【发布时间】: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