ab.com コミュニティ https://www.activebasic.com/forum/ |
|
アクセス権を取得する https://www.activebasic.com/forum/viewtopic.php?t=2565 |
ページ 1 / 1 |
作成者: | 水波形 [ 2009年4月07日(火) 12:06 ] |
記事の件名: | アクセス権を取得する |
パソコンをシャットダウンするプログラムを書きたいのですが、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 |
作成者: | konisi [ 2009年4月08日(水) 01:02 ] |
記事の件名: | |
シャットダウンするのが目的なら、Win2K以外では コード: Exec "shutdown.exe -s -f -t 0"で出来ると思います。 ところでそのDeclareは多分VB6あたりで書かれたものだと思うのですが、 VB6他:ByValとByRef省略時→ByRef AB4:ByValとByRef省略時→ByVal と、やや違いがあります。 Declareで定義している関数の引数にByValが書いていないところに、ByRefを挿入してみてください。 |
作成者: | 水波形 [ 2009年4月08日(水) 23:40 ] |
記事の件名: | |
>>AB4:ByValとByRef省略時→ByVal 入れてみました。 エラーは減りましたが、メンバが定義されてないと出てきて、今の自分では理解できそうにないので、いったん Exec "shutdown.exe -s -f -t 0" を使用させていただきます。 お騒がせしました |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |