2010-12-08 6 views
1

CreateJobObjectで指定されたジョブオブジェクトハンドルに現在のプロセスを割り当てるのに、関数を使用できないようです。これは既にStackOverflowで数回質問されていますが、これまでのところUACマニフェストの埋め込みに至るまでの解決策のどれも私にとってはうまくいかないようです。新しく作成されたジョブオブジェクトにどのように現在のプロセスを割り当てることができますか?

私はこれにWindows 7でMSVC9を使用しています。ここに私のサンプルアプリケーションと私は埋め込んだ小型マニフェストのソースコードです(たぶん問題を修正します - しかし、ではない私のために):

私のサンプルアプリケーション(main.cpp):

#include <windows.h> 

static void dumpLastError() 
{ 
    LPVOID lpMsgBuf; 
    DWORD dw = GetLastError(); 

    FormatMessage(
     FORMAT_MESSAGE_ALLOCATE_BUFFER | 
     FORMAT_MESSAGE_FROM_SYSTEM, 
     NULL, 
     dw, 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
     (LPTSTR) &lpMsgBuf, 
     0, NULL); 
    OutputDebugStringA((LPTSTR)lpMsgBuf); 

    LocalFree(lpMsgBuf); 
} 

int main() 
{ 
    HANDLE job = CreateJobObjectA(NULL, "demo job 123"); 
    if (!job) { 
     OutputDebugStringA("CreateJobObject failed"); 
     dumpLastError(); 
     return 1; 
    } 

    if (!AssignProcessToJobObject(job, GetCurrentProcess())) { 
     OutputDebugStringA("AssignProcessToJobObject failed"); 
     dumpLastError(); 
     return 1; 
    } 

    return 0; 
} 

UACマニフェスト(main.exe.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3"> 
     <ms_asmv3:security> 
     <ms_asmv3:requestedPrivileges> 
      <ms_asmv3:requestedExecutionLevel level="requireAdministrator"/> 
     </ms_asmv3:requestedPrivileges> 
     </ms_asmv3:security> 
    </ms_asmv3:trustInfo> 
</assembly> 

私は

cl main.cpp 
mt -manifest main.exe.manifest -outputresource:main.exe;1 
を実行することによって、このサンプルをビルド

残念ながら、AssignProcessToJobObject呼び出しを試みると、これらの手順の後に私のmain.exeサンプルを実行すると、デバッグ出力に「アクセス拒否」エラーが発生します。誰がなぜそれが分かっていますか?

+0

万が一cygwinを使用していますか?または、あなたのビルド/実行コマンドは、cmdのウィンドウですか? –

+0

@ Ryan Calhoun:いいえ、私はCygwinを使用していませんが、PyCmd(単純なcmd.exeの置き換え)を使用しています。それは興味深い質問です!私はcmd.exeの中から試してみましたが、今はうまくいくようです!奇妙な –

答えて

2

私は、ジョブオブジェクトとUACマニフェストに関する一時点で多くの議論を続けました。あなたが持っているのと同じ問題の周りに私を助けた唯一の情報は、このセキュリティ機能(Vistaで導入された)が明らかにcmdから実行されたときではないということでした。

私はあなたがスタートメニューからPyCmdを起動していると仮定します。 cmdからそれを起動してみてください。問題がそこから消えてしまうでしょう。私は(cygwinのでminttyを実行するために)やってしまった何を

start mintty.exe 

を言っmintty.batして、「最小化」を実行するように設定されたプロパティを持っていたmintty.batへのショートカットを作ることでした(私は正確な言葉遣いを忘れる)。これにより、スタートメニューから起動したいと思っていたシェルを、cmd.exeから起動したかのように動作させることができます。

誰かが来て実際にビルドレベルで問題を説明し、それを修正する方法があれば、私はそれを気に入っています。

+0

私はUACの問題やcmdの違いを知りませんが、ショートカットターゲットを次のように設定して.batファイルを切り取ることができます: 'C:\ Windows \ system32 \ cmd.exe/c start C :\ cygwin \ bin \ mintty.exe -' – ak2

+0

ありがとう、私はWindows 7でこの件に問題がありました。 – MRM

4

これは古い質問ですが、私は最近、まったく同じ問題を抱えていました。 提案したように私は数分前にコマンドラインの回避策を使用していましたが、this postが見つかりました。

私は、プロセスを作成していたので、私は、プロセスの作成フラグにCREATE_BREAKAWAY_FROM_JOBを追加する記事の指示に従っ:

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi) 

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) 

私がテストし、期待どおりに動作しますが、プロセスはジョブに割り当てられ、UACマニフェストはなく、コマンドラインは割り当てられません。

この問題を抱えているあなたや他の人に役立つことを願っています。

+0

+1ああ、非常に面白い!私は 'CREATE_BREAKAWAY_FROM_JOB'について知っていましたが、すべてのケースで設定しているかどうかを明示的にチェックしていませんでした。これを共有する時間をとってくれてありがとう。 :-) –

+0

関連ドキュメントはこちら(https://msdn.microsoft.com/en-us/library/windows/desktop/ms681949(v=vs.85).aspx):プロセスがプログラム互換性アシスタント(PCA)では、互換性ジョブに配置されます。したがって、別のジョブに配置する前に、CREATE_BREAKAWAY_FROM_JOBを使用してプロセスを作成する必要があります。また、アプリケーションにユーザーアカウント制御(UAC)レベルを指定するアプリケーションマニフェストを埋め込むことができ、PCAはそのプロセスを互換性ジョブに追加しません。 –

+0

これはかなりの発見です。私は自分自身を作成し​​ていないいくつかの仕事に新たに作成されたプロセスを_immediately_追加することは決して考えませんでした。明らかにCreateProcessをフックします。知っておいてよかった! – Jinxed

関連する問題