«Отказано в доступе» при записи на почтовый ящик в программе Windows Service - PullRequest
2 голосов
/ 05 декабря 2011

Я использую почтовые слоты (в Delphi 7) для межпрограммного диалога, и все в порядке.

Но когда я использую одну из своих программ (в Windows XP) в качестве службы Windows, у меня появляется сообщение «Доступ к почтовым слотам»«Запрещено», когда другая (классический пользователь-администратор) программа пытается написать в почтовый ящик.Я понимаю, что это, безусловно, проблема с правами, поскольку у службы есть права СИСТЕМЫ, но ... какое решение?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

При вызове 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;
2 голосов
/ 19 июня 2012

Я использую C ++ Embarcardero 2010, и мне нужно внести некоторые изменения в решение Реми Лебо , потому что функция 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. WPF с почтовым ящиком клиента (.NET v4)
...