在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. <tr>
  13. <td align=middle height=80>
  14. <script language=JScript>
  15. var STATE_COPY_INPUT  = 100
  16. var STATE_READLEN  = 101
  17. var STATE_DECODE  = 102
  18. var STATE_UNESCAPE  = 103
  19. var pick_encoding = new Array(
  20. 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0,
  21. 1, 0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2,
  22. 1, 1, 0, 2, 0, 2, 0, 1, 0, 1, 1, 2, 0, 1, 0, 2,
  23. 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0, 1, 0, 2
  24. )
  25. var rawData = new Array(
  26. 0x64,0x37,0x69, 0x50,0x7E,0x2C, 0x22,0x5A,0x65, 0x4A,0x45,0x72,
  27. 0x61,0x3A,0x5B, 0x5E,0x79,0x66, 0x5D,0x59,0x75, 0x5B,0x27,0x4C,
  28. 0x42,0x76,0x45, 0x60,0x63,0x76, 0x23,0x62,0x2A, 0x65,0x4D,0x43,
  29. 0x5F,0x51,0x33, 0x7E,0x53,0x42, 0x4F,0x52,0x20, 0x52,0x20,0x63,
  30. 0x7A,0x26,0x4A, 0x21,0x54,0x5A, 0x46,0x71,0x38, 0x20,0x2B,0x79,
  31. 0x26,0x66,0x32, 0x63,0x2A,0x57, 0x2A,0x58,0x6C, 0x76,0x7F,0x2B,
  32. 0x47,0x7B,0x46, 0x25,0x30,0x52, 0x2C,0x31,0x4F, 0x29,0x6C,0x3D,
  33. 0x69,0x49,0x70, 0x3F,0x3F,0x3F, 0x27,0x78,0x7B, 0x3F,0x3F,0x3F,
  34. 0x67,0x5F,0x51, 0x3F,0x3F,0x3F, 0x62,0x29,0x7A, 0x41,0x24,0x7E,
  35. 0x5A,0x2F,0x3B, 0x66,0x39,0x47, 0x32,0x33,0x41, 0x73,0x6F,0x77,
  36. 0x4D,0x21,0x56, 0x43,0x75,0x5F, 0x71,0x28,0x26, 0x39,0x42,0x78,
  37. 0x7C,0x46,0x6E, 0x53,0x4A,0x64, 0x48,0x5C,0x74, 0x31,0x48,0x67,
  38. 0x72,0x36,0x7D, 0x6E,0x4B,0x68, 0x70,0x7D,0x35, 0x49,0x5D,0x22,
  39. 0x3F,0x6A,0x55, 0x4B,0x50,0x3A, 0x6A,0x69,0x60, 0x2E,0x23,0x6A,
  40. 0x7F,0x09,0x71, 0x28,0x70,0x6F, 0x35,0x65,0x49, 0x7D,0x74,0x5C,
  41. 0x24,0x2C,0x5D, 0x2D,0x77,0x27, 0x54,0x44,0x59, 0x37,0x3F,0x25,
  42. 0x7B,0x6D,0x7C, 0x3D,0x7C,0x23, 0x6C,0x43,0x6D, 0x34,0x38,0x28,
  43. 0x6D,0x5E,0x31, 0x4E,0x5B,0x39, 0x2B,0x6E,0x7F, 0x30,0x57,0x36,
  44. 0x6F,0x4C,0x54, 0x74,0x34,0x34, 0x6B,0x72,0x62, 0x4C,0x25,0x4E,
  45. 0x33,0x56,0x30, 0x56,0x73,0x5E, 0x3A,0x68,0x73, 0x78,0x55,0x09,
  46. 0x57,0x47,0x4B, 0x77,0x32,0x61, 0x3B,0x35,0x24, 0x44,0x2E,0x4D,
  47. 0x2F,0x64,0x6B, 0x59,0x4F,0x44, 0x45,0x3B,0x21, 0x5C,0x2D,0x37,
  48. 0x68,0x41,0x53, 0x36,0x61,0x58, 0x58,0x7A,0x48, 0x79,0x22,0x2E,
  49. 0x09,0x60,0x50, 0x75,0x6B,0x2D, 0x38,0x4E,0x29, 0x55,0x3D,0x3F
  50. )
  51. var transformed = new Array()
  52. for (var i=0; i<3; i++) transformed[i] = new Array()
  53. 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
  54. var digits = new Array()
  55. for (var i=0; i<26; i++)
  56. {
  57. digits["A".charCodeAt(0)+i] = i
  58. digits["a".charCodeAt(0)+i] = i+26
  59. }
  60. for (var i=0; i<10; i++) digits["0".charCodeAt(0)+i] = i+52
  61. digits[0x2b] = 62
  62. digits[0x2f] = 63
  63. function unescape(char)
  64. {
  65. var escapes = "#&!*$"
  66. var escaped = "\r\n<>@"
  67. if (char.charCodeAt(0) > 126) return char
  68. if (escapes.indexOf(char) != -1) return escaped.substr(escapes.indexOf(char), 1)
  69. return "?"
  70. }
  71. function decodeBase64(string)
  72. {
  73. var val = 0
  74. val +=  (digits[string.substr(0,1).charCodeAt(0)] << 2)
  75. val +=  (digits[string.substr(1,1).charCodeAt(0)] >> 4)
  76. val +=  (digits[string.substr(1,1).charCodeAt(0)] & 0xf) << 12
  77. val += ((digits[string.substr(2,1).charCodeAt(0)] >> 2) << 8)
  78. val += ((digits[string.substr(2,1).charCodeAt(0)] & 0x3) << 22)
  79. val +=  (digits[string.substr(3,1).charCodeAt(0)] << 16)
  80. return val
  81. }
  82. function strdec(encodingString)
  83. {
  84. var marker = "#@~^"
  85. var stringIndex = 0
  86. var scriptIndex = -1
  87. var unEncodingIndex = 0
  88. var char = null
  89. var encodingLength = unEncodinglength = 0
  90. var state = STATE_COPY_INPUT
  91. var unEncodingString = ""
  92. var re, arr
  93. while(state)
  94. {
  95. switch (state)
  96. {
  97. case (STATE_COPY_INPUT) :
  98. scriptIndex = encodingString.indexOf(marker, stringIndex)
  99. if (scriptIndex != -1)
  100. {
  101. unEncodingString += encodingString.substring(stringIndex, scriptIndex)
  102. scriptIndex += marker.length
  103. state = STATE_READLEN
  104. }
  105. else
  106. {
  107. stringIndexstringIndex = stringIndex==0 ? 0 : stringIndex
  108. unEncodingString += encodingString.substr(stringIndex, encodingString.length)
  109. state = 0
  110. }
  111. break
  112. case (STATE_READLEN) :
  113. encodingLength = encodingString.substr(scriptIndex, 6)
  114. unEncodinglength = decodeBase64(encodingLength)
  115. scriptIndex += (6 + "==".length)
  116. state = STATE_DECODE
  117. break
  118. case (STATE_DECODE) :
  119. if (!unEncodinglength)
  120. {
  121. stringIndex = scriptIndex + "DQgAAA==^#~@".length
  122. unEncodingIndex = 0
  123. state = STATE_COPY_INPUT
  124. break
  125. }
  126. char = encodingString.substr(scriptIndex, 1)
  127. if (char == "@") state = STATE_UNESCAPE
  128. else
  129. {
  130. if (char.charCodeAt(0) < 0xFF)
  131. {
  132. unEncodingString += String.fromCharCode(transformed[pick_encoding[unEncodingIndex%64]][char.charCodeAt(0)])
  133. unEncodingIndex++
  134. }
  135. else
  136. {
  137. unEncodingString += char
  138. }
  139. scriptIndex++
  140. unEncodinglength--
  141. break
  142. }
  143. case STATE_UNESCAPE:
  144. unEncodingString += unescape(encodingString.substr(++scriptIndex, 1))
  145. scriptIndex++; unEncodinglength -=2
  146. unEncodingIndex++
  147. state = STATE_DECODE
  148. break
  149. }
  150. }
  151. re  = new RegExp("(JScript|VBscript).encode", "gmi")
  152. while(arr = re.exec(unEncodingString)) unEncodingString = RegExp.leftContext + RegExp.$1 + RegExp.rightContext
  153. return unEncodingString
  154. }
  155. </script>
  156. <textarea id=encodeHTML rows=20 cols=80></textarea> <br><br>
  157. <div align=center><button onclick=encodeHTML.innerText=strdec(encodeHTML.innerText)>Decode
  158. </button></div></td></tr></table></td></tr></table></td></tr></table>
  159. </body>
  160. </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:已附上代码附件提供下载!

