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

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

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

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

( 休止のある XP だと、"{DOWN}{DOWN}{DOWN}{DOWN}{UP}{ENTER}" )
01.Set WshShell = CreateObject( "WScript.Shell" )
02.Set Shell = CreateObject( "Shell.Application" )
03. 
04.Shell.ShutdownWindows()
05. 
06.WScript.Sleep 100
07. 
08.WshShell.AppActivate "Windows のシャットダウン"
09. 
10.WScript.Sleep 100
11. 
12.WshShell.SendKeys "{DOWN}{DOWN}{DOWN}{ENTER}"
VBScript では、AppActivate は必要無いようなのですが、以下の PHP では
コマンドラインから実行したので必要になりました。

よって、同じコードにしてあります。
01.<?
02. 
03.$WshShell = new COM("WScript.Shell");
04.$Shell = new COM("Shell.Application");
05. 
06.$Shell->ShutdownWindows();
07. 
08.Sleep( 1 );
09. 
10.$WshShell->AppActivate("Windows のシャットダウン");
11. 
12.Sleep( 1 );
13. 
14.$WshShell->SendKeys( "{DOWN}{DOWN}{DOWN}{ENTER}" );
15. 
16.?>
どうせ他言語では COM を使用するのでインターフェイスを整理する
短いコードですが、それでも言語毎にメンテするのは馬鹿馬鹿しいので、
Windows Script Components で処理を統一させます。

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


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

※ インストールは、このファイルを拡張子( .wsc ) で保存して、
※ 右クリックから「登録」を選択します
01.<?xml version="1.0" encoding="shift_jis" ?>
02.<component>
03. 
04.<registration
05.    description="Script Standby"
06.    progid="Lbox.Standby"
07.    version="1.00"
08.    classid="{A73CF61A-C193-4EE9-BA69-6A86A3D42138}"
09.>
10.</registration>
11. 
12.<public>
13. 
14.    <method name="Standby">
15.        <PARAMETER name="sec"/>
16.    </method>
17. 
18.</public>
19. 
20. 
21.<script language="VBScript">
22.<![CDATA[
23. 
24.function Standby(sec)
25. 
26.    Set WshShell = CreateObject( "WScript.Shell" )
27.    Set Shell = CreateObject( "Shell.Application" )
28. 
29.    Shell.ShutdownWindows()
30. 
31.    Call Sleep( sec )
32. 
33.    WshShell.AppActivate "Windows のシャットダウン"
34. 
35.    Call Sleep( sec )
36. 
37.    WshShell.SendKeys "{DOWN}{DOWN}{DOWN}{ENTER}"
38. 
39.end function
40. 
41.function Sleep(sec)
42. 
43.    Set objWMIService = GetObject("winmgmts:" _
44.     & "{impersonationLevel=impersonate}!\\.\root\cimv2")
45. 
46.    Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
47.    For Each objOS in colOSes
48.        Target = objOS.LocalDateTime
49.    Next
50. 
51.    Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2")
52.    Set objMonitor = obj.ExecNotificationQuery( _
53.        "select * from __InstanceModificationEvent " & _
54.        "within " & sec & " " & _
55.        "where TargetInstance isa 'Win32_OperatingSystem' " & _
56.        "and TargetInstance.LocalDateTime > '" & Target & "'" _
57.    )
58. 
59.    Set objLatestEvent = objMonitor.NextEvent
60. 
61.end function
62. 
63.]]>
64.</script>
65. 
66.</component>
実行用 : test.vbs
実行用 : test.php


付録 : ログオフ
VBScript
1.Set colTarget = GetObject("winmgmts:{(Shutdown)}") _
2.    .ExecQuery("Select * from Win32_OperatingSystem")
3.For Each obj in colTarget
4.    obj.Win32Shutdown(0)
5.Next
PHP
01.<?
02. 
03.$obj = new COM("winmgmts:{(Shutdown)}");
04. 
05.$col = $obj->ExecQuery( "Select * from Win32_OperatingSystem" );
06. 
07.foreach( $col as $obj ) {
08.    $obj->Win32Shutdown(0);
09.}
10. 
11.?>