SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

VBScript でリモートコンピューターをシャットダウン

leave a comment

ここ数日、リモートコンピューターをシャットダウンする方法 投稿に対してのアクセスが多いので今日は VBScript を使用したリモートコンピューターのシャットダウンについて投稿してみたいと思います。

■VBScript でリモートコンピュータをシャットダウン

Windows スクリプトセミナー WMI編 VBScript&WMI
【Management】UACの WMIへの影響について

に詳しく書かれているので実はそれほど書くことが無かったりするのですが…。
他にもいろいろな方が書かれていますので [Win32_OperatingSystem] [Win32Shutdown] で検索をしていただくと情報はかなり見つかるかと思います。

VBScript でリモートシャットダウンを実行する場合には以下のようなスクリプトを使用します。

Option Explicit
Dim Locator, Service
Dim strServer, strUser, strPassword, intMode
Dim strQuery
Dim objOS, colOS
Dim iRet

If WScript.Arguments.Count <> 4 Then
    WScript.Echo "引数に誤りがあります"
    WScript.Echo "第 1 引数 : サーバー名"
    WScript.Echo "第 2 引数 : ユーザー名"
    WScript.Echo "第 3 引数 : パスワード"
    WScript.Echo "第 4 引数 : 操作"
    Wscript.Echo "[操作]"
    Wscript.Echo "0  : Logoff"
    Wscript.Echo "1  : Shutdown"
    Wscript.Echo "2  : Reboot"
    Wscript.Echo "4  : Forced Log Off (0 + 4)"
    Wscript.Echo "5  : Forced Shutdown (1 + 4)"
    Wscript.Echo "6  : Forced Reboot (2 + 4)"
    Wscript.Echo "8  : Power Off"
    Wscript.Echo "12 : Forced Power Off (8 + 4)"
    WScript.Echo "cscript.exe RemoteShutdown.vbs localhost UserName Passowrd 2"
    WScript.Quit (-1)
Else
    strServer = WScript.Arguments(0)
    strUser = WScript.Arguments(1)
    strPassword = WScript.Arguments(2)
    intMode = WScript.Arguments(3)
End If

Set Locator1 = WScript.CreateObject("WbemScripting.SWbemLocator")

Set Service = Locator.ConnectServer(strServer, "rootcimv2", strUser,strPassword)
strQuery = "Select * from Win32_OperatingSystem"
Set objOS = Service.ExecQuery(strQuery)

For Each colOS In objOS
    iRet = colOS.Win32Shutdown(intMode)
Next

WScript.Echo "Return Value : " & iRet

Set Locator = Nothing
Set Service = Nothing
Set objOS = Nothing

このスクリプトを以下の形式で実行するとリモートコンピューターを VBScript でシャットダウンすることが可能です。
要求が受けつけられた場合、Return Value は 0 となっているはずですので成功可否に関してはこの辺の値を使用して判断することができるかと思います。
# すでに要求が送信済みの場合は 1115 だったと思います。

以下の例ではモードを [Reboot] (2)  にしていますので再起動が実施されます。

cscript RemoteShutdown.vbs コンピューター名 "ユーザー名" "パスワード" モード

例)
cscript RemoteShutdown.vbs WIN2008R2 WIN2008R2Administraotr" "password" 2

Windows Server 2008 以降 (または Vista 以降) は UAC の関係で、ワークグループ環境では対象コンピューターのローカルのビルトイン Administrator を使用しないとアクセス拒否となってしまいシャットダウンができない可能性がありますのでご注意いただければと思います。

この辺の情報が参考になると思うのですがあまり読めていません…。
# Microsoft の安納さんのブログに書かれている内容がこの情報の邦訳になるかと。
User Account Control and WMI

コンピューターがロックされている場合、サーバー上で何かしらのプログラムが実行されており要求の応答待ちになってしまている場合等は、Forcexxxx 系を使用する必要があるかもしれませんので事前にテストをする必要はあります。
# UPS の通電による自動起動を設定している場合は、Shutdown と PowerOff のどちらが適切かテストしておく必要があるかもしれません。私、この辺は疎いので詳しいことが書けないのですが。

ここ数日、輪番電停電対応でシャットダウンについての投稿の参照が多かったのかと思いますが、WMIC 以外でも実施することが可能ですので何かのご参考になればと思い投稿をしておきました。
# 停電対応をされている方は本当にお疲れ様です。

以前投稿をしました、複数のサーバーに Ping を送信するサンプルスクリプト と組み合わせるとシャットダウン要求送信後にネットワークレベルで疎通確認ができるかと思いますので必要に応じてこちらもご利用いただければと。

Share

Written by Masayuki.Ozawa

3月 16th, 2011 at 11:13 pm

Posted in Windows Server,ツール

Tagged with

Leave a Reply