【问题标题】:Handling Domain Join Errors处理域加入错误
【发布时间】:2016-03-16 10:30:54
【问题描述】:

我创建了一个基本脚本来将 PC 添加到域中。虽然这可行,但仍有出错的余地,我想进行一些错误处理。

do {
  Add-Computer -DomainName $Domain -Credential(get-credential)
} while (!$?)

使用 !$?在最后一个命令不成功时运行 while 循环。

但是,会返回各种错误。无论 PC 是否处于网络断开状态、用户 ID 或密码不正确,或者域规范,我都希望能够处理这些错误并显示一些有意义的东西。

返回的错误之一

Add-Computer : 此命令无法在目标计算机('PCName') 上执行,因为
以下错误:登录失败:未知用户名或密码错误。
在行:1 字符:13
+ 添加计算机 

在假设 VBA 中使用错误处理程序时,会给出一个错误 ID,并使用 if 语句可以对它进行一些操作。

上述错误中的 FullyQualifiedErrorID 在由于不同原因收到的所有错误中都是相同的,所以我不相信我可以使用它。

如何捕获特定错误“登录失败:未知用户名或密码错误”。或其他错误并显示有意义的消息,以便管理员采取适当的措施?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果没有别的,您应该能够使用错误消息来区分错误:

    do {
      $joined = $true
      $cred = Get-Credential
      try {
        Add-Computer -DomainName $Domain -Credential $cred -ErrorAction Stop
      } catch {
        $joined = $false
        switch -regex ($_.Exception.Message) {
          '.*unknown user name.*'     { ... }
          '.*domain does not exist.*' { ... }
          ...
          default                     { 'Unexpected error' }
        }
      }
    } until ($joined)
    

    请注意,您需要将错误操作设置为 Stop (-ErrorAction Stop),否则错误将不会终止,因此无法捕获。

    【讨论】:

    • 感谢您的回复。我的错误被捕获,但我的 do while 循环被完全忽略。在这种情况下最好使用真/假标志吗?将变量设置为“False”,如果发现错误,将变量设置为“True”并将其用作我的循环断路器?
    • 使用catch 块中的语句,循环条件中$? 的值可能不是您所期望的。尝试使用状态变量(请参阅更新的答案)。
    • 您好!抱歉,终于有时间回到这个问题上。您的更正已经奏效,并且为此循环使用真/假标志已经奏效。感谢您的帮助
    【解决方案2】:

    与 -ErrorAction 参数一起使用:

    Add-Computer ... -ErrorAction SilentlyContinue -ErrorVariable computerError
    

    ErrorVariable 是一个数组,因此生成的错误将存储在:

    $computerError[0]
    

    要反复使用同一个变量,请在变量名前使用 +:

    Add-Computer -ErrorVariable +manyErrors
    

    最后一个错误永远是:

    $manyErrors[$manyerrors.count - 1]
    

    如果有相应的 Win32 错误代码,则要获取最后一个错误代码,然后运行以下命令

    $manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode
    

    然后,如果您收集潜在的错误代码,您可以执行以下操作

    if ($manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode -eq 1)
    {
    Write-Host error happened
    }
    elseif ($manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode -eq 2)
    Write-Host other error happened
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2011-11-09
      • 2016-08-02
      • 2013-05-02
      • 2013-04-16
      相关资源
      最近更新 更多