上一篇 | 下一篇

如何让 Windows(95 及 NT) 重新开机?

发布: 2008-6-26 09:40 | 作者: admin | 来源: | 查看: 0次

原始来源:王国荣

Windows 95 重新开机十分简单,只要呼叫 ExitWindowsEx API 函数就可以了, 例如:

API 宣告式:

Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long , _

ByVal dwReserved As Long) As Long

Private Enum HowExitConst

EWX_LOGOFF = 0 ' 登出

EWX_REBOOT = 2 ' 重开机

EWX_SHUTDOWN = 1 ' 关机

EWX_FORCE = 4 ' 强制关机

End Enum

呼叫叙述:

Call ExitWindowsEx(how, 0)

' how 等於 EWX_LOGOFF 、 EWX_REBOOT 、EWX_SHUTDOWN 、 或EWX_FORCE

但是这个方法并不能对 NT 关机或重新开机, 原因是 NT 比较着重安全性(Security),

而为了让 NT 关机或重新开机, 则必须在呼叫 ExitWindowsEx 之前, 呼叫

AdjustToken 副程式就对了。

AdjustToken 副程式的细节如下:

1. API 的宣告:

Enum HowExitConst

EWX_FORCE = 4 ' 强制关机

EWX_LOGOFF = 0 ' 登出

EWX_REBOOT = 2 ' 重开机

EWX_SHUTDOWN = 1 ' 关机

End Enum

Const TOKEN_ADJUST_PRIVILEGES = &H20

Const TOKEN_QUERY = &H8

Const SE_PRIVILEGE_ENABLED = &H2

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

2. AdjustToken 副程式:

Private Sub AdjustToken()

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

'Get the LUID for shutdown privilege.

LookupPrivilegeValue "","SeShutdownPrivilege", tmpLuid

tkp.PrivilegeCount = 1 ' One privilege to set

tkp.Privileges(0).pLuid = tmpLuid

tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

'Enable the shutdown privilege in the access token of this process.

AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), _

tkpNewButIgnored, lBufferNeeded

End Sub

3. 呼叫的范例:

AdjustToken

Call ExitWindowsEx(how, 0)

'how 等於 EWX_LOGOFF 、 EWX_REBOOT 、 EWX_SHUTDOWN、 或EWX_FORCE

在 Windows 95 底下呼叫了 AdjustToken 也没关系,因为 Windows 95 并不会

理会安全性的设定。

字号: | 推荐给好友

评分:0

我来说两句