Powershell-根据其他列表检查安全组成员

Powershell-根据其他列表检查安全组成员,powershell,Powershell,在上下文中,我试图从一个安全组中获取一个用户列表,然后检查这些用户中是否有没有指定的XenDesktop 请原谅,我昨天才开始使用Powershell,所以我的格式设置已关闭。它首先从广告组抓取用户,然后检查该用户是否有一个指定的桌面,这是有效的,但我似乎无法工作的是,如果在该列表中找到该用户,我希望它移动到下一个用户名,而不是继续检查每台机器,然后检查最后的代码位 $checkusernames = Get-ADGroupMember "***AD security Group***" | S

在上下文中,我试图从一个安全组中获取一个用户列表,然后检查这些用户中是否有没有指定的XenDesktop

请原谅,我昨天才开始使用Powershell,所以我的格式设置已关闭。它首先从广告组抓取用户,然后检查该用户是否有一个指定的桌面,这是有效的,但我似乎无法工作的是,如果在该列表中找到该用户,我希望它移动到下一个用户名,而不是继续检查每台机器,然后检查最后的代码位

$checkusernames = Get-ADGroupMember "***AD security Group***" | Select SamAccountName

$desktops = get-brokerdesktop -DesktopGroupName Personal_WIN8 | Select MachineName, @{Name='AssociatedUserNames';Expression={[string]::join(“;”, ($_.AssociatedUserNames))}}

foreach ($username in $checkusernames.SamAccountName) {
foreach ($desktop in $desktops) {
If ($desktop.AssociatedUserNames -like "*$username*") {
write-host $username "is assigned to" $desktop.machinename
}
write-host $username "is not assigned to a desktop"
}
Write-host $username "is not assigned to anything"
pause
}

如果要提前退出
ForEach
循环,可以使用
Break
关键字。例如:

$checkusernames = Get-ADGroupMember "***AD security Group***" | Select SamAccountName

$desktops = get-brokerdesktop -DesktopGroupName Personal_WIN8 | Select MachineName, @{Name='AssociatedUserNames';Expression={[string]::join(“;”, ($_.AssociatedUserNames))}}

foreach ($username in $checkusernames.SamAccountName) {

    $machine = ''

    foreach ($desktop in $desktops) {

        If ($desktop.AssociatedUserNames -like "*$username*") { 
            $machine = $desktop.machinename
            break
        }
    }

    If ($machine) {
        write-host $username "is assigned to" $desktop.machinename
    } Else {
        write-host $username "is not assigned to a desktop"
        pause
    }
}
这将停止内部
ForEach
循环的当前循环(一旦其全部完成),而不会中断外部循环的持续循环


根据评论中的讨论,我还重新组织了代码,以便根据桌面是否与用户匹配,您只能获得一个输出,并且只有在未找到匹配项时才会暂停。

如果您想提前退出
ForEach
循环,可以使用
Break
关键字。例如:

$checkusernames = Get-ADGroupMember "***AD security Group***" | Select SamAccountName

$desktops = get-brokerdesktop -DesktopGroupName Personal_WIN8 | Select MachineName, @{Name='AssociatedUserNames';Expression={[string]::join(“;”, ($_.AssociatedUserNames))}}

foreach ($username in $checkusernames.SamAccountName) {

    $machine = ''

    foreach ($desktop in $desktops) {

        If ($desktop.AssociatedUserNames -like "*$username*") { 
            $machine = $desktop.machinename
            break
        }
    }

    If ($machine) {
        write-host $username "is assigned to" $desktop.machinename
    } Else {
        write-host $username "is not assigned to a desktop"
        pause
    }
}
这将停止内部
ForEach
循环的当前循环(一旦其全部完成),而不会中断外部循环的持续循环


根据评论中的讨论,我还重新组织了代码,以便根据桌面是否与用户匹配,您只能获得一个单独的输出,并且只有在找不到匹配项时才会暂停。

感谢您的回复,我尝试了中断,但随后将其移动到写入主机$username“未分配给任何内容”暂停,然后进行另一个循环。我想运行循环,直到它找到一个在$desktop变量中找不到的用户。好的,所以它结束当前循环周期,但您想立即退出。我认为最好的解决方法就是使用if,否则,我会修改我的答案。哦,等等,对不起,我误解了。让我重新思考一下。看看修改后的答案,让我知道你是否在寻找答案。谢谢!这很好,我没有想过这样做,谢谢。谢谢你的回复,我尝试了中断,但它随后移动到写入主机$username“未分配给任何内容”暂停,然后执行另一个循环。我想运行循环,直到它找到一个在$desktop变量中找不到的用户。好的,所以它结束当前循环周期,但您想立即退出。我认为最好的解决方法就是使用if,否则,我会修改我的答案。哦,等等,对不起,我误解了。让我重新思考一下。看看修改后的答案,让我知道你是否在寻找答案。谢谢!这真是太棒了,谢谢你,我还没想过那样做。