2012-11-16 51 views
0

我有一个MVC4页面,它调用了一段PowerShell。不过,由于我使用的模块没有签名,所以我遇到了问题,因此我必须启用Unrestricted策略。我如何强制powershell孩子使用无限制政策。我已经在我的脚本中启用了它,但它被忽略。另外,当我尝试在代码中设置策略时,会引发异常。从C#启用PowerShell执行策略

using (Runspace myRunSpace = RunspaceFactory.CreateRunspace()) 
    { 
     myRunSpace.Open(); 

     using (PowerShell powerShell = PowerShell.Create()) 
     { 
      powerShell.Runspace = myRunSpace; 
      powerShell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted"); 
      powerShell.AddScript(script); 

      objectRetVal = powerShell.Invoke(); 
     } 
    } 

感谢, 铝

+1

什么异常说呢? – SLaks

+0

是否生成自签名证书,将Web应用程序的身份设置为信任该证书,然后签署脚本帮助? (似乎没有办法用'PowerShell.exe'的'-ExecutionPolicy'参数创建'Runspace'。 – Richard

+0

感谢您的指针,我在注册表中为用户和计算机设置了我的执行策略然后我自己签署了我使用的模块以及我正在运行的脚本 – albal

回答

6

如果你只需要运行没有交互的一个脚本,您可以通过在命令提示符下执行策略设置像这样:

string command = "/c powershell -executionpolicy unrestricted C:\script1.ps1"; 
System.Diagnostics.Process.Start("cmd.exe",command); 
+0

好的想法 - 这让我得到了现在需要的另一个发现。 – albal

0

我的解决办法自我签署我从IIS Express运行的模块和脚本。我仍在开发并发现IIS Express没有看到您可能已安装在\ System32 \ WindowsPowerShell ... \ Modules Path中的所有模块。我将我使用的模块移动到另一个驱动器,并使用该位置将模块导入到我的脚本中。

感谢您的答复:-)

0

这是一样的@ kravits88的答案,但不显示CMD:

static void runPowerShellScript(string path, string args) { 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = @"/c powershell -executionpolicy unrestricted " + path + " " + args; 
     startInfo.UseShellExecute = false; 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     startInfo.CreateNoWindow = true; 
     Process process = new Process(); 
     process.StartInfo = startInfo; 
     process.Start(); 
    }