2011-09-19 10 views
5

Estoy ejecutando un servicio de Windows al que envío mensajes a través de NetNamedPipeBinding. Los mensajes se envían desde una aplicación cliente que se desencadena por un GPO. Acabo de instalar el servicio y el cliente en un nuevo servidor y recibo el siguiente mensaje:Obteniendo EndpointNotFoundException con NetNamedPipeBinding en C#; Necesidad de crear un canal con nombre global

System.ServiceModel.EndpointNotFoundException: 
There was no endpoint listening at 
net.pipe://localhost/VOXAServices/VOXADefaultPipe that could accept the 
message. This is often caused by an incorrect address or SOAP action. 
See InnerException, if present, for more details. 

No hay una excepción interna. Si ejecuto la aplicación cliente haciendo doble clic en su icono en el escritorio, se ejecuta sin problemas. Administro el código tanto para el servicio de Windows como para la aplicación cliente, para poder cambiar lo que necesito. Pero hasta ahora, estoy bastante convencido de que el enlace, el contrato y la dirección son todos correctos (ya que todo funciona bien cuando se ejecuta desde el escritorio). Creo que el problema debe ser con la aplicación del cliente que se ejecuta desde un GPO. Pero no puedo pensar en ninguna razón por la que eso causaría este error.

ACTUALIZACIÓN:

leí este presente en el sitio web de Microsoft:

una tubería con nombre es un objeto en el núcleo del sistema operativo Windows, tales como una sección de memoria compartida que los procesos puedan usar para la comunicación . Una tubería con nombre tiene un nombre y se puede usar para la comunicación dúplex unidireccional o entre procesos en una sola máquina.

Cuando se requiere comunicación entre diferentes aplicaciones WCF en un solo equipo , y desea evitar cualquier comunicación desde en otra máquina, utilice el transporte de tuberías con nombre. Una restricción adicional de es que los procesos que se ejecutan desde Windows Remote Desktop pueden restringirse a la misma sesión de Windows Remote Desktop a menos que tengan privilegios elevados.

(Choosing a Transport, énfasis añadido)

necesito el proceso de cliente para ejecutar en el contexto del usuario (no privilegiado) y tener un diálogo UAC pop arriba no es una opción. ¿Hay alguna forma de que le dé a este cliente privilegios elevados mientras mantiene el proceso ejecutándose en el contexto del usuario sin privilegiarlo?

ACTUALIZACIÓN # 2:

Parece que hay una cosa tal como global y local (a la sesión de Windows) canalizaciones con nombre. Creo que mi servicio de Windows está creando una tubería con nombre local y que si puedo obligarlo a crear una tubería con nombre global, resolvería mi problema. (Esto explica por qué no pude ver mi pipa en sysinternals "Process Explorer", aunque mi aplicación cliente podría encontrarla si la lancé desde una sesión privilegiada). El problema es que no sé (y no puedo encontrarlo) cómo forzar una tubería con nombre para que se cree globalmente (C#). ¿Algunas ideas?

Respuesta

3

The mechanism by which WCF clients find WCF service NetNamedPipe endpoints implica un objeto de memoria compartida del núcleo que el servicio utiliza para indicar a los clientes el nombre real de la tubería que se utilizará. Si los clientes van a estar en una sesión de inicio de sesión diferente al servidor, este objeto de memoria compartida debe estar en el espacio de nombres global y no en el núcleo local. Los propios conductos nombrados tienen un solo espacio de nombres, visible para todos los clientes. No puede controlar directamente el espacio de nombres que utiliza WCF para el objeto de memoria compartida, pero será el espacio de nombres global del kernel siempre que su servidor sea un servicio de Windows que se ejecute con SeCreateGlobalPrivilege.Su pregunta parece implicar que este es el caso, por lo que soy escéptico si su problema está relacionado con los espacios de nombres de los objetos del kernel. otros

dos causas posibles son:

  1. Las ACL que protegen tanto el objeto de memoria compartida y la canalización con nombre. Estos siempre denegarán el acceso a cualquier contexto de seguridad que tenga membresía en el grupo de USUARIOS DE RED (SID S-1-5-2). Esto impone la garantía de WCF de no tener acceso remoto a puntos finales de tuberías con nombre.

  2. Si ejecuta en Vista o posterior, el nivel de integridad obligatoria del proceso del cliente no debe ser inferior al nivel de integridad obligatoria de los objetos kernel (que será el nivel implícito - Medio) a menos que haya tomado especial medidas para elevar el uso de etiquetas de integridad obligatorios)

no sé lo suficiente sobre el contexto de seguridad en el que el proceso de cliente iniciado por el GPO iría para asesorar a más, pero le sugiero que consulte estas dos posibilidades y posterior actualizaciones adicionales a su pregunta en consecuencia.

Cuestiones relacionadas