【问题标题】:Get-ADUser - searching for expired account. Using variables in commandGet-ADUser - 搜索过期帐户。在命令中使用变量
【发布时间】:2021-06-11 06:19:10
【问题描述】:

我目前正在开发一个 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 不会让我休息!

谢谢!

【问题讨论】:

  • 你的过滤器不应该是一个脚本块;试试Get-ADUser -Properties * -Filter 'PasswordExpired -eq "TRUE" -and Enabled -eq "TRUE"'。我不会发誓(现在不在 AD 系统上进行测试),但我认为您可以省略-eq "TRUE" 的两个实例。
  • 嗨,杰夫。我已经尝试过了。 'PasswordExpired' 显然是一种方法(或计算值),因此与过滤属性的工作方式不同(对于 Get-ADUser,例如 'Enabled'。

标签: active-directory windows-server powershell-5.0


【解决方案1】:

Get-ADUser cmdlet 公开了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

您可以通过扩展过滤器以排除具有PasswordNeverExpiresPasswordNotRequired 两者的用户来加快上述速度 $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

【讨论】:

    【解决方案2】:

    我认为我在 Stack Exchange 上找到了解决方案。

    https://serverfault.com/questions/723217/find-out-if-password-expired-or-when-it-expires-for-user-in-a-specific-ou

    早期测试表明它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2018-03-27
      • 2013-02-22
      • 2013-08-20
      相关资源
      最近更新 更多