怎样用程序控制计算机开机、重起、注销?

解决方案 »

  1.   

    Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As LongExitWindowsEx 1, 0 关机
    ExitWindowsEx 0, 0 注销
    ExitWindowsEx 2, 0 重启
      

  2.   

    Option ExplicitPrivate 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
      

  3.   

    Option ExplicitPrivate Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Const EWX_SHUTDOWN As Long = 1
    Private Const EWX_FORCE As Long = 4
    Private Const EWX_REBOOT = 2
    Private Const EWX_POWEROFF=8Private Type LUID
      UsedPart As Long
      IgnoredForNowHigh32BitPart As Long
    End TypePrivate Type TOKEN_PRIVILEGES
      PrivilegeCount As Long
      TheLuid As LUID
      Attributes As Long
    End Type'关闭系统的API
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, _
                                                         ByVal dwReserved As Long) As Long
    '获取当前进程的一个伪句柄
    '只要当前进程需要一个进程句柄,就可以使用这个伪句柄。该句柄可以复制,但不可继承。不必调用CloseHandle函数来关闭这个句柄
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long'以下为NT/2000中和权限相关的函数
    '如果函数执行成功,返回非零。
    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
    Sub ExitSystem()  Dim hProcessHandle As Long
      Dim hTokenHandle As Long
      Dim tmpLuid As LUID
      Dim tkpNew As TOKEN_PRIVILEGES
      Dim tkpPrevious As TOKEN_PRIVILEGES
      Dim lBufferNeeded As Long  hProcessHandle = GetCurrentProcess()
      Call OpenProcessToken(hProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hTokenHandle)  Call LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid)  tkpNew.PrivilegeCount = 1
      tkpNew.TheLuid = tmpLuid
      tkpNew.Attributes = SE_PRIVILEGE_ENABLED  lBufferNeeded = 0
      Call AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, lBufferNeeded)  Call ExitWindowsEx(EWX_SHUTDOWN, &O0)
    '把EWX_SHUTDOWN(关机)换成 EWX_REBOOT(重启)、EWX_LOGOFF(注销)、EWX_POWEROFF(关闭电源)。EWX_FORCE是强制执行。
    End Sub
      

  4.   

    Call ExitWindowsEx(EWX_SHUTDOWN, &O0)应该是
    ExitWindowsEx 8,0'正常关机
    ExitWindowsEx 13,0'强制关机如果不这样就会出现"现在可以安全关闭计算机了!"
      

  5.   

    '模块中的代码(粘过去就可以了)
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
    Private Type OSVERSIONINFO
           dwOSVersionInfoSize  As Long
           dwMajorVersion  As Long
           dwMinorVersion  As Long
           dwBuildNumber  As Long
           dwPlatformId  As Long
           szCSDVersion  As String * 128 'Maintenance  string  for  PSS  usage
           osName  As String             '我自己加的,  操作系统的名称
    End TypePrivate 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 LongPrivate 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 SubPrivate 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 SubPrivate Function GetWindowsVersion() As Long
    Dim ver As OSVERSIONINFO
    ver.dwOSVersionInfoSize = 148
    GetVersionEx ver
    GetWindowsVersion = ver.dwPlatformId
    End FunctionPublic Sub CloseComputer() '关闭计算机
    Dim ver As Long
    ver = GetWindowsVersion()
    If ver = 1 Then 
        Call ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF, 0)
    Else 
        Call Halt
    End If
    End SubPublic Sub ResetComputerA() '重启计算机
    Dim ver As Long
    ver = GetWindowsVersion()
    If ver = 1 Then 
        Call ExitWindowsEx(EWX_REBOOT, 0)
    Else  
        Call Restart
    End If
    End SubPublic Sub LogoutComputerA() '注销计算机
    Dim ver As Long
    ver = GetWindowsVersion()
    If ver = 1 Then 
        Call ExitWindowsEx(EWX_LOGOFF, 0)
    Else 
        Call Logon
    End If
    End Sub
    '窗体中的代码(98,2000,XP下都可用)
    Private Sub Command1_Click()'关闭计算机
    CloseComputer
    End SubPrivate Sub Command2_Click()'重启计算机
    ResetComputerA
    End SubPrivate Sub Command3_Click()'注销计算机
    LogoutComputerA
    End Sub