"Acceso denegado" al escribir en Mailslot en el programa de servicio de Windows
-
28-10-2019 - |
Pregunta
Utilizo correo (en Delphi 7) para el cuadro de diálogo Interprograms y todo está bien.
Pero cuando uso uno de mis programas (en Windows XP) como servicio de Windows, tengo un mensaje "MororSlot Access denegado", cuando otro programa (usuarios de administrador clásico) intenta escribir en Mailslot. Entiendo que seguramente es un problema de derechos ya que el servicio tiene derechos del sistema, pero ... ¿cuál es la solución?
Solución
Al llamar CreateMailslot()
, especifique un SECURITY_DESCRIPTOR
Eso permite todo el acceso al maga, por ejemplo, por ejemplo:
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;
Otros consejos
Utilizo C ++ Embarcardero 2010, y tengo que hacer algunas modificaciones a la solución de Remy Lebeau Porque la función CreateMailSlot recibe un puntero de tipo Security_Attributes *, y no un puntero de tipo Security_descriptor *.
Mi solución en C ++ es:
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: En mi caso tengo tres aplicaciones:
- Un servicio con Mailslot (Embarcadero C ++ 2010)
- Un servicio con un cliente Mailslot (.net v4)
- Un WPF con un cliente Mailslot (.net v4)