通过脚本下派WsusAgent3.0.exe(续)

    在 http://yangye.blog.51cto.com/922715/200444这篇文章中我提到过使用脚本结合调用runas命令来给客户端安装exe文件。如果做过测试的人会发现,这个脚本并不是很完美。
    其一,当脚本未运行结束时不能被其他进程所打断,否则将会出现输入密码的黑框。会对用户造成干扰,也需要花费一些口舌和用户解释。
    其二,runas命令的脚本必然会在其中写出密码部分,造成安全隐患,换句话说只要找到了这个vbs的文件就能找到password。当然你可以使用Windows Script Encoder将其加密成vbe的文件,但这还是不够安全(其实根本谈不上安全),我这里有个网页工具,将你的vbe代码放入试试?代码如下,复制并另存为VBE-Decode.html
  
  
  
  
  1. <html> 
  2. <head> 
  3. <META http-equiv=Content-Type content="text/html; charset=utf-8"> 
  4. <title>VBscript.Encode Decode</title> 
  5. </head> 
  6. <body> 
  7. <center> 
  8. <table cellPadding=3 bgcolor=#e7e7e7> 
  9. <tr> 
  10. <td bgcolor=#336699> 
  11. <div align=center><font color=#ffffff size=3><strong>VBscript.Encode Decode</strong></font></div></td></tr> 
  12.    
  13. <tr> 
  14. <td align=middle height=80> 
  15. <script language=JScript> 
  16.  var STATE_COPY_INPUT  = 100 
  17.  var STATE_READLEN  = 101 
  18.  var STATE_DECODE  = 102 
  19.  var STATE_UNESCAPE  = 103 
  20.  var pick_encoding = new Array(  
  21.   1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,  
  22.   1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,  
  23.   1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,  
  24.   1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2  
  25.  )  
  26.  var rawData = new Array(  
  27.   0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,  
  28.   0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,  
  29.   0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,  
  30.   0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,  
  31.   0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,  
  32.   0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,  
  33.   0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,  
  34.   0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,  
  35.   0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,  
  36.   0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,  
  37.   0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,  
  38.   0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,  
  39.   0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,  
  40.   0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,  
  41.   0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,  
  42.   0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,  
  43.   0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,  
  44.   0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,  
  45.   0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,  
  46.   0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,  
  47.   0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,  
  48.   0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,  
  49.   0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,  
  50.   0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F  
  51.  )  
  52.  var transformed = new Array()  
  53.  for (var i=0; i<3; i++) transformed[i] = new Array()  
  54.  for (var i=31; i<=126; i++) for (var j=0; j<3; j++) transformed[j][rawData[(i-31) * 3 + j]] = (i==31) ? 9 : i  
  55.    
  56.  var digits = new Array()  
  57.  for (var i=0; i<26; i++)  
  58.  {  
  59.   digits["A".charCodeAt(0)+i] = i  
  60.   digits["a".charCodeAt(0)+i] = i+26  
  61.  }  
  62.  for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52  
  63.  digits[0x2b] = 62  
  64.  digits[0x2f] = 63  
  65.  function unescape(char)  
  66.  {  
  67.   var escapes = "#&!*$" 
  68.   var escaped = "\r\n<>@" 
  69.   if (char.charCodeAt(0) > 126) return char  
  70.   if (escapes.indexOf(char) != -1) return escaped.substr(escapes.indexOf(char), 1)  
  71.   return "?"  
  72.  }  
  73.    
  74.  function decodeBase64(string)  
  75.  {  
  76.   var val = 0 
  77.   val +=  (digits[string.substr(0,1).charCodeAt(0)] << 2)  
  78.   val +=  (digits[string.substr(1,1).charCodeAt(0)] >> 4)  
  79.   val +=  (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12 
  80.   val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)  
  81.   val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)  
  82.   val +=  (digits[string.substr(3,1).charCodeAt(0)] << 16)  
  83.   return val  
  84.  }  
  85.  function strdec(encodingString)  
  86.  {  
  87.     
  88.   var marker = "#@~^" 
  89.   var stringIndex = 0 
  90.   var scriptIndex = -1  
  91.   var unEncodingIndex = 0 
  92.   var char = null 
  93.   var encodingLength = unEncodinglength = 0  
  94.   var state = STATE_COPY_INPUT 
  95.   var unEncodingString = "" 
  96.   var re, arr  
  97.     
  98.   while(state)  
  99.   {  
  100.    switch (state)  
  101.    {  
  102.     case (STATE_COPY_INPUT) :  
  103.      scriptIndex = encodingString.indexOf(marker, stringIndex)  
  104.      if (scriptIndex != -1)  
  105.      {  
  106.       unEncodingString += encodingString.substring(stringIndex, scriptIndex)  
  107.       scriptIndex += marker.length  
  108.       state = STATE_READLEN 
  109.      }  
  110.      else  
  111.      {  
  112.       stringIndexstringIndex = stringIndex==0 ? 0 : stringIndex  
  113.       unEncodingString += encodingString.substr(stringIndex, encodingString.length)  
  114.       state = 0 
  115.      }  
  116.      break  
  117.       
  118.     case (STATE_READLEN) :  
  119.      encodingLength = encodingString.substr(scriptIndex, 6)  
  120.      unEncodinglength = decodeBase64(encodingLength)  
  121.      scriptIndex += (6 + "==".length)  
  122.      state = STATE_DECODE 
  123.      break  
  124.        
  125.     case (STATE_DECODE) :  
  126.      if (!unEncodinglength)  
  127.      {  
  128.       stringIndex = scriptIndex + "DQgAAA==^#~@".length  
  129.       unEncodingIndex = 0 
  130.       state = STATE_COPY_INPUT 
  131.       break  
  132.      }  
  133.      char = encodingString.substr(scriptIndex, 1)  
  134.      if (char == "@") state = STATE_UNESCAPE 
  135.      else  
  136.      {  
  137.       if (char.charCodeAt(0) < 0xFF)  
  138.       {  
  139.        unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])  
  140.        unEncodingIndex++  
  141.       }  
  142.       else  
  143.       {  
  144.        unEncodingString += char  
  145.       }        
  146.       scriptIndex++  
  147.       unEncodinglength--  
  148.       break  
  149.      }  
  150.        
  151.     case STATE_UNESCAPE:  
  152.      unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))  
  153.      scriptIndex++; unEncodinglength -=2 
  154.      unEncodingIndex++  
  155.      state = STATE_DECODE 
  156.      break  
  157.    }  
  158.   }  
  159.     
  160.   re  = new RegExp("(JScript|VBscript).encode", "gmi")  
  161.   while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext  
  162.   return unEncodingString  
  163.  }  
  164.    
  165. </script> 
  166.  
  167. <textarea id=encodeHTML rows=20 cols=80></textarea> <br><br> 
  168. <div align=center><button onclick=encodeHTML.innerText=strdec(encodeHTML.innerText)>Decode  
  169. </button></div></td></tr></table></td></tr></table></td></tr></table> 
  170. </body> 
  171. </html> 
 
