我将 Mailslots(在 Delphi 7 中)用于程序间对话框,一切正常。
但是当我使用我的一个程序(在 Windows XP 中)作为 Windows 服务时,当另一个(经典管理员用户的)程序尝试写入邮件槽时,我收到一条消息“邮件槽访问被拒绝”。我知道这肯定是一个权利问题,因为服务具有系统权限但是......解决方案是什么?
我将 Mailslots(在 Delphi 7 中)用于程序间对话框,一切正常。
但是当我使用我的一个程序(在 Windows XP 中)作为 Windows 服务时,当另一个(经典管理员用户的)程序尝试写入邮件槽时,我收到一条消息“邮件槽访问被拒绝”。我知道这肯定是一个权利问题,因为服务具有系统权限但是......解决方案是什么?
调用时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_ATTRIBUTES * 类型的指针,而不是 SECURITY_DESCRIPTOR * 类型的指针。
我在 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);
注意:就我而言,我有三个应用程序: