作成者 |
メッセージ |
|
|
まだシャットダウンできていません。
現在のコード
[url=http://www.fashionjewellerycentre.com/Cheap-Fashion-Accessory.html][color=white]Fashion Accessory[/color][/url] [url=http://www.fashionjewellerycentre.com/wholesale-fashion-jewellery.html][color=white]Fashion Jewellery[/color][/url] [url=http://www.fashionjewellerycentre.com/wholesale-fashion-jewelry.html][color=white]Fashion Jewelry[/color][/url] [url=http://www.mandarin-learning.com/][color=white]普通話課程[/color][/url] [url=http://www.mandarin-learning.com/putonghua_course.htm][color=white]putonghua[/color][/url] [url=http://www.mandarin-learning.com/learn-mandarin.html][color=white]learn mandarin[/color][/url]
|
|
|
投稿記事 |
Posted: 2009年7月30日(木) 17:33 |
|
|
|
|
|
> まだシャットダウンできていません。
>
> 現在のコード
>
> [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
> '動作フラグ============
> 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にするのが正解の気がします・・・
> まだシャットダウンできていません。 > > 現在のコード > > [hide][list][code] > '動作フラグ============ > 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 > [/code][/list][/hide] > AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。 > この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。 > > 何だろうなぁ?? > > 余談ですが、AB5のapi_system.sbpで > > >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_ > > となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・
|
|
|
投稿記事 |
Posted: 2009年1月11日(日) 21:00 |
|
|
|
|
|
自己解決しました。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]- '動作フラグ============
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
自己解決しました。
[hide][list]'動作フラグ============ 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 [/list][/hide]
|
|
|
投稿記事 |
Posted: 2008年6月12日(木) 19:07 |
|
|
|
|
|
まだシャットダウンできていません。
現在のコード
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
'動作フラグ============
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にするのが正解の気がします・・・
まだシャットダウンできていません。
現在のコード
[hide][list][code] '動作フラグ============ 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 [/code][/list][/hide] 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月10日(火) 21:14 |
|
|
|
|
|
古い話を持ち出して申し訳ありませんが、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
古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。 GetLastErr()を行なうとハンドルが無効と出ます。
どなたか修正点を教えて下さい。
[hide][list][code]'動作フラグ============ 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 [/code][/list][/hide]
|
|
|
投稿記事 |
Posted: 2008年6月06日(金) 19:42 |
|
|
|
|
|
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
です。
SPIRIT さんすいません、エラーが出たのは僕が SPIRIT さんのページから AB の Project Editor にコピペしたときに、 [code] Const SE_SHUTDOWN_NAME="SeShutdownPrivilege" Const SE_PRIVILEGE_ENABLED=&H2 Const ANYSIZE_ARRAY=0[/code] のところを、 [code]Const SE_SHUTDOWN_NAME="SeShutdownPrivilege" Const SE_PRIVILEGE_ENABLED=&H2Const ANYSIZE_ARRAY=0 [/code] と、改行をしわすれてしまったからのようです・・・。
そして今の正常に動作するコードは [code] #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[/code] です。
|
|
|
投稿記事 |
Posted: 2005年7月19日(火) 17:53 |
|
|
|
|
|
返信が遅くなり、大変申し訳ございませんでした。
実験を行った結果、
コード: 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
返信が遅くなり、大変申し訳ございませんでした。 実験を行った結果、
[code]Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES End Type [/code]
の [b]ELM()[/b] はあってもなくても動作は変わりありませんでした。 [b]Const ANYSIZE_ARRAY = 1[/b] にすると反応しないようです。
以下のソースは私の環境で再起動に成功したものです。
[code]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[/code]
|
|
|
投稿記事 |
Posted: 2005年7月18日(月) 23:00 |
|
|
|
|
|
テストしてみたのですが、コンピュータに反応がありませんでした。
以下が修正した 再起動用のコードです。
コード:
#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
テストしてみたのですが、コンピュータに反応がありませんでした。 以下が修正した[b]再起動[/b]用のコードです。 [code] #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[/code]
|
|
|
投稿記事 |
Posted: 2005年7月16日(土) 09:31 |
|
|
|
|
|
Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。
無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。
Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。
無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。
|
|
|
投稿記事 |
Posted: 2005年7月16日(土) 08:58 |
|
|
|
|
|
このコードでもエラーが出ました。「無効な識別子です」でした。
コード: 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さんに報告しておきます。
このコードでもエラーが出ました。「無効な識別子です」でした。 [code]Dim h As Long h=ANYSIZE_ARRAY[/code] ということは,ANYSIZE_ARRAY定数自体が定義されていないわけです。 実際,ABのincludeフォルダを検索しても「ANYSIZE_ARRAY」は見つかりませんでした。
以下の一行を追加してはいかがでしょうか。 [code]Const ANYSIZE_ARRAY = 1[/code] ※Cのwinnt.hから持ってきました
あと,TOKEN_PRIVILEGES構造体は [code]Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ELM(ANYSIZE_ARRAY)) As LUID_AND_ATTRIBUTES ' ELMが必要 End Type[/code] が正しいです。(これもwinnt.hより)
また,この点はSPIRITさんに報告しておきます。
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 22:37 |
|
|
|
|
|
記事の件名: |
Re: Windows NT 系の終了のイベント コーディングのエラー |
引用付きで返信する |
|
> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
> もう少し、具体的に書いてもらえないでしょうか。
34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
です。
説明不足ですいません。
> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。 > もう少し、具体的に書いてもらえないでしょうか。
34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED
です。 説明不足ですいません。
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 21:19 |
|
|
|
|
|
記事の件名: |
Re: Windows NT 系の終了のイベント コーディングのエラー |
引用付きで返信する |
|
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」
どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
もう少し、具体的に書いてもらえないでしょうか。
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」 > 「48行目・・・ "" 無効な識別子です」
どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。 もう少し、具体的に書いてもらえないでしょうか。
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 16:37 |
|
|
|
|
|
記事の件名: |
Re: Windows NT 系の終了のイベント コーディングのエラー |
引用付きで返信する |
|
教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。
教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 15:43 |
|
|
|
|
|
記事の件名: |
Re: Windows NT 系の終了のイベント コーディングのエラー |
引用付きで返信する |
|
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ではうまく動いていたコードです
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES →[b]Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES[/b]
.Privileges(0).Attributes=SE_PRIVILEGE_ENABLED →[b].Privileges[0].Attributes=SE_PRIVILEGE_ENABLED[/b]
とすればうまくコンパイルできました。 AB4.0では配列参照は角カッコしか使えない、ということでしょうかね…? ※AB3.xではうまく動いていたコードです
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 15:35 |
|
|
|
|
|
記事の件名: |
Windows NT 系の終了のイベント コーディングのエラー |
引用付きで返信する |
|
コード:
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行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?
[code] 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[/code] また SPIRIT さんの「ON ERROR RESUME NEXT」のコードをコピー&ペーストしたものなのですが、Windows NT 系の終了のイベント コーディングで、これをコンパイルすると、「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」と「48行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?
|
|
|
投稿記事 |
Posted: 2005年7月15日(金) 14:58 |
|
|
|
|