【问题标题】:Log off user from Win XP programmatically in C#在 C# 中以编程方式从 Win XP 注销用户
【发布时间】:2009-01-27 17:10:45
【问题描述】:

如何从 C# 应用程序启动 Windows XP 用户注销?我的应用程序的操作应该会产生与在 XP 开始菜单中单击“注销”相同的结果——如果系统要求确认就可以了。

是否有用于此的 .Net 或非托管 API?

【问题讨论】:

    标签: c# .net windows logoff


    【解决方案1】:

    你可以 P/Invoke ExitWindowsEx:

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

    综合起来:

    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
    }
    

    【讨论】:

    • 我猜有人不喜欢冗长。我当然感谢列出相关的枚举。
    • 我认为你应该 OR 标志,而不是 AND 他们:ShutdownReason.MajorOther | ShutdownReason.MinorOther
    • 这是否适用于较新版本的 Windows,例如 7 或 10?
    【解决方案2】:

    尝试使用常量“EWX_LOGOFF”或 0 调用“ExitWindowsEx”API 函数。API 指南告诉我第二个参数被忽略。例如,

    //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】:

      为了完整起见,我发现最简单的方法是调用 Shutdown.exe(包含在 Windows 中)。

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

      这是 Cerebrus 建议的答案,只是 C# 形式。

      【讨论】:

      • 这个方法可以指定特定用户吗?
      【解决方案4】:

      Cerebrus 是对的。这里有更多信息: Lock, Logoff, Reboot, Shutdown, Hibernate, Standby in .Net

      【讨论】:

        【解决方案5】:

        由于某种原因,您不能将 -l-t 结合使用,因此它们将不起作用。唯一的方法似乎是前面提到的 P/Invoke。

        【讨论】:

          【解决方案6】:

          或者你可以直接打电话:

          shutdown.exe -l -t 0
          

          如果您想要轻松的出路。我自己使用 ExitWindowsEx。

          【讨论】:

            猜你喜欢
            • 2012-06-15
            • 1970-01-01
            • 2011-03-07
            • 2012-01-27
            • 1970-01-01
            • 1970-01-01
            • 2015-06-19
            • 2020-10-16
            • 2017-01-15
            相关资源
            最近更新 更多