Windows 为什么赢了';该逻辑是否按预期过滤掉数据?
我正在使用此代码块从Administrators组中删除任何不是“Lcs”或“Admin”的管理员。然而,“Lcs”仍在从管理组中删除。我认为下面的代码会将脚本配置为只在控制台中为“Lcs”帐户写出一些文本,而不更改其当前状态,但每次运行它时,Lcs都会从Administrators组中删除Windows 为什么赢了';该逻辑是否按预期过滤掉数据?,windows,powershell,scripting,Windows,Powershell,Scripting,我正在使用此代码块从Administrators组中删除任何不是“Lcs”或“Admin”的管理员。然而,“Lcs”仍在从管理组中删除。我认为下面的代码会将脚本配置为只在控制台中为“Lcs”帐户写出一些文本,而不更改其当前状态,但每次运行它时,Lcs都会从Administrators组中删除 $UserList = Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" foreach ($User in $Us
$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
}
}
循环正文包含两条语句(很可能是无意的):一条
if
语句(不带else
分支),用于检查名称是否匹配“Lcs”,另一条(带else
分支),用于检查名称是否匹配“Guest”或“Administrator”。如果帐户名与“Lcs”匹配,则会出现以下行为:
"Lcs" -match "Lcs" → True ⇒ Write-Host "LCS Account Excluded."
"Lcs" -match "Guest" -Or "Lcs" -match "Administrator" → False ⇒ net localgroup Administrators $User.Name /Delete
问题是你的逻辑没有按你说的做 如果匹配LCS写入主机“一只小狗因为使用写入主机而死亡” 如果匹配客人或管理员写主机“另一只小狗刚死”否则删除帐户 您的两条语句将分别执行。如果第一个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
}
}
这是佩瑟拉尔建议的,应该是可行的。它链接了两个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-匹配“Lcs”
,这样可以正确识别相关的用户帐户。第二个如果->elseif
@PetSerAl,这似乎没有什么区别。谢谢,这在PetSerAl推荐它时一开始似乎不起作用,但到目前为止,它运行良好。感谢进一步的故障分析。:)
$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 }