只运行c#中签名的powershell脚本

本文关键字:powershell 脚本 运行 | 更新日期: 2023-09-27 18:05:39

我有一个windows服务,下载一个脚本,然后运行它。

我一直在努力使我的windows服务更安全,使它只接受签名的power-shell脚本。

我已经在服务器上运行了Set-ExecutionPolicy AllSigned命令,这在windows power shell命令提示符中有效。

但是,我的代码仍然运行有符号和无符号脚本,即使set-executionpolicy设置为restricted。

我试过两种方法:

RunspaceConfiguration = RunspaceConfiguration. create ();

        Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
        runspace.Open();
        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
        Pipeline pipeline = runspace.CreatePipeline();         
        pipeline.Commands.AddScript(@"Set-ExecutionPolicy AllSigned");
        pipeline.Commands.AddScript(@"Get-ExecutionPolicy");
        pipeline.Commands.AddScript(script);
        Collection<PSObject> results = pipeline.Invoke();

另一种方法:

using (PowerShell ps = PowerShell.Create())
                {
                    ps.AddCommand("Set-ExecutionPolicy").AddArgument("Restricted");
                    ps.AddScript("Set-ExecutionPolicy Restricted");
                    ps.AddScript(script);
                    Collection<PSObject> results = ps.Invoke();
                  }

在两种情况下,代码也运行无符号脚本。

我错过什么了吗?

只运行c#中签名的powershell脚本

我找到了解决方案。限制代码运行未签名脚本的唯一方法是使用Get-AuthenticodSignature:

自己检查脚本。
 public bool checkSignature(string path)
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(String.Format("Get-AuthenticodeSignature '"{0}'"", path));
        Collection<PSObject> results = pipeline.Invoke();
        Signature check = (Signature)results[0].BaseObject;
        runspace.Close();
        if (check.Status == SignatureStatus.Valid)
        {
            return true;
        }
        return false;
    }

谢谢,丹