HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0802
あげなすsysexit5解決


あげなす

リンク

2006/8/2(Wed) 19:18:41|NO.1730

自分の環境だとsysexitがうまく動作しません。
ログオフはできるのですが、シャットダウン&電源を落とすことができません。
管理者権限のあるユーザー(というかユーザーはこれ1つしかないです。)で入っています。

環境 :
Windows 2000 Pro



この記事に返信する


hiro

リンク

2006/8/2(Wed) 20:48:07|NO.1733

sysexitが「ExitWindowsEx」関数を使用しているか判りませんが、
電源切、シャットダウン、再起動に関してヘルプには

「Windows NT/2000:呼び出し側のプロセスに、
SE_SHUTDOWN_NAME 特権を割り当てておかなければなりません。」

と書かれています。
SE_SHUTDOWN_NAME特権を割り当ててみてはいかがでしょうか。



hiro

リンク

2006/8/2(Wed) 23:37:54|NO.1734

SE_SHUTDOWN_NAMEについて自信が無かったので、
サンプル書いてみました。
実行して動作確認できましたが、どうでしょうか。
環境:WindowsXP / HSP30A

//インクルード #include "hspext.as" //定義 #define SE_SHUTDOWN_NAME "SeShutdownPrivilege" #define TOKEN_ADJUST_PRIVILEGES 0x20 #define SE_PRIVILEGE_ENABLED 0x02 //関数 #uselib "kernel32.dll" #func GetCurrentProcess "GetCurrentProcess" #func CloseHandle "CloseHandle" int #uselib "Advapi32.dll" #func OpenProcessToken "OpenProcessToken" int,int,sptr #func AdjustTokenPrivileges "AdjustTokenPrivileges" int,int,sptr,int,sptr,sptr #func LookupPrivilegeValue "LookupPrivilegeValueA" sptr,sptr,sptr screen 0,200,30:objsize 100,30 pos 0,0: button "SHUTDOWN",*sys_shutdown pos 100,0:button "POWEROFF",*sys_off //変数 dim htoken dim sLuid,2 dim token_pr,4 //SE_SHUTDOWN_NAME 特権を割り当て GetCurrentProcess : hcp=stat OpenProcessToken hcp,TOKEN_ADJUST_PRIVILEGES,varptr(htoken) LookupPrivilegeValue 0,SE_SHUTDOWN_NAME,varptr(sLuid) token_pr(0)=1:token_pr(1)=sLuid(0):token_pr(2)=sLuid(1) token_pr(3)=SE_PRIVILEGE_ENABLED AdjustTokenPrivileges htoken,0,varptr(token_pr),0,0,0 CloseHandle htoken stop //シャットダウン *sys_shutdown sysexit 2 end //電源OFF *sys_off sysexit 2:sysexit 3 end
# 必要の無いコードが混じってましたので書き直しました



あげなす

リンク

2006/8/3(Thu) 19:15:49|NO.1757

動作しました!!ありがとうございます。
少し思ったのですが、これはNT系だけ動作するのでしょうか?
9x系でもちゃんと動いてくれますかね?



hiro

リンク

2006/8/4(Fri) 01:00:59|NO.1775

NO1734で、「Advapi32.dll」を使用した3つの関数は
Windows NT/2000:Windows NT 3.1 以降にて対応しています。
また、Windows NT/2000以外のOSでは
SE_SHUTDOWN_NAME 特権を割り当てる必要はありません。

Windows98にてNO1734を実行した結果、正常動作を確認しました。
「Advapi32.dll」の関数の戻り値を調べると全て0(失敗)でしたが、
この関数は、Windows NT/2000に対して必要ですので問題無かったと思われます。
また、sysexitはWindows95以降に対応されていると思います。

Windows98ではうまく動きましたが、OS別の処理が必要かと思います。



あげなす

リンク

2006/8/4(Fri) 19:14:04|NO.1790

ありがとうございます。
解決しました。



ONION software Copyright 1997-2021(c) All rights reserved.