Скрытие ошибок при использовании Get-ADGroup - программирование
Подтвердить что ты не робот

Скрытие ошибок при использовании Get-ADGroup

Я работаю над script, который будет создавать новую группу, если она не существует. Я использую Get-ADGroup, чтобы убедиться, что группа не существует, используя следующую команду:

$group = get-adgroup $groupName -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue 

Но когда я делаю, я получаю следующую ошибку (я удалил любые данные, относящиеся к домену, из этой ошибки):

Get-ADGroup : Cannot find an object with identity: '*group name*' under: '*domain*'.
At U:\Scripts\Windows\Create-FolderAccessGroup.ps1:23 char:24
+ $group = get-adgroup <<<< $groupName -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
    + CategoryInfo          : ObjectNotFound: (y:ADGroup) [Get-ADGroup], ADIdentityNot
   FoundException
    + FullyQualifiedErrorId : Cannot find an object with identity: '' under: ''.,Microsoft.ActiveDirectory.Management.Commands.GetADGroup

Я предположил, что установка ErrorAction и WarningAction для SilentlyContinue не позволит этой ошибке отображаться, но она не имеет.

4b9b3361

Ответ 1

 try {get-adgroup <groupname>}
  catch  {
      <make new group>
     }

Ответ 2

Я считаю, что это лучше всего работает:

$Group = Get-ADGroup -Filter {SamAccountName -eq $GroupName}

Если фильтр не возвращает никаких результатов, тогда $Group просто устанавливается в $null и сообщение об ошибке не генерируется. Кроме того, поскольку имя учетной записи SAM должно быть уникальным в Active Directory, нет риска того, что $Group будет настроен на массив из более чем одного объекта.

Я считаю, что использование -Filter для получения группы, а не -Identity работает очень хорошо, проверяя наличие групп (или пользователей) в операторах If. Например:

If (Get-ADGroup -Filter {SamAccountName -eq $GroupName})
{
    Add-ADGroupMember -Identity $GroupName -Members $ListOfUserSamAccountNames
}
Else
{
    Write-Warning "Users could not be added to $GroupName because $GroupName
    does not exist in Active Directory."
}

Я считаю, что логически логически легче (если группа существует, добавьте пользователей, а если нет, отобразите сообщение), чем предложение mjolinor try/catch с помощью командлета Get-ADGroup с параметром -Identity, Рассмотрим метод try/catch, сделав то же, что и выше, используя параметр -Identity:

Try
{
    Get-ADGroup -Identity $GroupName
    Add-ADGroupMember -Identity $GroupName -Members $ListOfUserSamAccountNames
}
Catch
{
    Write-Warning "Users could not be added to $GroupName because $GroupName
    does not exist in Active Directory."
}

Вы видите, если какая-либо из команд в блоке try выдает завершающую ошибку. Если это так, это означает, что группа не существует и будет перемещаться и обрабатывать команды (ов) в блоке catch. Он будет работать, но я не думаю, что try/catch здесь также протекает, по логике, по сравнению с if/else.

Не поймите меня неправильно, mjolinor - гений PowerShell. Это просто, что в этом случае я не думаю, что его решение является лучшим.

Ответ 3

@mjolinor дает хороший ответ, но я думаю, что некоторые объяснения также могут помочь.

Windows PowerShell предоставляет два механизма для сообщения об ошибках: один механизм для прерывания ошибок и другой механизм для ошибок, не связанных с завершением.

Внутренний код CmdLets может вызывать метод ThrowTerminatingError, когда возникает ошибка, которая не позволяет или не позволяет командлету продолжать обрабатывать свои входные объекты. Создатель script может использовать исключение, чтобы поймать эту ошибку.

Внутренний код CmdLets может вызывать метод WriteError для сообщения об ошибках без завершения, когда командлет может продолжить обработку входных объектов. После этого сценарий script может использовать -ErrorAction для скрытия сообщений.

Ответ 4

Я понимаю, что это старо, но у меня также была эта проблема и она была решена следующим образом:

Если (Get-ADObject -Filter {objectClass -eq "Group -and samAccountName -eq" groupname "}) {//do stuff//}