如题

解决方案 »

  1.   

    Private Type LUID
    UsedPart As Long
    IgnoredForNowHigh32BitPart As Long
    End TypePrivate Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
    End TypePrivate Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
     
    Const EWX_FORCE = 4 '强迫中止没有响应的进程
    Const EWX_LOGOFF = 0 '中止进程,然后注销
    Const EWX_POWEROFFE = 8 '关掉系统电源(如果可能的话,ATX电源就可以)
    Const EWX_REBOOT = 2 '重新引导系统
    Const EWX_SHUTDOWN = 1 '关闭系统Sub AdjustToken()
    Const TOKEN_ADJUST_PRIVILEGES = &H20
    Const TOKEN_QUERY = &H8
    Const SE_PRIVILEGE_ENABLED = &H2
    Dim hdlProcessHandle As Long
    Dim hdlTokenHandle As Long
    Dim tmpLuid As LUID
    Dim tkp As TOKEN_PRIVILEGES
    Dim tkpNewButIgnored As TOKEN_PRIVILEGES
    Dim lBufferNeeded As Long
    hdlProcessHandle = GetCurrentProcess()
    OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle
    LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
    tkp.PrivilegeCount = 1
    tkp.TheLuid = tmpLuid
    tkp.Attributes = SE_PRIVILEGE_ENABLED
    AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
    End SubSub ShutDown()
    Call AdjustToken '98可以不用这个,2000与XP就要用 ,2003还没有试过
    ExitWindowsEx EWX_LOGOFF, 0
    End Sub
      

  2.   

    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Const EWX_LOGOFF = 0 '注销
    Const EWX_SHUTDOWN = 1 '关机
    Const EWX_REBOOT = 2 '重启
    Const EWX_FORCE = 4 '强制关闭
    Private Sub Form_Load()
        msg = MsgBox("您注销系统吗?", vbInformation + vbOKCancel + 256, "注销")
        If msg = vbCancel Then End
        ret& = ExitWindowsEx(EWX_LOGOFF, 0)'0--注销,1--关机,2--重启...
    End Sub