Windows NT 系の終了のイベント コーディングのエラー

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: Windows NT 系の終了のイベント コーディングのエラー

11

by amy » 2009年7月30日(木) 17:33

まだシャットダウンできていません。

現在のコード



Fashion Accessory Fashion Jewellery Fashion Jewelry 普通話課程 putonghua learn mandarin

by ゲスト » 2009年1月11日(日) 21:00

> まだシャットダウンできていません。
>
> 現在のコード
>
> > AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
> この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。
>
> 何だろうなぁ??
>
> 余談ですが、AB5のapi_system.sbpで
>
> >>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_
>
> となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・

by 初心者13号 » 2008年6月12日(木) 19:07

自己解決しました。

by 初心者13号 » 2008年6月10日(火) 21:14

まだシャットダウンできていません。

現在のコード
AdjustTokenPrivileges()でエラーになりますが、 GetLastError()でエラーを取得できません。
この状態で、ExitWindowsEx()を実行すると、「クライアントは要求された権利を取得していません」となります。

何だろうなぁ??

余談ですが、AB5のapi_system.sbpで

>>Declare Function AdjustTokenPrivileges Lib "advapi32" (TokenHandle As Long, DisableAllPrivileges As Long,_

となっていますがAB5では、第一引数をTokenHandle As HANDLEにするのが正解の気がします・・・

OSの終了

by 初心者13号 » 2008年6月06日(金) 19:42

古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。
GetLastErr()を行なうとハンドルが無効と出ます。

どなたか修正点を教えて下さい。

Re: 初投稿!

by M.S. » 2005年7月19日(火) 17:53

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
です。

初投稿!

by SPIRIT » 2005年7月18日(月) 23:00

返信が遅くなり、大変申し訳ございませんでした。
実験を行った結果、

コード: 全て選択

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

by M.S. » 2005年7月16日(土) 09:31

テストしてみたのですが、コンピュータに反応がありませんでした。
以下が修正した再起動用のコードです。

コード: 全て選択


#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

Re:

by M.S. » 2005年7月16日(土) 08:58

Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。

無事コンパイルできましたので、今から Windows NT 系の「Windows XP Service Pack 2」でテストしてみます。

by Sinryow » 2005年7月15日(金) 22:37

このコードでもエラーが出ました。「無効な識別子です」でした。

コード: 全て選択

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: Windows NT 系の終了のイベント コーディングのエラー

by M.S. » 2005年7月15日(金) 21:19

> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
> もう少し、具体的に書いてもらえないでしょうか。

34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES

48行目 : .Privileges(0).Attributes=SE_PRIVILEGE_ENABLED

です。
説明不足ですいません。

Re: Windows NT 系の終了のイベント コーディングのエラー

by tak » 2005年7月15日(金) 16:37

> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」

どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
もう少し、具体的に書いてもらえないでしょうか。

Re: Windows NT 系の終了のイベント コーディングのエラー

by M.S. » 2005年7月15日(金) 15:43

教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。

Re: Windows NT 系の終了のイベント コーディングのエラー

by hira » 2005年7月15日(金) 15:35

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ではうまく動いていたコードです

Windows NT 系の終了のイベント コーディングのエラー

by M.S. » 2005年7月15日(金) 14:58

コード: 全て選択


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行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?

ページトップ