プログラム間ダイアログにメールスロット(Delphi 7)を使用していますが、すべて問題ありません。
しかし、(Windows XP で) プログラムの 1 つを Windows サービスとして使用すると、別の (従来の管理者ユーザーの) プログラムがメールスロットに書き込もうとすると、「Mailslot Access Denied」というメッセージが表示されます。サービスにはシステム権限があるため、これは確かに権限の問題であることは理解していますが、解決策は何ですか?
プログラム間ダイアログにメールスロット(Delphi 7)を使用していますが、すべて問題ありません。
しかし、(Windows XP で) プログラムの 1 つを Windows サービスとして使用すると、別の (従来の管理者ユーザーの) プログラムがメールスロットに書き込もうとすると、「Mailslot Access Denied」というメッセージが表示されます。サービスにはシステム権限があるため、これは確かに権限の問題であることは理解していますが、解決策は何ですか?
を呼び出すときは、メールスロットへのすべてのアクセスを許可する をCreateMailslot()
指定します。例:SECURITY_DESCRIPTOR
var
...
sd: SECURITY_DESCRIPTOR;
sa: SECURITY_ATTRIBUTES;
begin
...
InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, True, nil, False);
sa.lpSecurityDescriptor := @sd;
sa.bInheritHandle := Frue;
... := CreateMailslot(..., @sa);
...
end;
私は C++ Embarcardero 2010 を使用していますが、Remy Lebeauのソリューションにいくつかの変更を加える必要があります。これは、CreateMailSlot 関数が SECURITY_DESCRIPTOR * 型のポインターではなく、SECURITY_ATTRIBUTES * 型のポインターを受け取るためです。
C ++での私の解決策は次のとおりです。
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
SECURITY_ATTRIBUTES sa;
sa.lpSecurityDescriptor=&sd;
sa.bInheritHandle=true;
this->pHandleMailSlot = CreateMailslot("your mail slot path", 0, -1, &sa);
注: 私の場合、3 つのアプリケーションがあります。