7

ユーザーがボタンをクリックすると、ASP.NET アプリケーションから実行可能なプロセスを実行しています。このプロセスでは、いくつかのファイルが作成され、エンド ユーザーに提供されます。プロセスが何をしているのか、何をしていないのかを実際に確認することはできませんが、サーバーのアプリケーション プール ID として管理者ユーザーを指定するまで機能しませんでした。IIS7を使用しています。

 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通常のアカウントでこれを有効にするには、何をする必要があるか教えていただけますか?

ありがとう!

4

4 に答える 4

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();

たとえば、プールを追加して UserA の下で実行する場合は、プログラムを実行するディレクトリに移動し、UserA がそのディレクトリでプログラムを実行できるようにするためのアクセス許可を追加します。プログラムが他のディレクトリも使用して読み取りと書き込みを行う場合は、そのディレクトリの UserA にもアクセス許可を追加します。

プロセスが何をしているか、何をしていないかを本当に見ることができない

サーバー上でProcess Explorerを使用している場合は、それが実行されているか、閉じているか、停止しているかどうかを確認できますが、そこにとどまります。

于 2013-03-04T21:23:49.837 に答える
2

ファイル/実行権限の問題である可能性があります。executeApplicationPoolIdentity へのアクセス許可と へのアクセス許可を~/Testing/Dema/MyExe.exe付与readしてみてくださいcommandFilePath。あなたのプロセスはファイルを作成すると言いました。ファイルが作成されるフォルダーの ApplicationPoolIdentity に、modifyまたはアクセス許可を付与する必要があります。これは、権限full controlのマトリックス化されたリストです。

アクセス許可の付与については、「 ApplicationPoolIdentity アカウントへのアクセス許可の割り当て」を参照してください。

セキュリティ イベント ログは、アクセス許可が拒否されたエラーをキャプチャする必要があります。アクセス許可の問題があるかどうかを確認してください。システム ログとアプリケーション ログにも、問題に関する情報が含まれている場合があります。

Process Explorer は、ファイル アクセス要求も表示できます。Process Explorer を使用したトラブルシューティングに関する Technet の記事を次に示します。

于 2013-03-04T21:23:12.787 に答える
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();
        }

これにより、一時ファイルがシステム以外のフォルダーに書き込まれるため、アプリケーション プールに対する昇格されたアクセス許可は必要ありません。

于 2013-03-05T15:13:35.173 に答える
1

ASP.NET ページからプロセスを実行するときは常に、アプリ プール アカウントの特権であるワーカー プロセスのセキュリティ コンテキストの下で実行されます。MyExe.exe を通常実行しているのとは異なり、その場合はログイン アカウントを使用して実行されます。このため、アプリ プールに管理者アカウントを付与すると、コードが機能しました。

この問題を解決するには多くの方法があります。

最も簡単な方法の 1 つは、アプリ プール ID を Network Service に変更し、MyExe.exe がファイル形式にアクセスするフォルダーのアクセス許可に Network Service を追加することです。

それが役に立てば幸い。

于 2013-03-04T22:45:50.220 に答える