使用C#执行Powershell命令时在ScriptBlock中设置参数

时间:2016-10-13 06:07:45

标签: c# powershell scriptblock

我正在尝试在C#

中执行以下powershell命令
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 个答案:

答案 0 :(得分:2)

您的C#代码的问题在于您将identityuser作为Invoke-Command的参数传递。它或多或少等同于以下PowerShell代码:

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

由于Invoke-Command没有identityuser参数,因此当您运行它时,它将失败。要将值传递给远程会话,您需要将它们传递给-ArgumentList参数。要使用传递的值,您可以在ScriptBlock的{​​{1}}块中声明它们,也可以使用param自动变量。因此,实际上您需要等效的以下PowerShell代码:

$args

在C#中就是这样:

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