如何从C#运行PowerShell脚本作为非升级用户

问题描述:

我想从C#应用程序运行PowerShell脚本,并且需要脚本在我的C#应用​​程序以非管理员用户身份运行时运行(例如网络服务或其他域帐户)。如何从C#运行PowerShell脚本作为非升级用户

以前,我用的是下面的代码:(!请教我,如果有一个更好的办法)

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

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

我不知道这是否是运行的模块中定义的cmdlet的最佳方法。在任何情况下,如果我以管理用户身份运行,此功能完美无缺。然而,我试图运行这个网络服务,并且我在RunspaceInvoke的构造函数中遇到了一个不友好的错误:

不允许请求的注册表访问。

有没有一种方法可以将我的PowerShell cmdlet作为未提升的用户(例如网络服务)运行?我不需要或不想访问注册表。该cmdlet本身也不需要提升特权。

我认为this条目会回答你的问题。

+0

谢谢,但我不想提升或模仿。我试图将PowerShell脚本作为*低权限*用户运行,而不是高权限用户。 – 2010-02-14 17:34:49

更多lkaso答案

此向您展示如何运行它的任何人,而不仅仅是管理。你必须像其他人一样运行它,该服务作为一个严重受限帐户运行,无法做任何事情。

或运行服务本身乔用户

我们使用一个版本的下方。 “script”参数是要运行的PS脚本。我们在一个自定义命令行中使用这个命令,以便我们可以将c#命令与一些用PS编写的命令混合。 “结果”可用于捕捉脚本的评估。 “out-default”行意味着PS脚本的输出写入控制台。如果您拥有WPF应用程序的WinForm,则可以将其输出捕获到TextBox或类似的输出。

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

您可以使用SysInternals procmon工具来查看它试图完成的注册表访问吗?也许这会给你一些洞见,你可以做些什么来解决这个问题。