【问题标题】:Handling errors with ADSI使用 ADSI 处理错误
【发布时间】:2014-10-08 16:57:31
【问题描述】:

我正在编写一个 PowerShell 脚本来更改本地帐户名称。当然,第一步是检查账号是否存在:

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

如果帐户存在,则没有问题。但如果没有,那么我会收到此错误:

format-default:检索成员时发生以下异常>“distinguishedName”:“找不到用户名。” + CategoryInfo : NotSpecified: (:) [format-default], ExtendedTypeSystemException + 完全限定错误 ID: CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand

我不知道如何查找该错误,报告“$oldName not found”之类的内容并继续。据我所知,它没有被扔进错误变量中,所以我无法搜索“找不到用户名”字符串。 Try-Catch-Finally 似乎忽略了这个错误。

我承认我在错误处理方面很薄弱。似乎有无数种方法会导致失败,而我的用户在使用我的脚本时总是会找到新的方法。

【问题讨论】:

标签: powershell adsi


【解决方案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

【讨论】:

  • 谢谢,诺亚。但我看不出你的第一行和我的有什么不同。
  • 我以为您想了解如何处理错误情况?第一行无关紧要,这只是向您展示如何处理错误,放入您的行,它会做同样的事情。我只是在测试时更改了它。
  • 好吧,没关系。寻找 $user.name 就可以了。谢谢你,诺亚。
  • 让我澄清一下(为其他人和我未来的自己。)我正在搜索的错误只是 $user,而不是 $user.name
【解决方案2】:

这样可以检查用户名是否存在

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

它返回一个布尔值。如果用户存在,则为真,否则为假。

【讨论】:

  • PortableDevil 也可以,但我需要消除 $Server 和 $UserName 之间的反斜杠之一才能使其正常工作。谢谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2011-01-24
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多