我获得了一项对Powershell来说非常完美的任务,并借此机会学习了Powershell脚本语言。
我有一个包含两个列的CSV文件:
Name, Active
我想获取列中已禁用的每条记录的名称。使用该名称,我想检查AD并检查它们是否被禁用。最终,如果他们没有被禁用,我想禁用它们,但我不希望你们为我破坏所有的乐趣!
我在这里,我不知道以下是否可行,但现在有语法错误。
$file = 'C:\scripts\users.csv'
$test = Import-CSV $file | Where-Object {$_.Active -like "disable*"} | Select-Object Name
foreach($user in $test){
if (Get-AdUser -LDAPFilter "(samaccountname=*$user*)" | Select-Object Enabled){
Write-Host $user + "is active"
}
}
感谢您的帮助。
编辑:我修复了语法错误,现在脚本将运行,但没有输出。我知道有些用户仍处于活动状态,因此肯定会有一些输出。
答案 0 :(得分:2)
你非常接近,但我认为你需要的是Select-Object的-ExpandProperty参数。
if ((Get-AdUser $user | Select-Object -ExpandProperty Enabled)){
否则它不是True / False的布尔响应,而是具有一个属性的对象,该属性为Enabled。该属性的值将是布尔值true / false,但如果您想要的是值,则必须先扩展属性。
编辑此外,您并不真正需要Write-Host命令(很多人会告诉您不要使用它,除非您真的想要写入屏幕而不是其他任何内容)。您可以简单地将该行添加到"$user is active"
,因为双引号会自动扩展字符串。
我想你可以通过以下方式进一步简化它:
get-aduser -filter {SAMAccountName -eq "$user" -and Enabled -eq $true} | ForEach{ $_.samaccountname + " is enabled." }
这将取代整个ForEach区块。
答案 1 :(得分:0)
按如下方式构建过滤器字符串
$filterstring = "samaccountname=*{0}*" -f $user
答案 2 :(得分:0)
Select-Object将返回Enabled
的对象数组。您的If
声明:
if(Get-ADUser disabledUser | Select-Object enabled){Write-host "Enabled"}
Enabled
那应该是假的吗?发生的事情是If
评估了一个填充的语句。它不是空的,所以它是$ true
你应该做什么使用-ExpandProperty。这将从enabled
获得原始值,这将正确触发if语句。
if(Get-ADUser disabledUser | Select-Object -ExpandProperty enabled){Write-host "Enabled"}