我有以下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
我认为这个问题与范围界定有关,但我以前从未遇到过这个问题,因此我不确定如何处理它。谁能指出我在这里做错了什么?
答案 0 :(得分:1)
您的foreach
循环有效地仅返回$Groups
中最后一个元素的评估结果。它正在为每个组更新$UserSID
,但也会为最后一个更新它。
我认为你需要这样的东西:
$UserSID = $u.IdentityReference
$G = $Groups | where SID -like $u.IdentityReference
if ($G) {$UserSID = $G.Name}
您可以提前指定默认值。您尝试查找具有此类SID($G =...
)的组,如果找到它,则将其名称分配给您的变量。