コード: 全て選択
Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long
'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0
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
ExitWindows()
End
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub