我需要获取Active Directory安全组中一组帐户的最后一次密码更改,我觉得这是PowerShell应该擅长的。
现在,我已经停留在如何从我正在查看的AD帐户读取pwdLastSet属性。 即使运行这样简单的东西:
[adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net" | Format-List *
给出pwdLastSet的结果,如下所示:
pwdLastSet : {System.__ComObject}
我觉得我这样做是错误的,那么查询和格式化pwdLastSet属性的输出(这个值是基于Windows Epoch而不是人类可读的)的最好方法是什么?
您也可以在没有pipe理单元的情况下执行此操作。 我试过这个,它的工作原理:
PS#> $ searcher =新对象DirectoryServices.DirectorySearcher PS#> $ searcher.Filter =“(&(samaccountname = user1))” PS#> $ results = $ searcher.findone() PS#> [date时间] :: fromfiletime($ results.properties.pwdlastset [0]) 2009年6月10日星期三下午4:32:08
我也得到一个System.__ ComObject的pwdLastSet如果我有这样的用户对象设置:
$ user = [adsi]“LDAP:// cn = user1,ou =工作人员,ou =用户帐户,dc = ramalamadingdong,dc = net”
应该有一种方法来使用[System .__ ComObject] .InvokeMember()和reflection来从$ user对象获得pwdLastSet值,但是我一直没有把它弄清楚。 我从来没有弄明白,所以我用上面的例子,继续前进。
如果您将要使用AD(或Exchange或SQL Server)进行大量工作,则可能需要获取pipe理单元并使用它。
Windows 7 / Windows Server 2008 R2附带的内置AD命令行程序现在可以做到这一点。 在Powershell提示符下的Windows 7上:
Import-Module ActiveDirectory Get-ADUser 'user1' -properties PasswordLastSet | Format-List
“PasswordLastSet”属性似乎是实际的“pwdLastSet”属性的翻译版本。
有一个更简单的方法。
ADSI对象有一个名为ConvertLargeIntegerToInt64的方法。 请注意,这是一个ADSI对象的方法,而不是通过查询时间戳属性的值返回的System .__ Comobject,所以$ user.pwdLastSet.value.ConvertLargeIntegerToInt64()将不起作用。 你需要如下调用它:
$user.ConvertLargeIntegerToInt64($user.pwdLastSet.value)
这将得到你的LDAP时间戳,需要被转换为可读的date,正如上面的Bratch所解释的那样。 这将适用于由ADSI提供程序返回的任何时间戳属性值,并且ConvertLargeIntegerToInt64方法(我相信)由表示目录条目的任何对象公开。
把它们放在一起,这里是你如何得到上次设置密码的date:
$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 displayname,PasswordLastSet
第一个命令加载你刚刚下载的任务pipe理单元。 如果您在开始菜单中使用快捷方式查找,则不需要执行此操作。 第二个命令获取所有和用户的列表以及上次更改密码的时间。
也许你应该看看使用passwordLastChanged属性。 在这里寻找更多信息: http : //www.microsoft.com/technet/scriptcenter/resources/qanda/aug06/hey0801.mspx
将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))