ExitWindowsEx関数を定義して、実行してみても、パソコンが『ログオフ』の機能しか処理してくれませんでした。
なぜかと思い、検索してみると『アクセス権』を取得しないといけないと書いてあったので、
いろいろ探して、コピーペーストを繰り返して、ここまで完成しました。
しかし、動いてくれません。(エラーがたくさん出る)
すみませんが、どのようにすればいいのでしょうか。
ご教授お願いします。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Type LUID
LowPart As Long
HightPart As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
Const TOKEN_QUERY = &H8
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED = &H2
Const EWX_LOGOFF = 0 'ログオフ
Const EWX_SHUTDOWN = &H1 'シャットダウン 98:電源オフ
Const EWX_REBOOT = &H2 '再起動
Const EWX_FORCE = &H4 '強制(無条件に実行)
Const EWX_POWEROFF = &H8 '電源オフ NT:電源オフ 98:無し
Declare Function ExitWindowsEx Lib "user32.dll" (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 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 LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemNmae As String,ByVal lpName As String, ipLuid As LUID) As Long
Sub PowerTreat(TreatKind As Long)
Dim hToken As HANDLE
Dim tknPri As TOKEN_PRIVILEGES
Dim result As BOOL
Dim luid As LUID
'シャットダウンの特権を取る
result = LookupPrivilegeValue(NULL, "SeShutdownPrivilege", luid)
'自分のトークンハンドルを取る
result = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
'情報の設定をする
tknPri.PrivilegeCount = 1
tknPri.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
tknPri.Privileges[0].Luid = luid
'自分のトークンハンドルにシャットダウンの特権を設定する
result = AdjustTokenPrivileges(hToken, FALSE, tknPri, 0, ByVal 0, ByVal 0)
'トークンハンドルを閉じる
CloseHandle(hToken)
'PCをシャットダウンする
ExitWindowsEx(TreatKind, 0)
End Sub