我正在使用此代码块从管理员组中删除任何不是“Lcs”或“Admin”的管理员。但是,“Lcs”仍然会从管理组中删除。我认为以下代码会将脚本配置为在控制台中为“Lcs”帐户写出一些文本,而不更改其当前状态,但每次运行时,Lcs都会从Administrators组中删除。
$UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'"
foreach ($User in $UserList) {
if($User.Name -match "Lcs") {
Write-Host "LCS Account Excluded."
}
if($User.Name -match "Guest" -Or $User.Name -match "Administrator") {
Write-Host "Default Windows Accounts Excluded."
} else {
net localgroup Administrators $User.Name /Delete
}
}
答案 0 :(得分:2)
你的循环体包含两个语句(很可能不是故意的):一个if
语句(没有else
分支),你检查名称是否匹配" Lcs"和另一个一个(带else
分支),你检查名称是否匹配"访客"或"管理员"。如果帐户名称匹配" Lcs"你会得到以下行为:
"Lcs" -match "Lcs" → True ⇒ Write-Host "LCS Account Excluded." "Lcs" -match "Guest" -Or "Lcs" -match "Administrator" → False ⇒ net localgroup Administrators $User.Name /Delete
使用具有多个条件的单个if
语句来避免这种情况:
if ($User.Name -match "Lcs") {
Write-Host "LCS Account Excluded."
} elseif ($User.Name -match "Guest" -Or $User.Name -match "Administrator") {
Write-Host "Default Windows Accounts Excluded."
} else {
net localgroup Administrators $User.Name /Delete
}
答案 1 :(得分:1)
问题是你的逻辑没有做你告诉它的事情。
IF匹配LCS写主机"一只小狗因使用Write-Host&#34而死亡
如果匹配访客或管理员写主持人"另一只小狗刚刚去世" ELSE删除帐户
您的两个陈述正在单独执行。第一个IF语句只是写入控制台,如果匹配的话。
$UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'"
foreach ($User in $UserList) {
if($User.Name -match "Lcs") {
Write-Host "LCS Account Excluded."
}
elseif($User.Name -match "Guest" -Or $User.Name -match "Administrator") {
Write-Host "Default Windows Accounts Excluded."
} else {
net localgroup Administrators $User.Name /Delete
}
}
这就是PetSerAl建议并应该起作用的。它链接你的两个IF语句,所以第二个只在第一个不是。
时执行或者,如果您不关心输出:
$UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" |
Where { $_.Name -notmatch "Lcs" -and `
$_.Name -notmatch "Guest" -and `
$_.Name -notmatch "Administrator" } |
Foreach-Object { net localgroup Administrators $_.Name /Delete }
这使用WHERE语句过滤掉您在将其传递给FOREACH之前不想处理的内容。这样效率更高,但您无法获得输出。
注意:我只是在这里更正您的逻辑,并假设$User.Name -match "Lcs"
并正确识别相关的用户帐户。