使用ADSI处理错误

时间:2014-10-08 16:57:31

标签: powershell adsi

我正在使用PowerShell脚本来更改本地帐户名称。当然,第一步是检查帐户是否存在:

$user=[ADSI]"WinNT://$server/$oldName,user"

如果帐户存在,则没问题。但如果它没有,那么我得到这个错误:

  

format-default:检索成员>" distinguishedName"时出现以下异常:"找不到用户名。"      + CategoryInfo:NotSpecified:(:) [format-default],ExtendedTypeSystemException      + FullyQualifiedErrorId:   CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand

我无法弄清楚如何查找该错误,报告类似" $ oldName not found"并继续。据我所知,它并没有被抛入一个错误变量,所以我无法搜索到一个"无法找到用户名"串。 Try-Catch-Finally似乎忽略了错误。

我承认我在错误处理方面表现不佳。似乎有无数种方法可以使某些东西失败,而且我的用户在使用我的脚本时总能找到新的东西。

3 个答案:

答案 0 :(得分:2)

看起来该命令实际上是在抛出一个终止错误。来自about_preference_variables

" $ ErrorActionPreference和ErrorAction公共参数都没有 影响Windows PowerShell如何响应终止错误(那些 停止cmdlet处理)。"

因此,当命令运行时,即使在继续尝试处理catch块之前,它也会终止脚本。

有趣的是,如果将其置于变量中,则此行为将停止发生。我很想知道是否有人有更好的答案,但看起来我能看到的解决方案将是基于变量结果的if语句。

$User = [ADSI]"WinNT://badserver/Name,user" 
If (! $User.Name)
{
    Throw "Issue retrieving user"
}

#Rest of script can continue here

答案 1 :(得分:0)

您可以通过这种方式检查用户名是否存在

[ADSI]::Exists("WinNT://$Server/$UserName")

返回一个布尔值。如果用户存在,则为true,否则为false。

答案 2 :(得分:0)

我通过将命令包装在脚本块中并使用Invoke-Command解决了类似的问题。

$ChangePassword = {([adsi]"WinNT://domain/$Username,user").ChangePassword($CurrentPassword, $NewPassword)}
try {
    Invoke-Command -ScriptBlock $ChangePassword -ErrorAction Stop
}
catch {
    # Error handling code
}