2

私のアプリケーションはジョブで実行されています。後でこのハンドルを使用できるように、を使用してこのJobobjectへのハンドルを取得したいと思いOpenJobObjectます。問題は、ジョブ名がわからないことです。ジョブ名にNULLを渡すと、エラー87(パラメーターが正しくありません)が返されます。

これは私がそれを試した方法です:

HANDLE handle = OpenJobObject( JOB_OBJECT_QUERY, FALSE, NULL );
if ( !handle  ) printf( "\nError %d", GetLastError() );
else printf( "\nOK" );

これはMSDNでも見つかりました。アプリケーションは、ジョブオブジェクトの名前がない限り、実行中のジョブオブジェクトへのハンドルを取得できません。ただし、アプリケーションはNULLを指定してQueryInformationJobObject関数を呼び出して、ジョブオブジェクトに関する情報を取得できます。

だから私の質問は、私のアプリケーションが実行されているJobObjectへのハンドルをどうにかして取得することは可能ですか?または、アプリケーションが実行されているジョブの名前を取得しますか?

ありがとう!

更新:
これまでの私のコード:http://pastebin.com/aJ7XMmciSetInformation現在、 :( からエラー87(パラメーターが正しくありません)が発生しています

4

1 に答える 1

0

OK、サポートされている方法はないようです。それができないという意味ではありません!:-)

システム内のすべてのハンドルを列挙するには、この質問を参照してください。ここのサンプルコードはハンドルをフィルタリングし、特定のプロセスに属するハンドルのみを検索しますが、これは簡単に変更できます。最初にデバッグ特権を有効にする必要がある場合があります。

ハンドルごとに、それをプロセスに複製してから、IsProcessInJobを呼び出して、それが正しいハンドルであるかどうかを確認します。

それが機能するようになったらSYSTEM_HANDLE.ObjectTypeNumber、ジョブオブジェクトで常に同じであるかどうかを確認します。おそらく(少なくとも任意のOSで)、ジョブオブジェクトのハンドルをチェックするだけで、コードの効率を大幅に向上させることができます。

これがrunasのジョブオブジェクトを作成するものであると思われるため、セカンダリログオンサービスを実行しているプロセスのみにフィルタリングすることもできます。

(これが機能する場合は、コードを投稿してください。将来の訪問者にとって非常に役立つ可能性があります。)

于 2012-11-21T21:28:17.817 に答える