脚本专栏 发布日期:2024/12/30 浏览次数:1
代码一:
'******************************************************************************************* 'Version:3.1 ' 调整错误处理方法,错误信息输出到LogFile文件,可以查看扫描失败原因 ' 如果出现“RPC 服务器不可用”错误,是因为远程主机没开机 ' 如果出现“RPC 服务器不可用”之外的错误,可能是由于正在运行的程序造成,请你把此信息告诉我 ' 重启后再次扫描就可以排除非“RPC 服务器不可用。”的错误 ' 如果扫描到的硬件信息为空,应该是驱动问题(或BIOS不完善),请自行解决 'Version:3.0 ' 增加输出BIOS的发行日期,和主板信息放在一起 'Version:2.9 ' 修正所有GetInfo过程遇错的处理方法,避免返回的数组上限不符合输出要求导致脚本报错。 ' 之所以为出现这种情况,是因为Win32类检索不到硬件或连接到Win32类失败; ' 原来判断是否出现Err,忽略了检索不到硬件的情况(连接成功无Err,Count为0) ' 检索不到硬件多数是因为驱动没装好 'Version:2.8 ' 增加GetIDEProtocol过程,获取IDE控制器使用的协议,只是增加了代码,没有调用 ' 计划增加检索其它存储器控制器的过程 'Version:2.7 ' 检索硬盘/显卡/网卡/声卡的过程增加 DeviceID 属性(设备标识符) ' 此属性不被输出,用于脚本内部判断 'Version:2.6 ' 原来输出搜索到的第一个硬盘 ' 改为输出搜索到的第一个InterfaceType属性为IDE的硬盘的信息 'Version:2.5 ' 增加Sort过程,排序硬件信息 'Version:2.4 ' 调整输出信息的分类,同类信息尽可能的只使用一个逗号分隔,以便导入xls后在同一列 ' 查询到的硬件信息如果是空或0,有可能是相关驱动不完善或未定义此信息,也可能是未安装驱动 ' 因为WMI查询就代表了系统知道这些硬件的详细信息,查不到信息就是系统不知道 ' 系统不知道硬件的详细信息,代表着性能可能有所缺失,建议找个好驱动安装 ' 值得注意的是主板驱动 ' (为了更容易理解,此版本的升级信息被编辑过) 'Version:2.3 ' 取消2.2版增加输出的硬盘接口类型 ' 由于STAT也归于IDE接口,这会导致误解 ' PS:脚本只输出搜索到的第一个硬盘 'Version:2.2 ' GetMemoryInfo过程增加MemoryType、FormFactor、TypeDetail三个属性 ' 输出增加内存类型、封装类型 ' 输出增加硬盘容量、接口类型 'Version:2.1 ' GetOSInfo过程增加去掉Caption属性中带有的逗号“,”的代码 ' 原因:在检测2003系统时,读取到的Caption属性,带有逗号“,” ' 这会影响输出,因为输出是以逗号“,”为分隔符的 'Version:2.0 B5发布版 ' GetNetworkInfo过程改为使用MACAddress属性非空、 ' Manufacturer属性非"Microsoft"判断网卡 'Version:2.0 Beta4 ' GetNetworkInfo过程使用NetConnectionStatus属性判断网络适配器 ' NetConnectionStatus属性表明连接状态(2000系统不支持此属性) ' 物理网络适配器才具有此状态(包括停用状态在内) 'Version:2.0 Beta3 ' GetNetworkInfo过程增加一个判断 ' 忽略读取IPAddress(0)时会产生Err类型数据的适配器(对战平台) 'Version:2.0 Beta2 ' GetOSInfo过程原来使用的Name、ServicePackMajorVersion属性 ' 改为使用Caption、CSDVersion属性 ' 所有GetInfo过程增加错误处理代码,避免正在扫描的时候 ' 脚本遇到运行时错误导致脚本退出 'Version:2.0 Beta1 ' 增加扫描失败记录,再次运行脚本只读取失败记录,忽略配置信息 'Version:1.1 ' GetNetworkInfo过程增加一个判断 ' 忽略NetConnectionID属性(接口名称)为空的适配器 'Version:1.0 ' 初始版本 Option Explicit '************************************** '作 者: LZ-MyST QQ:8450919 'http://hi.baidu.com/lzmyst 'http://www.clxp.net.cn 'E-Mail:lzmyst@163.com '你可以任意编辑、引用脚本的全部或部分代码 '转贴、引用脚本的全部或部分代码请保留版权 '************************************** '********************************说明开始************************************* 'Input格式:起始IP-数量=用户名=密码;起始计算机名-数量=用户名=密码 ' 多个配置项用“;”隔开 '例:192.168.0.1-10指明IP范围为192.168.0.1~192.168.0.10,支持跨网段 '例:PC001-10指明范围为PC001~PC010(计算机名可以包含-号) '与指定格式不相同的,默认为单IP[计算机名],也可以在"未扫描的计算机.txt"里配置 '"硬件信息.txt"是以逗号分隔各项硬件信息,你需要自己导入XLS整理、精简 '未扫描到的计算机,会把机号、用户名、密码保存到"未扫描的计算机.txt" '再次运行脚本将只读取"未扫描的计算机.txt"里的信息(如果存在并且大小不为0) '********************************说明结束************************************* Dim Input, InfoOutFile, LogFile '请按格式给Input赋值 'Input = "pc021=administrator=cylslynetbar" Input = "PC001-109=administrator=cylslynetbar;pc110-85=administrator=LYjfnetbaradmin" InfoOutFile = "硬件信息.txt" LogFile = "未扫描的计算机.txt" Redim arrConfig(0) Dim WshShell, FSO, intCount1, intCount2 intCount1 = 0 intCount2 = 0 Set WshShell = WScript.CreateObject("WScript.Shell") Set FSO = WScript.Createobject("Scripting.Filesystemobject") ReadConfig WshShell.Popup "扫描过程会很慢,请耐心等待,完成后会给出提示",,"扫描开始" LinkRemoteServer arrConfig Dim LenNum1, LenNum2 If intCount1 > intCount2 Then LenNum1 = 0 LenNum2 = Len(intCount1) - Len(intCount2) Else LenNum1 = Len(intCount2) - Len(intCount1) LenNum2 = 0 End If Sort InfoOutFile WshShell.Popup "扫描结果:" & _ vbCrLf & vbTab & "扫描成功:" & Space(LenNum1) & intCount1 & " 台" & _ vbCrLf & vbTab & "扫描失败:" & Space(LenNum2) & intCount2 & " 台" & _ vbCrLf & "扫描失败的电脑已做记录,再次运行脚本只扫描记录里的电脑",,"扫描完成" Function ReadConfig Dim objMatches, objMatche,objLogFile, arrLog, intUBarrConfig If FSO.FileExists(LogFile) Then If FSO.GetFile(LogFile).Size = 0 Then Set objMatches = GetMatche("([^;=]+)=([^;=]+)=([^;=]+)", Input) For Each objMatche In objMatches GetConfig objMatche.SubMatches(0), objMatche.SubMatches(1), objMatche.SubMatches(2) Next If objMatches.Count = 0 Then Msgbox "配置信息格式不正确,请修改" WScript.Quit End If Else Set objLogFile = FSO.OpenTextFile(LogFile) Do Until objLogFile.AtEndOfStream arrLog = Split(objLogFile.ReadLine,"=") intUBarrConfig = ((Ubound(arrConfig)+1)\3+1)*3-1 Redim Preserve arrConfig(intUBarrConfig) arrConfig(intUBarrConfig-2) = arrLog(0) arrConfig(intUBarrConfig-1) = arrLog(1) arrConfig(intUBarrConfig-0) = arrLog(2) Loop End If Else Set objMatches = GetMatche("([^;=]+)=([^;=]+)=([^;=]+)", Input) For Each objMatche In objMatches GetConfig objMatche.SubMatches(0), objMatche.SubMatches(1), objMatche.SubMatches(2) Next If objMatches.Count = 0 Then Msgbox "配置信息格式不正确,请修改" WScript.Quit End If End If End Function '********************************************************************************* '目的:连接到远程主机的WMI命名空间 '输入:arrArray数组,包含有计算机名[IP]、用户名、密码 '调用:LinkServer过程 ' 如果返回SWbemLocator对象ConnectServer方法的实例,调用OutInfo过程 ' 如果返回Err信息(字符串类型),输出计算机名[IP]、用户名、密码及错误信息到LogFile文件 ' OutInfo过程 ' 如果返回Err信息(字符串类型)输出计算机名[IP]、用户名、密码及错误信息到LogFile文件 '传递:SWbemLocator对象ConnectServer方法的实例传递给OutInfo过程 ' 计算机名[IP]、命名空间、用户名、密码传递给LinkServer过程 '********************************************************************************* Function LinkRemoteServer(arrArray) Dim objErrLog, E, objLinkServer, objConnection, objWbemLocator, objErr Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objErrLog = FSO.CreateTextFile(LogFile,True) For E = 0 To Ubound(arrArray) Step 3 Set objLinkServer = LinkServer(arrConfig(E),"root\cimv2",arrConfig(E+1),arrConfig(E+2)) If Err Then objErrLog.Writeline arrArray(E) & "=" & arrArray(E+1) & "=" & arrArray(E+2) & "=" & _ "错误编号:" & CStr(Err.Number) & _ ",错误原因:" & CStr(Err.Description) & _ ",错误来源:" & CStr(Err.Source) & " By LinkServer Function" intCount2 = intCount2 + 1 Err.Clear Else objErr = OutInfo(objLinkServer) If Vartype(objErr) = 8 Then objErrLog.Writeline arrArray(E) & "=" & arrArray(E+1) & "=" & arrArray(E+2) & "=" & objErr intCount2 = intCount2 + 1 End If End If Next End Function '****************************************************** '目的:输出硬件信息 '输入:SWbemLocator对象ConnectServer方法的实例 '调用:获取硬件信息的GetXXXInfo过程 '传递:SWbemLocator对象ConnectServer方法的实例 '返回:所有调用的GetInfo过程都未返回Err对象,则返回True ' 某个GetInfo过程返回Err对象,则返回False '****************************************************** Function OutInfo(objRemote) Dim OutFile, arrInfo, strOutInfo, Tmp, A If FSO.FileExists(InfoOutFile) Then Set OutFile = FSO.OpenTextFile(InfoOutFile,8) Else Set OutFile = FSO.CreateTextFile(InfoOutFile) OutFile.Writeline "计算机名,系统(初装日期),主板型号(厂商)(发行日期),CPU型号(接口类型),外频,L2容量(速度)," & _ "内存总量,内存速度(位置),内存类型(封装类型),硬盘型号(容量),显卡型号(显存),网卡,IP/MAC" End If '系统 arrInfo = GetOSInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = arrInfo(0) & "," & arrInfo(1) & "(" & arrInfo(2) & ")," '主板 arrInfo = GetBoardInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = strOutInfo & arrInfo(0) & "(" & arrInfo(1) & ")" 'BIOS arrInfo = GetBIOSInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = strOutInfo & "(" & arrInfo(2) & ")," 'CPU arrInfo = GetCPUInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = strOutInfo & arrInfo(1) & "(" & arrInfo(8) & ")," & arrInfo(4) & "," & _ arrInfo(6) & "(" & arrInfo(7) & ")," '内存 arrInfo = GetMemoryInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If Tmp = 0 For A = 1 To Ubound(arrInfo) Step 6 Tmp = Tmp + Cint(arrInfo(A)) Next strOutInfo = strOutInfo & arrInfo(0) & "条,共" & Tmp & "M," Tmp = "" For A = 2 To Ubound(arrInfo) Step 6 If A = Ubound(arrInfo) - 4 Then Tmp = Tmp & arrInfo(A) & "(" & arrInfo(A+1) & ")," Else Tmp = Tmp & arrInfo(A) & "(" & arrInfo(A+1) & ") " End If Next strOutInfo = strOutInfo & Tmp Tmp = "" For A = 4 To Ubound(arrInfo) Step 6 If A = Ubound(arrInfo) - 2 Then Tmp = Tmp & arrInfo(A) & "(" & arrInfo(A+1) & ")," Else Tmp = Tmp & arrInfo(A) & "(" & arrInfo(A+1) & ") " End If Next strOutInfo = strOutInfo & Tmp '硬盘 Tmp = "" arrInfo = GetDiskInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If For A = 1 To Ubound(arrInfo) Step 5 If arrInfo(A+1) = "IDE" Then Tmp = arrInfo(A) & "(" & arrInfo(A+2) & "G)," Exit For End If Next If Tmp = "" Then strOutInfo = strOutInfo & "硬盘型号未检索到," Else strOutInfo = strOutInfo & Tmp End If '显卡 arrInfo = GetVideoInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = strOutInfo & arrInfo(0) & "(" & arrInfo(1) & "M)," '网卡 arrInfo = GetNetworkInfo(objRemote) If Vartype(arrInfo) = 8 Then OutInfo = arrInfo Exit Function End If strOutInfo = strOutInfo & arrInfo(1) & "," & arrInfo(2) & Space(17-Len(arrInfo(2))) & arrInfo(3) '输出 OutFile.Writeline strOutInfo intCount1 = intCount1 + 1 OutInfo = True End Function '********************************************************* '目的:连接到远程主机的WMI命名空间 '输入:strComputer:远程主机的计算机名或IP ' strNamespace:命令空间 ' strUserName:用户名 ' strPassword:密码 '返回:连接成功,返回SWbemLocator类连接远程主机后的对象的实例 ' 连接失败,返回错误对象 '********************************************************* Function LinkServer(strComputer,strNamespace,strUserName,strPassword) Dim objWbemLocator Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Dim objConnection On Error Resume Next Set objConnection = objwbemLocator.ConnectServer _ (strComputer, strNamespace, strUserName, strPassword) If Err Then Set LinkServer = Err Exit Function End If On Error Goto 0 objConnection.Security_.ImpersonationLevel = 3 Set LinkServer = objConnection End Function '****************************************** '目的:正则表达式 '输入:strPatrn:正则表达式模式 ' strString:要执行正则表达式的字符串 '返回:Match对象 '****************************************** Function GetMatche(strPatrn, strString) Dim RegEx Set RegEx = New Regexp RegEx.Global = True RegEx.IgnoreCase =True RegEx.Pattern = strPatrn Set GetMatche = RegEx.Execute(strString) End Function '*************************************** '目的:2、8、16进制转10进制 '输入:strString:2、8、16进制数 ' intNum:进制(2|8|16) '返回:10进制数 '*************************************** Function ChangeToDecimal(strString, intNum) ChangeToDecimal = 0 If Isnull(strString) Then ChangeToDecimal = 0 : Exit Function Dim A, M For A = 1 To Len(strString) M = LCase(Mid(strString, A, 1)) Select Case M Case "a" :M = 10 Case "b" :M = 11 Case "c" :M = 12 Case "d" :M = 13 Case "e" :M = 14 Case "f" :M = 15 End Select ChangeToDecimal = ChangeToDecimal + M * intNum^(Len(strString)-A) Next End Function 1234下一页阅读全文