C# Windows Server 2012-从C运行powershell脚本时拒绝访问注册表
我正在构建一个必须运行一些powershell脚本的C应用程序 虽然该应用程序在我所有同事的计算机上都能正常工作,但我在Windows Server 2012虚拟机上无法正常工作 每当我在应用程序中运行脚本时,都会收到以下错误消息: 对注册表项“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell”的访问被拒绝。要更改默认LocalMachine作用域的执行策略,请使用“以管理员身份运行”选项启动Windows PowerShell。要更改当前用户的执行策略,请运行Set ExecutionPolicy-Scope CurrentUser 我明确地说,我经历了很多话题,尝试了很多没有解决我问题的事情 我试过: 设置executionpolicy不受限制 设置executionpolicy unrestricted-Scope-CurrentUser 当然,我以管理员身份在运行powershell应用程序的x64和x86 powershell实例上运行了这些命令 现在奇怪的是,我在直接通过powershell窗口运行脚本时没有遇到任何问题,只有在通过C应用程序运行脚本时才会发生错误 以下是相关代码:C# Windows Server 2012-从C运行powershell脚本时拒绝访问注册表,c#,.net,powershell,windows-server-2012,C#,.net,Powershell,Windows Server 2012,我正在构建一个必须运行一些powershell脚本的C应用程序 虽然该应用程序在我所有同事的计算机上都能正常工作,但我在Windows Server 2012虚拟机上无法正常工作 每当我在应用程序中运行脚本时,都会收到以下错误消息: 对注册表项“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell”的访问被拒绝。要更改默认LocalMachine作用域的执行策略,请使用“以管理员身
public static List<string> RunPowerShellScript(Sequence sq, Script script)
{
try
{
script.Results = new List<Result>();
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
RunspaceInvoke runspaceInvoker = new RunspaceInvoke(runspace);
//runspaceInvoker.Invoke("set-executionpolicy bypass");
runspaceInvoker.Invoke("set-executionpolicy unrestricted");
//Create a pipeline to send variables
Pipeline pipeline = runspace.CreatePipeline();
//Create a command
Command myCommand = new Command(Properties.Settings.Default.Scripts + "\\" + script.ScriptName + ".ps1", false);
foreach (Parameter p in script.Parameters)
{
CommandParameter param = new CommandParameter(p.ParameterName, sq.GetUpdatedParameter(p));
myCommand.Parameters.Add(param);
}
pipeline.Commands.Add(myCommand);
//Return the output from the script
Collection<PSObject> returnObjects = pipeline.Invoke();
runspace.Close();
List<string> output = new List<string>();
foreach (PSObject po in returnObjects)
{
if (po != null)
output.Add(po.ToString());
}
return output;
}
catch(Exception e)
{
return new List<string> { e.Message, "1" };
}
}
也许这可以解决你的问题: 1-打开Visual Studio az管理员 2-使用visualstudio打开您的项目解决方案
3-运行它若要解决此问题,请以管理员身份打开powershell,然后再次运行该命令:
Set-ExecutionPolicy Unrestricted
这可能与您没有在运行执行策略更改的同一实例中运行powershell脚本有关,请尝试powershell–ExecutionPolicy Bypass-文件C:\Path\to\script。您将希望以shell命令CMD而不是powershell命令的形式运行此命令,它将打开powershell脚本。我不确定您的建议是什么,我是否应该更改我的c代码以从CMD而不是使用RunspaceFactory运行脚本?因为,它确实可以从cmd工作,但这不是新的,它也可以从powershell窗口工作,但不能从c applicationUse System.Diagnostics.Process.StartCMD.exe、powershell-ExecutionPolicy Bypass-File c:\Path\to\Script;'这将打开一个cmd并运行带执行策略旁路的Powershell脚本我必须尝试一下,这对于我的代码和参数的动态传递来说并不方便,但我将在Powershell窗口中提供一个shotUse Get ExecutionPolicy-List,以验证您的Windows服务器域没有使用组策略覆盖您的策略更改。如果是的话,那么在不要求域管理员更改GPL的情况下,您真的无法做太多的更改。不幸的是,windows服务器不是开发人员机器,应用程序必须在没有visual studio帮助的情况下运行