2013-02-21 3 views
2

나는 process.start를 사용하여 실행 파일 (Graphviz)을 호출하는 asp.net 애플리케이션을 가지고있다. 모든 것이 내 개발 환경에서 잘 작동하지만, 프로덕션 환경으로 이동하면 프로세스를 실행할 수 없습니다. 여기에 세부 사항이 있습니다.asp.net 응용 프로그램을 통해 process.start를 사용하려면 어떤 권한이 필요합니까?

문제를 표시하기 위해이 간단한 하위 항목을 만들었습니다.

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 

    Dim ProcessInfo As ProcessStartInfo 
    ProcessInfo = New ProcessStartInfo 

    'ProcessInfo.Domain = "xxxxxxx" 
    ProcessInfo.UserName = "xxxxxx" 
    Dim PwdString As String = "xxxxxxx" 
    Dim newPass As System.Security.SecureString 
    newPass = New System.Security.SecureString 
    For Each c As Char In PwdString 
     newPass.AppendChar(c) 
    Next c 
    ProcessInfo.Password = newPass 

    'ProcessInfo.FileName = """C:\Windows\System32\Notepad.exe""" 
    'ProcessInfo.FileName = """C:\Test.bat""" 
    ProcessInfo.FileName = """C:\Program Files (x86)\Graphviz2.30\bin\dot.exe""" 
    ProcessInfo.Arguments = " -Kdot -Tsvg C:\Test.dot -pC:\Test.svg" 
    ProcessInfo.RedirectStandardOutput = True 
    ProcessInfo.UseShellExecute = False 
    ProcessInfo.CreateNoWindow = True 

    Dim Process As Process 
    Process = New Process 
    Process.StartInfo = ProcessInfo 
    Process.Start() 

    'Wait until the process passes back an exit code 
    Process.WaitForExit() 

    Try 
     Dim ProcessResults As String = Process.StandardOutput.ReadToEnd 
     Output.Text = ProcessResults 
    Catch ex As Exception 
     Output.Text = ex.ToString 
    End Try 

End Sub 

여기에는 세 가지 시나리오가 있습니다. 첫째, 메모장을 시작하기 만하면됩니다. - 개발 작업 - 제작 작업 (프로덕션 환경에서 작업 할 수있는 유일한 경우)

두 번째 메모장에서 문서를 여는 간단한 배치 파일을 만들었습니다. (메모장 C는 : \ test.dot)

  • 개발 생산 내가 graphviz를의 dot.exe를 호출하고 한

셋째 작동하지 않습니다

  • 작동합니다. 이것은 내가 다른 페이지에서 일하기 위해 노력하고있는 것입니다.

    • 개발 생산 내가이 동작 을 재현 할 수 있습니다 작동하지 않는 경우
    • 생산은 모든 경우에

    작동하지 않습니다 작동 - 내 Web.config의에는 true 가장 할 =를 추가하는 경우 , 그렇다면 오류가 다시 발생하지 않습니다. 페이지는 마치 성공한 것처럼 실행됩니다. 나는 ProcessInfo 개체에 자격 증명을 추가 IMPERSONATE의 설정을 추가 할 수 있지만하지 않으면

    • , 다음 페이지가 다시 오류없이 실행됩니다. 그러나 프로덕션 환경에서는 프로세스가 시작되지 않습니다.

    • 가장 또는 ProcessInfo 자격 증명을 추가하지 않으면 오류가 발생합니다. 이것은 오류 출력입니다.

    은 액세스가

    설명을 거부 : 처리되지 않은 예외가 현재 웹 요청을 실행하는 동안 오류가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

    Exception Details: System.ComponentModel.Win32Exception: Access is 
    denied 
    
    Source Error:  
    Line 36:   Process = New Process 
    Line 37:   Process.StartInfo = ProcessInfo 
    Line 38:   Process.Start() 
    Line 39: 
    Line 40:   'Wait until the process passes back an exit code 
    
    Source File: C:\Inetpub\vhosts\leapfrogbi.com\httpdocs\test\ProcessStart.aspx.vb Line: 38 
    
    Stack Trace:  
    [Win32Exception (0x80004005): Access is denied] 
    System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) +2161 
    System.Diagnostics.Process.Start() +150 
    Test_ProcessStart.Page_Load(Object sender, EventArgs e) in C:\Inetpub\vhosts\leapfrogbi.com\httpdocs\test\ProcessStart.aspx.vb:38 
    System.Web.UI.Control.OnLoad(EventArgs e) +91 
    System.Web.UI.Control.LoadRecursive() +74 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207 
    

    나는 보안 관련 다양한 설정을 시도했습니다. 현재 내 응용 프로그램 풀이 로컬 관리자 인 ID로 실행 중입니다. 보안 문제가 근본적인 문제인지 확인하기 위해 관리자 그룹에 모두 추가하려고했습니다.

    또한 Plesk를 사용하여 내 도메인을 관리하고 있습니다. 이 상황에 영향을 미칠 수있는 옵션을 광범위하게 검색했으며 아직 찾지 못했습니다. 다시 말하면 프로세스 호출은 간단한 호출로 메모장을 시작할 때 프로덕션 환경에서 작동합니다. 더 자세한 로그없이이 범위를 좁히는 것은 매우 어렵습니다.

    제공 할 수있는 도움에 미리 감사드립니다. 이것은 나를 미치게합니다.

  • 답변

    1

    사이트가 실행되는 풀을 찾고 어떤 사용자가 실행 중인지 확인하십시오.

    당신이 당신의 풀을 실행하는 사용자 확인이 코드를 실행할 수 할 수없는 경우

    var user = System.Security.Principal.WindowsIdentity.GetCurrent().User; 
    var userName = user.Translate(typeof(System.Security.Principal.NTAccount)); 
    

    을 그리고 이러한 파일을 실행할 수 있도록 해당 사용자에게 권한을 부여.

    참조 : How to find out which account my ASP.NET code is running under?

    +0

    감사합니다. Aristos. 나는 당신이 제안했지만 애플 리케이션 풀 ID는 현재 로컬 관리자 그룹의 일부입니다. – DataMe

    +0

    이 사용자가 Security.Windowsidentity.GetCurrent.User에 의해 반환 된 동일한 사용자인지 확인했습니다. 필자는 또한 앞서 명시 적으로 파일에 동일한 사용자 권한을 부여하고 요청과 관련되었지만 동일한 결과를 보았습니다. 관리자 계정을 사용하여 응용 프로그램을 실행할 수는 있지만 프로세스는 실제로 메모장이 시작되는 첫 번째 예제를 제외하고 실행됩니다. – DataMe

    +0

    내 마지막 취소. 사용자가 권한이없는 파일을 발견했습니다. 배치 파일이 실행되었습니다. 나는 타겟 exe & report back으로 더 테스트 할 것이다. – DataMe

    0

    내가 프로세스를 사용하고 있지 않다가, 쉘을 사용하고 성공적으로 실행됩니다.

    1. 명령이 포함 된 배치 파일을 만듭니다. 시스템 폴더에 배치를 저장하지 마십시오.

    2. IIS에서 웹 사이트가 실행되는 응용 프로그램 풀의 설정 대화 상자를 엽니 다. 프로세스 풀 ID를 "localsystem"으로 설정하십시오.

    3. 셸 ("path \ batchfile")을 사용하여 배치 파일을 실행하십시오.

    관련 문제