转载于:https://blog.51cto.com/yangye/202461

通过脚本下派WsusAgent3.0.exe(续)相关推荐

  1. 通过脚本下派WsusAgent3.0.exe

    上一篇文章中提到如何检测WsusAgent的客户端版本,如果客户端版本过低就需要手动更新到WsusAgent 3.0,数量少还可以手动去打上,但是像我公司还剩900多客户端未升级到这个版本.手动打上未 ...

  2. Python selenium —— 将你的自动化脚本打包成一个exe

    写好了Python selenium脚本,到其他机器上运行,还得要在其他机器上也装一套Python的环境,尤其在你用了一些第三方库的时候,甚至还要顾及操作系统是32位还是64位,是不是很坑,如果能打成 ...

  3. Python 把脚本编译打包成EXE文件 —— pyinstaller 的安装和使用

    安装 pyinstaller 要把Python脚本编译打包成.exe可执行文件,需要安装 pyinstaller.exe . 打开windows控制台窗口cmd.exe,执行以下命令,Python会自 ...

  4. groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

    groovy.run 脚本 Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持. 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么还要使用picocli? ...

  5. shell脚本:exit 0 和 exit 1有什么区别?他们和return不同,return是关键字,exit是一个shell函数

    定义 exit 0 :正常运行程序并退出程序.使用echo $? 返回0,也就是说调用环境认为你的程序执行正常. exit 1 :非正常运行导致退出程序,也可以是其他数字.系统程序对于程序运行错误是有 ...

  6. 利用NT6.X HDD Installer_v3.0.exe安装电脑系统

     1.此系统不能正确安装网卡驱动和显卡驱动,故重装前先将这两个驱动下载好,建议用鲁大师备份还原驱动. 2.小马激活工具使用:安装后直接点"开始体验"即可自动完成所有电脑的激活. ...

  7. 按键游侠脚本引擎 v1.0 免费下载--IT man

    Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.a ...

  8. 3dsmax建筑/室内/家具/生长动画脚本插件AutokeyV1.0

    3dsmax建筑/室内/家具/生长动画脚本插件AutokeyV1.0 List item

  9. SharpCAD脚本建模1.0版本发布了

    SharpCAD建模工具1.0发布了.SharpCAD模仿的是开源脚本建模工具OpenSCAD,SharpCAD造型内核使用的是OpenCasCADE7.5,未修改任何代码.此外还用到了以下几个开源库 ...

