2009-01-27 22 views
25

¿Cómo inicie un usuario de Windows XP Cerrar sesión desde una aplicación C#? La acción de mi aplicación debería producir el mismo resultado que hacer clic en "Cerrar sesión" en el menú de inicio de XP; está bien si el sistema solicita una confirmación.Cerrar sesión usuario de Win XP mediante programación en C#

¿Existe una .Net o una API no administrada para esto?

Respuesta

40

Usted podría P/Invoke ExitWindowsEx:

http://www.pinvoke.net/default.aspx/user32/ExitWindowsEx.html

Uniendo todo:

using System.Runtime.InteropServices; 
class Class1 
{ 
    [DllImport("user32.dll")] 
    static extern bool ExitWindowsEx(uint uFlags, uint dwReason); 

    [STAThread] 
    static void Main(string[] args) 
    { 
     ExitWindowsEx(ExitWindows.LogOff, ShutdownReason.MajorOther | ShutdownReason.MinorOther); 
    } 
} 

[Flags] 
public enum ExitWindows : uint 
{ 
    // ONE of the following five: 
    LogOff = 0x00, 
    ShutDown = 0x01, 
    Reboot = 0x02, 
    PowerOff = 0x08, 
    RestartApps = 0x40, 
    // plus AT MOST ONE of the following two: 
    Force = 0x04, 
    ForceIfHung = 0x10, 
} 

[Flags] 
enum ShutdownReason : uint 
{ 
    MajorApplication = 0x00040000, 
    MajorHardware = 0x00010000, 
    MajorLegacyApi = 0x00070000, 
    MajorOperatingSystem = 0x00020000, 
    MajorOther = 0x00000000, 
    MajorPower = 0x00060000, 
    MajorSoftware = 0x00030000, 
    MajorSystem = 0x00050000, 

    MinorBlueScreen = 0x0000000F, 
    MinorCordUnplugged = 0x0000000b, 
    MinorDisk = 0x00000007, 
    MinorEnvironment = 0x0000000c, 
    MinorHardwareDriver = 0x0000000d, 
    MinorHotfix = 0x00000011, 
    MinorHung = 0x00000005, 
    MinorInstallation = 0x00000002, 
    MinorMaintenance = 0x00000001, 
    MinorMMC = 0x00000019, 
    MinorNetworkConnectivity = 0x00000014, 
    MinorNetworkCard = 0x00000009, 
    MinorOther = 0x00000000, 
    MinorOtherDriver = 0x0000000e, 
    MinorPowerSupply = 0x0000000a, 
    MinorProcessor = 0x00000008, 
    MinorReconfig = 0x00000004, 
    MinorSecurity = 0x00000013, 
    MinorSecurityFix = 0x00000012, 
    MinorSecurityFixUninstall = 0x00000018, 
    MinorServicePack = 0x00000010, 
    MinorServicePackUninstall = 0x00000016, 
    MinorTermSrv = 0x00000020, 
    MinorUnstable = 0x00000006, 
    MinorUpgrade = 0x00000003, 
    MinorWMI = 0x00000015, 

    FlagUserDefined = 0x40000000, 
    FlagPlanned = 0x80000000 
} 
+1

Supongo que a alguien no le gustó la verbosidad. Ciertamente aprecio tener enumeradas las enumeraciones relevantes. – dbkk

+0

apreciado. Kev. – Kev

+0

creo que deberías O las banderas, no Y ellas: _ShutdownReason.MajorOther | ShutdownReason.MinorOther_ – Lucas

14

Trate de llamar a la función API "ExitWindowsEx" con la "EWX_LOGOFF" constante o 0. API Guide me dice que el segundo parámetro se ignora. Por ejemplo,

//The import 
using System.Runtime.InteropServices; 

// The declaration 
[DllImport("user32.dll")] 
public static extern int ExitWindowsEx(int uFlags, int dwReserved); 

// The call 
ExitWindowsEx(0, 0); 
3

o simplemente puede llamar:

shutdown.exe -l -t 0 

Si desea que el camino más fácil. Yo uso ExitWindowsEx yo mismo.

6

Para completar, la forma más sencilla que encontré es llamar a Shutdown.exe (incluido con Windows).

Process.Start("shutdown.exe", "-l -t 0"); 

Esta es la respuesta sugerida por Cerebrus, solo en formato C#.

+0

¿Es posible especificar un usuario particular con este método? –

2

No se puede combinar -l con -t por algún motivo, por lo que no funcionarán. El único enfoque parece ser el P/Invoke antes mencionado.

Cuestiones relacionadas