windows2000 的OS

解决方案 »

  1.   

    Private Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
    Private Enum HowExitConst
       EWX_LOGOFF = 0 
        EWX_SHUTDOWN = 1
        EWX_REBOOT = 2 
        EWX_FORCE = 4 
        EMX_POWEROFF = 8
    End Enum
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Const ANYSIZE_ARRAY = 1
    Private Type LUID
        LowPart As Long
        HighPart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegevalue Lib "advapi32.dll" Alias "LookupPrivilegevalueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    '98下
    Call ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF, 0)  '关机
    Call ExitWindowsEx(EWX_REBOOT, 0) '重启
    Call ExitWindowsEx(EWX_LOGOFF, 0)  '注销'2000/XP下             
    Call Halt   '关机
    Call Restart  '重启
    Call Logon  '注销
    Private Sub AdjustToken()
        On Error Resume Next
        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.Privileges(0).pLuid = tmpLuid
        tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
        AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewbutIgnored), tkpNewbutIgnored, lBufferNeeded
    End Sub
    Private Sub Halt()
        Dim method As HowExitConst
        method = EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF
        Call AdjustToken
        Call ExitWindowsEx(method, 0)
        End SubPrivate Sub Logon()
        Dim method As HowExitConst
        method = EWX_LOGOFF
        Call AdjustToken
        Call ExitWindowsEx(method, 0)
        End SubPrivate Sub Restart()
        Dim method As HowExitConst
        method = EWX_REBOOT
        Call AdjustToken
        Call ExitWindowsEx(method, 0)
        End Sub试试
      

  2.   

    更正一下:
    Declare Function LookupPrivilegevalue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long