不與你商量的遠程強制關機

        作爲管理員,偶爾會被一些不按常理出牌的用戶弄得很無奈,按說,大家下班後,是不是您得把計算機關閉了再走?時下,大家都在喊低碳環保節能,這就是踐行的一個實際行動啊。再說,計算機不關閉,明顯地這也是一個消防安全隱患!

        某天深夜,某位領導回家路過公司的一排排辦公室,那微略的燈光在黑暗中是如此的光亮。第二天,被領導談話......在此省去一千字.

        隨後公司首先發文進行了行政告示,但免不了總有粗心的MM下班爲了趕公司班車還是忘記關閉計算機!看來只有靠偶來看好最後一關了!

實現思路:

比如每天晚上23:00 準時.用循環的思路遍歷公司所有的IP,ping它,若在線,就 shutdown -m \\ip -f -s -t 0, 最後不要忘記記下日誌,留做第二天領導查的上交“作業”或者再主動去告訴一下那個粗心的傢伙!

  1. For $i=0 To 255  
  2.  For $j=0 To 255  
  3.  
  4.    If $i=40  And $j=147 Then ExitLoop  ;呵呵,記得把自己排除一下  
  5.  
  6.    ToolTip("正在覈查:"&"172.16."&$i&"."&$j, @DesktopWidth/2, (@DesktopHeight - taskbarh()-30),"稍候...", 1, 2)  
  7.    If Ping("172.16."&$i&"."&$j,250) then 
  8.      $sCommand="shutdown -m \\172.16."&$i&"."&$j& " -f -s -t 0" 
  9.      Runwait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)  
  10.    _log("在線:172.16."&$i&"."&$j)  
  11.    EndIf  
  12.           Sleep(50)  
  13.  Next   
  14. Next 

如上所示,注意事項,記得將自己臨時排除一下,等腳本全部執行完了,最後自己來關機:

  1. shutdown(5)  


