2010-02-13 50 views
10

我想從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本身也不需要提升特權。

回答

-1

我認爲this條目會回答你的問題。

+0

謝謝,但我不想提升或模仿。我試圖將PowerShell腳本作爲*低權限*用戶運行,而不是高權限用戶。 – 2010-02-14 17:34:49

0

更多lkaso答案

此向您展示如何運行它的任何人,而不僅僅是管理。你必須像其他人一樣運行它,該服務作爲一個嚴重受限帳戶運行,無法做任何事情。

或運行服務本身喬用戶

2

我們使用一個版本的下方。 「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(); 
     } 
    } 
} 
0

您可以使用SysInternals procmon工具來查看它試圖完成的註冊表訪問嗎?也許這會給你一些洞見,你可以做些什麼來解決這個問題。

相關問題