作为系统服务,IE下载从internet组件通常需要进行认证和检查。对于发布者,有两种机制: 1、inf文件进行发布 2、osd文件发布(ie4及以后版本) 推荐使用cab来将所有需要文件打包,并进行签名。IE收到一个cab文件后: 首先查找是否存在OSD文件,如果存在,按照OSD语法(XML文档)进行处理。其中如果涉及到INF文件,还会打开INF文件进行引用。 如果不存在,会打开INF文件,按照INF文件进行解释安装。 CODEBASE 属性 在internet上发布组件,极其重要的属性就是codebase属性了,因为此url指定了一个“挑剔”的组件运行所需的全部文件从哪儿获取。 组件开发者可以将组件以下列方式打包发布: INF文件格式 INF语法由Internet下载组件下载并处理。 所有URL必须被urlencode过,即空格以%20代替,且以codebase=<URL>中的url来作为基址解释。 代码下载器理解其中几个主要的节 [Add.Code] 及 [Setup Hooks] 如果者两个节均不存在,那么当作标准的win32 inf格式进行解释 Add.Code 节列出所有将要被安装的文件,包括可选文件 [Add.Code] 每一个文件自成一节(文件节),并进行单独描述安装属性。 [section-name1] File-%opersys%-%cpu%=[url | ignore | thiscab] %opersys% 可以是 [win32 | mac] ,当前 %cpu% 可以是 [x86 | ppc | mips | alpha].。 File=[url | thiscab] FileVersion=a,b,c,d 文件版本定义 Clsid={nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn} 组件的CLSID DestDir=[10 | 11] DestDir 可以设定为 10 即 \\windows directory 11 windows\\system directory. 如果没有设定值,则存放在cache目录中 RegisterServer=[yes | no] 是否自行注册组件,会覆盖inf文件中的其他关于注册的设定 Hook=section-name3 定义有条件挂钩。如果 clsid 或者文件的最小版本不匹配且无 File= or File-%opersys%-%cpu%= values 条目,安装程序会寻找关于定制的挂钩。挂钩节如下定义: [section-name3] key1=value1 可以多个组件都挂同一个hook. 以下key可用: File-%opersys%-%cpu%=[url | ignore] File=[url] 为cab文件展开在临时文件夹后运行的名另。如果缺少此命令设定,将寻找 InfFile= and InfSection= keys 以运行挂钩节。 InfFile=[name of win32 INF file inside the CAB] 可以是在cab文件中的其他inf文件 无条件安装Hook在[Setup Hooks]节中指定,且在add.Code节之前执行。 [Setup Hooks] 如果要使用Hook节,需要指定version如下(否则下载组件服务会忽略): [Version] ;例子分析最后给出。 Internet 组件下载服务 Internet 组件下载服务通过单一函数导出:CoGetClassObjectFromURL。此函数下载应用代码,校验且安装OLE组件,由IE实现 CoGetClassObjectFromURL 函数返回一个给定rclsid的工厂对象。如果无CLSID (CLSID_NULL),此函数根据contentType的MIME类型进行选择。如果对象已经安装,就实例化,否则,从指定的url处或者internet搜索页下载必要的代码 。 "下载和安装" 进程处理以下步骤: 使用URL Moniker(s)下载必要的代码。 调用 WinVerifyTrust 以确信所有下载文件安装是安全的 所有自注册组件完成注册 增加对下载的组件的跟踪的注册项 利用rclsid调用 CoGetClassObject 在通常浏览器设定下,直接通过HTML OBJECT 元素获取必须的参数。举例:对于一个 <OBJECT>标签"CODEBASE=http://www.foo.com/bar.ocx#Version=a,b,c,d",szCodeURL 是 "http://www.foo.com/bar.ocx", dwFileVersionMS 是 MAKELONG(b, a), dwFileVersionLS 是MAKELONG(d, c). 存储/缓存下载的代码 下载的代码存储在windows\\occache.。此位置可被注册表的HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ActiveXCache值所覆盖。 有些组件安装在\\windows 和 \\windows\\system.。所有辖载的代码登记在一个新的 "Module Usage" 注册节以保持对此代码的跟踪。下载的代码不可被自动删除但可被用户通过控制面板的清除功能请除掉。 Internet 搜索路径 当Internet 组件下载调用下载代码,它遍历Internet搜索路径寻找引用的组件。此处的路径是对象对处服务器的列表,被GetClassObjectFromURL调用。 即使 <OBJECT> 标记没有指定CODEBASE 下载 OLE 控件,Internet 组件下载服务将依然使用Internet 搜索路径寻找必要的代码。 Internet 搜索路径语法 搜索路径存储在注册表HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\CodeBaseSearchPath. ,如下格式: CodeBaseSearchPath = <URL1>; <URL2>; ... <URLm>; CODEBASE; <URLm+1>; ... <URLn-1>; <URLn> 每一个URL都是绝对路径,依次搜索下载,按照CODEBASE指定的szCodeURL 。 Win32 INF 语法中特定变量: EXTRACT_DIR CAB文件展开后的目录 run=%EXTRACT_DIR%/mysetup.exe OBJECT_DIR Windows下的Downloaded Program Files 目录\\windows directory. 一个 internet inf的例子。 我们通过Terminal Services 服务来控制远端计算机时除了可以通过远程连接管理器外,还可以通过一个web中的activex控件进行发布,此控件信息在:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/embedding_the_remote_desktop_activex_control_in_a_web_page.asp 此控件的internet发布inf文件如下,我们进行逐节分析: ; INF file for Terminal Server Web client 注释;开头 [VERSION] ;确定版本,否则下载服务不认可有关内容 [Add.Code] ;安装节 ,告诉我们此inf文件肯定还有一个称作msrdp.ocx [msrdp.ocx] ;add.code节指定的节 [Setup Hooks] ;无条件挂钩 ,此节指定有多少无条件挂钩,仅有一个 [AddToRegHook] ;无条件挂钩节 [DefaultInstall] ;需要按照安装文件解释的节 [AddIMERegEntries] ;按照标准inf文件中的addreg类节来解释此节内容 |