4

Windows サービスを作成しました。その下でイベント「テスト」を作成しています。アプリケーションで同じイベント オブジェクトを設定/リセットするために使用したいと考えています。しかし、アプリを介してイベント オブジェクトのハンドルを取得していないようです。ただし、イベントが BaseNamed オブジェクトにリストされていることがわかります。

create Event の security Attribute で何かをする必要があると思います。

サービスでこのイベントを作成しています

CreateEvent(NULL, TRUE, FALSE, TEXT("テスト"))

私のアプリケーションでOpenEventを使用しています。

OpenEvent( EVENT_ALL_ACCESS, TRUE, TEXT("テスト"))

アプリがハンドルを取得するために必要な変更を提案してください。

アップデート

交換後TEXT("Test") with TEXT("Global\\Test")。それでも、Event オブジェクト ハンドルを取得できませんでした。はい、少なくとも Error return(Access Denied) でイベント オブジェクトの存在を認識するようになりました。以前はエラーが返されていました (システムは指定されたファイルを見つけることができません)。私が言ったように、ここにはセキュリティの側面があると思います。これが私が見つけたものです:セッションがセッション0でイベントを作成するため、セッション1で作成されているアプリケーションでは継承できません。そのために、イベントオブジェクトの作成中に、セキュリティ属性構造を指定する必要がありますそのための適切な Security Dispatcher。誰かが私にそうする方法を教えてもらえますか?

4

2 に答える 2

5

これを試して:

PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); 
InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(psd, TRUE, NULL, FALSE);

SECURITY_ATTRIBUTES sa = {0};
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = psd;
sa.bInheritHandle = FALSE;

HANDLE hEvent = CreateEvent(&sa, TRUE, FALSE, TEXT("Global\\Test"));
LocalFree(psd);

HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, TEXT("Global\\Test"));
于 2013-09-19T16:05:51.830 に答える
4

サービスとアプリケーションは異なるセッションで実行される可能性が高く、「グローバル」カーネル オブジェクト名前空間プレフィックスを使用して、サービスとアプリケーションの両方からオブジェクトを表示できるようにする必要があります。

MSDNのカーネル オブジェクトの名前空間の例と説明を参照してください。

個別のクライアント セッションの名前空間により、複数のクライアントが互いに干渉することなく同じアプリケーションを実行できます。クライアント セッションで開始されたプロセスの場合、システムはデフォルトでセッション名前空間を使用します。ただし、これらのプロセスは、"Global\" プレフィックスをオブジェクト名の先頭に追加することにより、グローバル名前空間を使用できます。たとえば、次のコードは CreateEvent を呼び出し、CSAPP という名前のイベント オブジェクトをグローバル ネームスペースに作成します。

CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );

以下も参照してください。

デフォルトのイベント セキュリティはアプリケーションからのアクセスを拒否する可能性があるため、イベントを作成して公開する準備ができたらすぐに更新する必要があります。

于 2013-09-19T09:54:23.983 に答える