www.pudn.com > NT 的注销、重启、关闭计算机.zip > Form1.frm


VERSION 5.00 
Begin VB.Form Form1  
   BorderStyle     =   1  'Fixed Single 
   Caption         =   "模拟 Win95/98/NT 的关闭系统项" 
   ClientHeight    =   1710 
   ClientLeft      =   45 
   ClientTop       =   330 
   ClientWidth     =   3255 
   Icon            =   "Form1.frx":0000 
   LinkTopic       =   "Form1" 
   MaxButton       =   0   'False 
   MinButton       =   0   'False 
   ScaleHeight     =   1710 
   ScaleWidth      =   3255 
   StartUpPosition =   2  '屏幕中心 
   Begin VB.CommandButton Command3  
      Caption         =   "关闭计算机" 
      BeginProperty Font  
         Name            =   "宋体" 
         Size            =   10.5 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Height          =   405 
      Left            =   780 
      TabIndex        =   2 
      Top             =   1230 
      Width           =   1635 
   End 
   Begin VB.CommandButton Command2  
      Caption         =   "重启计算机" 
      BeginProperty Font  
         Name            =   "宋体" 
         Size            =   10.5 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Height          =   405 
      Left            =   780 
      TabIndex        =   1 
      Top             =   660 
      Width           =   1635 
   End 
   Begin VB.CommandButton Command1  
      Caption         =   "注销当前用户" 
      BeginProperty Font  
         Name            =   "宋体" 
         Size            =   10.5 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Height          =   405 
      Left            =   780 
      TabIndex        =   0 
      Top             =   60 
      Width           =   1635 
   End 
End 
Attribute VB_Name = "Form1" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
'Editer:戴国宏 
'Date:2001-07-10 
'E-Mail: Daiguohong@163.net 
 
 
'利用API函数模拟 Win95/98/NT 的注销、重启、关闭计算机 
Option Explicit 
 
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        '操作系统类型( 2-NT ) 
 
Private Type OSVERSIONINFO 
    dwOSVersionInfoSize As Long   '结构的大小(148)<在正式调用函数之前,必须先将这个结构的dwOSVersionInfoSize字段设为结构的大小(148)> 
    dwMajorVersion As Long        '主版本号 
    dwMinorVersion As Long        '次版本号 
    dwBuildNumber As Long         '生成号 
    dwPlatformId As Long          '操作系统类型( 1-95/98 ;  2-NT ) 
    szCSDVersion As String * 128  '版本号(形如'第几版') 
End Type 
 
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 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 
'测试系统类型,如果运行在NT下不用此过程 
Public Function IsWinNT() As Boolean 
    Dim myOS As OSVERSIONINFO 
    myOS.dwOSVersionInfoSize = Len(myOS) 
    GetVersionEx myOS 
    IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) 
End Function 
'授权当前应用程序的关闭操作系统权限 
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 
    '允许当前应用程序有关闭操作系统的权限 
    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount) 
End Sub 
' 关闭计算机 
Public Sub ShutDownNT(Force As Boolean) 
    Dim ret As Long 
    Dim Flags As Long 
    Flags = EWX_SHUTDOWN 
    If Force Then Flags = Flags + EWX_FORCE 
    If IsWinNT Then EnableShutDown 
    ExitWindowsEx Flags, 0 
End Sub 
'重启计算机 
Public Sub RebootNT(Force As Boolean) 
    Dim ret As Long 
    Dim Flags As Long 
    Flags = EWX_REBOOT 
    If Force Then Flags = Flags + EWX_FORCE 
    If IsWinNT Then EnableShutDown 
    ExitWindowsEx Flags, 0 
End Sub 
'注销当前用户 
Public Sub LogOffNT(Force As Boolean) 
    Dim ret As Long 
    Dim Flags As Long 
    Flags = EWX_LOGOFF 
    If Force Then Flags = Flags + EWX_FORCE 
    ExitWindowsEx Flags, 0 
End Sub 
 
Private Sub Command1_Click() 
    LogOffNT True 
End Sub 
Private Sub Command2_Click() 
    RebootNT True 
End Sub 
Private Sub Command3_Click() 
    ShutDownNT True 
End Sub 
Private Sub Form_Load() 
    'Command1.Caption = "Log Off NT" 
    'Command2.Caption = "Reboot NT" 
    'Command3.Caption = "Shutdown NT" 
End Sub