パソコンをシャットダウンするプログラムを書きたいのですが、ExitWindowsEx関数などが良く分かりません。
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
パソコンをシャットダウンするプログラムを書きたいのですが、ExitWindowsEx関数などが良く分かりません。 ExitWindowsEx関数を定義して、実行してみても、パソコンが『ログオフ』の機能しか処理してくれませんでした。 なぜかと思い、検索してみると『アクセス権』を取得しないといけないと書いてあったので、 いろいろ探して、コピーペーストを繰り返して、ここまで完成しました。 しかし、動いてくれません。(エラーがたくさん出る) すみませんが、どのようにすればいいのでしょうか。 ご教授お願いします。
[hide][code] 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 [/code][/hide]
|