vb关机,重启

该博客使用VB语言实现Windows系统的关机、注销和重启功能。通过声明多个Windows API函数,定义枚举和类型,编写获取系统权限的函数,再根据不同的操作系统版本执行相应操作,如调用ExitWindowsEx函数实现关机、注销和重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Option Explicit

Private Declare Function SetSystemPowerState Lib "kernel32" (ByVal fSuspend As Long, ByVal fForce As Long) _
    As Long
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
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation _
    As OSVERSIONINFO) As Long
   
Private Enum HowExitConst
    EWX_LOGOFF = 0
    EWX_SHUTDOWN = 1
    EWX_REBOOT = 2
    EWX_FORCE = 4
    EMX_POWEROFF = 8
End Enum

Private Type OSVERSIONINFO
       dwOSVersionInfoSize  As Long
       dwMajorVersion  As Long
       dwMinorVersion  As Long
       dwBuildNumber  As Long
       dwPlatformId  As Long
       szCSDVersion  As String * 128
       osName  As Integer
End Type

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

Private Sub Logon()  '注销
    Dim method As HowExitConst
    method = EWX_LOGOFF
    Call AdjustToken
    Call ExitWindowsEx(method, 0)
    End Sub

Private Sub Restart()  '重启
    Dim method As HowExitConst
    method = EWX_REBOOT
    Call AdjustToken
    Call ExitWindowsEx(method, 0)
End Sub

'  获得  Windows  操作系统的版本
'  OSVERSIONINFO  结构中的  osName  返回操作系统的名称
Private Function GetWindowsVersion() As OSVERSIONINFO

    Dim ver As OSVERSIONINFO

    ver.dwOSVersionInfoSize = 148
    GetVersionEx ver

    With ver
        Select Case .dwPlatformId
   
        Case 1
            Select Case .dwMinorVersion
       
            Case 0
                .osName = 1 ' "Windows  95"
               
            Case 10
                .osName = 2 ' "Windows  98"
               
            Case 90
                .osName = 3 '"Windows  Mellinnium"
               
            End Select
               
        Case 2
   
            Select Case .dwMajorVersion
           
            Case 3
                .osName = 4 '"Windows  NT  3.51"
           
            Case 4
                .osName = 5 '"Windows  NT  4.0"
           
            Case 5
                If .dwMinorVersion = 0 Then
                    .osName = 6 '"Windows  2000"
                Else
                    .osName = 7 '"Windows  XP"
                End If
           
            End Select
                
        End Select
    End With

    GetWindowsVersion = ver

End Function

Public Sub Pull_The_Plug()  '注销

    Dim I As OSVERSIONINFO

    I = GetWindowsVersion()

    Select Case I.osName
        Case 1 To 3 '
            Call ExitWindowsEx(EWX_LOGOFF, 0)
        Case 4 To 7
            Call Logon
    End Select
   
End Sub

Public Sub Log_Off_Current_User()   '关机

    Dim I As OSVERSIONINFO

    I = GetWindowsVersion()

    Select Case I.osName
        Case 1 To 3 '
            Call ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE + EMX_POWEROFF, 0)
        Case 4 To 7
            Call Halt
    End Select

End Sub

Public Sub Reboot_Computer()    '重启

    Dim I As OSVERSIONINFO

    I = GetWindowsVersion()

    Select Case I.osName
        Case 1 To 3 '
            Call ExitWindowsEx(EWX_REBOOT, 0)
        Case 4 To 7
            Call Restart
    End Select

End Sub

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值