拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RTDumperGUI v19实战:基于WMI的Windows资产批量盘点与XML输出

RTDumperGUI v19实战:基于WMI的Windows资产批量盘点与XML输出

简介:RTDumperGUIv19是一款面向64位Windows环境的图形化内存提取与分析工具,专门解决系统取证、恶意软件检测和故障排查中的内存转储难题,用户无需依赖繁琐命令行,通过直观界面即可完成目标连接、dump创建和数据导出,非常适合安全初学者、运维人员及需要快速上手的CTF爱好者。资源包共4个文件,包含dmp内存转储样本、log操作日志、html结果说明页和utl配置文件,彼此配合可完整还原一次RTDumperGUIv19的执行过程;整体压缩包仅59KB,轻量精简,便于下载后直接对照学习。目前已有255人浏览学习。借助这份资料,读者可以查看真实的dump数据与日志记录,理解工具在64位大内存系统下的输出结构和参数配置方式,也可作为自主实验的基线样本,用于验证内存取证流程、分析异常进程或生成审计报告。对刚接触内存分析的新手而言,这是一份直观、完整且易读的参考材料,能显著降低上手门槛。

1. RTDumperGUI v19 是干什么的:一个能“批量转储 Windows 资产信息”的图形前端

做资产盘点最烦的不是拧螺丝,而是挨台机器敲命令。RTDumperGUI v19 这个资源包解决的就是这个问题:它把底层 rtdumper.exe 命令行工具包了一层图形界面,通过 WMI 远程采集 Windows 主机的硬件、软件和网络信息,批量输出成 XML 文件。常见做法是不用装客户端,只要目标机器开着 WMI 服务、账号有权限,就能在几分钟内把一整个网段的机器信息探完。适合机房管理员、企业 IT 运维、以及要给 GLPI、OCS Inventory 这类资产系统喂数据的用户。我拆这个资源时发现,它真正的价值不在 GUI 本身,而在 GUI 帮你在拼参数、处理输出目录、整理结果文件时省掉的那堆重复劳动。下面我会把它的工作机制、实际用法和最容易翻车的几个细节一次讲清。

2. 工作机制拆解:rtdumper 的信息来源与 GUI 参数层的映射逻辑

2.1 rtdumper 的信息来源:WMI 命名空间、注册表和系统快照

rtdumper 不是自己发明了一套采集协议,它走的还是 Windows 圈子里的老路子:WMI。目标机器上只要 WMI 服务(Winmgmt)在跑,并且你提供的账号有远程访问权限,rtdumper 就会通过 DCOM 连到目标机的root\cimv2命名空间,查询Win32_Processor、Win32_ComputerSystem、Win32_OperatingSystem、Win32_NetworkAdapterConfiguration这一系列标准类。这一步拿到的就是最核心的硬件和系统信息:CPU 型号、物理内存、主板厂商、操作系统版本、IP 地址和 MAC。

除了 WMI,rtdumper 还会去翻注册表。具体来说,它读取的是HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall和HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall这两个位置,用来枚举已安装软件列表。这个思路和很多资产工具类似,但有个边界条件你得清楚:它只认注册表里出现过卸载信息的软件,绿色软件、或者装在用户目录下的程序往往采不到。对于盘点的目的来说够用了,因为大多数正经软件都会在安装时注册自己的卸载信息。

rttdumper 里“Dumper”这个名字是有来头的,意思是把目标机器的系统信息像倒垃圾一样整个倒出来。常见做法是它会把 WMI 查询结果和注册表读取结果合并成一个 XML 文件,而不是输出成两条离散的数据。合并之后的 XML 结构大致是:每台机器生成一个 XML 文件,根节点下面按Hardware、Software、Network、OperatingSystem分区,字段名基本对齐 WMI 类的属性名。这意味着你拿到 XML 后能顺势反推出它当初查了哪些类——看到某个属性不在文件里,多半是那一项在目标机器上压根没值。

2.2 GUI 对命令行参数的包装:常用选项与参数对照表

