2014-10-08 87 views
0

我正在使用PowerShell脚本更改本地帐户名称。当然,第一步是检查账号是否存在:使用ADSI处理错误

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

如果账号存在,那就没问题了。但是,如果没有,那么我得到这个错误:

format-default : The following exception occurred while retrieving member >"distinguishedName": "The user name could not be found." + CategoryInfo : NotSpecified: (:) [format-default], ExtendedTypeSystemException + FullyQualifiedErrorId : CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand

我无法弄清楚如何寻找这个错误,报告类似“$使用oldName未找到”,然后继续。从我所知道的情况来看,它并没有被引入错误变量,所以我无法搜索“无法找到用户名”字符串。 Try-Catch-Finally似乎忽略了这个错误。

我承认我在错误处理方面很弱。看起来有无数种方法可能导致失败,并且我的用户在使用我的脚本时总是会找到新的方法。

+0

我添加了一个可能有帮助的链接问题的答案,在这里:https://stackoverflow.com/questions/43145567/powershell-directoryservice-object-error-not-catched-neither-trapped/43617003 – 2017-04-26 09:24:46

回答

1

看起来命令实际上是抛出一个终止错误。从参阅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 
+0

谢谢,诺亚。但是我没有看到你的第一行与我的区别。 – 2014-10-08 20:26:01

+0

我以为你想知道如何处理错误情况?第一行是无关紧要的,这只是告诉你如何处理错误,放入你的行,它会做同样的事情。我在测试时改变了它。 – 2014-10-08 20:27:29

+0

好吧,没关系。寻找$ user.name就是它所需要的。谢谢你,诺亚。 – 2014-10-08 20:32:10

0

您可以检查以这种方式

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

它返回一个布尔值是否存在一个用户名。如果用户存在,您将变为true,否则为false。

+0

这也适用于PortableDevil,除了我需要消除$ Server和$ UserName之间的反斜杠之一才能使其正常工作。谢谢。 – 2014-10-10 17:27:20