Перейти к следующему объекту в цикле For-Each, если условие ложно - PullRequest
0 голосов
/ 30 июня 2018

Это мой первый пост. Я обычно сталкиваюсь с этим сайтом, когда нахожу другие вопросы или ответы, и он мне очень помог. Тем не менее, я не могу найти ответ на этот вопрос. Если я сделал что-то не так, пожалуйста, дайте мне знать. Отказ от ответственности: я все еще изучаю PowerShell, так что любая конструктивная критика также будет хороша.

Мне было поручено проверить членов группы AD. Проведя некоторые исследования, я нашел лучший способ сделать это как можно проще. Я продолжил копать и обнаружил, что цикл ForEach - лучший способ принять несколько записей.

Таким образом, весь смысл в том, чтобы использовать et-ADPrincipalGroupMembership для проверки того, в каких группах находится пользователь. У меня есть оператор if, чтобы проверить, есть ли они даже в AD. Я могу убедиться, что это работает просто отлично. Однако, когда я делаю несколько пользователей (то есть user1, user2, user3), он останавливается на первом пользователе, который НЕ находится в AD, и вообще останавливает функцию.

Однако, если я передаю содержимое через файл, используя Get-Content, он работает как обслуживаемый. Любые пользователи, не являющиеся пользователями AD, будут обнаружены, и отобразится правильная ошибка.

Вот несколько примеров (cltest & bcltest - реальные учетные записи AD):

PS C:\scripts> Get-Hscaccess cltest, cltest123, bcltest, bcltest123 
CLTEST is NOT in HSCACCESS 
CLTEST123 does not exist in AD

Если я запускаю одинаковые имена в текстовом файле, я получаю это:

PS C:\scripts> gc .\hsca.txt | Get-Hscaccess  
CLTEST is NOT in HSCACCESS  
CLTEST123 does not exist in AD 
BCLTEST is NOT in HSCACCESS
BCLTEST123 does not exist in AD

вот контекст текстового файла:

cltest 
cltest123 
bcltest 
bcltest123

Я попытался продолжить, вернуть, прервать ... он просто останавливает сценарий, вместо того, чтобы переходить к следующему объекту и снова проверять операторы. На самом деле использование continue проходит через следующие операторы if, но оно не будет выполнено, поскольку пользователь не находится в AD. Я надеюсь, что я понимаю, чего я пытаюсь достичь здесь.

Я понял, что использую $ user / $ users в обратном направлении. Это был всего $ user, прежде чем я понял, что могу иметь несколько входов. Ничего особенного, хотя, и я могу это исправить, когда я завершаю этот сценарий.

Итак, надеюсь, я все объяснил и привел примеры. Если я что-то упустил, дайте мне знать. Я знаю, что у всех нет доступа к AD, но если кто-то может помочь, это будет с благодарностью. Кроме того, я знаю, что BEGIN, PROCESS и END не нужны, но именно так я научился выполнять эту функцию. Также эта функция находится в файле .psm1 и является частью других функций в модуле.

Вот полная функция:

function Get-Hscaccess {
    param (
        [string[]]$user
    )
    BEGIN {}
    PROCESS {
        if ($_ -ne $null) {
            $user = $_
        }
        foreach ($users in $user) {
            $usrOBJ = Get-ADUser -LDAPFilter "(SAMAccountName=$users)"
            if ($usrOBJ -eq $null) {
                Write-Host "$($users.ToUpper()) does not exist in AD" 
                return
            }
            $memGroups = (Get-ADPrincipalGroupMembership $users | Select-Object -ExpandProperty name)
            if ($memGroups.Contains("HSCACCESS")) {
                Write-Host "$($users.ToUpper()) is in HSCACCESS"
            } 
            else {
                Write-Host "$($users.ToUpper()) is NOT in HSCACCESS"
            }
        } #end of foreach
    }   
    END {} 
}

1 Ответ

0 голосов
/ 30 июня 2018

Я внес некоторые изменения в ваш скрипт и логику.

function Get-Hscaccess {
    param (
        [string[]]$users #The singular name was bothering my OCD.
    )

    if ($_)
    {
        foreach ($user in $users)
        {
            $usrOBJ = Get-ADUser -LDAPFilter "(SAMAccountName=$user)" -erroraction Continue

            if ($usrOBJ -eq $null)
            {
                Write-Host "$($user.ToUpper()) does not exist in AD"
            }
            else
            {
                $memGroups = (Get-ADPrincipalGroupMembership $user | Select-Object -ExpandProperty name)
                if ($memGroups.Contains("HSCACCESS"))
                {
                    Write-Host "$($user.ToUpper()) is in HSCACCESS"
                } 
                else
                {
                    Write-Host "$($user.ToUpper()) is NOT in HSCACCESS"
                }
            }
        } #end of foreach
    }   
}
...