4

私は(過去4日間)iis7(asp.net)でプロセスを開始するためのさまざまなオプションをテストしてきました

解決策を見つけました。

デスクトップと対話する必要がなく、実行するだけでよいcmdまたはそのようなものである)限り、ソリューションは単純です。

  1. w3wpユーザー->特権ユーザーである必要があります。

  2. プロセス開始情報(StartInfo.Username高特権ユーザー->である必要があります。

ただし、(私のテストによると)落とし穴があります。

両方のユーザーが同じである必要があります(cmd実行する場合)。これが機能する唯一の方法です。

だからここに私の2つの質問があります:

  • なぜそれらは両方とも同じでなければならないのですか?HighPriviligedとして(process.startInfoを介して)HighPrivilegedを実行することはできませんか?USerAcmdUSerB

  • 両方のユーザーはドメイン管理者です(これは私のローカルグループの管理者でもあります)。ドメイン管理者/ローカル管理者のみがローカルマシンでプロセスを実行できますか?

psすべてのフォルダーのアクセス許可はeveryone : full controllc:\windows\*.* /scmd.exeアクセス許可を含む)であり、前述のように、両方のユーザーは同じクローンアクセス許可を持つローカルマシンの管理者です。IIS7ハンドラーマッピング*[静的ファイル]は読み取り+実行に設定されます

また、完全なcmdコマンドは次のとおりです。

cmd /c time /t >c:\1.txt。成功とは、ファイルが存在する場合です(そして、両方のアカウントが同じである場合にのみ成功します)。

完全なコード:

Process proc = new Process();
  proc.StartInfo.FileName = "cmd";
  proc.StartInfo.UserName = "Royin"; //<-- only if this user is the same as w3wp user , the operation succeed !
  proc.StartInfo.Domain = ...;
  proc.StartInfo.WorkingFolder = @"c:\windows\system32";
  proc.StartInfo.Password = ...
  proc.StartInfo.Arguments = @"/c time /t >c:\1.txt"
  proc.Start();
4

1 に答える 1

2

まず、優れたSysInternals ProcessMonitorを使用して、次のような問題のトラブルシューティングに役立てることを強くお勧めします:ProcessMonitor

このアプリは基本的に、プロセスが実行しようとしているすべてのアクションを通知するため、状況によっては、、などを呼び出そうとしていることがわかりQueryOpenますProcessCreate

失敗したシナリオでプロセスのExitCodeが何であるかを確認しましたか?0xC0000142 (-1073741502)「DLLのロードに失敗した」などの意味で、戻ってくる実際のお金に賭けても構わないと思います。特権ユーザーのクレデンシャルを使用している場合でも、system32パスで何かを実行すると、プロセスを作成するための初期化手順が原因で、アクセス許可に関する奇妙な問題が発生します。

基本的に、Process.Startフローは次のようになります。

(仮定:UserA == w3wpを実行しているプロセス、UserB ==偽装ctx、UserC ==プロセス開始情報で指定された資格情報)

  1. まず、他の会話で説明したように、UserBはあまり影響を与えません。プロセス作成はすべて「起動エンティティ」のプロセストークンに基づいているため、UserAのクレデンシャルを確認します。

  2. ランタイムは「ねえ、UserAは指定されたファイル名にアクセスできますStartInfo.FileNameか?」と表示します。

  3. Windowsはyes/noと応答しますが、「しかし、それを使用するには、これらの他のすべてのDLLも読み取ることができる必要があります」

  4. ランタイムは「OK、UserAはそれらのDLLにアクセスできますか?」と応答します。

  5. 上記のすべての答えが「はい」の場合、ランタイムは「OK、このユーザーにログオンして、cmd行と引数を使用して新しいプロセスを作成してみてください...」と表示します。

デフォルトのアプリプールIDにはSystem32フォルダーへの読み取りアクセス権がないため、#2または#4のいずれかで問題が発生している可能性があります。これが、w3wpプロセスのIDを特権アカウントに切り替えると機能する理由です。

いくつか試してみることができますが、最も簡単なオプションは、おそらく特権の低いアカウント(デフォルトのアプリプールIDなど)に切り替えて、そのアカウントにsystem32フォルダーへの読み取り専用アクセスを許可することです。

ただし、特権ユーザーとしてw3wpを実行することは絶対にありません。これは、誰かがあなたをハッキングするなど、何か厄介なことが起こった場合に、大きな頭痛の種を求めているだけです。

ああ、最後の考え:

  • あなたがそれを助けることができるならtrueに設定しないUseShellExecuteでください、それは奇妙なことをします。

  • あなたがそれを助けることができるならtrueに設定しないLoadUserProfileでください、それはまた奇妙なことをします、そして同様に本当に遅いです。

  • 可能であればtrueに設定してくださいCreateNoWindow。そうしないと、サーバー上でlotsaウィンドウが開いたり閉じたりします。

  • 出力を配管する代わりに使用してくださいRedirectStandardOutput / RedirectStandardError。これにより、制御性が向上し、問題が発生した場合のフィードバックが向上します。

  • プロセスが機能していないように見える場合は、常にプロセスのExitCodeを確認してください

于 2012-12-29T22:53:38.050 に答える