我正在使用此代码块来删除pipe理员组中不是“Lcs”或“Admin”的任何pipe理员。 但是,“Lcs”仍然从pipe理组中删除。 我认为下面的代码会将脚本configuration为仅仅在控制台中为“Lcs”帐户写出一些文本而不改变它的当前状态,但是每次运行它时都会从Administrators组中删除Lcs。
$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”或“管理员”。 如果帐户名称与“Lcs”匹配,则会出现以下行为:
“Lcs”-match“Lcs”→True⇒Write-Host“LCS账户排除”。 “Lcs”-match“Guest” - 或“Lcs”-match“Administrator”→False⇒net本地组管理员$ 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 }
问题是你的逻辑不是在做你所告诉的。
IF与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 } }
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"
等正确识别相关的用户帐户。