#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