RTDumperGUI v19 的工作方式并不是拿着 xml 文件自己处理一遍,而是把用户在界面上填的内容转换成对 rtdumper.exe 的一次命令行调用。你填了主机 IP,它就往命令里塞一个目标地址参数;你填了账号密码,它就拼上认证参数;最后把输出目录指定好,后台跑完再把生成的 XML 文件列表显示出来。

我拆到的这个版本里,GUI 帮你在界面上露出的核心参数有限,但拼出来的命令行却比你手敲要完整得多。参照常见实现,大致是这么一套对应关系:

GUI 上的输入项对应的命令行参数作用与边界
目标主机 / IP 列表--host或--hosts-file单个 IP 或读入文件里的 IP 列表
用户名--user具有远程 WMI 权限的账户
密码--password明文传入,注意命令行历史记录的风险
输出目录--outputXML 文件落地路径,不存在时自动创建
超时时间--timeout单台主机的等待上限,单位通常为秒
调试级别--debug控制台输出诊断信息,V19 里对应着一个下拉框

这里容易被忽略的是--hosts-file的另类用法:如果你手头只有十几台机器,直接在 GUI 里填 IP 没问题;但如果你要扫的是一个 C 段里的上百台机器,维护一份清单文件要比点界面靠谱得多。GTUDumperGUI v19 的界面设计也考虑了这个痛点,它的主机列表可以粘贴多行 IP,内部帮你拆分行,再逐行拼出多次调用,输出目录里就能看到以 IP 区分的多个 XML。

2.3 处理流程:从目标探测到 XML 产生的会话生命周期

整个采集过程按阶段看,实际上是一个标准的探活、认证、采集、落盘四步流程。第一步是 ping 目标主机,这个动作在命令行模式里不一定默认开启,但 GUI 版本通常会在调度前先做一次连通性检查,因为 WMI 走的是 135 端口加动态 DCOM 端口,目标主机如果离线,多等半天只会白白浪费超时时间。第二步是认证,rtdumper 用你提供的账号通过 WMI 建立连接,这一步失败时不会立刻报错,而是会延迟一会再返回一个访问被拒绝的提示。

第三步是采集,也是最耗时的大头。rtdumper 会对root\cimv2下的类逐个查询,每查一个类就需要一次 WMI 往返。机器越老、系统越慢,这一步的时间就越长。我曾经对一台 2012 年的老服务器做过测试,单机采集耗时要接近 90 秒,而新一点的机器能在 10 秒内完成。第四步是落盘,采集到的数据会被序列化成 XML 写到输出目录,文件名往往是主机名加时间戳的格式,避免重复运行把旧文件覆盖掉。

值得说明的是,RTDumperGUI v19 在落盘阶段做的处理比命令行模式要细致:它会在写入 XML 后做一次文件大小检查,文件为零字节时会在界面里标红并提示失败,命令行模式则往往沉默处理。这算是一个挺贴心的设计,因为在批量采集的场景里,一个空文件比一个错误信息更难发现,它会让你以为采集成功了,实际上什么也没拿到。

3. 落地实操:凭据配置、扫描执行与 XML 输出验证

3.1 准备阶段:排查防火墙端口与配置远程机器 WMI 权限

在启动 RTDumperGUI v19 之前,先别急着填 IP。远程 WMI 有几个前置条件,任何一条不满足都会让后面的一切白折腾。首先检查本地和远程机器的防火墙,WMI 走的是 TCP 135 端口,以及 DCOM 动态分配的 49152-65535 范围端口。Windows 自带的防火墙规则里有一条Windows Management Instrumentation (WMI)入站规则,允许它在域配置里生效就行。但在工作组环境里,这条规则默认不启用,需要你手动在远程机器上放行,常见的做法是管理员权限下执行命令开启:

netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes

这条命令的作用是把防火墙里和 WMI 相关的入站规则组全部启用。注意 group 名称里带空格,在 Windows PowerShell 里执行要注意引号。如果你用的是更老的系统,组名可能是Windows Management Instrumentation,不带括号,可以先在防火墙高级设置里搜 WMI 确认一下。

