CreateFileMapping関数で共有メモリを作成して使用するプログラムを作成しています。
実はこのプログラムはDLLで、このDLLを使用してWindowsサービスプログラムとWindowsア
プリケーションとでプロセス間通信を実現させようとしています。
CreateFileMapping関数では、Globalのプレフィックスを付けた名前で作成しています。
セキュリティ識別子(SECURITY_ATTRIBUTES構造体)も渡しています。
この仕組みですが、WindowsXPでなら問題なく動作するのですが、
WindowsVistaだと、管理者権限のないユーザーでログインしてWindowsアプリケーション
を起動すると、CreateFileMapping関数がERROR_ACCESS_DENIED(アクセス拒否)で失敗し
ます。
管理者権限のないユーザーでログインしていると、Globalのプレフィックスを付けた名前
では共有メモリは作成できないのでしょうか?
Globalのプレフィックスを付けないと、Windowsサービスプログラムとはメモリを共有で
きませんし・・・。
何か良い解決策があれば教えてください。
MSDN にある通り
http://msdn.microsoft.com/en-us/library/aa366537.aspx
> 管理者権限のないユーザーでログインしていると、Globalのプレフィックスを付けた
> 名前では共有メモリは作成できないのでしょうか?
はい。
正確には、SeCreateGlobalPrivilege 特権が必要です。
解決策は3つ。
1:その DLL を使うアプリを要昇格にする。
2:そのアプリを使うユーザーに SeCreateGlobalPrivilege を付与する
3:アプリではなくサービス側で共有メモリを作成し、アプリは OpenFileMapping する
個人的には 3 をお勧めします。
ありがとうございました。とても参考になります。