c# - que - pagina web de eventos
Creación de un evento de proceso cruzadoWaitHandle (2)
Debe usar la versión del constructor EventWaitHandle que toma una instancia de EventWaitHandleSecurity . Por ejemplo, el siguiente código debería funcionar (no está probado, pero esperamos que puedas comenzar):
// 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 está ejecutando en Vista o posterior, debe crear el evento en el espacio de nombres global (es decir, prefijar el nombre con "Global /"). También tendría que hacer esto en Windows XP si utiliza la función "Cambio rápido de usuario".
Tengo dos aplicaciones de Windows, una es un servicio de Windows que crea EventWaitHandle y lo espera. La segunda aplicación es una interfaz gráfica de Windows que la abre llamando a EventWaitHandle.OpenExisting () e intenta establecer el evento. Pero estoy recibiendo una excepción en OpenExisting. La excepción es "Acceso denegado a la ruta".
código de servicio de windows
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
wh.WaitOne();
Código GUI de Windows
try
{
EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName");
wh.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Probé el mismo código con dos aplicaciones de consola de muestra, estaba funcionando bien.
Esto puede deberse a que el proceso de servicio se ejecuta en un nivel de privilegio elevado, pero el proceso GUI no lo es. Si coloca el mismo código en dos aplicaciones de consola, ambas se ejecutarán a nivel de usuario y no tendrán ningún problema para acceder a los objetos compartidos nombrados entre sí.
Intente ejecutar la aplicación GUI con el indicador "Ejecutar como administrador" en el menú de inicio de Windows. Si eso resuelve el problema, debe leer cómo solicitar la elevación dentro de su código. (No he hecho eso)