Powershell:如何查询pwdLastSet并使其有意义?

我需要获取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))