2009-05-15 10 views
0

私のOSはVistaでUACがオンになっています。私はサーバ側でグローバルMutexオブジェクトを作成します。そして、UIを持つAPは同じ名前のCreateMutexを使用してサーバで作成されたMutexオブジェクトを取得します。しかし、私はそれにアクセスする権利がないと私に伝えています。どうしたらいいですか?VistaのMutexオブジェクトについて

+0

あなたがサーバーを実行していて -

また、あなたが本当にグローバルミューテックスを必要とする場合に、注意してください同じVistaマシンのUI? –

+0

はい、大きな問題は、UIが、既存のミューテックスがUI SWよりも高い権利を持っているため、サーバーによって作成されたMUTEXにアクセスする必要はないということです。 –

答えて

5

あなたのケースでは、対応するセキュリティ属性を初期化することによって、あなたのミューテックスへのすべてのアクセスを明示的に許可する必要があると思います。

は、ミューテックスをこの方法(半擬似コードとしてそれを考慮して)作成してみてください:

SECURITY_ATTRIBUTES sa; 
SECURITY_DESCRIPTOR sd; 
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 
sa.nLength = sizeof(sa); 
sa.lpSecurityDescriptor = &sd; 
CreateMutex(&sa, ...); 

ところでを - 既存ミューテックスを開くためにCreateMutexを使用するのもOKです。しかし、OpenMutexでは必要なアクセスレベルを指定することができます。あなたはそれが「グローバル\」と名前だ接頭辞にする必要があります(MSDNの「カーネルオブジェクト名前空間」の記事を参照してください)

+1

まあ、それは良い練習の問題ではありません:同じフックを初期化してアクセスするグローバルフックDLLがあると想像してください - このシナリオではOpenMutexは便利ではありません。しかし、あなたのコードを作成してミューテックスを作成し、そのミューテックスにアクセスするのが簡単に分かれば、CreateMutexが作成され、OpenMutexが既存のミューテックスを所望のアクセス権で開くと、コードがより明確になります – Andrey

+0

ありがたいことに、 –

関連する問題