使用来自C#抛出异常的invoke-command

时间:2014-01-29 06:05:28

标签: c# powershell powershell-remoting invoke-command executionpolicy

我在powershell终端尝试了以下案例:

invoke-command -connectionuri "http://FullMachineName/wsman" -configuration "http
://schemas.microsoft.com/powershell/Microsoft.PowerShell" -credential "MachineName\Administrator" -filepath "C:\scripts\get
Users.ps1"

这很好用。 但是当我通过C#中的invoke命令尝试同样的事情时,它会抛出以下异常:

System.Management.Automation.CmdletInvocationException was unhandled
  Message=File C:\scripts\getUsers.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
  Source=System.Management.Automation
  WasThrownFromThrowStatement=false
  StackTrace:
       at System.Management.Automation.Internal.PipelineProcessor.SynchronousExecuteEnumerate(Object input, Hashtable errorResults, Boolean enumerate)
       at System.Management.Automation.Runspaces.LocalPipeline.InvokeHelper()
       at System.Management.Automation.Runspaces.LocalPipeline.InvokeThreadProc()
  InnerException: System.Management.Automation.PSSecurityException
       Message=File C:\scripts\getUsers.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
       Source=System.Management.Automation
       WasThrownFromThrowStatement=false
       StackTrace:
            at System.Management.Automation.AuthorizationManager.ShouldRunInternal(CommandInfo commandInfo, CommandOrigin origin, PSHost host)
            at Microsoft.PowerShell.Commands.PSExecutionCmdlet.GetScriptBlockFromFile(String filePath)
            at Microsoft.PowerShell.Commands.PSExecutionCmdlet.BeginProcessing()
            at Microsoft.PowerShell.Commands.InvokeCommandCommand.BeginProcessing()
            at System.Management.Automation.Cmdlet.DoBeginProcessing()
            at System.Management.Automation.CommandProcessorBase.DoBegin()
       InnerException: System.UnauthorizedAccessException
            Message=File C:\scripts\getUsers.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
            InnerException: 

我正在尝试使用以下代码:

String file = @"C:\scripts\getUsers.ps1";
PowerShell ps = PowerShell.Create()
PSCommand cmd = new PSCommand();                
cmd.AddCommand("Invoke-Command");
cmd.AddParameter("CONNECTIONURI", "http://FullMachineName/wsman");
cmd.AddParameter("FILEPATH",file);
cmd.AddParameter("CREDENTIAL", Credential);            
cmd.AddParameter("CONFIGURATION","http://schemas.microsoft.com/powershell/Microsoft.PowerShell" );
ps.Commands = cmd;                
Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();
ps.Runspace = runSpace;
psObjects = ps.Invoke();

2 个答案:

答案 0 :(得分:3)

此方案中的典型问题是您在PowerShell中为32位或64位版本的PowerShell运行了Set-ExecutionPolicy,但两者都没有。您正在运行的C#程序可能是您没有更改PowerShell的默认执行策略的位置。尝试打开32位和64位PowerShell会话,并确保将执行策略设置为RemoteSigned或Unrestricted。

答案 1 :(得分:0)

尝试使用PowerShell实例不受限制地设置和获取Set-ExecutionPolicy。

 public static ICollection<PSObject> RunScriptText(string scriptFullPath, ICollection<CommandParameter> parameters = null)
        {
            var runspace = RunspaceFactory.CreateRunspace();
            runspace.Open();
            var pipeline = runspace.CreatePipeline();

            using (PowerShell PowerShellInstance = PowerShell.Create())
            {
                var initial = InitialSessionState.CreateDefault();
                Console.WriteLine("Importing ServerManager module");
                initial.ImportPSModule(new[] { "ServerManager" });

                PowerShellInstance.Runspace = runspace;

                PowerShellInstance.AddScript("Set-ExecutionPolicy Unrestricted");
                PowerShellInstance.AddScript("Get-ExecutionPolicy");
                PowerShellInstance.Invoke();

                var cmd = new Command(scriptFullPath);
                if (parameters != null)
                {
                    foreach (var p in parameters)
                    {
                        cmd.Parameters.Add(p);
                    }
                }
                pipeline.Commands.Add(cmd);
                var results = pipeline.Invoke();
                pipeline.Dispose();
                runspace.Dispose();
                return results;
            }
            return null;
        }