it-swarm.cn

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而不是人类可读的)的最佳方式是什么?

17
Bob

您也可以在没有管理单元的情况下执行此操作。我尝试了一下,它起作用了:

 PS#> $ searcher =新对象DirectoryServices.DirectorySearcher 
 PS#> $ searcher.Filter =“(&(samaccountname = user1))” 
 PS#> $ results = $ searcher.findone()
 PS#> [datetime] :: 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)进行大量工作,则可能需要获取并使用该管理单元。

13
Bratch

Windows 7/Windows Server 2008 R2随附的内置AD命令集现在可以轻松完成此操作。在Windows 7上从Powershell提示:

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

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

19
Neobyte

有一种更简单的方法。

ADSI对象具有一种称为ConvertLargeIntegerToInt64的方法。请注意,这是ADSI对象的方法,通过查询时间戳属性值返回not System .__ Comobject,因此$ user.pwdLastSet.value.ConvertLargeIntegerToInt64()无法正常工作。您需要按以下方式调用它:

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

如上面的Bratch所述,这将为您提供LDAP时间戳,该时间戳需要转换为可读的日期。这将适用于ADSI提供程序返回的任何时间戳属性值,并且(我相信)任何代表目录项的对象都可以使用ConvertLargeIntegerToInt64方法。

综上所述,这是如何获取上次设置密码的日期:

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

这是显示AD计算机的简单方法:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
3
William

将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))
1
Mike Pfeiffer

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

打开PowerShell

运行以下命令:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft显示名称,PasswordLastSet

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

1
baz

也许您应该看看使用passwordLastChanged属性。在此处查找更多信息: http://www.Microsoft.com/technet/scriptcenter/resources/qanda/aug06/hey0801.mspx

0
mrTomahawk