Vistaでサービスで起動している実行ファイルとユーザが起動している実行ファイルでイベントのやり取りをするには?

解決


どら  2008-06-12 21:20:16  No: 68536

いつもお世話になっております。

今、2つの実行ファイルを作成しており、一つはサービスとしてローカルシス
テムアカウントで、もう一つはユーザアカウントで実行するアプリケーション
を作っています。

以下のようなソースでサービス側でCreateEvent関数を使ってイベントハンド
ルを作成し、クライアント側でOpenEventを行ってイベントのハンドルを取得
しているのですが・・・

/**************************サービス側*****************************
HANDLE hEventSvToCl = NULL;                                                                                              //サーバ→クライアント用イベントハンドル
HANDLE hEventClToSv = NULL;                                                                                              //クライアント→サーバ用イベントハンドル

SECURITY_ATTRIBUTES l_sa;
SECURITY_DESCRIPTOR l_sd;

//セキュリティ偽装の準備
if(!InitializeSecurityDescriptor(&l_sd, SECURITY_DESCRIPTOR_REVISION))
{
        return -10;
}
if(!SetSecurityDescriptorDacl(&l_sd, TRUE, NULL, FALSE))
{
        return -20;
}
l_sa.nLength = sizeof(SECURITY_ATTRIBUTES);
l_sa.bInheritHandle = FALSE;
l_sa.lpSecurityDescriptor = &l_sd;

//クライアントから受ける為のイベントハンドルの作成
hEventClToSv = CreateEvent(&l_sa, FALSE, FALSE, "ClToSv");
//クライアントに書き込むことを通知するイベントを作成
hEventSvToCl = CreateEvent(&l_sa, FALSE, FALSE, "SvToCl");
//どちらか一方が作成できなかったらエラー
if(hEventSvToCl == NULL || hEventClToSv == NULL)
{
        return -30;
}

/**********************クライアント側*****************************
hEventClToSv = OpenEvent(EVENT_ALL_ACCESS, FALSE, "ClToSv");
if(hEventClToSv == NULL)
{
        MessageBox(hWnd, "起動エラー\n\nサーバへ送るイベントを取得できませんでした。", ClassName, MB_OK);
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        break;
}
//サーバから受け取るイベントの作成
hEventSvToCl = OpenEvent(EVENT_ALL_ACCESS, FALSE, "SvToCl");
if(hEventSvToCl == NULL)
{
        MessageBox(hWnd, "起動エラー\n\nサーバから受け取るイベントを取得できませんでした。", ClassName, MB_OK);
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        break;
}

かなりはしょっていますが・・・こんな感じです。
Windows 2000、XPでは問題なく起動するのですが、Vistaだと「サーバへ送る
イベントを取得できませんでした。」のメッセージボックスがでてしまいます。

XPまでとVistaでは、イベントのやり取りをするときに何か特殊なセキュリテ
ィ設定などが必要なのでしょうか?

実際にはこのイベントハンドルを使って、サービスとクライアント間で名前付きパイプのやり取りをさせています(XPまでは問題なく動作していました)。

ご存じの方いらっしゃいましたら、ご教授をお願いできますでしょうか?
よろしくお願いいたします。

開発環境はWindows XP SP2 + VS 2005 Team Edition + Windows SDK(日本語
 6000.0.18) です。


YuO  2008-06-12 22:40:37  No: 68537

Vista以降のOSにおける,セッション0分離の影響でしょう。
http://www.microsoft.com/japan/technet/security/secnews/secpoint/secpoint0014.mspx

資料を読む限り,Global\を前置することで,対応出来そうです。
これが本当に正しいかどうかはわかりませんが……。


どら  2008-06-13 00:58:19  No: 68538

YuOさん、いつもありがとうございます!!

やっぱり、セッション0分離が原因なのですね・・・
で、教えていただいたURLを確認しました。
確かに
http://www.microsoft.com/japan/whdc/system/vista/services.mspx
この資料から見ると

> Global\を前置することで,対応出来そう

っぽいことが書いてありますが・・・これって、具体的にどの様にすればよい
のでしょうか?
参考になるサイトだけでも教えていただけると幸いです。
(これをやることでVistaでしか動かなくなる、というわけではないですよね?)


どら  2008-06-13 02:25:42  No: 68539

済みません、自己解決しました!! > Global\を前置することで,対応出来そう

サーバ側の

hEventClToSv = CreateEvent(&l_sa, FALSE, FALSE, "ClToSv");
hEventSvToCl = CreateEvent(&l_sa, FALSE, FALSE, "SvToCl");

hEventClToSv = CreateEvent(&l_sa, FALSE, FALSE, "Global\\ClToSv");
hEventSvToCl = CreateEvent(&l_sa, FALSE, FALSE, "Global\\SvToCl");

に、クライアント側の

hEventClToSv = OpenEvent(EVENT_ALL_ACCESS, FALSE, "ClToSv");
hEventSvToCl = OpenEvent(EVENT_ALL_ACCESS, FALSE, "SvToCl");

hEventClToSv = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\ClToSv");
hEventSvToCl = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\SvToCl");

に変更していけました!!
別の海外のFAQ板調べていたら、わかりました☆

YuOさん、本当にありがとうございました!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加