2011-10-26 70 views
3

我創建了一個啓動兩種類型進程的進程處理程序: 用管理員用戶名和密碼提升的進程處理程序 另一個運行正常,沒有任何用戶名和密碼輸入。從高架子進程獲取錯誤和標準輸出

我struggeling弄清楚如何從高架過程獲取輸出。啓動進程的應用程序不需要管理員憑據運行,管理員憑據將輸入到單獨加密的xml文件中,該文件應用程序在需要管理員憑證的腳本和其他位置使用該文件。

由於應用程序與正常用戶運行,訪問該應用程序已經開始升高的過程中,似乎是不可能的。我可以開始一個過程,並且可以輕鬆地檢查它是否完成了它所支持的過程,但我無法將其操作讀取到字符串或日誌中。

public bool CreateProcessWithAdminRights(string filePath, string commandlineArgument, bool log) 
{ 
    if (!string.IsNullOrEmpty(filePath) && !string.IsNullOrEmpty(commandlineArgument) && _user.UserDataExsists()) 
    { 
     var securePassword = GetSecureString(_user.Password); 

     ToolsProvider.Logger.Debug("Creating process with the following filepath: {0} and commandline argument: {1}", filePath, commandlineArgument.Replace(_user.Password, "<REPLACED>")); 
     ToolsProvider.Logger.Info("Creating Process with admin rights for {0} against {1}", _user.Name); 

     _proc = new Process 
     { 
      StartInfo = 
      { 
       FileName = @filePath, 
       Arguments = commandlineArgument, 
       ErrorDialog = false, 
       RedirectStandardInput = false, 
       RedirectStandardOutput = _log, 
       RedirectStandardError = _log, 
       UseShellExecute = false, 
       CreateNoWindow = true, 
       WindowStyle = ProcessWindowStyle.Hidden, 
       UserName = _user.Name, 
       Password = securePassword, 
       Domain = _user.Domain 
      } 
     }; 
     _proc.ErrorDataReceived += ErrorDataReceived; 
     _proc.OutputDataReceived += OutputDataReceived; 
     return true; 
    } 
    return false; 
} 

的進程正在使用開始:

private bool StartProcess() 
{ 
    if (_proc != null) 
    { 
     try 
     { 
      _proc.Start(); 
      _proc.BeginErrorReadLine(); 
      _proc.BeginOutputReadLine(); 
      _proc.WaitForExit(); 
      _proc.CancelOutputRead(); 
      _proc.CancelErrorRead(); 

      if (_standardOutput.Length > 2) 
      { 
       // use writeline, the builder itself will add the DEBUG/info tag 
       ToolsProvider.Logger.WriteLine(_standardOutput.ToString()); 
      } 

      if (_errorBuilder.Length > 2) 
      { 
       // use writeline, the builder itself will add the DEBUG/info tag 
       ToolsProvider.Logger.WriteLine(_errorBuilder.ToString()); 
      } 

      return true; 
     } 
     catch (Win32Exception ex) 
     { 
      ToolsProvider.Logger.Error(
       "Missing file while trying to run an action: " + _proc.StartInfo.FileName, ex.Message); 
     } 
    } 
    ToolsProvider.Logger.Error(""); 
    return false; 
} 

我試着用模仿類爲好,有和沒有加入到過程中的管理員憑據啓動進程。假冒者類沒有做任何事情,但告訴我,我沒有acccess沉綿我冒充管理員...

我從這裏冒領類:

http://freshclickmedia.co.uk/2008/11/programmatic-impersonation-in-c/

所以,如何在不升高的過程中從升級過程中獲得標準和錯誤輸出?

+0

您可以使用'Named Pipes':http://msdn.microsoft.com/en-us/library/bb546085.aspx – SepehrM

回答

1

無法除非黑客攻擊的系統和/或利用一些bug和/或寫一些內核級代碼(即驅動程序)來規避這些安全措施......

只是想想這種可能性將意味着 - 因爲總是在一個系統中的一些提升進程可能通過這樣的手段來操縱......所以,答案是否定的海拔將變得毫無意義......

,你應該能夠做的是將輸出重定向到一個文件(例如> C:\MyLog.txt),後來讀到的文件...

想想另一種不需要這種訪問的設計...

+0

通過重定向輸出到一個文件,然後你在想什麼?通過將其添加到運行的命令或過程對象本身中? – Verzada

+0

通過添加'> C:\ MyLog.txt'到命令行的末尾... – Yahia

+0

嘗試過了,沒有工作。 雖然,我正在思考啓動應用程序的其他方式。作爲普通用戶啓動後,是否可以提升應用程序?還是必須重新啓動? – Verzada

相關問題