【发布时间】:2021-06-12 02:41:18
【问题描述】:
我正在开发一个 Powershell 脚本(带有 GUI),以帮助我的同事更轻松地找到冗余和禁用的 AD 帐户。
这是一个小预览......
$props = "Name, Enabled, PasswordExpired, Company,passwordNeverExpires, Office"
$propsAsArray = $props -split ',\s*'
Get-ADUser -filter * -properties $propsAsArray | where {$_.Enabled -eq $true} | where {$_.PasswordNeverExpires -eq $false}| where {$_.passwordexpired -eq $false} | Select-Object $propsAsArray | Export-csv -Path "C:\report.csv"
一切正常并输出 CSV 报告。
问题在于如何将 AD 帐户状态的所有可能组合和排列分配给变量,然后将变量替换为 Get-ADUser cmdlet(取决于用户在 GUI 中单击的单选按钮)。
我已经尝试了所有能想到的但只能返回错误Expressions are only allowed as the first element of a pipeline。
我确定$accountStatus = "where {$_.Enabled -eq $true} | where {$_.PasswordNeverExpires -eq $false}"(或微妙的变体)不是它的完成方式。
我对 Powershell 比较陌生,渴望获得经验。谢谢,威廉。
【问题讨论】:
-
每次运行此类查询时从您的 AD 中查询所有用户并随后使用多个
Where-Objects 过滤它们实际上并不是最好的主意。最好创建适当的过滤器字符串以与参数-Filter一起使用,因为这会给您的 AD 带来更少的压力。 ;-) -
感谢您的提示。脚本的最终版本将使用“SearchBase”参数来减少 DC 上的负载。我很乐意使用 -Filter 参数来查找密码已过期的用户,但看起来这是不可能的。我的研究表明,“PasswordExpired”是一种方法,而不是标准属性,因此无法过滤。 “链式” where 语句是唯一可行的解决方法。
-
我的代码基于serverfault.com/questions/723217/… 上的最终建议解决方案。我主要关心的是如何将链接的“Where-Object”语句转换为我可以替换为“Get-ADUser”cmdlet 的变量。谢谢。
-
@WilliamLombard - 我怀疑我误解了你的问题......但
W-O脚本块可以像任何其他脚本块一样。使用适当的-and或-or运算符将每个测试放在一个脚本块中。
标签: windows powershell active-directory