通过脚本下派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) 
 
接下来的工作就是等着看报告结果


本文转自yangye1985 51CTO博客,原文链接:http://blog.51cto.com/yangye/202461,如需转载请自行联系原作者

相关文章
|
移动开发 机器学习/深度学习 安全
|
边缘计算 缓存 安全
源于加速,不止加速——10年沉淀,破局改变
边缘云 开启分布式云网融合新时代
682 0
源于加速,不止加速——10年沉淀,破局改变
|
SQL Java 数据库连接
MyBatis(九) resultMap的关联方式实现多表查询
MyBatis_resultMap 的关联方式实现多表查询(多对一)
MyBatis(九)   resultMap的关联方式实现多表查询
|
Shell iOS开发 MacOS
mac安装homebrew及异常处理
mac安装homebrew及异常处理
2786 0
mac安装homebrew及异常处理
|
弹性计算 负载均衡 网络协议
开源PaaS工具CloudFoundry落地阿里云
云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和用户青睐于将自己的业务和应用不断的从传统IT设施迁移到云上,在灵活、高效管理应用,快速扩展业务的同时不断地降低基础设施的运维和管理成本。
14347 0
开源PaaS工具CloudFoundry落地阿里云
|
存储 搜索推荐 安全
菲住布渴的数字化转型:阿里宜搭助力服务中枢升级,提升10倍开发效率
在新形势下,酒店纷纷通过数字化转型,提升运营管理效率。宜搭通过快速、安全、可靠的应用搭建能力不仅提升了组织内部的运营管理效率也大大节省了人力成本,低代码的应用搭建方式激发了人的主观能动性,让业务人员也具备开发应用的能力,大大提升了组织的活力。
26242 0
菲住布渴的数字化转型:阿里宜搭助力服务中枢升级,提升10倍开发效率
|
人工智能 机器学习/深度学习 算法
贾扬清谈大数据&AI发展的新挑战和新机遇
2019云栖大会大数据&AI专场,阿里巴巴高级研究员贾扬清为我们带来《大数据AI发展的新机遇和新挑战》的分享。本文主要从人工智能的概念开始讲起,谈及了深度学习的发展和模型训练,以及数据的爆发增长,着重阐述了算法、数据和算力的闭环。
6006 0
贾扬清谈大数据&AI发展的新挑战和新机遇
|
弹性计算 运维 监控
【实战】阿里云与AWS的体验对比
关注公众号“达摩院首座”,了解开发者最真实生活
7121 0
【实战】阿里云与AWS的体验对比
|
定位技术 Android开发 前端开发
高德客户端及引擎技术架构演进与思考
阿里巴巴高级无线开发专家宋照春在高德技术专场做了题为《高德客户端及引擎技术架构演进与思考》的演讲,主要分享了高德地图客户端技术架构沿着「上漂下沉」、「模块化、Bundle化」的思路演进所做的一系列架构升级中的经验和思考。
|
Web App开发 搜索推荐 数据库