Question

J'utilise Mailslots (dans Delphi 7) pour les dialogues inter-programmes et tout va bien.

Mais quand j'utilise un de mes programmes (sous Windows XP) comme service Windows, j'ai un message "Accès Mailslot refusé", quand un autre programme (utilisateur classique de l'administrateur) essaie d'écrire dans le bac. Je comprends que c'est sûrement un problème de droits puisque le service a des droits SYSTEM mais ... quelle est la solution?

Était-ce utile?

La solution

Lors de l'appel de CreateMailslot(), spécifiez un SECURITY_DESCRIPTOR qui autorise tous les accès au bac de courrier, par exemple:

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;

Autres conseils

J'utilise C ++ Embarcardero 2010, et je dois apporter quelques modifications à la solution de Remy Lebeau car leLa fonction CreateMailSlot reçoit un pointeur de type SECURITY_ATTRIBUTES *, et non un pointeur de type SECURITY_DESCRIPTOR *.

Ma solution en C ++ est:

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);

Remarque: Dans mon cas, j'ai trois applications:

  1. Un service avec MailSlot (Embarcadero C ++ 2010)
  2. Un service avec un emplacement de courrier client (.NET v4)
  3. Un WPF avec un espace de courrier client (.NET v4)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top