SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.10<<123456789101112131415161718192021222324252627282930>>2017.12
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

異常を検出するサービスを作成し、その状態をモニターするアプリケーションを別に作った。

受け渡すやり方として、共有メモリ(メモリマップドファイル)を使ったのだが、最初サービスでは次のように共有メモリを作成していた。
hMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, SERVICE_SHARED_NAME);

XPでデバッグをしていて、アカウントは管理者であるから、デバッグ環境では特に問題なく動いていた。
Vistaで動作テストしてみると、アプリケーション側で共有メモリがオープンできない。
前回の記事でもあったが、セッションが違うということで、以下のように "Global\" をつけてみる。
h=OpenFileMapping(FILE_MAP_READ, FALSE, _T("Global\\") SERVICE_SHARED_NAME);

でも、ダメ。どうやら権限がないということらしい。
今まで LPSECURITY_ATTRIBUTES なんて、NULLでしか指定した事ないぞ。どうやって作ればいいの?、とほぼ初めて SECURITY_ATTRIBUTES をいろいろと調べながら作ってみたけど、今度は共有メモリの作成さえもできなくなってしまった。どこが悪いんだ?、と全然わからず。

そこで、ちょっと考え方を変え,とりあえず NULL なら作成できるのだから、それで作成しておいて、そのオブジェクトにアクセス権を追加してしまおう…と。
で、結局できたのが以下。果たしてこれで良いのやら(汗)
hMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, SERVICE_SHARED_NAME);
if (hMem) {
PACL pDacl, pDaclNew;
PSECURITY_DESCRIPTOR sd;
EXPLICIT_ACCESS ea;

// アクセス権を設定
GetSecurityInfo(hMem, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDacl, NULL, &sd);
BuildExplicitAccessWithName(&ea, _T("Everyone"), GENERIC_READ, GRANT_ACCESS, FALSE);
SetEntriesInAcl(1, &ea, pDacl, &pDaclNew);
SetSecurityInfo(hMem, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pDaclNew, NULL);
}



テーマ:プログラミング - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。