处理域加入错误

时间:2016-03-16 10:30:54

标签: powershell

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

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

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

但是,会有各种错误返回。无论PC是否脱离网络,用户ID或密码不正确,还是域规范,我都希望能够处理这些错误并显示有意义的内容。

其中一个错误返回

Add-Computer : This command cannot be executed on target computer('PCName') due to
following error: Logon failure: unknown user name or bad password.
At line:1 char:13
+ Add-Computer <<<<  -DomainName $Domain -Credential(get-credential); 
    + CategoryInfo          : InvalidOperation: (PCNAME:String) [Add-Computer], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.AddComputerCommand

使用错误处理程序,比如VBA,给出错误ID,并使用if语句,你可以用它做一些事情。

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

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

2 个答案:

答案 0 :(得分:2)

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

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),否则错误将无法终止,因此无法捕获。

答案 1 :(得分:0)

将它与-ErrorAction参数一起使用:

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

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

$computerError[0]

要反复使用相同的变量,请使用var名称前面的+:

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
}