Перехват ошибок в сценарии powershell

#powershell #foreach #error-handling #file-permissions #adgroup

#powershell #foreach #обработка ошибок #файл-права доступа #adgroup

Вопрос:

Я написал скрипт для извлечения разрешений из файловых каталогов, чтобы мы могли проверять доступ к папкам. Я просто хочу посмотреть, какие группы у нас есть, а не какие пользователи, поэтому я написал этот скрипт, чтобы извлечь все имена групп и удалить доменное имя из значения, чтобы затем он мог запустить его через второй скрипт, который исправит для нас название группы AD, если оно вообще неверно, поскольку мы столкнулись с проблема, когда по какой-то причине некоторые возвращались с немного другими именами. Проблема в том, что все пользователи AD, указанные в разрешениях, возвращаются с ошибками. Я хочу, чтобы эти ошибки даже не отображались на экране, есть ли способ сделать это? Как вы можете видеть, я пробовал несколько разных способов перенести их в журнал или параметр -ea ignore, но он по-прежнему показывает ошибки на экране.

 $filelocationscsv = "C:ADExcelFile Share migration.csv"
$filelocationcsvcontents = Get-Content -LiteralPath $filelocationscsv

$AllFolders = @()
foreach ($location in $filelocationcsvcontents) {
    $AllFolders  = $location.Substring(0,$location.Length-1)
}

$outputfilelocation = "C:ADExcelpermissions.csv"

$Results = @()
$errResults = @()
Foreach ($i in $Allfolders) {
    if (Test-Path $i){
    Write-Host "Obtaining file permissions for $i."
    $acl = (Get-Acl $i -Filter *).Access | select -ExpandProperty IdentityReference
    foreach($Access in $acl) {
    if ($Access.Value -notlike "BUILTINAdministrators" -and $Access.Value -notlike "domainDomain Admins" -and $Access.Value -notlike "CREATOR OWNER" -and $access.Value -notlike "NT AUTHORITYSYSTEM" -and $access.Value -notlike "Everyone" -and $access.Value -notlike "BUILTINUsers" -and $access.Value -notlike "s-1*") {
    [string]$perm = $Access.Value.Split('')[1]
      if($checkgroup = Get-ADGroup $perm){
#try
#{
##                if( $LASTEXITCODE -gt 0 ){
##                # Handle the error here
##                # This example writes to the error stream and throws a terminating error
##                $errResults  = $LASTEXITCODE
##                Write-Error "Unable to ping server, ping returned" -EA Ignore
##                }
                $Properties = [ordered]@{'AD Group'=$perm}
                $Results  = New-Object -TypeName PSObject -Property $Properties
#}
#Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
#{
#                Write-Verbose "$perm skipped." -Verbose
#                #$ErrorMessage = 
#                #$FailedItem = $_.Exception.ItemName
#                #$errResults  = $ErrorMessage   $FailedItem
#}
                }
            }

        }
    }
    else {
    Write-Host "$i is not accessible"
    }
}

$Results | select -Property 'AD Group' -Unique | Export-Csv $outputfilelocation -NoTypeInformation
 

Стоит отметить, что эти ошибки не мешают моему скрипту выполнять его скорее эстетическую функцию, а также возможность обучения для себя. Я могу использовать свой скрипт как есть, но мне бы хотелось, чтобы он выглядел чище и научился лучше обрабатывать ошибки.

Комментарии:

1. Вы используете «Get-ADGroup» для получения пользователей AD в рамках вашего If-условия. Если вы хотите выдавать пользователям ошибки и перехватывать эти ошибки, я бы предложил добавить -ErrorAction параметр в Get-ADGroup , записать его результат в новую переменную и заключить его в try-catch . Например. try { $adGroup = Get-ADGroup $perm -ErrorAction Stop} catch {<errorBlock> ; continue} . Оператор continue в блоке catch перейдет к следующей записи коллекции $acl в вашем цикле foreach.

2. Это сработало, но код слишком длинный, чтобы публиковать его в комментарии, я думаю, поэтому я опубликую ответ на вопрос ниже на случай, если кто-то еще ищет тот же ответ.

Ответ №1:

Поскольку вы указали, что вам интересно узнать больше об обработке ошибок, на этой неделе я узнал одну вещь: эти общие параметры для обработки и записи ошибок:

 -ErrorAction
-WarningAction
-ErrorVariable
-WarningVariable
 

Вы можете отключить сообщения об ошибках с помощью параметра -ErrorAction SilentlyContinue , но зафиксировать ошибку с помощью параметра -ErrorVariable

 EXAMPLE: get-adgroup -ErrorAction SilentlyContinue -ErrorVariable MyErrors
 

Вы можете прочитать ошибки и обработать их, вызвав $MyErrors

Предупреждения работают таким же образом

Это может дать альтернативу Try/Catch .

Комментарии:

1. При попытке ответить на этот вопрос вместо этого я получаю отдельную ошибку системы «Get-ADGroup: не удается преобразовать». Коллекции. ArrayList’ в систему типа’. Строка ‘требуется параметром ‘ErrorVariable’. Указанный метод не поддерживается.’

2. Извините, что я пропустил $perm из команды, я думаю, эта работа лучше? Get-ADGroup $perm -ErrorAction SilentlyContinue -ErrorVariable $MyErrors

Ответ №2:

Спасибо тебе @pwnosh, ты гений!

Я изменил строку 20 на

   if($errResults  = try {$checkgroup = Get-ADGroup $perm -ErrorAction Stop } catch {[Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]}){
 

Эта строка также вводит пользователей в мой CSV, но затем второй скрипт в любом случае очищает их с помощью

 $results = @()
foreach($Group in ($Groups = Import-csv C:ADExcelpermissions.csv)){
    $groupname = $Group.'AD Group'
    Write-Host "Confirming $groupname group name in AD."
    $results  = get-adgroup -Filter "name -like '$groupname'" -Properties * -SearchBase "dc=domain,dc=local,dc=net" | select name
}
$results | Export-Csv C:ADExcelADGroups.csv -NoTypeInformation