リモートPCをシャットダウンする その2@WMI
会社だと夜中までパソコンの電源入れっぱなしで帰宅する人って結構多いんです。パソコンの電源入れっぱなしだと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 strComputerSet objArgs = WScript.Arguments
If objArgs.count = 1 Then
strComputer = objArgs.item(0)
Else
' Wscript.Echo "引数が不正です。" & vbCrLf & "実行例:Cscript ping.vbs PC07B-053"
Wscript.Quit '終了
End IfIf PingResult(strComputer) = True Then
Wscript.Echo "応答ありました。"
Call ShutDownWindows(strComputer)
Else
Wscript.Echo "応答無いです、端末落ちてるかも。"
End IfWscript.Echo "スクリプト終了"
Set objArgs = Nothing
Function PingResult(strComputer) 'strComputerにpingを行って成功したらPingResultにTrueを返す
Dim objWMIService
Dim colItems
Dim objItemSet 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
NextSet objWMIService = Nothing
Set colItems = Nothing
End FunctionFunction ShutDownWindows(strComputer)
On error resume NextConst LogOff = 0 'ログオフ
Const REBOOT = 2 '再起動
Const SHUTDOWN = 8 'シャットダウンDim objWMIService
Dim colOperatingSystems
Dim objOperatingSystemSet 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 = NothingCall ErrorCheck
End FunctionSub ErrorCheck
If Err <> 0 Then
WScript.Echo "エラー番号:" & Err.Number & vbCrLf &_
Err.Description & vbCrLf &_
strDirPath
' WScript.Quit
End If
End Sub
Popularity: 3%
トラックバック URI : http://pnpk.net/cms/archives/408/trackback/
【関連記事】