2

作成しているプログラムにWINAPIを使用しています。プログラムには別のプロセスのProcessIdがあり、そのハンドルを取得する必要があります(後で終了できるようにするため、またプロセスが稼働していて、WaitForSingleObjectを使用して応答しているかどうかを定期的に確認するため)。プログラムを(Embarcadero RAD Studio 2010 C ++ Builderで)コンパイルすると、うまく機能します。プログラムは正常にハンドルを取得しているようで、通常は意図したとおりに機能します。ただし、スタンドアロンexeとしてフォルダから起動すると、ハンドルを正しく取得できないようです。比較して確認しました(CompanionはHANDLEで、Companion_PIDはDWORDです)。

GetProcessId(Companion)

Companion_PID

ここで、数行前に、Companionは次のコードのCompanion_PIDから取得されます。

Companion = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Companion_PID);

また、「GetProcessId(Companion)」の結果は0になります(これは、OpenProcessが適切なハンドルを返さなかったことを示す良い兆候です。

このコードがコンパイラから実行された場合とスタンドアロンのexeとして実行された場合では、動作が異なることにかなり驚いています。最初のケースでは、セキュリティ属性はコンパイラ自体から継承されていると思いますが、特にWINAPIとセキュリティ属性の経験が豊富な人から、この動作のより良い説明を聞きたいと思います。

小さな更新:はい、私が思ったように、OpenProcessはエラー0x5=ERROR_ACCESS_DENIEDになります。

4

1 に答える 1

3

MSDNのOpenProcess関数ページから:

別のローカルプロセスへのハンドルを開いてフルアクセス権を取得するには、SeDebugPrivilege特権を有効にする必要があります。

IDE(コンパイラではなくIDEからアプリケーションを実行している)がデフォルトで有効になっていると思います。アプリケーションを実行すると、IDE(プロセス)はIDEから特権を継承する新しいプロセスを作成します。これが、IDEから実行したときに関数が成功する理由です。SeDebugPrivilegeSeDebugPrivilege

アプリケーションは、有効になっているかどうかを確認し、有効になってSeDebugPrivilegeいない場合は有効にする必要があります。

于 2012-02-09T15:58:21.940 に答える