针对这些不足,特写了此篇续章。
解决此问题最理想的就是最好能够用计算机开机脚本,毕竟是给计算机安装程序,而不是用户。Vbs可以做到将远程的程序复制到本地,但是不能做到开机脚本安装exe程序(未报错)。Bat可以做到调用本地的exe文件安装,但是不能作为开机脚本从远程拷贝文件。最后想出了3套脚本完美解决此问题。
 
1.用vbs检测客户端版本并复制远程wsusagent程序到本地。
2.用bat进行本地安装exe文件,安装完毕并删除源程序。
3.生成报告。
 
请按照顺序将三个脚本添加到GPO的开机脚本中,然后下派给客户端计算机。做之前养成先测试的好习惯,并仔细check权限等问题。
 
1)复制文件代码,复制并另存为AgentCopy.vbs
 
  
  
  
  
  1. On Error Resume Next  
  2. Const WINDOWS = &H24&  
  3. Const OverwriteExisting = True 
  4. Set objShell = CreateObject("Shell.Application")  
  5. Set objFolder = objShell.Namespace(WINDOWS)  
  6. Set objFolderobjFolderItem = objFolder.Self  
  7. strWinPath = objFolderItem.Path  
  8. strDrvPath = Mid(strWinPath, 1, 3)  
  9. strWinLen = Len(strWinPath)  
  10. strNum = strWinLen - 3  
  11. strWinName = Mid(strWinPath, 4, strNum)  
  12. Set objFSO = CreateObject("Scripting.FileSystemObject")  
  13. strFullAgentpath = strDrvPath & "\" & strWinName & "\\system32\\wuaueng.dll"  
  14. strComputer = "." 
  15. Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
  16. Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where name = '" & strFullAgentpath & "'")  
  17. For Each objFile in colFiles  
  18.  strVer = objFile.Version  
  19. Next  
  20. strVerCur = Mid(strVer, 1, 12)  
  21. strVerNew = "7.2.6001.788" 
  22. If strVerCur >= strVerNew Then  
  23. Wscript.Quit  
  24. Else  
  25. Set objFSO = CreateObject("Scripting.FileSystemObject")  
  26. objFSO.CopyFile "\\Filesrv\WSUS\WsusAgent30.exe" , "C:\", OverwriteExisting    'Change your Source File Location  
  27. End If 
 

