Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Server 2012-从C运行powershell脚本时拒绝访问注册表_C#_.net_Powershell_Windows Server 2012 - Fatal编程技术网

C# Windows Server 2012-从C运行powershell脚本时拒绝访问注册表

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作用域的执行策略,请使用“以管理员身

我正在构建一个必须运行一些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应用程序运行脚本时才会发生错误

以下是相关代码:

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帮助的情况下运行