Windowsを終了・再起動する |
Windowsを終了・再起動する(WindowsXP 対応版) (137) | |
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 'Windows NT/2000:システムをシャットダウンまたは再起動するには、 '呼び出し側プロセスは AdjustTokenPrivileges 関数を呼び出して、 '特権を有効にしておかなければなりません。 'Windows 95/98:シェルの仕様により、EWX_FORCE を指定して ExitWindowsEx 関数 'を呼び出すと、ユーザーを完全にログオフさせることはできません '(システムはすべてのアプリケーションを終了させ、[ネットワークパスワードの '入力]ダイアログボックスを表示しますが、元のユーザーのデスクトップはそのまま '残っています)。ユーザーを強制的にログオフさせるには、[エクスプローラー]を '終了させた後、EWX_LOGOFF と EWX_FORCE を指定して ExitWindowsEx 関数を '呼び出してください。 |
2002/09/02