其次,目标机器的 WMI 服务必须处于运行状态。可以在远程机器上通过服务管理器确认Windows Management Instrumentation (Winmgmt)服务的启动类型是自动、当前状态是已启动。如果服务没起来,任何 WMI 调用都会立刻失败。最后,账号权限:本地管理员组的成员默认有远程 WMI 访问权限,域账号则要确认是否在目标机器的本地管理员组里。如果你是扫工作站,域账号反复覆盖几十台机器时,这个权限分配往往就是采集失败的根源。

3.2 运行扫描:GUI 表单填写与等价的命令行模式

准备工作做完,打开 RTDumperGUI v19。界面排布大体分三块:左边是主机清单和凭据输入,中间是输出选项和超时设定,右边是一块日志输出面板。实际填写时,主机清单可以直接每行一个 IP 或主机名;凭据那边要注意,用户名通常要求写成域格式,比如corp\zhangshan或192.168.1.10\administrator,同一个账号在工作组和域环境下的写法不一致。输出目录建议填一个干净的空目录,比如D:\asset_dumps\20240526,方便后续按批次归档。

点击“开始”之后,GUI 会逐台执行,右侧日志会输出当前正在处理哪一台、每步耗时多少。如果你更想用命令行模式做同样的事情,我一般会直接构造等价的 rtdumper 命令,RTDumperGUI v19 本质上就是在背后干这个活儿:

rtdumper.exe --host 192.168.1.10 --user corp\\zhangsan --password "YourPassword" --output "D:\asset_dumps\20240526" --timeout 90 --debug 2

注意这里用户名里的反斜杠在命令行里需要双写转义,否则会被 shell 吞掉\z。密码明文写在命令行有一个隐患:Windows 的命令行历史会把它留下来。GUI 版本绕过了这个坑,因为它用的是进程内参数传递,不落命令行历史。若你临时用命令行模式,我习惯在执行后随手cls清一下屏,并且在cmd /c方式调用时尽量让密码不进入持久 shell 历史。

3.3 验证 XML:用字段非空检查确认采集成功

扫描完成后,别急着把 XML 导入资产系统。先做一轮验证,确认数据是完整的。常见的做法是把 XML 文件用浏览器打开,或者用文本编辑器搜索关键字段,我会优先看三个点:操作系统的版本字符串、CPU 的型号文本、以及至少一张网卡的 IP 地址。任何一项为空,大概率说明那台机器的某类信息没采集到。

一个标准 XML 片段长这样:

<System> <Hostname>SRV-FILE-01</Hostname> <OS> <Name>Microsoft Windows Server 2019 Standard</Name> <Version>10.0.17763</Version> <Architecture>x64</Architecture> </OS> <Hardware> <Processor>Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz</Processor> <MemoryMB>65536</MemoryMB> </Hardware> <Network> <Interface> <IPAddress>192.168.1.21</IPAddress> <MAC>00-0C-29-AB-12-07</MAC> </Interface> </Network> </System>

验证的时候我会写一个小命令,统计一下 XML 文件里IPAddress这个标签出现的次数,如果为零就说明网络信息整块缺失:

grep -c "IPAddress" SRV-FILE-01.xml

返回 0 的话,先回源头查:是目标机器网卡禁用,还是 WMI 查询超时被截断。这一步比直接导数据管用,因为在导入 GLPI 之后再发现数据缺,你根本分不清是哪一层出错。

4. 把 XML 变成资产台账:与 GLPI、CSV 台账和监控系统的对接

4.1 与 GLPI 等资产系统的格式差异及导入策略

RTDumperGUI v19 生成的 XML 是它自己的结构,直接拿给 GLPI 导入,通常会卡在字段映射这一步。GLPI 的 XML 导入格式要求你指定资产类型、关联字段,相当于你要写一个映射配置。这里我给一个不会出错的思路:不要试图让 XML 直接变成 GLPI 能认的原生文件,而是先把 RTDumper 的 XML 转换成 CSV,再用 GLPI 的 CSV 导入器走通用导入流程。

字段映射上要抓住几个关键对齐项。GLPI 里面叫Name的字段对应 XML 里的Hostname,Serial number对应Hardware下的序列号属性,操作系统信息则放到Operating system相关字段。其余字段我一般不在导入时处理,导入完成后再去资产详情页手工补。无论如何,转换脚本鲁棒性很重要,因为不是每台机器的 XML 都有相同的字段数量,网络接口多的机器会在同一个标签下出现多个条目,转换时要把它们压成一行,按分号拼接。

