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
# 必要の無いコードが混じってましたので書き直しました