2009-01-27 37 views
25

Làm cách nào để bắt đầu người dùng Windows XP Đăng xuất khỏi ứng dụng C#? Hành động của ứng dụng của tôi sẽ tạo ra kết quả tương tự khi nhấp vào "Đăng xuất" trong trình đơn khởi động XP - sẽ tốt nếu hệ thống yêu cầu xác nhận.Xóa người dùng khỏi Win XP theo lập trình trong C#

Có một .Net hoặc API không được quản lý cho điều này không?

Trả lời

40

Bạn có thể P/Invoke ExitWindowsEx:

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

kéo nó tất cả cùng nhau:

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

Tôi đoán có ai đó không thích sự rầm rộ. Tôi chắc chắn đánh giá cao việc có các enums có liên quan được liệt kê. – dbkk

+0

Được đánh giá cao. Kev. – Kev

+0

tôi nghĩ rằng bạn nên HOẶC cờ, không VÀ họ: _ShutdownReason.MajorOther | ShutdownReason.MinorOther_ – Lucas

14

Thử gọi là "ExitWindowsEx" chức năng API với "EWX_LOGOFF" liên tục hoặc 0. Hướng dẫn API cho tôi biết tham số thứ hai bị bỏ qua. Ví dụ:

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

Hoặc bạn chỉ có thể gọi:

shutdown.exe -l -t 0 

Nếu bạn muốn một cách dễ dàng ra. Tôi sử dụng bản thân ExitWindowsEx.

6

Để hoàn thành, cách đơn giản nhất tôi tìm thấy là gọi Shutdown.exe (đi kèm với Windows).

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

Đây là câu trả lời Cerebrus được đề xuất, chỉ trong biểu mẫu C#.

+0

Có thể chỉ định một người dùng cụ thể với phương pháp này không? –

2

Bạn không thể kết hợp -l với -t vì một lý do nào đó để chúng không hoạt động. Cách tiếp cận duy nhất có vẻ là P/Invoke nói trên.

Các vấn đề liên quan