2010-02-13 4 views
10

J'essaie d'exécuter un script PowerShell à partir d'une application C# et j'ai besoin que le script s'exécute lorsque mon application C# s'exécute en tant qu'utilisateur non administrateur (par ex. Service réseau ou un autre compte de domaine).Comment exécuter un script PowerShell à partir de C# en tant qu'utilisateur non-élevé

Auparavant, j'utilisais le code suivant: (! S'il vous plaît me apprendre s'il y a une meilleure façon)

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

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

Je ne sais pas si cela est la meilleure approche pour cmdlets en cours d'exécution définies dans un module. En tout cas, cela fonctionne parfaitement si je cours en tant qu'utilisateur administratif. J'ai essayé d'exécuter ceci comme service de réseau, cependant, et j'ai obtenu une erreur hostile dans le constructeur de RunspaceInvoke:

L'accès de Registre demandé n'est pas autorisé.

Existe-t-il un moyen pour exécuter mes applets de commande PowerShell en tant qu'utilisateur non élevé, tel que le service réseau? Je n'ai pas besoin ou envie d'accéder au registre. La cmdlet elle-même ne nécessite pas non plus de privilèges élevés.

Répondre

-1

Je pense que l'entrée this va répondre à votre question.

+0

Merci, mais je n'essaie pas d'élever ou d'usurper l'identité. J'essaie d'exécuter des scripts PowerShell en tant qu'utilisateur * low-privileged * et non en tant qu'utilisateur à privilèges élevés. –

0

plus sur lkaso réponse

cela vous montre comment exécuter comme tout le monde, pas seulement administrateur. Vous devez l'exécuter comme quelqu'un, le service fonctionne comme un compte fortement restreint qui ne peut rien faire.

ou exécuter le service lui-même comme joe utilisateur

2

Nous utilisons une version du ci-dessous. Le paramètre "script" est le script PS à exécuter. Nous utilisons ceci à partir d'une ligne de commande personnalisée afin que nous puissions mélanger les commandes C# avec certaines écrites en PS. Les "résultats" peuvent être utilisés pour capturer l'évaluation de votre script. La ligne "out-default" signifie que la sortie du script PS est écrite sur la console. Une version de cela peut à la place capturer la sortie vers un TextBox ou similaire si vous avez une application 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

Peut-on utiliser Sysinternals procmon outil pour voir ce que l'accès du Registre, il essaie d'accomplir? Peut-être que cela vous donnera un aperçu de ce que vous pourriez faire pour résoudre le problème.

Questions connexes