2009-03-26 12 views

Respuesta

11
//using Microsoft.Win32; 
//using System.Net.NetworkInformation; 
public class SessionChanges 
{ 
    public SessionChanges() 
    { 
     NetworkChange.NetworkAvailabilityChanged += 
      new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); 
     SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch); 
    } 

    void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
    { 
     if (e.Reason == SessionSwitchReason.SessionLogon) 
     { 
      //user logged in 
     } 
    } 

    void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
    { 
     if (e.IsAvailable) 
     { 
      //a network is available 
     } 
    } 
} 
+1

SystemEvents.SessionSwitch solo se activará para el usuario actual, que no parece ser lo que quiere. (Consulte la fuente de referencia de .Net para SystemEvents.EnsureRegisteredSessionNotification) – SLaks

+0

Tenga en cuenta que para usar SystemEvents desde un servicio necesita un bucle de mensaje. La forma más sencilla de hacerlo es crear una forma oculta. Vea el ejemplo 2 en http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx para obtener un excelente ejemplo de esto. – Rory

-1

Puede escribir WinLogin Notification package. Sin embargo, no estoy seguro de si es posible hacerlo en C#. (No tengo ninguna razón para creer que no es, pero solamente he hecho en C++ y código no administrado.)

Aquí es un CodeProject link

No sé cómo escuchar para cuando el la red se conecta

+0

Tu enlace no funciona. –

0

No se puede hacer b) con .NET 2.0. Para XP y anteriores, debe crear un reemplazo GINA, que es un archivo DLL no administrado que exporta un conjunto específico de funciones.

En Vista, hay un modelo diferente basado en COM que tiene que usar que podría ser capaz de usar .NET 2.0 para, pero no me sorprendería si no puede.

Lo que haría es hacer que su reemplazo GINA (o el equivalente en Vista) envíe una señal de algún tipo a su servicio.

Para a) estos dos enlaces deben ser capaces de ayudar:

Reconocimiento de redes en Windows XP

http://msdn.microsoft.com/en-us/library/ms700657(VS.85).aspx

Reconocimiento de redes en Windows Vista

http://msdn.microsoft.com/en-us/library/ms697388(VS.85).aspx

+1

Recuerde que los GINA no son compatibles con el Cambio rápido de usuario. Según su entorno de destino, sus usuarios pueden no apreciar que – SLaks

2

Para encontrar cuando la red está conectada, agregue un controlador para el NetworkAvailabilityChanged i n la clase System.Net.NetworkInformation.NetworkChange.

Una forma simple de saber cuándo un usuario inicia sesión es crear un exe por separado y ponerlo en un inicio común. Se ejecutará cada vez que un usuario inicie sesión, y luego podría comunicarse con su servicio y dar el nombre de usuario. Si desea que su servicio interactúe con el escritorio del usuario, esta es (creo) la única forma de hacerlo. Sin embargo, si no lo hace, esta podría no ser una buena idea.

Recuerde que es posible que varios usuarios que estar conectado a la vez, especialmente a través de Escritorio remoto o Terminal Services (En Windows Server)

3

Para recibir una notificación cuando ningún usuario inicia sesión en la máquina, llame al WTSRegisterSessionNotification, pasando NOTIFY_FOR_ALL_SESSIONS, y escuche el mensaje WM_WTSSESSION_CHANGE en el bucle del mensaje.

En el mensaje, que tire la wParam a la Microsoft.Win32.SessionSwitchReason enumeración de averiguar lo que pasó, y pasar el lParam a WTSQuerySessionInformation para encontrar el nombre de usuario.

[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); 

//Pass this value in dwFlags 
public const int NOTIFY_FOR_ALL_SESSIONS   = 0x1; 

//Listen for this message 
public const int WM_WTSSESSION_CHANGE = 0x02B1; 

//Call this method before exiting your program 
[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd); 
Cuestiones relacionadas