最新文章

  1. 【特惠】非饱和(不内卷),高颜值,有三这本深度学习书正在半价!
  2. boost::mpl模块实现comparison相关的测试程序
  3. cytoscape插件下载_Cytoscape下载
  4. python扩展文件_1. 使用 C 或 C++ 扩展 Python
  5. 微服务的真相(一)服务拆的太小,后面迭代忍不了
  6. Java即时编译器JIT之简单介绍
  7. 嵌入式工程师是硬件工程师么‘_硬件工程师修炼真经
  8. MySQL 一条SQL语句执行得很慢的原因有哪些?
  9. 关于mongodb的学习与探索二
  10. day9-mysql集群
  11. 01背包 hihocoder第六周
  12. 在低版本浏览器内核中适配replaceAll
  13. React Native多语言切换
  14. 不同类型的物联网产品、物联网产品的优势
  15. android one a2,小米第二代 Android One 机种小米 A2 与平价版小米 A2 Lite 于西班牙发表...
  16. 分享一个android手机开不了机的问题
  17. 计算机顶级会议Rankings
  18. Java设计模式-代理模式笔记
  19. Spring整合MyBatis导致一级缓存失效问题
  20. 标自然段的序号格式_正确的序号及标点使用格式

热门文章

  1. SpringMVC框架搭建( 使用Jar包搭建)
  2. 推荐阅读-Docker实现原理之Namespace,CGroup
  3. github上传命令
  4. 一份深度学习相关的面试题
  5. 中国地区Win10免费升级活动正式结束
  6. 【redis】 windows 32x 64x
  7. Java知多少(50)Java throws子句
  8. Thinkphp3.2整合微信支付
  9. UESTC 2014 Summer Training #19
  10. context.Request.Files post 上传问题件