将循环添加到可分辨名称验证时拒绝访问

时间:2017-05-10 14:00:41

标签: powershell active-directory

我正在尝试使用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
}

1 个答案:

答案 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的新手,我建议您查看以下帮助文件主题: