作為系統服務,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]
File=[url]
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).
存儲/緩存下載的代碼
下載的代碼存儲在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] ;確定版本,否則下載服務不認可有關內容
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"