2)程序安装代码,就一个bat,很简单,复制另存为AgentInstall.bat
c:\wsusagent30.exe /quiet /norestart
del c:\WsusAgent30.exe
 
 
3)生成报告代码(包括系统分区文件系统,系统分区剩余空间,依赖服务等检测结果),复制并另存为WsusResult.vbs
  
  
  
  
  1. On Error Resume Next  
  2. '================  
  3. 'Define constants  
  4. '================  
  5. Const WINDOWS = &H24&  
  6. Const ForReading=1 
  7. Const ForWriting=2 
  8. Const ForAppending=8 
  9. '========================  
  10. 'check wsus agent version  
  11. '========================  
  12. Set objShell = CreateObject("Shell.Application")  
  13. Set objFolder = objShell.Namespace(WINDOWS)  
  14. Set objFolderobjFolderItem = objFolder.Self  
  15. strWinPath = objFolderItem.Path  
  16. strDrvPath = Mid(strWinPath, 1, 3)  
  17. strDrvID = Mid(strWinPath, 1, 2)  
  18. strWinLen = Len(strWinPath)  
  19. strNum = strWinLen - 3  
  20. strWinName = Mid(strWinPath, 4, strNum)  
  21. Set objFSO = CreateObject("Scripting.FileSystemObject")  
  22. strFullAgentPath = strDrvPath & "\" & strWinName & "\\system32\\wuaueng.dll"  
  23. strComputer = "." 
  24. Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
  25. Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where name = '" & strFullAgentPath & "'")  
  26. For Each objFile in colFiles  
  27.  strVer = objFile.Version  
  28. Next  
  29.  strVerCur = Mid(strVer, 1, 12)  
  30. '===========  
  31. 'Get Pc Name  
  32. '===========  
  33. strComputer = "." 
  34. Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")    
  35. Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")    
  36. For Each objComputer in colComputers  
  37.  strPCname = UCase(objComputer.Name)  
  38. Next  
  39. '===============  
  40. 'Get FileSystem  
  41. '===============  
  42. strComputer = "." 
  43. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
  44. Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk where name = '" & strDrvID & "'")  
  45. For Each objDisk in colDisks  
  46. strFileSystem = objDisk.FileSystem  
  47. Next  
  48. '==============================  
  49. 'Get System Patition Free Space  
  50. '==============================  
  51. Dim fso, drv  
  52. Set fso = CreateObject("Scripting.FileSystemObject")  
  53. Set drv = fso.GetDrive(fso.GetDriveName(strDrvID))  
  54. strFreeNum = FormatNumber(drv.FreeSpace / 1024 / 1024 /1024, 3)  
  55. strFreeSpace = strFreeNum & "GB"  
  56. '============================  
  57. 'Check WSUS Relation Services  
  58. '============================  
  59. strComputer = "." 
  60. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
  61. Set colRunningServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='wuauserv'")  
  62. For Each objService in colRunningServices  
  63. strState1 = objService.State  
  64. strMode1 = objService.StartMode  
  65. strstatus1 = strState1 & "(" & strMode1 & ")"  
  66. Next  
  67. strComputer = "." 
  68. Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
  69. Set colRunningServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='bits'")  
  70. For Each objService in colRunningServices  
  71. strState2 = objService.State  
  72. strMode2 = objService.StartMode  
  73. strstatus2 = strState2 & "(" & strMode2 & ")"  
  74. Next  
  75. '=============  
  76. 'Create Report  
  77. '=============  
  78.  strVerErr = "7.0.0000.000" 
  79.  strVerNew = "7.2.6001.788" 
  80.  If strVerCur=strVerNew and strMode1="Auto" and strFreeNum>1 Then  
  81.  strFileName = "(ok)" & strPCname & ".csv"  
  82.  Elseif strVerCur<strVerErr or strFreeNum<1 or strMode1="Disabled" then  
  83.  strFileName = "(Err)" & strPCname & ".csv"  
  84.  Else  
  85.  strFileName = strPCname & ".csv"  
  86.  End If  
  87. Set WshShell = CreateObject("WScript.Shell")  
  88. Set WshFso = CreateObject("Scripting.FileSystemObject")  
  89. strDstPath = "\\FileSrv\WSUS_Report\Result\"  'Change your Export File Location  
  90. strDstFilePath = WshFso.BuildPath(strDstPath, strFileName)  
  91. Set WshLogFile = WshFso.OpenTextFile(strDstFilePath,ForWriting,True)  
  92. WshLogFile.WriteLine ("ComputerName,CurrentVersion,DriverType,FreeSpace,AutoUpdate,BITS")  
  93. WshLogFile.WriteLine (strPCname & "," & strVerCur & "," & strFileSystem & "," & strFreeSpace & "," & strstatus1 & "," & strstatus2) 
 
接下来的工作就是等着看报告结果
 
PS:已附上代码附件提供下载!

你可能感兴趣的:(职场,服务器,休闲,WSUS)