Ответ 1
try {get-adgroup <groupname>}
catch {
<make new group>
}
Я работаю над 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 не позволит этой ошибке отображаться, но она не имеет.
try {get-adgroup <groupname>}
catch {
<make new group>
}
Я считаю, что это лучше всего работает:
$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. Это просто, что в этом случае я не думаю, что его решение является лучшим.
@mjolinor дает хороший ответ, но я думаю, что некоторые объяснения также могут помочь.
Windows PowerShell предоставляет два механизма для сообщения об ошибках: один механизм для прерывания ошибок и другой механизм для ошибок, не связанных с завершением.
Внутренний код CmdLets может вызывать метод ThrowTerminatingError
, когда возникает ошибка, которая не позволяет или не позволяет командлету продолжать обрабатывать свои входные объекты. Создатель script может использовать исключение, чтобы поймать эту ошибку.
Внутренний код CmdLets может вызывать метод WriteError
для сообщения об ошибках без завершения, когда командлет может продолжить обработку входных объектов. После этого сценарий script может использовать -ErrorAction
для скрытия сообщений.
Я понимаю, что это старо, но у меня также была эта проблема и она была решена следующим образом:
Если (Get-ADObject -Filter {objectClass -eq "Group -and samAccountName -eq" groupname "}) {//do stuff//}