2011-10-26 3 views
3

두 가지 유형의 프로세스를 시작하는 프로세스 처리기를 만들었습니다. 관리자 아이디와 비밀번호로 상승 된 그룹 다른 사용자 이름과 비밀번호없이 정상적으로 실행되는 또 하나의 프로세스입니다.상승 된 하위 프로세스에서 오류 및 표준 출력 가져 오기

상승 된 프로세스에서 출력을 얻을 수있는 방법을 파악하는 데 어려움을 겪고 있습니다. 프로세스를 시작하는 응용 프로그램은 관리 자격 증명을 실행할 필요가 없으며 응용 프로그램이 스크립트 및 관리자 자격 증명이 필요한 다른 장소에서 사용하는 별도의 암호화 된 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; 
} 

. 그래서

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

다음 장자 클래스는

는 여기에서 장자 클래스를 가지고 ... 내가 바로 그겁니다 내가 관리자를 가장 한, acccess을 가지고 있지 않았다고 말해하지만 아무 짓도 안 했어요 , 상승되지 않은 프로세스에서 상승 된 프로세스로부터 표준 및 오류 출력을 얻으려면 어떻게해야합니까?

+0

'Named Pipe'를 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/bb546085.aspx – SepehrM

답변

1

당신은 (즉, 드라이버) 이러한 보안 조치를 우회하기를 ... 시스템을 해킹 및/또는 일부 버그를 악용 및/또는 일부 커널 레벨의 코드를 작성하여

그냥 생각하지 수를 제외하고 어떤이 가능성 의미는 - 고도가 의미가 없게 될 것입니다. 왜냐하면 그러한 수단에 의해 조작 될 수있는 시스템에서 상승 된 프로세스가 있기 때문입니다 ... 따라서 대답은 아니오입니다 ...

출력을 리디렉션해야합니다 파일 (예 : > C:\MyLog.txt)을 읽고 나중에 해당 파일을 읽으십시오 ...

이러한 종류의 액세스가 필요하지 않은 다른 디자인에 대해 생각해보십시오.

+0

파일에 출력, 그때 당신은 무엇에 대해 생각하고 있습니까? runned 명령이나 프로세스 객체 자체에 추가 하시겠습니까? – Verzada

+0

'> C : \ MyLog.txt'를 명령 줄 끝에 추가하면 ... – Yahia

+0

시도해 보았습니다. 작동하지 않았습니다. 하지만 애플리케이션을 시작하는 다른 방법에 대해 숙고하고 있습니다. 일반 사용자로 시작한 후에 응용 프로그램을 승격시킬 수 있습니까? 아니면 다시 시작해야합니까? – Verzada

관련 문제