Скрытие ошибок при использовании Get-ADGroup - PullRequest
12 голосов
/ 10 июня 2011

Я работаю над сценарием, который создаст новую группу, если она не существует. Я использую 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 будет препятствовать отображению этой ошибки, но это не так.

Ответы [ 4 ]

18 голосов
/ 24 февраля 2012

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

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

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

Я считаю, что использование -Filter для получения группы, а неИдентичность работает очень хорошо при проверке существования групп (или пользователей) в операторах 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 попробовать / поймать с помощьюКомандлет 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.Это будет работать, но я не думаю, что попытка / ловить здесь также идет логически, по сравнению с if / else.

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

17 голосов
/ 10 июня 2011
 try {get-adgroup <groupname>}
  catch  {
      <make new group>
     }
6 голосов
/ 11 июня 2011

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

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

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

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

0 голосов
/ 07 октября 2014

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

If (Get-ADObject -Filter {objectClass -eq "Group -and samAccountName -eq" groupname "}) {// делать вещи //}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...