【问题标题】:Hiding Errors When Using Get-ADGroup使用 Get-ADGroup 时隐藏错误
【发布时间】:2011-09-12 12:32:36
【问题描述】:

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

【问题讨论】:

  • 我不想将此作为答案发布,因为我不知道它是否会起作用,而且我现在无法对其进行测试,但请尝试将其传递给 Out-Null。
  • @EBGreen 所以$group = get-adgroup $groupName | out-null?
  • 这就是我会尝试的方法,但正如我所说的,我不确定它是否会起作用。
  • 幸好我没有把它作为答案:)
  • @EBGreen - 用于输出。例如,如果您执行"blah" | out-null,则 blah 不会传递到管道(或控制台)与错误/异常无关。

标签: powershell active-directory


【解决方案1】:

我发现这样效果最好:

$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 天才。只是在这种情况下,我认为他的解决方案不是最好的。

【讨论】:

  • 我也更喜欢使用-filter,它可以使代码更简洁。我总是看到人们过于频繁地使用 try/catch,而他们应该考虑像这样更优雅的策略。
【解决方案2】:
 try {get-adgroup <groupname>}
  catch  {
      <make new group>
     }

【讨论】:

  • 感谢您,小提示,如果您不希望将 get-adgroup 的输出转储到控制台,请使用 $x = get-adgroup
  • 您也可以将输出重定向到 $null,或通过管道将其输出到 null。
【解决方案3】:

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

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

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

当 cmdlet 可以继续处理输入对象时,内部 CmdLets 代码可以调用WriteError 方法来报告非终止错误。然后脚本编写者可以使用-ErrorAction 选项隐藏消息。

【讨论】:

  • 谢谢,mjolinor 有技术上正确的答案,你的解释很有帮助。
【解决方案4】:

我意识到这是旧的,但我也有这个问题并像这样解决它:

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

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2019-06-16
    • 2018-01-04
    • 2013-10-05
    • 2021-08-06
    相关资源
    最近更新 更多