3

process.start を使用して実行可能ファイル (Graphviz) を呼び出す asp.net アプリケーションがあります。私の開発環境ではすべてうまくいきますが、本番環境に移るとプロセスを実行できません。詳細はこちら。

問題を示すために、この単純なサブを作成しました。

    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

ここには 3 つのシナリオがあります。まず、メモ帳を起動するだけでテストしています。・開発業務・生産業務(これが唯一、生産業務に携わることができた事例です)

次に、メモ帳でドキュメントを開く簡単なバッチ ファイルを作成しました。(メモ帳 c:\test.dot)

  • 開発工事
  • 生産が進まない

3 番目に、Graphviz の dot.exe を呼び出しています。これは、私が別のページで作業しようとしているものです。

  • 開発工事
  • 生産が進まない

プロダクションが機能しないすべてのケースで、この動作を再現できます。web.config に impersonate = true を追加すると、エラーは返されません。ページは成功したかのように実行されます。

  • 偽装構成を追加せずに資格情報を ProcessInfo オブジェクトに追加すると、ページは再びエラーなしで実行されます。ただし、プロセスは本番環境では開始されません。

  • 偽装または ProcessInfo 資格情報を追加しないと、エラーが発生します。これはエラー出力です。

アクセスが拒否されました

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

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 を使用してドメインを管理しています。この状況に影響を与える可能性のあるオプションを広範囲に検索しましたが、まだ見つかりません. 繰り返しますが、メモ帳を開始するための単純な呼び出しを行う場合、プロセスの開始は本番環境で機能します。詳細なログがなければ、これを絞り込むのは非常に困難です。

あなたが提供できる助けを前もって感謝します。これは私を夢中にさせています。

4

2 に答える 2

3

サイトが実行されているプールを見つけ、実行しているユーザーを確認します。

それができない場合は、次のコードを実行して、プールが実行されているユーザーを確認できます。

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

そして、そのユーザーにこれらのファイルを実行できる権限を与えます

参照: ASP.NET コードが実行されているアカウントを確認する方法は?

于 2013-02-21T10:54:12.730 に答える