如何用VB实现重启win NT系统?
看了网上的介绍用ExitWindowsEx(),但是一直不成功.不知是何原因,各位帮忙看看啊
首先获得权限
Private Structure LUID
Dim UsedPart As Long
Dim IgnoredForNowHigh32BitPart As Long
End Structure
Private Structure TOKEN_PRIVILEGES
Dim PrivilegeCount As Long
Dim TheLuid As LUID
Dim Attributes As Long
End Structure
Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2
Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
dwOptions As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal _
ProcessHandle As Long, _
ByVal DesiredAccess As Long, ByVal TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, ByVal lpLuid _
As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, ByVal NewState As TOKEN_PRIVILEGES _
, ByVal BufferLength As Long, _
ByVal PreviousState As TOKEN_PRIVILEGES, ByVal ReturnLength As Long) As Long
Private Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
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(vbNullString, "SeShutdownPrivilege", tmpLuid)
tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.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
然后使用这样两条语句来重启系统
AdjustToken()
ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF)
运行时执行到LookupPrivilegeValue(vbNullString, "SeShutdownPrivilege", tmpLuid)就出错:
未处理的“System.NullReferenceException”类型的异常出现在 MoveFile.exe 中。
其他信息: 未将对象引用设置到对象的实例。
debug时发现执行完
OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle)
之后,hdlTokenHandle=0
是否与这里有关呢?