2010-04-07 7 views
17

Tengo dos aplicaciones de Windows, una es un servicio de Windows que crea EventWaitHandle y lo espera. La segunda aplicación es un gui de Windows que lo abre llamando a EventWaitHandle.OpenExisting() e intenta establecer el evento. Pero estoy obteniendo una excepción en OpenExisting. La excepción es "Acceso denegado a la ruta".Creación de un evento de proceso cruzado en el gestor de órdenes

ventanas de código de servicio

EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName"); 
wh.WaitOne(); 

código de Windows GUI

try 
{ 
    EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName"); 
    wh.Set(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

probé el mismo código con la aplicación de consola de ejemplo, que estaba trabajando bien.

Respuesta

30

Necesita usar la versión de EventWaitHandle constructor que toma una instancia de EventWaitHandleSecurity. Por ejemplo, el siguiente código debería funcionar (no se probó, pero esperemos que le ayudará a utilizar):

// create a rule that allows anybody in the "Users" group to synchronise with us 
var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 
var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify, 
          AccessControlType.Allow); 
var security = new EventWaitHandleSecurity(); 
security.AddAccessRule(rule); 

bool created; 
var wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName", out created, security); 
... 

Además, si se está ejecutando en Vista o posterior, es necesario crear el evento en el espacio de nombres global (es decir, prefija el nombre con "Global \"). También debería hacer esto en Windows XP si usa la función "Cambio rápido de usuario".

+1

gracias. déjame probar primero .... – Navaneeth

+0

oye muchas gracias ..... funciona bien – Navaneeth

+0

ahhh ... el prefijo Global. Siempre lo olvido –

0

Esto podría deberse a que el proceso de servicio se ejecuta en un nivel de privilegio elevado, pero el proceso de la GUI no. Si coloca el mismo código en dos aplicaciones de consola, ambos se ejecutarán a nivel de usuario y no tendrán problemas para acceder a los objetos compartidos con nombre de los demás.

Intente ejecutar la aplicación GUI con el indicador "Ejecutar como administrador" desde el menú de inicio de Windows. Si eso resuelve el problema, debe leer sobre cómo solicitar la elevación dentro de su código. (No he hecho eso)

+0

me registré solo como administrador y estoy usando Windows XP – Navaneeth

+0

Buena idea, pero no creo que Run as Administrator ayude ya que el otro proceso se está ejecutando en una sesión aislada. Por ejemplo, no creo que los Mutexes se puedan compartir entre un servicio en la "sesión 0" y una sesión interactiva registrada. Sin embargo, no soy un experto en este sentido. – Josh

+1

Acabo de encontrar el siguiente documento que describe el impacto de la sesión 0 en Vista. Como menciona Codeka, puedes compartir eventos de esta manera si utilizas explícitamente el alcance Global \. Aquí está la URL: http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx – Josh

Cuestiones relacionadas