2008/5/2 金曜日

リモートPCをシャットダウンする その2@WMI

Filed under: Windows XP, スクリプト — pnpk @ 3:13:49

会社だと夜中までパソコンの電源入れっぱなしで帰宅する人って結構多いんです。パソコンの電源入れっぱなしだとHotFixの適用が出来なかったりログオンスクリプトが反映されなかったり、やっぱり管理面で結構面倒です。電気代も無駄ですしね。

過去にクライアントPCをシャットダウンするスクリプトを作成したんだけど別セグメント上のPCに上手く適用出来なくて、今回思い切って作り直してみました。VBSですけども。

使い方は簡単で、文末のスクリプトをコピペでテキスト文書に貼り付けてファイル名を

ping2shutdown.vbs

などに変更してください。

引数にPC名を入力するとそのPCに向かってシャットダウンコマンドを投げます。

Cscript ping2shutdown.vbs PC名

こんな感じでOKです。後は適当にBATファイルでも作成してタスクなんかに登録しておけば勝手にシャットダウンしてくれます。

動作はWindows XP、Windows Server 2003で可能なようです。Windows XPのみ動作確認を行いました。

ファイル中にゴミデータもいくつかありますが、後々更新していければと思っています。また、プログラミングは本当全然ですのでもっと効率の良い書き方あるんだけど。なんて事教えていただけるかたいらっしゃればコメント欄に記入していただければと思います。

動作の流れは

PC名に向かってPingを送信→応答があったらシャットダウン要求

こんな感じです。ですのでPingが通らない端末には効果がありません。また対象PCに対しての管理者権限も必要になります。

また、53行目の

objOperatingSystem.Win32Shutdown(SHUTDOWN)

LogOff

REBOOT

に変更する事でログオフ、再起動も可能だと思います。

あと、最後のエラーチェックはチェックするだけです。なので実質的には意味無いです。

クライアントPCのシャットダウン用に作成したんですが、サーバOSのリブートスケジュールの一元管理にも利用できるかも知れません。

'******************************************************
'*Ping応答があったらシャットダウンを実行するスクリプト
'*Ver 1.1
'*実行例:Cscript ping2shutdown.vbs PC名
'******************************************************

Option Explicit

Dim objArgs
Dim strComputer

Set objArgs = WScript.Arguments

If objArgs.count = 1 Then
    strComputer = objArgs.item(0)
Else
'    Wscript.Echo "引数が不正です。" & vbCrLf & "実行例:Cscript ping.vbs PC07B-053"
    Wscript.Quit    '終了
End If

If PingResult(strComputer) = True Then
    Wscript.Echo "応答ありました。"
    Call ShutDownWindows(strComputer)
Else
    Wscript.Echo "応答無いです、端末落ちてるかも。"
End If

Wscript.Echo "スクリプト終了"

Set objArgs = Nothing

Function PingResult(strComputer) 'strComputerにpingを行って成功したらPingResultにTrueを返す
    Dim objWMIService
    Dim colItems
    Dim objItem

    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery _
        ("Select * from Win32_PingStatus " & _
            "Where Address = '" & strComputer & "'")
    For Each objItem in colItems
        If objItem.StatusCode = 0 Then
            PingResult = True
        Else
            PingResult = False
        End If
    Next

    Set objWMIService = Nothing
    Set colItems = Nothing
End Function

Function ShutDownWindows(strComputer)
    On error resume Next

    Const LogOff   = 0 'ログオフ
    Const REBOOT   = 2 '再起動
    Const SHUTDOWN = 8 'シャットダウン

    Dim objWMIService
    Dim colOperatingSystems
    Dim objOperatingSystem

    Set objWMIService = GetObject("winmgmts:{impersonationLevel= impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2")
    Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

    For Each objOperatingSystem in colOperatingSystems
        objOperatingSystem.Win32Shutdown(SHUTDOWN)
    Next
    
    Set objWMIService = Nothing
    Set colOperatingSystems = Nothing

    Call ErrorCheck
End Function

Sub ErrorCheck
    If Err <> 0 Then
        WScript.Echo "エラー番号:" & Err.Number & vbCrLf &_
            Err.Description & vbCrLf &_
            strDirPath
'        WScript.Quit
    End If
End Sub

Popularity: 3%

コメント (0) »

この記事にはまだコメントがついていません。

コメント RSS トラックバック URI

コメントをどうぞ

HTML convert time: 0.491 sec. Powered by WordPress ME