使用INF和OSD文件从Internet下载组件
作为系统服务,IE下载从internet组件通常需要进行认证和检查。对于发布者,有两种机制:
1、inf文件进行发布
2、osd文件发布(ie4及以后版本)
推荐使用cab来将所有需要文件打包,并进行签名。IE收到一个cab文件后:
首先查找是否存在OSD文件,如果存在,按照OSD语法(XML文档)进行处理。其中如果涉及到INF文件,还会打开INF文件进行引用。
如果不存在,会打开INF文件,按照INF文件进行解释安装。
CODEBASE 属性
在internet上发布组件,极其重要的属性就是codebase属性了,因为此url指定了一个“挑剔”的组件运行所需的全部文件从哪儿获取。
组件开发者可以将组件以下列方式打包发布:
。PE格式(.exe .ocx .dll ……),好处是文件就一个一布操作,但是文件不会被压缩,通过http方式下载。
。inf文件。此方式仅在浏览器安全设定为低、中时候才可行,原因在于单一inf文件不可被签名。Inf的语法可以指向一些多样性的可执行文件。
。cab文件。所有需要的文件打包到一个压缩文件中,可被签名。
INF文件格式
INF语法由Internet下载组件下载并处理。
所有URL必须被urlencode过,即空格以%20代替,且以codebase=<URL>中的url来作为基址解释。
代码下载器理解其中几个主要的节
[Add.Code] 及 [Setup Hooks]
如果者两个节均不存在,那么当作标准的win32 inf格式进行解释
Add.Code 节列出所有将要被安装的文件,包括可选文件
[Add.Code]
filename1=section-name1
filename2=section-name2
每一个文件自成一节(文件节),并进行单独描述安装属性。
[section-name1]
key1=value1
key2=value2
在一个文件节中,以下关键字可用:
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
key2=value2
可以多个组件都挂同一个hook.
以下key可用:
File-%opersys%-%cpu%=[url | ignore]
Run=[cmd-line]
为cab文件展开在临时文件夹后运行的名另。如果缺少此命令设定,将寻找 InfFile= and InfSection= keys 以运行挂钩节。
InfFile=[name of win32 INF file inside the CAB] 可以是在cab文件中的其他inf文件
InfSection=[section name in the InfFile mentioned in above key]
无条件安装Hook在[Setup Hooks]节中指定,且在add.Code节之前执行。
[Setup Hooks]
hookname1=section-name4
hookname2=section-name5
如果要使用Hook节,需要指定version如下(否则下载组件服务会忽略):
[Version]
Signature="$CHICAGO$"
AdvancedINF=2.0
;例子分析最后给出。
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).
存储/缓存下载的代码
下载的代码存储在windowsoccache.。此位置可被注册表的HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionInternet SettingsActiveXCache值所覆盖。 有些组件安装在windows 和 windowssystem.。所有辖载的代码登记在一个新的 "Module Usage" 注册节以保持对此代码的跟踪。下载的代码不可被自动删除但可被用户通过控制面板的清除功能请除掉。
Internet 搜索路径
当Internet 组件下载调用下载代码,它遍历Internet搜索路径寻找引用的组件。此处的路径是对象对处服务器的列表,被GetClassObjectFromURL调用。 即使 <OBJECT> 标记没有指定CODEBASE 下载 OLE 控件,Internet 组件下载服务将依然使用Internet 搜索路径寻找必要的代码。
Internet 搜索路径语法
搜索路径存储在注册表HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionInternet SettingsCodeBaseSearchPath. ,如下格式:
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控件进行发布,此控件信息在:[url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/termserv/termserv/embedding_the_remote_desktop_activex_control_in_a_web_page.asp]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] ;确定版本,否则下载服务不认可有关内容
signature="$CHICAGO$"
AdancedINF=2.0
[Add.Code] ;安装节 ,告诉我们此inf文件肯定还有一个称作msrdp.ocx
msrdp.ocx=msrdp.ocx ;的节,此inf文件仅安装一个组件
[msrdp.ocx] ;add.code节指定的节
file-win32-x86=thiscab ;文件在当前cab文件中
clsid={9059f30f-4eb1-4bd2-9fdc-36f43a218f4a} ;组件的clsid
FileVersion=5,1,2600,1094 ;文件版本
RegisterServer=yes ;是否注册组件,下在后注册组件
[Setup Hooks] ;无条件挂钩 ,此节指定有多少无条件挂钩,仅有一个
AddToRegHook=AddToRegHook
[AddToRegHook] ;无条件挂钩节
InfFile=msrdp.inf ;从msrdp.inf中读取信息
InfSection=DefaultInstall ;指定标准安装文件
[DefaultInstall] ;需要按照安装文件解释的节
AddReg=AddIMERegEntries ;寻找 AddIMERegEntries 节
[AddIMERegEntries] ;按照标准inf文件中的addreg类节来解释此节内容
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","msime95.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","msime97.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","imejp98.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","imejp.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","imjp8.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\JPN","imjp81.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","msime95.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","msime95k.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","msuni95k.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","imekr.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","imekr98u.ime",,"null"
HKLM,"SOFTWARE\Microsoft\Terminal Server Client\IME Mapping Table\KOR","imekr61.ime",,"null"