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

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 并且不太易于人类阅读)的最佳方法是什么?

答案1

您也可以不使用插件来执行此操作。我试过了,成功了:

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

2009 年 6 月 10 日,星期三,下午 4:32:08

如果我将用户对象设置为如下形式,我还会获得 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)进行大量工作,您可能需要获取它的管理单元并使用它。

答案2

Windows 7/Windows Server 2008 R2 附带的内置 AD 命令行程序现在可以非常轻松地完成此操作。在 Windows 7 上,通过 Powershell 提示符:

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

“PasswordLastSet”属性似乎是实际“pwdLastSet”属性的翻译版本。

答案3

有一个更简单的方法。

ADSI 对象有一个名为 ConvertLargeIntegerToInt64 的方法。请注意,它是 ADSI 对象的一种方法,不是通过查询时间戳属性的值返回的 System.__Comobject,因此 $user.pwdLastSet.value.ConvertLargeIntegerToInt64() 将不起作用。您需要按如下方式调用它:

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

这将为您提供 LDAP 时间戳,需要将其转换为可读日期,如 Bratch 上文所述。这将适用于 ADSI 提供程序返回的任何时间戳属性值,并且 ConvertLargeIntegerToInt64 方法(我相信)由表示目录条目的任何对象公开。

综合起来,以下是如何获取上次设置密码的日期的方法:

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

答案4

安装: http://www.quest.com/powershell/activeroles-server.aspx

打开 powershell

运行以下命令:

添加 PSSnapin quest.activeroles.admanagement

Get-QADUser |ft 显示名称,PasswordLastSet

第一个命令加载您刚刚下载的 quest snapin。如果您在开始菜单中使用 quest 的快捷方式,则无需执行此操作。第二个命令获取所有用户的列表以及上次更改密码的时间。

相关内容