2017-02-06 22 views
-1

WMI命令可以接收顯式憑據作爲參數(-Credential標誌),或者在未提供憑據的情況下在運行腳本的用戶的安全上下文中運行。無論是否提供憑證,我都可以使用相同的WMI命令嗎?

現在,我的劇本是這樣的:

if ($Creds) { # if the user provided credentials 
    Invoke-WMIMethod -Credential $Creds <...something...> 
    ... hundreds more lines of Invoke-WMIMethod code ... 
else { # user did not supply credentials, use current security context 
    Invoke-WMIMethod <...something...> 
    ... same exact hundreds of lines of Invoke-WMIMethod code, without -Credential .... 
} 

換句話說,唯一的區別是-Credential標誌。有什麼方法可以將這個巨大的if-else合併到一個代碼塊中嗎?

回答

2

使用splatting的動態參數傳遞給cmdlet的,就像這樣:

$params = @{ 
    'Class'  = 'Win32_Foo' 
    'ComputerName' = 'bar' 
    ... 
} 

if ($cred) { 
    $params['Credential'] = $cred 
} 

Invoke-WmiMethod @params 

或像這樣:

$optional_params = @{} 
if ($cred) { 
    $optional_params['Credential'] = $cred 
} 

Invoke-WmiMethod -Class Win32_Foo -Computer bar ... @optional_params 

該技術應該是already be available in PowerShell v2.0

+0

因此,使用第二個例子,如果我在每個'Invoke-WMIMethod'的末尾添加了'@ optional_params',那麼它只會添加'-Credential $ Cred',如果我給它賦值像你一樣? – AlwaysQuestioning

+0

你如何才能*嘗試*看看自己? –

+0

我問的原因是因爲性能影響。我想這比其他解決方案增加了更多的開銷。 – AlwaysQuestioning

0

它看起來並不像當前安全上下文可用作憑證對象(ref this question)。

幸運的是,invoke-wmimethod使用憑證屬性似乎表現得好像在提供空值​​時未指定它一樣。因此,如果$cred爲空,那麼invoke-wmimethod -credential $cred <...something...>的行爲應該與invoke-wmimethod <...something...>的行爲相同。

現在,更好的做法可能是保留if else並刪除任何重複的代碼。因此,而不是:

if ($Creds) { # if the user provided credentials 
    Invoke-WMIMethod -Credential $Creds <...something...> 
    ... hundreds more lines of code ... 
else { # user did not supply credentials, use current security context 
    Invoke-WMIMethod <...something...> 
    ... same exact hundreds of lines of code .... 
} 

你必須:

if ($Creds) { # if the user provided credentials 
    $myresults = Invoke-WMIMethod -Credential $Creds <...something...> 
else { # user did not supply credentials, use current security context 
    $myresults = Invoke-WMIMethod <...something...> 
} 


    ... hundreds more lines of code using $myresults... 
+0

那麼,它會產生50次憑據的彈出式提示(每個Invoke-WMIMethod命令一個,我想象一下)。所以這不會工作。但是,一旦我取消了所有這些,似乎會產生預期的產出。有沒有辦法我可以禁用提示,或者(更好)提供一個不會產生提示的值? – AlwaysQuestioning

+0

如果用戶不提供證書,可以嘗試將'$ Cred'變量設置爲'$ null'。 –

+0

也沒有工作。我會繼續尋找解決方案。 – AlwaysQuestioning

相關問題