FC2ブログ

シャットダウンについて

シャットダウン

よくあるOSのログオフ,再起動,シャットダウンの方法です。

=======================================================================
'
' ShutDown関連
'
'=======================================================================

'--------------------
' API宣言
'--------------------

  '---Windowsの終了
    Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

  '---トークンオープン
    Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, _
                                   ByVal DesiredAccess As Long,TokenHandle As Long) As Long

  '---特権情報取得
    Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" ( _
                      ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long

  '---特権の制御
    Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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

  '---プロセスハンドル取得
    Declare Function GetCurrentProcess Lib "kernel32" () As Long

  '---Windowsバージョン情報取得
    Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" ( _
                        lpVersionInformation As OSVERSIONINFO) As Long


  '---定数宣言
    Public Const ANYSIZE_ARRAY = 0

    'OSVERSIONINFO構造体のdwPlatformIdメンバ
    Public Const VER_PLATFORM_WIN32s = 0 'Windows 3.1
    Public Const VER_PLATFORM_WIN32_WINDOWS = 1 'Windows 95
    Public Const VER_PLATFORM_WIN32_NT = 2 'Windows NT

    'ExitWindowsExのuFlagsの値
    Public Const EWX_FORCE = 4 '強制終了
    Public Const EWX_LOGOFF = 0 'ログオフ
    Public Const EWX_REBOOT = 2 '再起動
    Public Const EWX_SHUTDOWN = 1 'シャットダウン
    Public Const EWX_POWEROFF = 8 '電源オフ

    'OpenProcessTokenのDesiredAccessの値
    Public Const TOKEN_QUERY = &H8 'トークンの内容取得
    Public Const TOKEN_ADJUST_PRIVILEGES = &H20 '特権を変更する

    'LookupPrivilegeValueのlpNameの値
    Public Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" 'シャットダウン特権
    Public Const SE_PRIVILEGE_ENABLED = &H2


  '---構造体宣言
    Public Type OSVERSIONINFO
      dwOSVersionInfoSize As Long '構造体サイズ
      dwMajorVersion As Long    'メジャーバージョン
                          '例) Windows NT version 3.51 = 3
                          ' Windows NT version 4.00 = 4
      dwMinorVersion As Long    'マイナーバージョン
                          '例) Windows NT version 3.51 = 51
                          ' Windows NT version 4.00 = 0
      dwBuildNumber As Long     'ビルド番号
      dwPlatformId As Long      'プラットフォームID(定数参照)
      szCSDVersion As String * 128 'CSVバージョン
                          'Windows NT:最終インストールService Pack
                          'Windows 95:追加情報
    End Type

    Type LUID
      LowPart As Long
      HighPart As Long
    End Type

    Type LUID_AND_ATTRIBUTES
        pLuid As LUID     'ローカル識別ID
        Attributes As Long  '属性
    End Type

    Type TOKEN_PRIVILEGES
        PrivilegeCount As Long                        '特権数
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES 'LUID_AND_ATTRIBUTES 構造体
    End Type




'--------------------
' API呼出関数
'--------------------
  '---シャットダウン特権のセット
    Public Function fncSetShutdownPrivilege() As Boolean
      Dim hToken As Long 'トークンハンドル
      Dim tTP As TOKEN_PRIVILEGES '変更する特権情報を含む TOKEN_PRIVILEGES 構造体
      Dim tTP_Prev As TOKEN_PRIVILEGES '変更前の特権情報を格納する TOKEN_PRIVILEGES 構造体
      Dim lngLen As Long '返される tTP_Prev のサイズ

      '---戻り値初期化
        fncSetShutdownPrivilege = False

      '---アクセストークンハンドル取得
        If Not CBool(OpenProcessToken(GetCurrentProcess(), _
                             TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)) Then
          MsgBox "OpenProcessToken エラー", vbExclamation, "ExitWindowEx"
          Exit Function
        End If

      '---シャットダウン特権のLUID取得
        If Not CBool(LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, tTP.Privileges(0).pLuid)) Then
          MsgBox "LookupPrivilegeValue エラー", vbExclamation, "ExitWindowEx"
          Exit Function
        End If

        With tTP
          .PrivilegeCount = 1
          .Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
        End With

      '---シャットダウン特権をこのアプリケーションに持たせる
        If Not CBool(AdjustTokenPrivileges(hToken, False, tTP, Len(tTP), tTP_Prev, lngLen)) Then
          MsgBox "AdjustTokenPrivileges エラー", vbExclamation, "ExitWindowEx"
          Exit Function
        End If

      '---戻り値設定
        fncSetShutdownPrivilege = True
    End Function




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

  '---ShutDown
    Dim typeOSINFO As OSVERSIONINFO

    '---Windows プラットフォームの確認
      typeOSINFO.dwOSVersionInfoSize = 148
      If Not CBool(GetVersionEx(typeOSINFO)) Then
        MsgBox "Windows プラットフォームが不明です。", vbCritical, "ExitWindowExサンプル"
        Exit Sub
      End If

    '---WindowsNTの場合
      If typeOSINFO.dwPlatformId = VER_PLATFORM_WIN32_NT Then
        ' シャットダウン特権のセット
        If Not fncSetShutdownPrivilege Then
          Exit Sub
        End If
      End If

    '---Windows シャットダウン
      Call ExitWindowsEx(EWX_POWEROFF, 0)



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。
関連記事

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

検索フォーム
最新記事
カテゴリ
全記事表示リンク

全ての記事を表示する

最新コメント
プロフィール

ITLife

Author:ITLife
システム葵新井聡太です。
東京都東村山市に生まれ、ここで育ち、ここで結婚し、システムエンジニア一筋で十数年やってきました。
ここでは主に、パソコンを中心にITに関わることを備忘録として残していきたいと思います。
少しでも来ていただいた方のお役に立てたら幸いです。
m(_ _)m

p.s
ここで紹介している内容は一例です。すべては、自己責任でお願いします。

カレンダー
07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
訪問数
月別アーカイブ
リンク