関連ページ  
【VBS & PHP】スクリプトからスタンバイ状態にする

シャットダウンダイアログを表示してキーストロークを送る
正式には、SetSystemPowerState という API を使用するようですが、
いずれにせよ、VBScript から直接は呼べません。

そこでシャットダウンダイアログを表示して、コンボボックスの選択肢としての
「スタンバイ」を選択します。

テストした環境では、コンボボックスの一番下が「スタンバイ」であり、
リストの数が 4 なので、{DOWN} を3回送っています

( 休止のある XP だと、"{DOWN}{DOWN}{DOWN}{DOWN}{UP}{ENTER}" )
Set WshShell = CreateObject( "WScript.Shell" )
Set Shell = CreateObject( "Shell.Application" )

Shell.ShutdownWindows()

WScript.Sleep 100

WshShell.AppActivate "Windows のシャットダウン"

WScript.Sleep 100

WshShell.SendKeys "{DOWN}{DOWN}{DOWN}{ENTER}"
VBScript では、AppActivate は必要無いようなのですが、以下の PHP では
コマンドラインから実行したので必要になりました。

よって、同じコードにしてあります。
<?

$WshShell = new COM("WScript.Shell");
$Shell = new COM("Shell.Application");

$Shell->ShutdownWindows();

Sleep( 1 );

$WshShell->AppActivate("Windows のシャットダウン");

Sleep( 1 );

$WshShell->SendKeys( "{DOWN}{DOWN}{DOWN}{ENTER}" );

?>
どうせ他言語では COM を使用するのでインターフェイスを整理する
短いコードですが、それでも言語毎にメンテするのは馬鹿馬鹿しいので、
Windows Script Components で処理を統一させます。

ただ、この場合 スリープ関数が統一されていないので、
WMI を使用して秒単位の Sleep 関数を作成します。


※ GUID は、こちら で作成します

※ インストールは、このファイルを拡張子( .wsc ) で保存して、
※ 右クリックから「登録」を選択します
<?xml version="1.0" encoding="shift_jis" ?>
<component>

<registration
	description="Script Standby"
	progid="Lbox.Standby"
	version="1.00"
	classid="{A73CF61A-C193-4EE9-BA69-6A86A3D42138}"
>
</registration>

<public>

	<method name="Standby">
		<PARAMETER name="sec"/>
	</method>

</public>


<script language="VBScript">
<![CDATA[

function Standby(sec)

	Set WshShell = CreateObject( "WScript.Shell" )
	Set Shell = CreateObject( "Shell.Application" )

	Shell.ShutdownWindows()

	Call Sleep( sec )

	WshShell.AppActivate "Windows のシャットダウン"

	Call Sleep( sec )

	WshShell.SendKeys "{DOWN}{DOWN}{DOWN}{ENTER}"

end function

function Sleep(sec)

	Set objWMIService = GetObject("winmgmts:" _
	 & "{impersonationLevel=impersonate}!\\.\root\cimv2")

	Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
	For Each objOS in colOSes
		Target = objOS.LocalDateTime
	Next

	Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2")
	Set objMonitor = obj.ExecNotificationQuery( _
		"select * from __InstanceModificationEvent " & _
		"within " & sec & " " & _
		"where TargetInstance isa 'Win32_OperatingSystem' " & _
		"and TargetInstance.LocalDateTime > '" & Target & "'" _
	)

	Set objLatestEvent = objMonitor.NextEvent 

end function

]]>
</script>

</component>
実行用 : test.vbs
Set obj = CreateObject("Lbox.Standby")

obj.Standby(1)
実行用 : test.php
<?

$obj = new COM("Lbox.Standby");

$obj->Standby(1);

?>


付録 : ログオフ
VBScript
Set colTarget = GetObject("winmgmts:{(Shutdown)}") _
	.ExecQuery("Select * from Win32_OperatingSystem") 
For Each obj in colTarget 
	obj.Win32Shutdown(0) 
Next 
PHP
<?

$obj = new COM("winmgmts:{(Shutdown)}");

$col = $obj->ExecQuery( "Select * from Win32_OperatingSystem" );

foreach( $col as $obj ) {
	$obj->Win32Shutdown(0);
}

?>