Domanda

Uso le mailslot (in Delphi 7) per la finestra di dialogo inter-programmi e tutto va bene.

Ma quando utilizzo uno dei miei programmi (in Windows XP) come servizio Windows ho un messaggio "Accesso a posta" negata ", quando un altro programma (utente di amministrazione classico) prova a scrivere sulla posta. Capisco che è sicuramente un problema dei diritti poiché il servizio ha diritti di sistema ma ... qual è la soluzione?

È stato utile?

Soluzione

Quando si chiama CreateMailslot(), specificare a SECURITY_DESCRIPTOR Ciò consente tutto l'accesso alla Mailslot, ad esempio:

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;

Altri suggerimenti

Uso C ++ Embarcardero 2010 e devo fare alcune modifiche alla soluzione di Remy Lebeau Perché la funzione CreateMailSlot riceve un puntatore di Type Security_Attributes *e non un puntatore di Type Security_Descriptor *.

La mia soluzione in 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);

Nota: nel mio caso ho tre applicazioni:

  1. Un servizio con Mailslot (Embarcadero C ++ 2010)
  2. Un servizio con una mailslot client (.NET V4)
  3. Un WPF con una mailslot client (.NET V4)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top