VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 システム・情報関係のメニュー
1.Windowsのシステムディレクトリのパス名を取得する
2.Windows のバージョンを取得する
3.終了時の情報を保存・読み込み・反映(レジストリ使用・他)
4.Windows を終了・再起動する
5.スクリーンセーバーの起動及び解除
6.タスクバーを自動で隠す・常に手前に表示を設定・取得
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、当サイト内に掲載のシステム・情報に関するサンプル


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.ローカルシステムのシャットダウン特権の取得




このページのトップへ移動します。