2014-10-08 119 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