ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 06:37

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - Windows NT 系の終了のイベント コーディングのエラー
作成者 メッセージ
  記事の件名:  11  引用付きで返信する
まだシャットダウンできていません。

現在のコード



Fashion Accessory Fashion Jewellery Fashion Jewelry 普通話課程 putonghua learn mandarin
投稿記事 Posted: 2009年7月30日(木) 17:33
  記事の件名:   引用付きで返信する
> まだシャットダウンできていません。
>
> 現在のコード
>
> > 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
  記事の件名:   引用付きで返信する
自己解決しました。
投稿記事 Posted: 2008年6月12日(木) 19:07
  記事の件名:   引用付きで返信する
まだシャットダウンできていません。

現在のコード
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
  記事の件名:  OSの終了  引用付きで返信する
古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。
GetLastErr()を行なうとハンドルが無効と出ます。

どなたか修正点を教えて下さい。
投稿記事 Posted: 2008年6月06日(金) 19:42
  記事の件名:  Re: 初投稿!  引用付きで返信する
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
です。
投稿記事 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
投稿記事 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
投稿記事 Posted: 2005年7月16日(土) 09:31
  記事の件名:  Re:  引用付きで返信する
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さんに報告しておきます。
投稿記事 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

です。
説明不足ですいません。
投稿記事 Posted: 2005年7月15日(金) 21:19
  記事の件名:  Re: Windows NT 系の終了のイベント コーディングのエラー  引用付きで返信する
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」

どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
もう少し、具体的に書いてもらえないでしょうか。
投稿記事 Posted: 2005年7月15日(金) 16:37
  記事の件名:  Re: Windows NT 系の終了のイベント コーディングのエラー  引用付きで返信する
教えていただいたとおりにしてコンパイルしても、「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ではうまく動いていたコードです
投稿記事 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行目・・・ "" 無効な識別子です」というエラーが出るのですが、どうすればよいでしょか?
投稿記事 Posted: 2005年7月15日(金) 14:58

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean