关闭计算机模块

本文介绍了一个用于检测当前程序是否运行在Windows NT系统上的方法,并提供了一种设置关闭系统的权限及执行重启、关闭或注销用户的操作流程。

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

因为98以上增加了安全机制,所以需要判断是否是NT操作系统!!

Option Explicit
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
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2

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

Type LUID
    LowPart                 As Long
    HighPart                As Long
End Type

Type LUID_AND_ATTRIBUTES
    pLuid                   As LUID
    Attributes              As Long
End Type

Type TOKEN_PRIVILEGES
    PrivilegeCount              As Long
    Privileges(ANYSIZE_ARRAY)   As LUID_AND_ATTRIBUTES
End Type


'Detect if the program is running under Windows NT
Private Function IsWinNT() As Boolean
    Dim myOS As OSVERSIONINFO
    myOS.dwOSVersionInfoSize = Len(myOS)
    GetVersionEx myOS
    IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function

'set the shut down privilege for the current application
Private Sub EnableShutDown()
    Dim hProc       As Long
    Dim hToken      As Long
    Dim mLUID       As LUID
    Dim mPriv       As TOKEN_PRIVILEGES
    Dim mNewPriv    As TOKEN_PRIVILEGES
    hProc = GetCurrentProcess()
    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
    LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
    mPriv.PrivilegeCount = 1
    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    mPriv.Privileges(0).pLuid = mLUID
   
    'enable shutdown privilege for the current application
    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub

'*************************************************************************
'**FunctionName:OperateComputer
'**Input       :Force(Boolean)     -  FORCE TO SHUTDOWN
'**            :OperateStyle(Byte) -  0:Shut Down NT,1:Restart NT,2:Log off the current user
'**OutPut      :NUll
'**Description :
'**Global Var  :
'**Author      :YongJun-Zou
'**Data        :2007-01-25 16:10:25
'**Version     :V1.0.0
'*************************************************************************
Public Sub OperateComputer(Force As Boolean, OperateStyle As Byte)
    Dim Flags   As Long
    Select Case OperateStyle
        Case 0  ' Shut Down NT
            Flags = EWX_SHUTDOWN
            If Force Then Flags = Flags + EWX_FORCE
            If IsWinNT Then EnableShutDown
            ExitWindowsEx Flags, 0
        Case 1  'Restart NT
            Flags = EWX_REBOOT
            If Force Then Flags = Flags + EWX_FORCE
            If IsWinNT Then EnableShutDown
            ExitWindowsEx Flags, 0
        Case 2  'Log off the current user
            Flags = EWX_LOGOFF
            If Force Then Flags = Flags + EWX_FORCE
            ExitWindowsEx Flags, 0
        Case Else
    End Select

End Sub


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值