我的 foreach 循环有什么问题?

What's wrong with my foreach loop?

我写了这个 foreach 循环来将所有用户添加到本地管理员组,但有一些条件。它似乎通过前两个 if 语句正常,但是当涉及到将用户添加到管理员组的部分时,我收到错误 "The group already exists"。有任何想法吗?

$UserList = Net User

foreach ($User in $UserList)
{
    if($User -match "Lcs")
    {
        Write-Host "FCS Account Excluded."
    }

    if($User -match "Guest" -Or $User -match "Administrator")
    {
        Write-Host "Default Windows Accounts Excluded."
    }
    else 
    {
        net localgroup Administrators $User /Add
    }
}

问题是 Net User 存储用户的方式。

尝试以下块:

$UserList = Get-WmiObject -Class Win32_UserAccount  -Filter "LocalAccount='True'"
foreach ($User in $UserList)
{
    if($User.Name -match "Lcs")
    {
        Write-Host "FCS Account Excluded."
    }
    elseif ($User.Name -match "Guest" -Or $User.Name -match "Administrator")
    {
        Write-Host "Default Windows Accounts Excluded."
    }
    else 
    {
        net localgroup Administrators $User.Name /Add
    }
}

另外我不建议使用Net local group administrators user.add,因为它使用了另一个应用程序网络,但使用它没有问题。

net user 命令的输出如下所示:

PS C:\> net user

User accounts for \ComputerName

-------------------------------------------------------------------------------
user01               user02               user03               user04
user05               user06
The command completed successfully

PS C:\>

请注意,如果您只对用户名感兴趣,前 4 行是无用的,最后两行也是如此。您可以使用 Select-Object -SkipSelect-Object -First:

删除它们
PS C:\> $netuser = net user |Select-Object -Skip 4
PS C:\> $netuser |Select-Object -First $($netuser.Length - 3)
user01               user02               user03               user04
user05               user06
PS C:\>

现在您只需要将用户名拆分成单独的字符串:

PS C:\> $users = $netuser |Select-Object -First $($netuser.Length - 3) |ForEach-Object {
    $_.Split(' ',[StringSplitOptions]::RemoveEmptyEntries)
}
PS C:\> $users
user01
user02
user03
user04
user05
user06