使用 Get-ADGroup 时隐藏错误

问题描述 投票:0回答:4

我正在编写一个脚本,如果它不存在,它将构建一个新组。我使用 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 会阻止显示此错误,但事实并非如此。

powershell active-directory
4个回答
24
投票

我发现这个效果最好:

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

如果过滤器没有返回结果,则 $Group 简单地设置为 $null 并且不会生成错误消息。此外,由于 SAM 帐户名称在 Active Directory 中必须是唯一的,因此不存在将 $Group 设置为包含多个对象的数组的风险。

我发现在检查 If 语句中是否存在组(或用户)时,使用 -Filter 来获取组而不是 -Identity 效果非常好。例如:

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 建议使用带有 -Identity 参数的 Get-ADGroup cmdlet 进行 try/catch 的建议更容易逻辑处理(如果组存在,则添加用户;如果不存在,则显示一条消息)。考虑使用 -Identity 参数执行与上面相同的操作的 try/catch 方法:

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 相比,从逻辑上讲,这里的 try/catch 流程并不好。

别误会我的意思,mjolinor 是一位 PowerShell 天才。只是在这种情况下我不认为他的解决方案是最好的。


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

6
投票
@mjolinor 给出了很好的答案,但我认为一些解释也可以有所帮助。

Windows PowerShell 提供两种报告错误的机制:一种用于“终止错误”的机制,另一种用于“非终止”错误的机制。

当发生不允许或不应允许 cmdlet 继续处理其输入对象的错误时,内部 CmdLets 代码可以调用 ThrowTerminatingError 方法。脚本编写者可以使用异常来捕获这些错误。 当 cmdlet 可以继续处理输入对象时,内部 CmdLets 代码可以调用 WriteError

方法来报告

non-termination

 错误。然后,脚本编写者可以使用 
-ErrorAction

选项来隐藏消息。


我意识到这已经很旧了,但我也遇到了这个问题并像这样解决了:

If (Get-ADObject -Filter {objectClass -eq "Group -and samAccountName -eq "groupname"}) { //do stuff// }


0
投票
尝试 {New-ADGroup -Name "$NameGROUP -GroupScope Global -Path "$PathOU"} catch { }

© www.soinside.com 2019 - 2024. All rights reserved.