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

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

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

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

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));

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 параметр. Чтобы использовать переданные значения, вы можете объявить их в ScriptBlock"s param блок, или вы можете использовать $args автоматическая переменная. Итак, на самом деле вам нужен эквивалент следующего кода PowerShell:

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

В C# это было бы так:

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});
Другие вопросы по тегам