我正在尝试使用Active Directory帐户的专有名称验证PowerShell中某些用户的位置。在尝试找到迭代所有子OU(指定为level3s
)的正确方法时,我尝试实现for
循环以希望为用户检查每个级别3。但是,一旦我添加了for
,我就会得到以下内容作为输出。
拒绝访问路径'C:\ windows \ system32 \ inetsrv \ 0'。
如果我没有在$expected
字符串中连接数组的当前索引,我可以正确执行我的验证。该字符串的一个示例是:"CN=" + $user.SamAccountName + ",OU=Level3A,OU=Level2,OU=Level1,DC=domain,DC=org"
。只有当我尝试循环时才会出现访问问题。
值得注意的是,我已经提升了权限,因此访问实际上不应成为问题。此外,我没有在实际的PowerShell IDE中运行它,所以如果有人建议,我不能“以管理员身份运行”。
简而言之,我的问题是;
为什么添加for
循环导致访问被拒绝问题?
$users = @();
$users += Get-ADUser -SearchBase "OU=Level2,OU=Level1,DC=domain,DC=org" -Filter "SamAccountName -like '*lvl'" -ResultSetSize 5000 -Properties $properties | Select $properties;
Function LevelsOUCheck([System.Array]$users, $exceptions = @()){
$notes = "";
$invalidUsers = @();
$level3s= @("Level3A","Level3B","Level3C");
Foreach($user in $users){
for($i = 0; $level3s.Length > $i; $i++){
$expected = "CN=" + $user.SamAccountName + ",OU=" + $level3s[$i] + ",OU=Level2,OU=Level1,DC=domain,DC=org"
if($user.DistinguishedName -ne $expected){
if(-Not ($exceptions.Contains($user.SamAccountName))){
$invalidUsers += $user.SamAccountName;
}
}
}
}
if($invalidUsers.Count -gt 0){
$notes += $invalidUsers.Count + " accounts was in the wrong OU `n";
}
return $notes, $invalidUsers
}
在我添加循环之前,每个请求都是相同的函数。并且此方法不会输出任何错误,但我正在对级别进行硬编码。
Function LevelsOUCheck([System.Array]$users, $exceptions = @()){
$notes = "";
$invalidUsers = @();
$level3s= @("Level3A","Level3B","Level3C");
Foreach($user in $users){
$expected = "CN=" + $user.SamAccountName + ",OU=Level3A,OU=Level2,OU=Level1,DC=domain,DC=org"
if($user.DistinguishedName -ne $expected){
if(-Not ($exceptions.Contains($user.SamAccountName))){
$invalidUsers += $user.SamAccountName;
}
}
}
if($invalidUsers.Count -gt 0){
$notes += $invalidUsers.Count + " accounts was in the wrong OU `n";
}
return $notes, $invalidUsers
}
答案 0 :(得分:1)
让我们来看看for()
循环:
for($i = 0; $level3s.Length > $i; $i++){
<# loop body here #>
}
在PowerShell中,>
是重定向运算符,而不是比较运算符。
每次评估循环条件时,您都会有效地尝试将字符串"3"
写入当前目录中名称为$i
的文件,这就是您看到错误的原因< / p>
将$level3s.Length > $i
替换为$level3s.Length -gt $i
(-gt
运营商为greater than
)
如果您是PowerShell的新手,我建议您查看以下帮助文件主题: