ページ 1 / 1
Windows NT 系の終了のイベント コーディングのエラー
Posted: 2005年7月15日(金) 14:58
by M.S.
コード: 全て選択
Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long
'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
ExitWindows()
End
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
また SPIRIT さんの「ON ERROR RESUME NEXT」のコードをコピー&ペーストしたものなのですが、Windows NT 系の終了のイベント コーディングで、これをコンパイルすると、「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」と「48行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?
Re: Windows NT 系の終了のイベント コーディングのエラー
Posted: 2005年7月15日(金) 15:35
by hira
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
→Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES
.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
→.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED
とすればうまくコンパイルできました。
AB4.0では配列参照は角カッコしか使えない、ということでしょうかね…?
※AB3.xではうまく動いていたコードです
Re: Windows NT 系の終了のイベント コーディングのエラー
Posted: 2005年7月15日(金) 15:43
by M.S.
教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。
Re: Windows NT 系の終了のイベント コーディングのエラー
Posted: 2005年7月15日(金) 16:37
by tak
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」
どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
もう少し、具体的に書いてもらえないでしょうか。
Re: Windows NT 系の終了のイベント コーディングのエラー
Posted: 2005年7月15日(金) 21:19
by M.S.
> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
> もう少し、具体的に書いてもらえないでしょうか。
34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
です。
説明不足ですいません。
Posted: 2005年7月15日(金) 22:37
by Sinryow
このコードでもエラーが出ました。「無効な識別子です」でした。
コード: 全て選択
Dim h As Long
h=ANYSIZE_ARRAY
ということは,ANYSIZE_ARRAY定数自体が定義されていないわけです。
実際,ABのincludeフォルダを検索しても「ANYSIZE_ARRAY」は見つかりませんでした。
以下の一行を追加してはいかがでしょうか。
コード: 全て選択
Const ANYSIZE_ARRAY = 1
※Cのwinnt.hから持ってきました
あと,TOKEN_PRIVILEGES構造体は
コード: 全て選択
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES ' ELMが必要
End Type
が正しいです。(これもwinnt.hより)
また,この点はSPIRITさんに報告しておきます。
Re:
Posted: 2005年7月16日(土) 08:58
by M.S.
Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。
無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。
Posted: 2005年7月16日(土) 09:31
by M.S.
テストしてみたのですが、コンピュータに反応がありませんでした。
以下が修正した
再起動用のコードです。
コード: 全て選択
#include "WINNTRB.idx"
' ↓ ここからプログラムが実行されます
Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long
'動作フラグ============
const EWX_LOGOFF=0
CONST EWX_SHUTDOWN=1
CONST EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2Const ANYSIZE_ARRAY=0
Const ANYSIZE_ARRAY = 1
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES
End Type
ExitWindows()
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
初投稿!
Posted: 2005年7月18日(月) 23:00
by SPIRIT
返信が遅くなり、大変申し訳ございませんでした。
実験を行った結果、
コード: 全て選択
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES
End Type
の
ELM() はあってもなくても動作は変わりありませんでした。
Const ANYSIZE_ARRAY = 1
にすると反応しないようです。
以下のソースは私の環境で再起動に成功したものです。
コード: 全て選択
Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long
'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
ExitWindows()
End
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
Re: 初投稿!
Posted: 2005年7月19日(火) 17:53
by M.S.
SPIRIT さんすいません、エラーが出たのは僕が SPIRIT さんのページから AB の Project Editor にコピペしたときに、
コード: 全て選択
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY=0
のところを、
コード: 全て選択
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2Const ANYSIZE_ARRAY=0
と、改行をしわすれてしまったからのようです・・・。
そして今の正常に動作するコードは
コード: 全て選択
#include "WINNTRB.idx"
' ↓ ここからプログラムが実行されます
Declare Function ExitWindowsEx Lib "user32" (uFlags As Long,dwReserved As Long) As Long
Declare Function OpenProcessToken Lib "advapi32" (ProcessHandle As DWord,DesiredAccess As Long,_
ByRef TokenHandle As Long) As Long
Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (lpSystemName As String,_
lpName As String,ByRef lpLuid As LUID) As Long
Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long,DisableAllPrivileges As Long,_
ByRef NewState As TOKEN_PRIVILEGES,BufferLength As Long,_
ByRef PreviousState As TOKEN_PRIVILEGES,ByRef ReturnLength As Long) As Long
'動作フラグ============
const EWX_LOGOFF=0
CONST EWX_SHUTDOWN=1
CONST EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Const TOKEN_QUERY=&H8
Const TOKEN_ADJUST_PRIVILEGES=&H20
Const SE_SHUTDOWN_NAME="SeShutdownPrivilege"
Const SE_PRIVILEGE_ENABLED=&H2
Const ANYSIZE_ARRAY = 1
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES
End Type
ExitWindows()
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(0).pLuid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
です。
OSの終了
Posted: 2008年6月06日(金) 19:42
by 初心者13号
古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。
GetLastErr()を行なうとハンドルが無効と出ます。
どなたか修正点を教えて下さい。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Sub ExitWindows()
Dim Handle As Long
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
With TPS
.PrivilegeCount=1
.Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle As VoidPtr)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).Luid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
If AdjustTokenPrivileges(Handle,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
Exit Sub
EndIf
ExitWindowsEx(EWX_REBOOT,0)
End Sub
Posted: 2008年6月10日(火) 21:14
by 初心者13号
まだシャットダウンできていません。
現在のコード
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Sub ExitWindows()
Dim Handle As HANDLE
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
Dim lpBuf(ERRMESSAGE_MAX) As SByte
Dim ErrID As Long
With TPS
.PrivilegeCount=1
.Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
End With
If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
ErrID = GetLastError()
If ErrID <> 0 Then
FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
MessageBox( 0,lpBuf, "OpenProcessToken", MB_OK)
EndIf
EndIf
If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).Luid)=FALSE Then
MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
ErrID = GetLastError()
If ErrID <> 0 Then
FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
MessageBox( 0,lpBuf, "LookupPrivilegeValue", MB_OK)
EndIf
EndIf
If AdjustTokenPrivileges(Handle As Long,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
ErrID = GetLastError()
If ErrID <> 0 Then
FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
MessageBox( 0,lpBuf, "AdjustTokenPrivileges", MB_OK)
EndIf
EndIf
ExitWindowsEx(EWX_REBOOT,0)
ErrID = GetLastError()
If ErrID <> 0 Then
FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
MessageBox( 0,lpBuf, "ExitWindowsEx", MB_OK)
EndIf
End Sub
AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
何だろうなぁ??
余談ですが、AB5のapi_system.sbpで
>>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
Posted: 2008年6月12日(木) 19:07
by 初心者13号
自己解決しました。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]- '動作フラグ============
Const EWX_LOGOFF=0
Const EWX_SHUTDOWN=1
Const EWX_REBOOT=2
Const EWX_FORCE=4
Const EWX_POWEROFF=8
'====================
Sub ExitWindows()
Dim Handle As HANDLE
Dim TPS As TOKEN_PRIVILEGES
Dim TPS_P As TOKEN_PRIVILEGES
Dim Size As Long
Dim Luid As LUID
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, Handle)
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,Luid)
TPS.PrivilegeCount = 1
TPS.Privileges[0].Luid = Luid
TPS.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges(Handle As Long, FALSE,TPS, Len(TPS_P), TPS_P, Size)
CloseHandle(Handle)
ExitWindowsEx(EWX_REBOOT,0)
End Sub
Posted: 2009年1月11日(日) 21:00
by ゲスト
> まだシャットダウンできていません。
>
> 現在のコード
>
>
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
> '動作フラグ============
> Const EWX_LOGOFF=0
> Const EWX_SHUTDOWN=1
> Const EWX_REBOOT=2
> Const EWX_FORCE=4
> Const EWX_POWEROFF=8
> '====================
>
> Sub ExitWindows()
> Dim Handle As HANDLE
> Dim TPS As TOKEN_PRIVILEGES
> Dim TPS_P As TOKEN_PRIVILEGES
> Dim Size As Long
>
> Dim lpBuf(ERRMESSAGE_MAX) As SByte
> Dim ErrID As Long
>
> With TPS
> .PrivilegeCount=1
> .Privileges[ANYSIZE_ARRAY].Attributes=SE_PRIVILEGE_ENABLED
> End With
>
> If OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Handle)=FALSE Then
> MessageBox(0,"エラーが発生しました!","OpenProcessToken",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "OpenProcessToken", MB_OK)
> EndIf
> EndIf
>
> If LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,TPS.Privileges(ANYSIZE_ARRAY).Luid)=FALSE Then
> MessageBox(0,"エラーが発生しました!","LookupPrivilegeValue",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "LookupPrivilegeValue", MB_OK)
> EndIf
> EndIf
>
> If AdjustTokenPrivileges(Handle As Long,FALSE,TPS,Len(TPS),TPS_P,Size)=FALSE Then
> MessageBox(0,"エラーが発生しました!","AdjustTokenPrivileges",MB_OK or MB_ICONSTOP)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "AdjustTokenPrivileges", MB_OK)
> EndIf
> EndIf
>
> ExitWindowsEx(EWX_REBOOT,0)
> ErrID = GetLastError()
> If ErrID <> 0 Then
> FormatMessage( &h1200,NULL, ErrID, &h400, lpBuf, ERRMESSAGE_MAX, NULL)
> MessageBox( 0,lpBuf, "ExitWindowsEx", MB_OK)
> EndIf
>
> End Sub
>
> AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
>
> 何だろうなぁ??
>
> 余談ですが、AB5のapi_system.sbpで
>
> >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
>
> となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
11
Posted: 2009年7月30日(木) 17:33
by amy