Powershell: как мне запросить pwdLastSet и имеет ли это смысл?

17

Мне нужно получить последнее изменение пароля для группы учетных записей в группе безопасности Active Directory, и я чувствую, что это то, что PowerShell должен хорошо делать.

Прямо сейчас я уже застрял в том, как прочитать атрибут pwdLastSet из учетной записи AD, на которую я смотрю. Даже запустить что-то простое, как это:

[adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net" | Format-List *

дает результаты для pwdLastSet, которые выглядят так:

pwdLastSet            : {System.__ComObject}

Я чувствую, что поступаю неправильно, поэтому как лучше запросить, а затем отформатировать вывод (значение основано на эпохе Windows и не очень хорошо читается человеком) атрибута pwdLastSet?

боб
источник

Ответы:

13

Вы также можете сделать это без оснастки. Я попробовал это, и это сработало:

PS #> $ searcher = New-Object DirectoryServices.DirectorySearcher
PS #> $ searcher.Filter = "(& (samaccountname = user1))"
PS #> $ results = $ searcher.findone ()
PS #> [datetime] :: fromfiletime ($ results.properties.pwdlastset [0])

10 июня 2009 г., 16:32:08

Я также получаю System .__ ComObject для pwdLastSet, если у меня установлен пользовательский объект следующим образом:
$ user = [adsi] "LDAP: // cn = user1, ou = Staff, ou = учетные записи пользователей, dc = ramalamadingdong, dc = net "

Должен быть способ использовать [System .__ ComObject] .InvokeMember () и отражение, чтобы получить это значение pwdLastSet из объекта $ user, но я не смог сделать это правильно. Я так и не понял, поэтому использовал приведенный выше пример и пошел дальше.

Если вы собираетесь много работать с AD (или Exchange, или с SQL Server), вы можете получить оснастку и использовать ее.

Bratch
источник
1
Я был в восторге от выполнения различных простых задач в PowerShell, чтобы попытаться изучить синтаксис. Я был немного расстроен, что везде, где я смотрел, ответом было использование надстройки. Благодарность!
Боб
19

Встроенные командлеты AD, которые поставляются с Windows 7 / Windows Server 2008 R2, теперь могут делать это достаточно просто. В Windows 7 из командной строки Powershell:

Import-Module ActiveDirectory
Get-ADUser 'user1' -properties PasswordLastSet | Format-List

Атрибут «PasswordLastSet» представляется переведенной версией фактического атрибута «pwdLastSet».

Neobyte
источник
Просто любопытно, что означает отсутствие какого-либо значения для PasswordLastSet ... Означает ли это на 100%, что не было никаких изменений, так как пароль был установлен изначально?
Михаил
У меня нет коробки для тестирования, но я думаю, что более вероятно, что на объекте еще не установлен пароль.
Neobyte
@Mikhail, в большинстве случаев отсутствие PasswordLastSet для любого значения означает, что вы не запускаете команду в приглашении с повышенными привилегиями.
JPBlanc
3

Есть более простой способ.

У объекта ADSI есть метод ConvertLargeIntegerToInt64. Обратите внимание, что это метод объекта ADSI, а не System .__ Comobject, который возвращается путем запроса значения атрибута timestamp, поэтому $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () не будет работать. Вы должны вызвать его следующим образом:

$user.ConvertLargeIntegerToInt64($user.pwdLastSet.value)

Это даст вам метку времени LDAP, которую необходимо преобразовать в удобочитаемую дату, как объяснено в Bratch выше. Это будет работать для любого значения атрибута timestamp, возвращаемого поставщиком ADSI, и метод ConvertLargeIntegerToInt64 (я полагаю) предоставляется любым объектом, представляющим запись каталога.

Собрав все вместе, вот как вы получите дату, когда пароль был последний раз установлен:

$user = [ADSI]'LDAP://cn=someusername,ou=someou,dc=somedomain,dc=com'
[datetime]::FromFileTime($user.ConvertLargeIntegerToInt64($user.pwdLastSet.value))
Ади Инбар
источник
3

Вот простой способ отобразить компьютеры AD:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
Уильям
источник
1

Установите: http://www.quest.com/powershell/activeroles-server.aspx

открытый PowerShell

Запустите следующие команды:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft отображаемое имя, PasswordLastSet

Первая команда загружает снятый квестовый оснастка. Вам не нужно делать это, если вы используете ярлык для квеста в стартовом меню. Вторая команда получает список всех пользователей и пользователей, а также время последнего изменения пароля.


источник