2010-02-13 18 views
10

Estoy intentando ejecutar un script de PowerShell desde una aplicación C# y necesito que el script se ejecute cuando mi aplicación C# se ejecuta como un usuario no administrador (por ejemplo Servicio de red o alguna otra cuenta de dominio).Cómo ejecutar un script de PowerShell desde C# como usuario no elevado

Anteriormente, yo estaba usando el siguiente código: (por favor, enséñame si hay una mejor manera)

using (RunspaceInvoke invoker = new RunspaceInvoke()) 
{ 
    // load the powershell module 
    invoker.Invoke("Import-Module MyModule"); 

    // run the cmdlet defined in the module 
    invoker.Invoke("MyCmdlet"); 
} 

No sé si este es el mejor enfoque para ejecutar cmdlets definidos en un módulo. En cualquier caso, esto funciona perfectamente si me estoy ejecutando como un usuario administrativo. Intenté ejecutar esto como servicio de red, sin embargo, y obtuve un error hostil en el constructor de RunspaceInvoke:

No se permite el acceso al registro solicitado.

¿Hay alguna manera de ejecutar mis cmdlets de PowerShell como un usuario que no sea elevada, como los servicios de red? No necesito o deseo acceder al registro. El cmdlet en sí mismo tampoco requiere privilegios elevados.

Respuesta

-1

Creo que la entrada this responderá a su pregunta.

+0

Gracias, pero no estoy tratando de elevar o suplantar. Estoy intentando ejecutar scripts de PowerShell como un usuario con * privilegios bajos *, no como un usuario de alto nivel de privilegios. –

0

más en lkaso respuesta

esto le muestra cómo ejecutarlo como cualquiera, no sólo de administración. Tienes que ejecutarlo como alguien, el servicio se ejecuta como una cuenta fuertemente restringida que no puede hacer nada.

o ejecutar el servicio en sí mismo como el usuario Juan

2

Nosotros usamos una versión de la continuación. El parámetro "script" es el script PS que se ejecutará. Usamos esto desde una línea de comando personalizada para que podamos mezclar comandos C# con algunos escritos en PS. Los "resultados" se pueden usar para capturar la evaluación de su secuencia de comandos. La línea "out-default" significa que la salida del script PS se escribe en la consola. Una versión de esto puede capturar el resultado en un TextBox o similar si tiene una aplicación WinForm de WPF.

public void run(string script) 
{ 
    IEnumerable<PSObject> results; 
    var config = RunspaceConfiguration.Create(); 
    var host = new ScriptHost(); 
    using (var runspace = RunspaceFactory.CreateRunspace(host, config)) 
    { 
     runspace.Open(); 
     runspace.SessionStateProxy.SetVariable("prog", this); 

     using (var pipeline = runspace.CreatePipeline()) 
     { 
      if (!string.IsNullOrEmpty(scriptPath)) 
       pipeline.Commands.AddScript(string.Format("$env:path = \"{0};\" + $env:path", scriptPath)); 

      pipeline.Commands.AddScript(script); 

      var outDefault = new Command("out-default"); 
      outDefault.MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output); 
      pipeline.Commands.Add(outDefault); 

      results = pipeline.Invoke(); 
     } 
    } 
} 
0

Se puede utilizar SysInternals procmon herramienta para ver lo que el acceso al registro que está tratando de lograr? Tal vez eso te dará una idea de lo que podrías hacer para resolver el problema.

Cuestiones relacionadas