无论是否提供凭证,我都可以使用相同的WMI命令吗?

无论是否提供凭证,我都可以使用相同的WMI命令吗?

问题描述:

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合并到一个代码块中吗?

使用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

它看起来并不像当前安全上下文可用作凭证对象(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