在Windows服务程序中在Mailslot上编写“访问被拒绝”

时间:2011-12-05 17:46:27

标签: delphi windows-services mailslot

我使用Mailslots(在Delphi 7中)进行程序间对话,一切正常。

但是,当我使用我的一个程序(在Windows XP中)作为Windows服务时,我有一条消息“Mailslot Access Denied”,当另一个(经典管理员用户)程序尝试写入邮件槽时。 我明白这肯定是一个权利问题,因为服务有SYSTEM权限,但......解决方案是什么?

2 个答案:

答案 0 :(得分:2)

调用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;

答案 1 :(得分:2)

我使用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);

注意:在我的情况下,我有三个应用程序:

  1. 使用MailSlot(Embarcadero C ++ 2010)的服务
  2. 使用客户端邮件槽(.NET v4)的服务
  3. 带有客户端邮件槽(.NET v4)的WPF