4.Windowsを終了・再起動する |
1.Windowsを終了・再起動する(WindowsXP 以降用対応版) 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定: 使用 API:OpenProcessToken / LookupPrivilegeValue / GetCurrentProcess / AdjustTokenPrivileges / ExitWindowsEx その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :
|
1.Windowsを終了・再起動する(WindowsXP 以降用対応版) |
Option Explicit 'SampleNo=137 WindowsXP VB6.0(SP5) 2002.05.22 Private Type LUID UsedPart As Long IgnoredForNowHigh32BitPart As Long End Type Private Type TOKEN_PRIVILEGES PrivilegeCount As Long TheLuid As LUID Attributes As Long End Type 'プロセスに関連付けられているアクセストークンを開きます。 Private Declare Function OpenProcessToken Lib "advapi32" _ (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _ TokenHandle As Long) As Long 'ローカル一意識別子(LUID)を取得し、指定された特権名を表現します Private Declare Function LookupPrivilegeValue Lib "advapi32" _ Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _ ByVal lpName As String, lpLuid As LUID) As Long 'カレントプロセスの擬似ハンドルを返す(P656) Private Declare Function GetCurrentProcess Lib "kernel32" () 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 'カレントユーザーのログオフ、Windowsの終了、再スタートを行う(P1073) Private Declare Function ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Private Const TOKEN_QUERY = &H8 Private Const TOKEN_ADJUST_PRIVILEGES = &H20 Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" Private Const SE_PRIVILEGE_ENABLED = &H2 'uFlags は終了の方法を指定する次の定数 Private Const EWX_FORCE = &H4 '応答のないプロセスを強制終了 Private Const EWX_LOGOFF = &H0 'ログオフ Private Const EWX_REBOOT = &H2 '再起動 Private Const EWX_SHUTDOWN = &H1 'シャットダウン(ノートPCの終了) Private Const EWX_POWEROFF = &H8 '電源をオフ Private Sub sShutdown(myFlags As Long) If CreateObject("SYSINFO.Sysinfo").OSPlatform = 2 Then 'OSがNT4・Win2000・WinXP の場合 Dim lngResult As Long Dim hTokenHandle As Long Dim tmpLuid As LUID Dim tkpNew As TOKEN_PRIVILEGES Dim tkpPrevious As TOKEN_PRIVILEGES 'プロセスに関連づけアクセストークンのオープン lngResult = OpenProcessToken(GetCurrentProcess, TOKEN_QUERY Or _ TOKEN_ADJUST_PRIVILEGES, hTokenHandle) If lngResult = 0 Then Exit Sub 'ローカルシステムのシャットダウン特権の取得 lngResult = LookupPrivilegeValue(vbNullString, _ SE_SHUTDOWN_NAME, tmpLuid) If lngResult = 0 Then Exit Sub tkpNew.PrivilegeCount = 1 tkpNew.TheLuid = tmpLuid tkpNew.Attributes = SE_PRIVILEGE_ENABLED 'アクセストークンの特権を変更する lngResult = AdjustTokenPrivileges(hTokenHandle, False, _ tkpNew, Len(tkpPrevious), tkpPrevious, 0&) If lngResult = 0 Then Exit Sub End If lngResult = ExitWindowsEx(myFlags, 0&) End Sub Private Sub Command1_Click() '終了 Call sShutdown(EWX_POWEROFF) End Sub Private Sub Command2_Click() '再起動 EWX_FORCE は併用しない方が無難です Call sShutdown(EWX_REBOOT) End Sub |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
1.VBからWindowsを終了 2.VBからWindowsを再起動 3.プロセスに関連づけアクセストークンのオープン 4.ローカルシステムのシャットダウン特権の取得 |