嵌套的Foreach不会将变量传回去吗?

时间:2017-06-22 01:48:45

标签: powershell

我有以下foreach块,它会循环显示Get-ACL的结果,并将路径,用户名,权限等打印为CSV报告。

变量$groups由另一个脚本定义:

. C:\Powershell\Get-LocalGroup.ps1
$groups = Get-LocalGroup -Computername $computerName

这是主要的foreach块:

foreach ($u in $access.Access) {

    if ($u.IdentityReference -like "$domain") {
        Try {
            [String]$uIdent = $u.IdentityReference
            $displayName = get-aduser $uIdent.split("\")[1] -Properties DisplayName | Select-Object DisplayName
            $user = "$($displayName.DisplayName) ($MUDID)"
        }
        Catch {
            $user = "$($u.IdentityReference) (User not found)"
        }

    }
    elseif ($u.IdentityReference -like "S-*") {
        #PROBLEM STARTS HERE
        write-host "SID"
        foreach ($g in $groups) {
            if ($g.SID -like $u.IdentityReference) {
                Write-Host $u.IdentityReference    
                Write-Host $g.SID
                Write-Host $g.Name
                $userSID = $g.Name

            }
            else {
                $userSID = $u.IdentityReference
            }
        }
        $user = $userSID
        Write-Host "User: $user"
    }
    else {
        $user = $u.IdentityReference
    }
}

代码几乎完美无缺,除了它似乎拒绝将以下变量传递回foreach:

$userSID = $g.Name

从这个示例中可以看出来自(仅用于测试......我发誓)Write-Host事件的输出:

SID
S-1-5-21-4175155190-227829953-2793635334-1036
S-1-5-21-4175155190-227829953-2793635334-1036
AUK-PH-Distribution-Depart
User: S-1-5-21-4175155190-227829953-2793635334-1036

我认为这个问题与范围界定有关,但我以前从未遇到过这个问题,因此我不确定如何处理它。谁能指出我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您的foreach循环有效地仅返回$Groups中最后一个元素的评估结果。它正在为每个组更新$UserSID,但也会为最后一个更新它。

我认为你需要这样的东西:

$UserSID = $u.IdentityReference
$G = $Groups | where SID -like $u.IdentityReference 
if ($G) {$UserSID = $G.Name}

您可以提前指定默认值。您尝试查找具有此类SID($G =...)的组,如果找到它,则将其名称分配给您的变量。