5

スクリプトをダウンロードして実行するWindowsサービスがあります。

私は自分のWindowsサービスをより安全にし、署名されたPowerShellスクリプトのみを受け入れるようにしようとしています。

サーバーでSet-ExecutionPolicyAllSignedコマンドを実行しましたが、これはWindowsのPowerShellコマンドプロンプトで機能します。

ただし、set-executionpolicyがrestrictedに設定されている場合でも、私のコードは署名付きスクリプトと署名なしスクリプトの両方を実行します。

私は2つのアプローチを試しました:

RunspaceConfiguration 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();
                  }

どちらの状況でも、コードは署名されていないスクリプトも実行します。

私は何かを逃したことがありますか?

4

1 に答える 1

1

私は解決策を見つけました。コードが署名されていないスクリプトを実行するのを制限する唯一の方法は、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;
    }

ありがとう、

ダン

于 2013-04-10T23:19:11.720 に答える