7

사용자가 단추를 클릭 할 때 ASP.NET 응용 프로그램에서 실행 프로세스를 실행 중입니다. 이 프로세스는 여러 파일을 생성하여 최종 사용자에게 제공합니다. 프로세스가 무엇인지 알 수는 없지만 관리자 사용자를 서버의 응용 프로그램 풀 ID로 지정하기 전까지는 작동하지 않습니다. IIS7을 사용하고 있습니다.ASP.NET 응용 프로그램 풀 ID에서 명령 실행

using (var proc = new Process()) 
{ 
    proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyExe.exe"); 
    proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFilePath); 
    proc.StartInfo.UseShellExecute = true; 
    proc.Start(); 
    proc.WaitForExit(); 
} 

나는 일반적으로 나쁜 일이라고 가정하고 있습니다. 일반적인 ApplicationPoolIdentity 계정에서이 작업을 수행하기 위해 수행해야 할 작업에 대해 자세히 설명해 주시겠습니까?

감사합니다.

+0

프로세스가 최종 사용자에게 파일을 어떻게 제공합니까? –

+0

임시 디렉토리에 모든 파일을 압축하여 저장하고 있습니다. 이미 작동합니다. – daniel

답변

1

도움 주셔서 감사합니다. 내가해야 할 일은 StartInfo.WorkingDirectory를 내가 쓸 수있는 곳으로 설정하는 것이었다.

 using (var proc = new Process()) 
     { 
      proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyEXE.exe"); 
      proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFile); 
      proc.StartInfo.WorkingDirectory = savePath; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 

이렇게하면 임시 파일이 시스템 폴더가 아닌 폴더에 기록되므로 응용 프로그램 풀에 대한 높은 권한이 필요하지 않습니다.

2

파일/실행 권한 문제 일 수 있습니다. ApplicationPoolIdentity에 execute 권한을 부여하여 ~/Testing/Dema/MyExe.exeread에 대한 액세스 권한을 commandFilePath에게 부여하려고합니다. 귀하의 프로세스가 파일을 생성한다고 언급했습니다. 파일을 만들 폴더의 ApplicationPoolIdentity에 대해 modify 또는 full control 권한을 부여해야합니다. 다음은 행렬 list of permissions입니다.

사용 권한 부여에 대한 자세한 내용은 assign permissions to ApplicationPoolIdentity account을 참조하십시오.

보안 이벤트 로그는 사용 권한 거부 오류를 캡처해야합니다. 액세스 권한 문제가 있는지 확인하십시오. 시스템 및 응용 프로그램 로그에는 문제에 대한 정보가 포함될 수도 있습니다.

프로세스 탐색기는 파일 액세스 요청을 표시 할 수도 있습니다. 다음은 troubleshooting with Process Explorer에 대한 기술 문서입니다.

+0

동의 함. 쓰기 위치가 이미 잘 작동합니다 ... 실행 권한입니다. 실행 권한을 가지도록 ApplicationPoolIdentity를 변경하는 방법은 무엇입니까? – daniel

+0

IUSR 계정을 사용하고 있으며 해당 계정에는 디렉터리에 대한 전체 권한이 있습니다. 그 스레드에서 언급 된 것을 여전히 수행해야합니까? – daniel

+0

ProcessExplorer를 시작한 다음 관리자 계정으로 apppool을 실행하고 응용 프로그램이 성공적으로 실행될 때 모든 활동을 기록 할 수 있습니다 (ProcessExplorer를 통해). 그런 다음 IUSR 계정에서 실행되도록 변경하고 ProcessExplorer 로그를 비교합니다. –

3

우선, 쉘을 실행해야하는 이유는 무엇입니까? 콘솔 응용 프로그램이 아닙니다 - 창을여시겠습니까?

두 번째로 입력과 출력을 리디렉션해야합니다.

마지막으로 수행해야 할 작업은 스크립트가 실행되는 디렉토리에 풀이 실행되는 사용자의 권한을 설정하는 것입니다. 그리고 수영장에서 관리자를 제거하십시오.

proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.CreateNoWindow = false; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.RedirectStandardInput = true; 

proc.Start(); 

proc.StandardInput.Flush(); 
proc.StandardInput.Close(); 

proc.WaitForExit(); 
proc.Close(); 

그래서 예를 들어, 사용자 A에서 실행하는 풀을 추가하는 경우, 해당 프로그램이 실행 디렉토리로 이동하여 사용자 A에 대한 권한을 추가 디렉토리에 프로그램을 실행 할 수 있었다. 또한 프로그램이 다른 디렉토리를 사용하여 읽고 쓰는 경우 해당 사용자에 대한 권한을 UserA에 추가하십시오.

정말 프로세스가 또는 당신은 서버 Process Explorer에 사용하는 경우를 살펴 볼 수 있습니다

을 수행하지 않는 것을 볼 수 없습니다 그것의 실행도, 그 가까운 경우, 그것의 정지 그러나 거기 체재하는 경우에.

+0

프로세스가 잠시 실행 된 다음 종료되는 것을 볼 수 있습니다 ... 권한이 없다고 가정합니다. – daniel

+0

@daniel 시작이 표시되면 실행 권한이 없습니다. 응용 프로그램 내부에 일부 로그를 추가하여 중지 이유를 찾으십시오. – Aristos

+0

명령을 실행하면 "관리자 권한으로 실행"해야한다는 메시지가 나타납니다. 프로세스가 여전히 시작될 수 있지만 권한 상승 없이는 다른 작업을 수행하지 못할 수 있습니다. – daniel

1

ASP.NET 페이지에서 프로세스를 실행할 때마다 응용 프로그램 풀 계정의 권한 인 작업자 프로세스의 보안 컨텍스트에서 실행됩니다. MyExe.exe를 정상적으로 실행하는 것과 같지 않습니다.이 경우 MyExe.exe는 로그인 한 계정을 사용하여 실행됩니다. 이 때문에 관리자가 응용 프로그램 풀에 계정을 부여 할 때 코드가 작동했습니다.

이 문제를 해결할 수있는 방법은 여러 가지가 있습니다.

가장 쉬운 방법은 응용 프로그램 풀 ID를 네트워크 서비스로 변경하고 MyExe.exe가 파일 형식에 액세스 할 폴더의 사용 권한에 네트워크 서비스를 추가하는 것입니다.

희망이 있습니다.

+0

네트워크 서비스가 inetsrv 디렉토리에 대한 액세스 권한을 부여하지 않습니다. – daniel