"Accès refusé" lors de l'écriture sur Mailslot dans le programme de service Windows
-
28-10-2019 - |
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?
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:
- Un service avec MailSlot (Embarcadero C ++ 2010)
- Un service avec un emplacement de courrier client (.NET v4)
- Un WPF avec un espace de courrier client (.NET v4)