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