![]() シャットダウンダイアログを表示してキーストロークを送る正式には、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
1. Set obj = CreateObject( "Lbox.Standby" ) 2. 3. obj.Standby(1) 実行用 : test.php
1. <? 2. 3. $obj = new COM( "Lbox.Standby" ); 4. 5. $obj->Standby(1); 6. 7. ?> 付録 : ログオフ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. ?> |