【问题标题】:Nested Foreach won't pass variable back out?嵌套的 Foreach 不会将变量传回?
【发布时间】:2017-06-22 14:11:51
【问题描述】:

我有以下 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

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

【问题讨论】:

  • 你试过在foreach之前定义$userSID吗? #PROBLEM STARTS HERE $userSID = ''
  • 不能肯定地说,但我高度怀疑它与第一行有关:if ($u.IdentityReference -like "$domain")。 -like 运算符进行通配符匹配,除非您包含一些通配符(例如“$domain*”),否则它将进行完全匹配。
  • 如果我在 foreach 之前定义 $userSID = 'test',它在输出过程中仍然是空的。
  • @mjolinor 啊,这是一个净化变化。这是我真实代码中的通配符匹配。
  • $u.IndentityReference -> $u.IdentityReference。 BTW,如果你使用Set-StrictMode,那么发现这种错误变得更容易了。

标签: powershell


【解决方案1】:

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

我想你会需要这样的东西:

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

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

【讨论】:

  • 我明白了......现在你解释说 foreach 只是一直循环而不是我想象的那样,这是有道理的。我要到星期一才能回来工作,但希望这可能是正确的解决方案。我会检查它,如果它确实指向正确的方向,则标记为已回答。
  • 对此进行了测试,它运行良好。感谢您的帮助。
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 2022-07-07
  • 2014-06-11
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多