2013-03-25 10 views
5

スクリプトをダウンロードして実行するWindowsサービスがあります。C言語の署名済みPowerShellスクリプトのみを実行する#

私はWindowsサービスをより安全にし、署名付きの電源シェルスクリプトのみを受け入れるようにしてきました。

私はサーバーでSet-ExecutionPolicy AllSignedコマンドを実行しました。これはWindowsのpower shellコマンドプロンプトで動作します。

しかし、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(); 
        } 

コードも同様に、符号なしのスクリプトを実行します。

私は何かを見逃しましたか?

+0

は、64ビットサーバーですo.s.? –

+0

はい、@ C.Bです。 64ビットWindows Server 2008 R2 –

答えて

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; 
    } 

おかげで、

ダン

関連する問題