ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 08:30

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




新しいトピックを投稿する  トピックへ返信する  [ 15 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年7月15日(金) 14:58 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
コード:
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日(金) 15:35 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
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:43 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
教えていただいたとおりにしてコンパイルしても、「Privileges[ANYSIZE_ARRAY] As LUID_AND_ATTRIBUTES」のみ「定数式にリテラル値、または定数以外のものが含まれています」というエラーが出るのですが・・・。


通報する
ページトップ
投稿記事Posted: 2005年7月15日(金) 16:37 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
> 「34行目・・・定数式にリテラル値、または定数以外のものが含まれています」
> 「48行目・・・ "" 無効な識別子です」

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


通報する
ページトップ
投稿記事Posted: 2005年7月15日(金) 21:19 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
> どこが34行目と48行目なのかがわからないので、こちらでは大した検証は出来かねる、というのが本音です。
> もう少し、具体的に書いてもらえないでしょうか。

34行目 : Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES

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

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年7月15日(金) 22:37 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
このコードでもエラーが出ました。「無効な識別子です」でした。
コード:
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さんに報告しておきます。

_________________
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================


通報する
ページトップ
 記事の件名: Re:
投稿記事Posted: 2005年7月16日(土) 08:58 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
Sinryou さん、教えていただいた上に SPIRIT さんへの報告までしていただいてありがとうございます。

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年7月16日(土) 09:31 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
テストしてみたのですが、コンピュータに反応がありませんでした。
以下が修正した再起動用のコードです。
コード:
#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 
オフライン

登録日時: 2005年5月31日(火) 22:59
記事: 9
お住まい: 兵庫県神戸市
返信が遅くなり、大変申し訳ございませんでした。
実験を行った結果、
コード:
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 
オフライン

登録日時: 2005年6月01日(水) 21:51
記事: 212
お住まい: 奈良県北西部
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 
古い話を持ち出して申し訳ありませんが、WinXpのシャットダウンを行ないたく、AB5CP4にて下記の様にしましたが、AdjustTokenPrivileges()に失敗します。
GetLastErr()を行なうとハンドルが無効と出ます。

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 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にするのが正解の気がします・・・


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年6月12日(木) 19:07 
自己解決しました。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 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にするのが正解の気がします・・・


通報する
ページトップ
   
 記事の件名: 11
投稿記事Posted: 2009年7月30日(木) 17:33 
まだシャットダウンできていません。

現在のコード



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


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 15 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[25人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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