通过脚本下派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,如需转载请自行联系原作者

相关文章
|
弹性计算 网络协议 数据处理
稳定平滑进行云上业务IPv6化改造—— Series1:改造思路及CDN改造
随着国家工信部印发的《推进IPv6规模部署行动计划》的深入推进,近期国资委相关的大型国企都开始着手进行业务的IPv6化改造,其在阿里云上的门户及B2B、B2C等对外业务,自然进入第一批改造的范围。本文是基于在具体客户的IPv6化过程中积累的最佳实践编写,希望能够给读者带来一些IPv6化改造的启发。
稳定平滑进行云上业务IPv6化改造—— Series1:改造思路及CDN改造
|
3月前
|
机器学习/深度学习 算法 BI
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
本文系统综述了汽车雷达干扰缓解技术的最新进展,提出基于物理域避免、主动避免、反应式信号重建和被动调制技术的四类划分方法,深入分析各类策略的原理、优劣及实施挑战,并强调跨学科合作与监管协同对未来发展的关键作用。
278 4
汽车雷达系统的干扰缓解:现状调查与未来趋势——论文阅读
|
2月前
|
机器学习/深度学习 自然语言处理 监控
23_Transformer架构详解:从原理到PyTorch实现
Transformer架构自2017年Google发表的论文《Attention Is All You Need》中提出以来,彻底改变了深度学习特别是自然语言处理领域的格局。在短短几年内,Transformer已成为几乎所有现代大型语言模型(LLM)的基础架构,包括BERT、GPT系列、T5等革命性模型。与传统的RNN和LSTM相比,Transformer通过自注意力机制实现了并行化训练,极大提高了模型的训练效率和性能。
|
图形学
Pixi入门第三章:绘制更多内容
这篇文章作为Pixi.js入门教程的第三章,介绍了如何使用鼠标事件(如mousemove)来实现在画布上绘制线条的功能,并提供了实现动态绘制的代码示例。
261 0
|
人工智能 自然语言处理 小程序
|
XML Java Android开发
autojs自定义控件-导航栏
目前自定义控件可以控制的属性: ● 颜色 ● 宽度 ● 图片宽高 ● 绑定viewpager recyclerview的高度是由 文字 + 图片 控制的, 所以就不用设置recyclerview的高度
913 0
|
存储 编解码 API
成功解决ModuleNotFoundError: No module named codecs
成功解决ModuleNotFoundError: No module named codecs
成功解决ModuleNotFoundError: No module named codecs
|
存储 缓存 小程序
小程序数据缓存机制应用
小程序数据缓存机制应用
385 0
小程序数据缓存机制应用
|
编解码 ice
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V3_2版本数据集
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V3_2版本数据集
690 0
Google Earth Engine ——ALOS World 3D - 30m (AW3D30) 是一个全球数字表面模型 (DSM) V3_2版本数据集
|
缓存 监控 网络协议
Wireshark网络抓包(四)——工具
1. File:了解抓包文件的各种属性,例如抓包文件的名称、路径、文件所含数据包的规模等信息 2. Time:获悉抓包的开始、结束和持续时间 3. Capture:抓包文件由哪块网卡生成、OS版本、Wireshark版本等信息 4. Display:剩下的是汇总统计信息,数据包的总数、数量以及占比情况、网速等
Wireshark网络抓包(四)——工具