Установите параметры в ScriptBlock при выполнении команд Powershell с помощью C#

Я пытаюсь выполнить следующую команду powershell на С#

Invoke-Command -Session $session -ScriptBlock {
  Get-MailboxPermission -Identity ${identity} -User ${user}
}

Я попытался использовать следующий код С#, но не смог установить параметры личности и пользователя.

var command = new PSCommand();
command.AddCommand("Invoke-Command");
command.AddParameter("ScriptBlock", ScriptBlock.Create("Get-MailboxPermission -Identity ${identity} -User ${user}"));
command.AddParameter("identity", mailbox);
command.AddParameter("user", user);

Когда я жестко кодирую значения при создании ScriptBlock, он работает нормально. Как я могу установить параметры динамически.

Есть ли лучший способ сделать это, а не конкатенировать значения, как показано ниже.

command.AddParameter("ScriptBlock", ScriptBlock.Create("Get-MailboxPermission -Identity " + mailbox + " -User " + user));

person Yasitha    schedule 13.10.2016    source источник
comment
Спасибо @PetSerAl Именно то, что я искал. Почему бы вам не опубликовать это как ответ? Может помочь, кто ищет такое же решение.   -  person Yasitha    schedule 13.10.2016


Ответы (1)


Проблема с вашим кодом C# заключается в том, что вы передаете identity и user в качестве параметров для Invoke-Command. Это более или менее эквивалентно следующему коду PowerShell:

Invoke-Command -ScriptBlock {
    Get-MailboxPermission -Identity ${identity} -User ${user}
} -identity $mailbox -user $user

А так как Invoke-Command не имеет параметров identity и user, то при запуске произойдет сбой. Чтобы передать значения в удаленный сеанс, вам нужно передать их в параметр -ArgumentList. Чтобы использовать переданные значения, вы можете объявить их в блоке param ScriptBlock или использовать автоматическую переменную $args. Итак, на самом деле вам нужен эквивалент следующего кода PowerShell:

Invoke-Command -ScriptBlock {
    param(${identity}, ${user})
    Get-MailboxPermission -Identity ${identity} -User ${user}
} -ArgumentList $mailbox, $user

В С# это будет так:

var command = new PSCommand();
command.AddCommand("Invoke-Command");
command.AddParameter("ScriptBlock", ScriptBlock.Create(@"
    param(${identity}, ${user})
    Get-MailboxPermission -Identity ${identity} -User ${user}
"));
command.AddParameter("ArgumentList", new object[]{mailbox, user});
person user4003407    schedule 14.10.2016