在早期的Windows开发中,HTML Application(HTA)结合VBScript可以绕过浏览器安全限制,直接调用COM接口,实现强大的系统级操作。本文介绍一个经典的HTA脚本——Dom Explorer,它能够枚举当前系统中所有Internet Explorer窗口和Shell窗口,递归显示对象的属性并允许在运行时修改属性值、调用方法。该工具由Jean-Luc Antoine于2001年提交,适用于IE 5.5及以上版本,文件扩展名必须为.hta。
功能概述
Dom Explorer启动后,只需点击“init”按钮,即可自动检测所有运行中的IE实例和Shell窗口。用户可以通过树形展开查看每个对象的属性、类型、读写权限及当前值。对于可读写的属性,页面直接提供编辑框,修改后点击“ok”即可生效。同时,工具会列出对象支持的所有方法,并给出参数输入框,方便直接调用。
核心代码解析
整个脚本的核心采用VBScript编写,通过CreateObject("shell.application")获取Shell对象,进而遍历其Windows集合。关键的三个函数如下:
- Function SP2(name, obj, RW, ObjPath)
- ' 返回一个HTML表格行,显示属性名、类型、读写状态、值。
- ' 如果是对象类型,点击属性名可递归展开查看子属性。
- ' 如果值为可读写类型(如数字、字符串),会生成contenteditable的span,并附带“ok”链接,点击后执行赋值操作。
- End Function
复制代码- Function SP(name, NbArg, ObjPath, Title)
- ' 返回一个HTML表格行,显示方法名和输入框。
- ' 根据参数数量动态生成0~3个文本框,点击方法名即调用该方法并传入文本框中的值。
- End Function
复制代码- Sub ShowProp(Obj, OP)
- ' 根据对象的TypeName选择对应的属性输出模板。
- ' 支持IShellDispatch3、IShellWindows、IWebBrowser2、IShellFolderViewDual、Folder3、FolderItem2等多种COM接口。
- ' 每个接口的属性和方法都通过SP2和SP函数构建成表格行。
- End Sub
复制代码
例如,对于IWebBrowser2接口(即IE窗口),脚本输出了AddressBar、Busy、Document、FullScreen、Height、Left、LocationURL等数十个属性的读写状态,以及GoBack、GoForward、Navigate、Refresh、Quit等方法。对于可读写属性,用户可以直接在页面上修改值并点击“ok”更新。还包含一个ShowFrames函数,可递归显示框架的嵌套结构。
使用步骤
1. 将文末提供的完整代码复制到记事本,保存为Dom_Explorer.hta(注意扩展名必须是.hta)。
2. 确保系统已安装IE 5.5或更高版本(在Windows XP/2000/98上测试通过)。
3. 双击打开该.hta文件,界面会显示一个简单的HTA窗口。
4. 点击页面上的“init”按钮(原文中通过按钮触发初始化,代码中未直接给出按钮,但可根据注释自行添加)。
5. 程序会枚举所有Shell窗口和IE实例,以表格形式展示属性和方法。
6. 点击属性名称可递归展开子对象;对于可读写属性,直接在编辑区修改值,然后点击旁边的“ok”链接完成更新;对于方法,在输入框中填写参数后点击方法名执行。
注意事项
- 该HTA需要以本地文件执行,不能通过HTTP加载,因为HTA有更高的权限,允许跨域访问COM对象。
- 修改属性或调用方法时需谨慎,例如执行Quit方法会直接关闭对应的IE窗口。
- 工具依赖于shell.application对象,该对象在Windows 9x/NT/2000/XP中可用,但出于安全考虑,较新的Windows版本可能限制某些接口的访问。
- 代码中大量使用了On Error Resume Next来处理可能缺少属性的情况,实际运行时若遇到不支持的对象,相应行会显示为空。
总结
Dom Explorer是一个典型的HTA实战案例,展示了如何利用VBScript和COM接口实现动态DOM探测与操控。虽然它的主要应用场景是调试IE窗口和Shell对象,但其递归遍历、属性读写、方法调用的设计思路,对于理解HTA与Windows Shell交互非常有帮助。开发者可以在此基础上扩展,支持更多COM组件,或集成到自己的自动化测试工具中。 |