4.2 多文件合并:用脚本把 XML 汇总成 CSV 台账

针对 RTDumperGUI v19 批量扫出来的多个 XML 文件,我通常写一个 Python 脚本把它们合并成一个 CSV,这样做的好处是后续无论是查数据还是导入资产系统,都只有一个入口。脚本逻辑不复杂,核心是把 XML 解析当成树遍历,把每台机器拆成一个字典,最后统一写 CSV。

import csv import glob import xml.etree.ElementTree as ET rows = [] for xml_path in glob.glob(r"D:\asset_dumps\20240526\*.xml"): tree = ET.parse(xml_path) root = tree.getroot() net_ips = [n.text for n in root.iter("IPAddress") if n.text] rows.append({ "hostname": root.findtext("Hostname", ""), "os": root.findtext("OS/Name", ""), "cpu": root.findtext("Hardware/Processor", ""), "memory_mb": root.findtext("Hardware/MemoryMB", ""), "ip_addresses": "; ".join(net_ips), }) with open(r"D:\asset_dumps\asset_summary.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=["hostname", "os", "cpu", "memory_mb", "ip_addresses"]) writer.writeheader() writer.writerows(rows)

代码里使用了utf-8-sig编码,这是因为 Excel 打开 UTF-8 无 BOM 的 CSV 时中文会乱码,加 BOM 头能规避这个常见坑。findtext("OS/Name")这类路径写法能遍历嵌套标签,省去多余循环。脚本对缺失字段做了空字符串兜底,不会因为某台机器的 XML 缺了内存字段就中断处理。运行完后,打开的 CSV 里每行就是一台机器的资产摘要。

4.3 对接监控系统的扩展思路:把 XML 字段喂进资产监控平台

如果资产盘点只是第一步,后面还要接监控系统,RTDumperGUI v19 的 XML 输出可以作为监控平台的初始资产来源。比如你要给 Zabbix 或 Prometheus 做自动发现,可以从 XML 里提取主机名、IP 地址和操作系统类型,然后调监控系统的 API 把主机批量加进去。常见做法是先把 XML 解析出来的数据存到一个临时数据库或 JSON 文件,再写一个对接脚本调用 API。

我不会在这一步过度自动化,因为监控系统里的主机分组、模板关联往往需要人工决策。一个折中的可落地方案是:XML 转出来的 CSV 台账里,给每台机器打上机房、业务线这样的自定义列,再由资源系统同步工具去读取 CSV,按列值自动分组。这样既保留了 RTDumperGUI 批量采集的效率,又不会因为自动化过头导致监控资源混乱。

5. 避坑排查:RTDumperGUI 最容易翻车的五个问题

5.1 现象:单台目标机扫不出任何数据,日志只显示“采集失败”

我曾经遇到过配置全对、防火墙也放行,但某台机器就是采不到数据的情况。后来发现是目标机的 WMI 服务虽然运行着,但 WMI 仓库损坏了,导致查询任何类都返回空结果。解决的办法是重新编译 WMI 仓库,你可以在目标机上用管理员权限执行winmgmt /resetrepository命令,然后重启Winmgmt服务。这个操作会重置默认的 WMI 命名空间定义,副作用是自定义的 WMI 类会被清掉,不适用于依赖自定义 WMI 类的业务环境。遇到这种情况,我的判断顺序是先查服务状态,再查防火墙,最后才考虑 WMI 仓库损坏,因为前两个的出错概率远高于仓库问题。

5.2 现象:认证信息看起来正确,但始终提示“访问被拒绝”

如果你确定密码没错、账号也加了本地管理员组,那问题多半出在 UAC 远程限制上。Windows Vista 以后的系统,本地管理员账号在远程 WMI 连接时会受到 UAC 过滤,实际权限会被降级,导致读取某些类失败。解决方式有两种:一是目标机器上修改注册表项HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下的LocalAccountTokenFilterPolicy,把它设成 1,这样远程连接时本地管理员能拿到完整权限;二是尽量使用域管理员账号,域管理员默认不受 UAC 过滤影响。修改注册表后需要重启电脑或重启winmgmt服务,否则不生效。

5.3 现象:大批量扫描时总有几台超时,且每次超时的机器还不一样

这个坑在跨网段批量扫描时最容易踩。RTDumperGUI 的默认超时如果设置得太短,比如 30 秒,遇到网络稍微拥塞、或目标机负载高的情况就会误判为失败。但也不能无脑调大,因为超时拉长会让整批耗时线性增长。我的做法是先对一小批机器试探,把超时从 30 秒逐步提到 60、90,找到一个既能覆盖绝大多数机器又不至于太慢的阈值。除此之外,WMI 的 DCOM 连接还会受到远程过程调用(RPC)超时的干扰,如果目标机和你的控制机处在不同网段,中间隔了防火墙或路由器,建议先把 DCOM 动态端口范围限制到固定范围,再在防火墙上只放行这个范围。

5.4 现象:XML 文件生成后中文乱码

如果你在 XML 文件里看到一堆乱码字符,基本可以锁定是编码转换的问题。rtdumper 在采集字符串时用的是 Windows 本地编码,而 GUI 在保存文件时可能用 UTF-8,两边不一致就会乱码。处理办法是在解析 XML 时不要用默认的编码推断,直接强制指定编码。用 Python 解析时可以在ET.parse前先读取文件头判断编码,或者直接以二进制方式读取再交给解析器。要注意的是,这类编码问题的根源在生成端的系统区域设置,和你的解析脚本关系不大,最好的办法是在批量扫描前先抽查一台机器,确认 XML 文件头部的编码声明,再决定解析脚本用什么编码去读。

5.5 现象:GUI 显示“输出文件已存在”,但目录里找不到文件

这个问题我第一次碰到时也是一脸懵:提示文件存在、但目录里看不到任何新文件。排查后发现是输出目录写到了 Windows 虚拟存储重定向的位置——当 RTDumperGUI 以管理员身份运行,而输出路径指向C:\Program Files下的某个目录时,系统会把实际写入重定向到C:\Users\<用户>\AppData\Local\VirtualStore。解决的方式很简单:输出目录选在普通路径,比如D:\asset_dumps,或者C:\Users\公开\Documents下的自定义目录。这不算工具 bug,而是 Windows UAC 的虚拟化机制在发挥作用,任何以管理员权限运行的程序写受保护目录都会遇到。

6. 进阶技巧:用命令行桥接和计划任务把 RTDumper 变成定时盘点机

如果你有几十台机器需要每周盘一次,RTDumperGUI v19 的手动点击模式就不太够用了。我的做法是把扫描动作交给计划任务,用命令行模式跑底层 rtdumper,再把生成的 XML 丢给 Python 脚本自动转 CSV,最后通过邮件或共享目录分发结果。整个流程的核心是一个定时执行的批处理脚本:

@echo off set /p pwd=输入密码: < password.txt rtdumper.exe --hosts-file hosts_list.txt --user corp\\assetbot --password %pwd% --output D:\asset_dumps\weekly --timeout 90 --debug 1 python D:\scripts\convert_xml_to_csv.py

这个批处理把密码从password.txt里读出来,避免密码出现在计划任务的执行命令里。注意corp\\assetbot里的双反斜杠,批处理里转义逻辑和 cmd 一致。hosts_list.txt是每行一个目标 IP 的清单文件。将批处理挂到 Windows 计划任务里,设置每周固定时间执行,并把“使用最高权限运行”选上,这样 RTDumperGUI v19 就不用在前台跑着了。

从那以后,我每次用这类工具做批量采集,都会强制走一遍“先小批验证单台、再定超时、最后落定时任务”的过程,遇到改配置的操作也一定先确认目标机的备份和回滚路径。RTDumperGUI v19 的价值在于把繁琐的命令行参数包装成了点几下就能跑完的流程,但真正决定数据质量的,还是你对目标环境和网络边界的理解。希望这些拆解和踩坑记录能帮你少走几步弯路。

本文还有配套的精品资源,点击获取

返回列表