2013-03-25 13 views
5

Mam usługę Windows, która pobiera skrypt, a następnie uruchamia go.Uruchamiaj tylko podpisane skrypty powershell z C#

Staram się, aby moja usługa Windows była bezpieczniejsza, co oznacza, że ​​akceptuje tylko podpisane skrypty Power-shell.

Uruchomiłem polecenie Set-ExecutionPolicy AllSigned na serwerze, działa to w wierszu polecenia powłoki systemu Windows.

Jednak mój kod nadal uruchamia zarówno podpisane, jak i niepodpisane skrypty, nawet jeśli opcja set-executionpolicy jest ustawiona jako ograniczona.

Próbowałem dwóch podejść:

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

I kolejne podejście:

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

W obu sytuacjach kod uruchamia skrypty niepodpisanych, jak również.

Czy coś przeoczyłem?

+0

Czy serwer 64 bitowe z offu? –

+0

Tak, jest, @ C.B. To 64-bitowy Windows Server 2008R2 –

Odpowiedz

1

Znalazłem rozwiązanie. Jedynym sposobem, aby ograniczyć kod z systemem skrypty niepodpisanych było sprawdzenie skrypty się z 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; 
    } 

Dzięki,

Dan

Powiązane problemy