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

您的c#代码的问题是您传递identityuser作为Invoke-Command的参数。它或多或少相当于下面的PowerShell代码:

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

并且由于Invoke-Command没有identityuser参数,当您运行它时,它将失败。要将值传递给远程会话,需要将值传递给-ArgumentList参数。要使用传递的值,您可以在ScriptBlockparam块中声明它们,或者您可以使用$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});

相关内容

  • 没有找到相关文章

最新更新