如何查找未设置密码的AD用户?

时间:2018-07-25 12:37:01

标签: powershell active-directory

如何找到未设置密码的AD用户?

一些背景信息:

我们有一个脚本(用C#编写),用于创建AD用户并设置默认密码。在首次尝试登录时提示用户更改此密码。

脚本运行正常,但是最近我们发现在某些情况下未设置密码。而且它不时发生。我们目前正在调查此问题。

现在,我将找不到脚本未设置默认密码的用户,以便在需要时手动设置默认密码。

当我查看用户的AD属性时,看不到找到没有设置(默认)密码的用户的明显方法。

通过脚本创建用户并且密码已成功设置(经过测试)时,pwdLastSet为0x0。那么如何知道何时未设置密码?

3 个答案:

答案 0 :(得分:4)

您追求的是Get-ADReplicationAttributeMetadata

一劳永逸,您应该可以将其设置为所需的内容。它相当快,因此您可以将结果添加到哈希表中,并在完成后将其抽出。 我将其插入了一个不错的小功能,其中$Username$ServerNameparams

您要使用的主要属性是pwdLastSetntPwdHistorylastLogonTimestamp

Get-ADuser $username |
Get-ADReplicationAttributeMetadata -Server $ServerName |
Where-Object Version -GT 1 | Select AttributeName, LastOriginatingChangeTime, Version | OGV

version会告诉您更改了多少次,而LastOriginatingChangeTime会告诉您何时更改。如果您执行Select *并删除了Where-Object Version -GT 1,则可以看到它提取的其他数据。

编辑: 看起来Get-ADReplicationAttributeMetadata在版本2上不可用。

PSVersion Get-ADReplicationAttributeMetadata
--------- ----------------------------------
        2                              False
        3                               True
        4                               True
        5                               True

答案 1 :(得分:1)

PasswordLastSet属性可以做到。保存上次设置密码的日期。

Get-ADUser -Filter * -Properties PasswordLastSet | Where-Object { $_.PasswordLastSet -eq $null } 

答案 2 :(得分:0)

尽管激活了密码策略,但 IS 仍然可以使AD中的用户密码为空。这是由于用户的PASSWD_NOTREQD属性中的userAccountControl标志所致。此PASSWD_NOTREQD标志的值为32。

要检查具有此标志(因此不需要密码)的已启用用户,您可以

$noPwdRequired = Get-ADUser -LDAPFilter "(&(objectClass=user)(objectCategory=person)(userAccountControl:1.2.840.113556.1.4.803:=544))"
foreach($user in $noPwdRequired ){
     Write-Host $user.sAMAccountName  # or displayName or whatever  you want to identify the user
}

通常,用户对象的默认值为512(NORMAL_ACCOUNT)。使用PASSWD_NOTREQD时,它们的值为544

使用值546查找也设置了此标志的禁用帐户。

您可以为所有发现的类似行为的用户更新此信息

$noPwdRequired = Get-ADUser -LDAPFilter "(&(objectClass=user)(objectCategory=person)(userAccountControl:1.2.840.113556.1.4.803:=544))"
foreach($user in $noPwdRequired ){
     Set-ADAccountControl $user -PasswordNotRequired $false
}