2011-12-01 1 views
2

다음 코드가 작동합니다. 내 콜백 메소드가 생성 될 때 프로그램의 출력과 함께 호출됩니다.System.Diagnostics.Process 다른 사용자를 가장 한 것

var proc = new System.Diagnostics.Process(); 
//proc.StartInfo.Domain = DOMAIN; 
//proc.StartInfo.UserName = USERNAME; 
//proc.StartInfo.Password = BuildPasswordString(); 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.FileName = EXEC_PATH; 
proc.StartInfo.Arguments = EXEC_ARGS; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.Start(); 
proc.OutputDataReceived += proc_OutputDataReceived; 
proc.BeginOutputReadLine(); 
proc.WaitForExit(); 

그러나 사용자 자격 증명과 관련하여이 세 줄의 주석을 제거하면 모든 것이 작동하지 않습니다. 코드는 오류없이 실행되지만 프로세스가 실행되지 않고 콜백 메소드에서 출력이 수신되지 않습니다.

실행 프로세스와 일치하지 않는 특정 사용자의 자격 증명을 사용하면서 별도의 프로세스를 생성하고 생성 된 출력을 비동기식으로 수집하려면 어떻게해야합니까?

업데이트 : @ Dos095-러스의 대답 오프
건물, 내가 대신 ASP.NET의 콘솔 응용 프로그램과 같은 코드를 테스트했다. 그것은 효과가있다. 따라서 이것은 ASP.NET 환경에서 오류의 원인이되는 것입니다.

+0

중복 : http://stackoverflow.com/questions/4624113/how-to-process-start-with-impersonated-domain-user –

+0

실제로 나에게 중복되는 것처럼 보이지 않습니다. 그 질문은 다른 코드와 다른 증상을 가지고 있습니다 ... – RationalGeek

답변

0

저는 UAC의 보안 메커니즘에 문제가 있다고 생각합니다. 초기 응용 프로그램은 다른 사용자 프로세스의 출력을 읽을 권한이 없습니다 (자식 프로세스 일지라도). 관리자 권한으로 응용 프로그램을 시작하고 코드 작성 여부를 확인하십시오.

난 당신의 문제를 해결하는 가장 좋은 방법은 파일로 귀하의 자식 프로세스 출력을 리디렉션하고 업데이 트에 대한 파일을 확인하기 위해 초기 응용 프로그램에서 스레드를 만드는 것 같아요.

는 또한 나는이 문제를 해결하기 위해 거의 이일 보냈다 Get error and standard output from an elevated child process

+0

ASP.NET에서 실행 중입니다. 관리자 계정으로 실행하는 것은 바람직하지 않습니다. 하지만 코드가 콘솔 앱으로 옮겨져 증상이 사라지는 지 확인할 것입니다. 출력을 파일로 리디렉션 한 다음 파일을 읽는 것에 대한 흥미로운 아이디어는 있지만 자식 프로세스는 실행되지 않는 것으로 보입니다. 지금 파일로 출력하고 사용자 자격 증명으로 실행할 때 해당 파일이 업데이트되지 않습니다. – RationalGeek

+0

오, ASP.NET을 언급하지 않았습니다. 내가 아는 한 웹 응용 프로그램은 설치시 정의 된 특별 계정으로 실행됩니다. 즉, exe는 asp 폴더의 어딘가에 배치됩니다. 지정한 사용자가 해당 폴더에 대한 액세스 권한이 없습니까? –

+0

콘솔 응용 프로그램에서 실행 했으므로 ASP.NET이 확실히 범인입니다.ASP.NET 프로세스를 시스템 계정으로 실행하여 해당 작업이 작동하는지 확인해 보겠습니다. – RationalGeek

2

비슷한 문제를 발견 ... 여기 이 솔루션입니다 : http://forums.asp.net/p/1032763/3054483.aspx

간단히, 당신은 "응용 프로그램 풀의 ID"를 설정해야"proc.StartInfo.UserName""proc.StartInfo.Password"과 동일합니다.

당신은이 식별로 "proc.StartInfo.UserName"를 사용하여 새 "응용 프로그램 풀"을 만들 또는 "을 DefaultAppPool"의 식별 ​​변경할 수 있습니다.

물론 새로운 "응용 프로그램 풀"을 만들려면 에 asp.net 웹 응용 프로그램에이 "응용 프로그램 풀"을 할당해야합니다.

희망, 유용합니다. 행운을 빕니다. lzch