日誌部分的構造:

  1. $CountLines =_FileCountLines($filelog)  
  2. If @error Then Exit  
  3.  
  4. For $i=1 To $CountLines  
  5. $tmpIP=StringRegExpReplace(FileReadLine ($filelog,$i), '.*在線:([^\z]+).*''$1')  
  6. If StringRegExp ($tmpIP, "((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)"Then 
  7.    ToolTip("正在覈查"&$tmpIP&"的執行情況", @DesktopWidth/2, (@DesktopHeight - taskbarh()-30),"稍候...", 1, 2)  
  8.    If Not Ping($tmpIP) Then 
  9.     _FileWriteToLine($filelog, $i, FileReadLine ($filelog,$i)&" 已關閉!", 1)  
  10.    Else 
  11.    _FileWriteToLine($filelog, $i, FileReadLine ($filelog,$i)&"  未關閉!", 1)  
  12.    EndIf     
  13. EndIf  
  14. Next 
  15. Exit(MsgBox(262144+64,"完成-8秒後自動退出","可查看日誌文件:"&$filelog&"查看執行情況",8))  
  16.  

當然,您若有更好的更直觀的構造歡迎多多指點。

關於如何在每天晚上23:00來執行這個腳本。想必大家已經想到了:系統裏的“任務計劃”,掛在上邊即可。當然掛在域控上也成,掛在自己的機器上也行,但要求一定要使用域管理員來登錄來執行!似乎費話了!

最後開源附上我根據我公司實際情況來的,請路過的朋友多多指教:

  1. #NoTrayIcon  
  2. #Region ;**** 參數創建於 ACNWrapper_GUI ****  
  3. #AutoIt3Wrapper_icon=c:\WINDOWS\system32\SHELL32.dll  
  4. #AutoIt3Wrapper_outfile=C:\Documents and Settings\zhanghong1\桌面\全體關機.exe  
  5. #AutoIt3Wrapper_Compression=4  
  6. #AutoIt3Wrapper_Res_Comment=管理員專用  
  7. #[email protected]  
  8. #AutoIt3Wrapper_Res_Fileversion=2011.3.29.1  
  9. #[email protected]  
  10. #EndRegion ;**** 參數創建於 ACNWrapper_GUI ****  
  11. #Include <File.au3>  
  12.  
  13.  
  14. HotKeySet("{ESC}""Terminate")  
  15.  
  16. Global $filelog="\\172.16.128.50\Backup\shutdown_log\"&@YEAR&"-"&@MON&"-"&@MDAY&"_log.txt"  
  17.     If Not FileExists($filelog) then 
  18.        _FileCreate($filelog)  
  19.        If @error Then Exit(MsgBox(262144+16,"嚴重錯誤:","無法寫入:"&$filelog))  
  20.     EndIf  
  21.  
  22. If @UserName<>"zhanghong1" and  @UserName<>"zhouyu" Then Exit(MsgBox(262144 +16,"出錯","拒絕非管理員運行"))  
  23. If @HOUR<23 Then   
  24.   If MsgBox(262144+17,"本機時鐘:"&@HOUR,"強烈建議在晚11點後再考慮檢查全體關機!要不後果嚴重,對吧?",55)=1 Then exit  
  25. EndIf  
  26.  
  27. For $i=0 To 255  
  28.     For $j=0 To 255  
  29.       If $i=128 Or $i=136 Then ExitLoop  
  30.       If $i=40  And $j=147 Then ExitLoop  
  31.       If $i=40  And $j=241 Then ExitLoop  
  32.       If $i=41  And $j=10 Then ExitLoop  
  33.       If $i=9  And $j=219 Then ExitLoop  
  34.         
  35.       ToolTip("正在覈查:"&"172.16."&$i&"."&$j, @DesktopWidth/2, (@DesktopHeight - taskbarh()-30),"稍候...", 1, 2)  
  36.       If Ping("172.16."&$i&"."&$j,250) then 
  37.         $sCommand="shutdown -m \\172.16."&$i&"."&$j& " -f -s -t 0" 
  38.         Runwait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)  
  39.          _log("在線:172.16."&$i&"."&$j)  
  40.       EndIf  
  41.       Sleep(50)  
  42.     Next      
  43. Next 
  44.  
  45. ToolTip("正在覈查執行情況", @DesktopWidth/2, (@DesktopHeight - taskbarh()-30),"稍候...", 1, 2)  
  46. Sleep(8000)  
  47. $CountLines =_FileCountLines($filelog)  
  48. If @error Then Exit  
  49.  
  50. For $i=1 To $CountLines  
  51. $tmpIP=StringRegExpReplace(FileReadLine ($filelog,$i), '.*在線:([^\z]+).*''$1')  
  52. If StringRegExp ($tmpIP, "((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)"Then 
  53.    ToolTip("正在覈查"&$tmpIP&"的執行情況", @DesktopWidth/2, (@DesktopHeight - taskbarh()-30),"稍候...", 1, 2)  
  54.    If Not Ping($tmpIP) Then 
  55.        _FileWriteToLine($filelog, $i, FileReadLine ($filelog,$i)&" 已關閉!", 1)  
  56.    Else 
  57.       _FileWriteToLine($filelog, $i, FileReadLine ($filelog,$i)&" 非計算機裝備?", 1)  
  58.    EndIf     
  59. EndIf  
  60. Next 
  61. Exit(MsgBox(262144+64,"完成-8秒後自動退出","可查看日誌文件:"&$filelog&"查看執行情況",8))  
  62.  
  63.  
  64. func taskbarh()  
  65. $pos = WinGetPos("[class:Shell_TrayWnd]")  
  66. if isarray($pos) Then 
  67.     return $pos[3]  
  68. EndIf  
  69. EndFunc  
  70.  
  71. Func Terminate()  
  72.     Exit(MsgBox(262144+16,"您按了 ESC 鍵?","點擊 確定 強制退出!"))  
  73. EndFunc  
  74.  
  75.  
  76. func _log($varjiamiwr)  
  77.     _FileWriteLog($filelog,$varjiamiwr)  
  78. EndFunc 


           --- 我的調試平臺http://autoit-cn.googlecode.com/files/AUTOIT_3.3.6.1-2.exe 

2011.6.3更新更完美的

  1. #include <File.au3>  
  2. #include <inet.au3>  
  3.  
  4.  
  5. HotKeySet("{ESC}""Terminate")  
  6.  
  7. Global $filelog = "\\172.16.128.50\Backup\shutdown_log\" & @YEAR & "-" & @MON & "-" & @MDAY & "_log.txt", $i, $j  
  8. Global $Remoteuser = "domain\administrator" ;遠程關機所用管理員用戶  
  9. Global $Remotepass = "BJp@ssw0rd" ;遠程關機所用管理員密碼  
  10.  
  11.  
  12. If Not FileExists($filelog) Then 
  13.     _FileCreate($filelog)  
  14.     If @error Then Exit (MsgBox(262144 + 16, "嚴重錯誤:""無法寫入:" & $filelog))  
  15. EndIf  
  16.  
  17. If @UserName<>"zhanghong1" Or @UserName<>"administrator" Then Exit(MsgBox(262144 +16,"出錯","拒絕非授權管理員運行"))  
  18.  
  19. If @HOUR < 17 And @HOUR > 8 Then 
  20.     ;防止在工作時間誤運行本程序,當然若堅持運行也是可以的。。。。  
  21.     If MsgBox(262144 + 17, "本機時鐘:" & @HOUR"強烈建議在非工作時間裏再考慮檢查遍歷全體關機!要不後果嚴重,對吧?", 55) = 1 Then Exit  
  22. EndIf  
  23.  
  24. $oMyError = ObjEvent("AutoIt.Error""MyErrFunc") ; Initialize a COM error handler  
  25. $objlocator = ObjCreate("wbemscripting.swbemlocator")  
  26. If Not IsObj($objlocator) Then 
  27.     MsgBox(262144 + 16, "8秒後自動退出""無法創建對象: wbemscripting.swbemlocator", 8)  
  28.     _log("系統嚴重錯誤,無法創建對象: wbemscripting.swbemlocator")  
  29.     Exit  
  30. EndIf  
  31.  
  32. For $i = 0 To 255  
  33.     For $j = 0 To 255  
  34.         If $i = 128 Or $i = 136 Then ExitLoop ;該段爲7*24的服務器區域,故跳過。  
  35.         ToolTip("正在覈查:" & "172.16." & $i & "." & $j, @DesktopWidth / 2, (@DesktopHeight - taskbarh() - 30), "稍候...", 1, 2)  
  36.         If Ping("172.16." & $i & "." & $j, 250) Then 
  37.             ;$sCommand="shutdown -m \\172.16."&$i&"."&$j& " -f -s -t 0" 
  38.             ;Run(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)  
  39.             $objWMIService = $objlocator.connectserver("172.16." & $i & "." & $j, "root/cimv2", $Remoteuser, $Remotepass)  
  40.             If Not @error Then 
  41.                 $colItems = $objWMIService.ExecQuery("SELECT * FROM  win32_operatingsystem where primary= true")  
  42.                 For $objItem In $colItems  
  43.                     If ($i = 40 And $j = 241) Or ($i = 41 And $j = 10) Or ($i = 9 And $j = 219) Or ($i = 40 And $j = 147) Then 
  44.                         $objItem.win32shutdown(6);重啓  
  45.                         If Not @error Then 
  46.                             TCPStartup()  
  47.                             $aResult = _TCPIpToName("172.16." & $i & "." & $j)  
  48.                             If @error Then 
  49.                                 _log("->在線IP:172.16." & $i & "." & $j & " 已成功遠程重啓設備!")  
  50.                             Else 
  51.                                 _log("->在線IP:172.16." & $i & "." & $j & " 機器名:" & $aResult & " 已成功遠程重啓設備!")  
  52.                             EndIf  
  53.                             TCPShutdown()  
  54.                         EndIf  
  55.                     Else 
  56.                         $objItem.win32shutdown(5) ;關機  
  57.                         If Not @error Then 
  58.                             TCPStartup()  
  59.                             $aResult = _TCPIpToName("172.16." & $i & "." & $j)  
  60.                             If @error Then 
  61.                                 _log("→在線IP:172.16." & $i & "." & $j & " 成功遠程關掉!")  
  62.                             Else 
  63.                                 _log("→在線IP:172.16." & $i & "." & $j & " 機器名:" & $aResult & " 成功遠程關掉!")  
  64.                             EndIf  
  65.                             TCPShutdown()  
  66.                         EndIf  
  67.                     EndIf  
  68.                 Next 
  69.             EndIf  
  70.         EndIf  
  71.         Sleep(50)  
  72.     Next 
  73. Next 
  74.  
  75. Exit (MsgBox(262144 + 64, "完成-8秒後自動退出""可查看日誌文件:" & $filelog & "查看執行情況", 5))  
  76.  
  77.  
  78. Func taskbarh()  
  79.     $pos = WinGetPos("[class:Shell_TrayWnd]")  
  80.     If IsArray($pos) Then 
  81.         Return $pos[3]  
  82.     EndIf  
  83. EndFunc   ;==>taskbarh  
  84.  
  85. Func Terminate()  
  86.     Exit (MsgBox(262144 + 16, "您按了 ESC 鍵?""點擊 確定 強制退出!", 30))  
  87. EndFunc   ;==>Terminate  
  88.  
  89.  
  90. Func _log($varjiamiwr)  
  91.     _FileWriteLog($filelog, $varjiamiwr)  
  92. EndFunc   ;==>_log  
  93.  
  94.  
  95. ; This is my custom defined error handler  
  96. Func MyErrFunc()  
  97.     $LOALERROR = $oMyError.description  
  98.     If StringInStr($LOALERROR, "RPC"Or StringInStr($LOALERROR, "拒絕"Then 
  99.         _log("172.16." & $i & "." & $j & "可能爲非計算機裝備(打印服務器網關等?),故無法執行遠程操作!錯誤代碼:" & Hex($oMyError.number, 8) & " " & $LOALERROR)  
  100.     Else 
  101.         _log("172.16." & $i & "." & $j & " 因:" & $LOALERROR & " 錯誤代碼:" & Hex($oMyError.number, 8) & " 無法執行遠程操作!")  
  102.     EndIf  
  103. EndFunc   ;==>MyErrFunc  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章