Recibí una entrada de Event Viever de uno de mis usuarios que decía que ocurrió una Excepción de acceso no autorizado. El proceso se inicia desde un servicio como SISTEMA. Pude reducir el error a la parte donde se crea NamedPipeServerStream:
// <error in this block> PipeSecurity pipeSa = new PipeSecurity(); pipeSa.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow)); NamedPipeServerStream np = new NamedPipeServerStream("streamname", PipeDirection.InOut,1,PipeTransmissionMode.Message,PipeOptions.None,16383,1, pipeSa); // </error in this block> while (true){ try{ if (!np.IsConnected) np.WaitForConnection(); }catch(Exception e){ } }Estoy bastante seguro de que el error está en el bloque de 3 líneas de arriba. No sucede en ninguna de mis computadoras, por lo que no puedo repetir el error. ¿Qué en el código anterior no se considera la mejor práctica y puede causar errores?
imagen del mensaje de error:
La pregunta que hiciste tiene muy pocos detalles. Por lo tanto, será difícil reducir cuál es la verdadera causa. Sin embargo, estoy dispuesto a intentarlo.
Si observa la documentación de la Excepción de acceso no autorizado
La excepción que se genera cuando el sistema operativo deniega el acceso debido a un error de E/S o un tipo específico de error de seguridad.
Podemos ver que su código ya se traga todas las excepciones. Entonces, probablemente podamos asumir que esto se lanza al crear la tubería.
Mi mejor suposición es que hay ocasiones en las que no puede acceder a la tubería porque el sistema no tiene el acceso adecuado a la tubería. Después de hacer una investigación rápida. Esta pregunta parece tener mucha información buena que vale la pena probar. Parafraseando algunas respuestas:
Hay dos cosas que pueden hacer que falle la instanciación de un segundo o posterior NamedPipeServerStream en la misma canalización:
Probablemente le falta un privilegio que necesita para agregar un derecho de acceso, tal vez necesite proporcionar control al sistema:
pipeSa.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow)); pipeSa.AddAccessRule(pa);