![]() シャットダウンダイアログを表示してキーストロークを送る正式には、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); } ?> |