我需要为 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,不是很容易阅读)的最佳方法是什么?
Windows 7/Windows Server 2008 R2 附带的内置 AD 命令行开关现在可以简单地做到这一点。在 Windows 7 上,来自 Powershell 提示符:
“PasswordLastSet”属性似乎是实际“pwdLastSet”属性的翻译版本。
您也可以在没有管理单元的情况下执行此操作。我试过了,它奏效了:
如果我有这样的用户对象集,我还会得到 pwdLastSet 的 System.__ComObject:
$user = [adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net "
应该有一种方法可以使用 [System.__ComObject].InvokeMember() 和反射从 $user 对象中获取 pwdLastSet 值,但我无法正确处理。我从来没有弄明白,所以我使用了上面的例子并继续前进。
如果您要使用 AD(或 Exchange 或 SQL Server)进行大量工作,您可能希望获取它的管理单元并使用它。
有一个更简单的方法。
ADSI 对象有一个名为 ConvertLargeIntegerToInt64 的方法。请注意,它是 ADSI 对象的方法,而不是通过查询时间戳属性的值返回的 System.__Comobject,因此 $user.pwdLastSet.value.ConvertLargeIntegerToInt64() 将不起作用。您需要按如下方式调用它:
这将为您提供 LDAP 时间戳,需要将其转换为可读日期,如上面的布拉奇所述。这将适用于 ADSI 提供程序返回的任何时间戳属性值,并且 ConvertLargeIntegerToInt64 方法(我相信)由表示目录条目的任何对象公开。
综上所述,您可以通过以下方式获取上次设置密码的日期:
这是显示 AD 计算机的简单方法:
安装: http ://www.quest.com/powershell/activeroles-server.aspx
打开电源外壳
运行以下命令:
添加-PSSnapin quest.activeroles.admanagement
Get-QADUser |ft displayname,PasswordLastSet
第一个命令加载您刚刚下载的任务管理单元。如果您在开始菜单中使用快捷方式进行任务,则无需执行此操作。第二个命令获取所有用户的列表以及上次更改密码的时间。
将 ConvertADSLargeInteger 函数添加到您的脚本中,您可以在此处获取它:
PowerShell:将 Active Directory IADSLargeInteger 转换为 System.Int64
以下是您将如何使用它:
也许您应该考虑使用 passwordLastChanged 属性。在这里查看更多信息: http: //www.microsoft.com/technet/scriptcenter/resources/qanda/aug06/hey0801.mspx