首页 > 解决方案 > Get-ADUser - 搜索过期帐户。在命令中使用变量

问题描述

我目前正在开发一个 Powershell GUI 脚本,以帮助我的团队更轻松地找到密码过期、禁用帐户等的帐户,并将这些帐户输出到 CSV。它几乎完全围绕“ Get-ADUser ”命令。到目前为止,几乎一切都奏效了,除了找到密码过期的帐户。

我已经对此进行了很多研究,但似乎没有使用 Get-ADUser 查找过期帐户的简单方法。我知道我可以改用Search-ADAccount,但这样做会很尴尬(因为我需要重新编写很多代码)。

Get-Aduser -Properties * -Filter {PasswordExpired -eq $true}只是画了一个空白。

我在https://serverfault.com/questions/805526/get-aduser-password-expired-filter-not-working-correctly/805611找到了部分解决方案

例如,

Get-ADUser -Properties * -Filter * | ? {$_.PasswordExpired -eq $True -and $_.Enabled -eq $true} | Select-Object name, enabled | Export-Csv "C:\report.csv" -NoTypeInformation

工作得很好,但如果我尝试分配命令的“中间”,即

{$_.PasswordExpired -eq $True -and $_.Enabled -eq $true}

到一个变量,然后将其替换为命令,我要么得到一个错误,要么是我的 AD 中所有那些的列表,要么根本没有人。替换变量的理由是允许可能的帐户状态(用户可以通过选择单选按钮来选择)。

我已经尝试过双引号和单引号的各种排列,包括和不包括大括号等,但 Powershell 不会让我休息!

谢谢!

标签: active-directorywindows-serverpowershell-5.0

解决方案


Get-ADUsercmdlet 公开了PasswordExpired扩展属性,该属性是一个布尔值,指示密码是否已过期。它基于msDS-User-Account-Control-Computed属性。但是,您不能使用此属性进行过滤。

这意味着您可以检查该属性上的 UF_PASSWORD_EXPIRED 位:

Get-ADUser -Filter "Enabled -eq 'True'" -Properties 'msDS-User-Account-Control-Computed' | 
    Where-Object {($_.'msDS-User-Account-Control-Computed' -band  0x800000) -eq 0x800000} |    # UF_PASSWORD_EXPIRED --> 0x800000 = 8388608
    Select-Object Name, Enabled | Export-Csv "C:\report.csv" -NoTypeInformation

PasswordNeverExpires您可以通过扩展过滤器以排除同时PasswordNotRequired使用 $false的用户来加速上述操作:

$filter = "Enabled -eq 'True' -and PasswordNeverExpires -eq 'False' -and PasswordNotRequired -eq 'False'"
Get-ADUser -Filter $filter -Properties PasswordNeverExpires, PasswordNotRequired, 'msDS-User-Account-Control-Computed' | 
    Where-Object {($_.'msDS-User-Account-Control-Computed' -band 0x800000) -eq 0x800000} |    # UF_PASSWORD_EXPIRED --> 0x800000 = 8388608
    Select-Object Name, Enabled | Export-Csv "C:\report.csv" -NoTypeInformation

推荐阅读