子プロセスを生成する親プロセスがあります。子プロセスの目的は、親プロセスを終了し、数秒待ってから再起動することで、親プロセスを再起動することです。親が管理者権限で実行されているかどうかを検出する方法はありませんが、子は管理者権限なしで実行されています。親には、一意のウィンドウ クラスを持つ非表示のウィンドウがあり、それによってウィンドウが検出され、それに WM_CLOSE が送信されます。ただし、特定のインストールでは、クラスの識別子を使用した子の FindWindow() の呼び出しが失敗し、ウィンドウが見つかりません。ただし、EnumProcesses() を介してシステム内のすべてのプロセスを列挙し、各プロセスを開いて GetModuleFileNameEx() を呼び出すと、既知で固定されている実行可能パスによって親のプロセスが正常に検出されます。でも、プロセス ハンドルで TerminateProcess() を呼び出すと、アクセス拒否エラー (5) が返されます。子にはエスカレートされた特権がないため、SeDebugPrivilege の設定は失敗します。上記の状況は少数のテスト マシンでのみ発生し、ほとんどのマシンでは期待どおりに動作します。ウィンドウが見つかり、TerminateProcess() を介して親を強制終了しようとすると成功します。私の質問は - FindWindow() と TerminateProcess() が失敗するように、一部のマシンで構成された子と親の間に何らかの分離モードがありますか、それとも別の理由がありますか?
1 に答える
1
このリンクが大いに役立つと思います:) GetParentProcessID
このソースは、ntdll NtQueryInformationProcessの関数が親 ID をPROCESS_BASIC_INFORMATION構造にInheritedFromUniqueProcessIdとして格納することを教えてくれます。
于 2012-05-20T04:01:38.633 に答える