Назад | Перейти на главную страницу

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

Мне нужно получить последнее изменение пароля для группы учетных записей в группе безопасности 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?

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

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

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

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

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

Wednesday, June 10, 2009 4:32:08 PM

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

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

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

Есть способ попроще.

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

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

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

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

$user = [ADSI]'LDAP://cn=someusername,ou=someou,dc=somedomain,dc=com'
[datetime]::FromFileTime($user.ConvertLargeIntegerToInt64($user.pwdLastSet.value))

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

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv

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

открыть PowerShell

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

add-PSSnapin quest.activeroles.admanagement

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

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

Добавьте в свой скрипт функцию ConvertADSLargeInteger, вы можете получить ее здесь:

PowerShell: преобразование Active Directory IADSLargeInteger в System.Int64

Вот как бы вы это использовали:

$user = [adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net"
[datetime]::FromFileTimeUtc((ConvertADSLargeInteger $user.pwdlastset.value))

возможно, вам следует использовать свойство passwordLastChanged. Смотрите здесь для получения дополнительной информации: http://www.microsoft.com/technet/scriptcenter/resources/qanda/aug06/hey0801.mspx