2017-02-06 28 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 для динамического передачи аргументов командлетов, например:

$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

Итак, используя второй пример, если я добавлю '@ optional_params' в конец каждого' Invoke-WMIMethod', то он добавит только '-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

 Смежные вопросы

  • Нет связанных вопросов^_^