我正在尝试在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#代码的问题在于,您将identity
和user
传递为Invoke-Command
的参数。它或多或少等效于以下PowerShell代码:
Invoke-Command -ScriptBlock {
Get-MailboxPermission -Identity ${identity} -User ${user}
} -identity $mailbox -user $user
而且由于
Invoke-Command
没有identity
和user
参数,因此在运行它时将失败。要将值传递给远程 session ,您需要将它们传递给-ArgumentList
参数。要使用传递的值,可以在ScriptBlock
的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});
关于c# - 使用C#执行Powershell命令时在ScriptBlock中设置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40013482/