顯示具有 IE 標籤的文章。 顯示所有文章
顯示具有 IE 標籤的文章。 顯示所有文章

星期一, 9月 14, 2015

IntroduceInstabilityByIgnoringProtectedModeSettings

過去在 Selenium RC + IE 的測試時,發現如果 IE 各個安全區域沒有一致的「受保護模式」設定,瀏覽器都會開不起來,必須設定標題屬性的值為真才行。最近搬上 Selenium Grid,發現這招不行了?深究之下,才知以前的那招實在是不太好,還是乖乖地將每個安全區域的「受保護模式」設成一樣,都同時是「啟用」似乎比較好。詳情可參考這篇

星期五, 8月 21, 2015

還會想用是非不分的 IE 嗎?

據說升級 IE 11 之後會有些問題,但設定「相容性檢視」可以解決。驚人內幕是:舊程式的錯誤會被舊的 IE 掩飾,新的 IE 雖然回歸正道,但卻被污名化,下圖是一段證據,在 IE 11 會顯示正確的「not found」,但開啟相容性檢視或降至 IE 8 卻會顯示錯誤的「found」。

用 JavaScript 取得 IE 的版本號

function getIeVersion() {
    var returnValue = 0;
    var userAgent = window.navigator.userAgent;
    if (/rv:11.0/.test(userAgent)) {
        returnValue = 11;
    }
    else {
        var matching = /MSIE \d+/.exec(userAgent);
        try {
            returnValue = parseInt(matching[0].substring(5));
        }
        catch (exception) {
        }
    }
    return returnValue;
}

星期五, 3月 13, 2015

用機碼新增近端區域的網站,擋我者死?

需求是:內部使用者都要在「政府組態基準」環境,上一個新的網路應用程式(假設在 http(s)://www.contoso.com)工作,而且必須用到一個已簽署、安全的 ActiveX,所以重點是 IE 要知道這不是網際網路區域,而是「近端內部網路」。

(錯的)做法:在每部電腦上增加以下機碼
  • HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\contoso.com\www
    • http (REG_DWORD: 1)
    • https (REG_DWORD: 1)
表面上這是可以達成需求的,但使用者實際測試後反映,他們原先各自設了一些屬於近端內部網路的位址都不見了!所以這個太過霸道的作法並不可行。後來研究的結果,把紅字部份刪掉,這個新的機碼位置就既可以增加新位址,又保留個人設定。

一段後話:透過瀏覽器的設定,使用者並不會看到 http(s)://www.contoso.com,所以變成有點難判別他是否做過了這件事。

已簽署的 ActiveX 未出現下載安裝提示

整理目前遇過的幾種可能與解決方法:
  • 已在瀏覽器的「管理附加元件」清單,但被停用或限制在特定的網站才能使用。
  • 瀏覽器設定被改過,可以全部恢復成預設值、重啟電腦來解決。
  • 使用者帳戶控制(UAC)被關閉,可以恢復成預設值、重啟電腦來解決。
  • 部署在近端(例如 http://machineName/index.html),也啟用了預設是關閉的近端區域,雖然不會提示,但是會直接下載安裝。
  • 相同的程式名稱與 Class GUID 已註冊,可以用這兩種搜尋條件分別找一次,刪去相關的機碼。
  • 在 Windows Server 等級的作業系統,瀏覽器與一般不同,雖是能調整,但應該想想這種環境本來就不太對。

星期二, 3月 10, 2015

已簽署的 ActiveX 出現怪異的資訊列提示

這可說是我測試過這麼多 ActiveX 下載、安裝、啟用過程中最討厭,也是最搞不懂的結果了。如今終於確認其中一種(不敢說是唯一)成因,有幾個要件:
  • InstallScope = machine
  • 檔案所在目錄的賦予某些人的權限不足,例如 User1: RW, User2: RO, User3: None。權限不足的使用者就會看到這個資訊列提示。
  • 註冊機碼沒有問題

星期四, 3月 05, 2015

當網際網路區域已簽署的 ActiveX 遇上政府組態基準(GCB)

簡單來說,即使是已簽署的 ActiveX 控制項,只要遇上套用「政府組態基準」的電腦,就無法下載安裝執行。在此將整個測試環境與解決步驟列出來:
  • 安裝 Windows 7,內建的瀏覽器是 IE 8。這是目前「政府組態基準」唯一允許的用戶端電腦環境。
  • 在網管眼中,要讓多部電腦套用「政府組態基準」,應該透過群組原則派送比較有效率,但這裏只是做驗證,所以能改到一部電腦上就夠了。請到行政院國家資通安全會報技術中心下載「LocalGPO 安裝程式」(工具)、「政府組態基準內容」(規則集,分別針對作業系統、防火牆、瀏覽器)。
  • 把 LocalGPO 安裝好,用系統管理權限執行,會出現命令列視窗。
  • 政府組態基準內容共有七個以 GUID 為名的目錄,在上述命令列視窗逐一執行 cscript LocalGPO.wsf /Path:"<PATH_TO_GUID>"。
  • 重啟電腦,此時便完成「政府組態基準」的套用。
  • 以系統管理身分登入,執行 gpedit.msc 群組原則編輯,找到 Computer Configuration -> Administrative Templates -> Windows Components -> Internet Explorer -> Internet Control Panel -> Security Page -> Site to Zone Assignment List,先設為 Enabled,並在此新增一筆資料,名稱是含有 ActiveX 網頁的協定與完整網域名稱(例如 http://abc.com),值是 1(代表近端內部網路)。
  • 改完後,這個 FQDN 就不再屬「網際網路區域」,當首次造訪,網頁上的 ActiveX 就會直接提示使用者允許下載安裝,連「資訊列提示」步驟都跳過,而且管理附加元件的相關狀態是「啟用」,代表執行也應該沒問題。

星期六, 7月 05, 2014

對 ActiveX 授權以限制非法使用

由於 ActiveX 是部署在網頁,下載到使用者的電腦執行,略懂的人就有辦法拿來「再利用」,而且無需發行 ActiveX 一方的同意。雖然網路上也有些專業販賣 ActiveX 元件的公司對自己的心血保護,但他們的做法大多不能防止「一魚多吃」或「非法挪用」的狀況。

利用 url 具有唯一性的特徵,可以用這樣的設計來限制非法使用:
  • 授權檔就是一個 JavaScript,定義其本身預計部署的 url 與「授權書」兩個變數。
  • 申請授權就是決定 url,發行 ActiveX 的一方視為待簽原文,用簽署 ActiveX 的憑證簽出「授權書」。
  • 帶有 ActiveX 的網頁也要引入授權檔。
  • 任一 ActiveX 公開方法都要檢查內部的「授權通過」旗標,若值為否,則直接拋出例外而不執行任何功能。
  • ActiveX 載入時就要檢查授權檔的兩個變數,若能取得,該 url 又確實是其載入的位址,授權書也能通過簽署 ActiveX 憑證的驗簽,則設「授權通過」為真。

星期四, 6月 19, 2014

包不出一個支援多國語系的 ActiveX cab

ActiveX 本身的組件預設會產生在 bin\Debug 目錄下,而各語系資源會在 bin\Debug\[lang] 目錄下,以正體中文為例,會在 bin\Debug\zh-TW 目錄下。只要包裝時 cabarc.exe 下了 -r -p 這兩個參數,雖然多國語系的資源檔都確實進了子目錄,但使用端始終無法將 ActiveX 安裝成功。

但如果在使用端手動將多國語系的子目錄與資源檔補上,多國語系的功能看來是正常的,所以問題應該在 IE 解完 cab 之後的動作,根本就不能處理有子目錄的狀況。

後來的土解法:將 bin\Debug 目錄下的所有子目錄與檔案先包成一個 cab,再把這個 cab、能解這個 cab 的 cabarc.exe 以及其他的檔案再包一個 cab,並寫好用戶端安裝的步驟,第一就是把裏面的 cab 還原到安裝目錄去。

星期五, 5月 23, 2014

Selenium IEDriverServer.exe (x64) + IE10 慢到爆

凶手不是 IE10 (x64) 就是 IEDriverServer.exe (x64),後者換 32 位元的版本就解決了。原始出處在

星期二, 5月 13, 2014

Mark of the Web

要用 IE 檢視位於本機的網頁,安全性設定還有點繁瑣,所以另一個辦法就是讓瀏覽器認為這是網路上的資源。通常在網頁的前兩行可以加上:

<!doctype html>
<!-- saved from url=(0023)http://www.contoso.com/ -->

其中第一行有點離題了,放在這裹是為了釐清它們之間的順序,第二行才是重頭戲。其實最常用的設定會是下面兩者之一:

<!-- saved from url=(0014)about:internet -->
<!-- saved from url=(0016)http://localhost -->

星期二, 8月 20, 2013

Windows 8.1 + IE 11 can't visit localhost?

部署在本機 IIS 8 的純網頁,原本在 Windows 8 + IE 10 都好好的,換到 Windows 8.1 + IE 11 竟然都看不到了?請出 Fiddler 也一樣徒勞?Google 一下,網路上還真的有幾篇文章在談這件事,說是防火牆要如何如何,有什麼辦法改等等,其實都太麻煩了。關鍵只在於:
  • 網際網路選項=>進階=>Enhanced Protected Mode 優先於某區域(網際網路/近端內部網路)的 Protected Mode,若前者未勾選,後者勾選是無效的;但兩者皆勾選,將阻止該區域來自於本機的 Routing。
  • Windows 8 + IE 10 預設 Enhanced Protected Mode Off,但 Windows 8.1 + IE 11 預設 Enhanced Protected Mode On。

星期四, 7月 11, 2013

不是 Cross-origin resource sharing 難,而是⋯⋯

整理幾個最近遭遇的問題:
  1. Microsoft IE 11.0.9431.0 在 localhost 但 port 不同的情況下,認為這不算跨域,沒作預檢(preflight),直接發送真正需要的 Request。
  2. Google Chrome 28.0.1500.71 即使預檢失敗,仍會發送真正需要的 Request。
  3. Microsoft IIS 8 即使未設 Access-Control-Allow-Methods,仍接受 GET、OPTIONS。
  4. System.Web.Http.ApiController 的子類別最好多寫一個空的方法「public void Options() { }」,否則 Firefox 預檢失敗,就不發送真正需要的 Request 了,雖然這是最標準的,但讓我誤會了好幾個小時,以為怎麼 IE 10、Chrome 都正常,唯獨 Firefox 不行?

星期三, 7月 10, 2013

從瀏覽器呼叫 Restful Web API 的要訣

前文所提,瀏覽器要支援 Cross-origin resource sharing,Firefox 或 Chrome 都沒問題,IE 只有 10 或更新的版本才有機會,而且要看文件模式(Document Mode)是不是「標準」或「相容」(Quirks),若其他像是 Internet Explorer 9 standards、Internet Explorer 8 standards 等都不行。
問題來了,若使用者雖然是 IE 10,但他調成不支援的文件模式,要如何交待?這時必須先用 JavaScript 偵測,並在不符條件的情況下提示。但用 navigator.userAgent 是無效的,因為它只對瀏覽模式(Browser Mode)有反應,對文件模式一無所知。幸好 IE 還有個特別的屬性叫 document.documentMode,如果小於 10 再提示就對了。
網路上也有人提到,即使是 IE 8 或 IE 9,還是有機會支援,只是限制一大堆。但連 jQuery 都明確表態不會採納了,我這種小角色又何必為難自己?

星期五, 3月 01, 2013

一般使用者權限即可安裝執行的 ActiveX

過去在網頁上部署 ActiveX,都需要電腦使用者具有管理權限才能安裝執行,但據說在 Vista 以後,就鬆綁到一般使用者權限即可。這對於我許多「MIS 管很嚴」的客戶來說,似乎是個蠻不錯(還是剛好相反?)的消息。做為一個 .NET based ActiveX 元件提供者,測試起來的確如此,但其中的小細節還有點多:
  1. 元件一定要經過簽署,而且這與封裝簽署是兩回事。
  2. 如果有被依賴的元件一同部署,不能放到系統目錄。
  3. 封裝資訊指定部署範圍為「使用者」。
  4. [.NET based ActiveX] 不能在封裝內的批次檔呼叫 RegAsm 註冊,要把寫入的所有機碼整理成一個檔案,由批次檔的命令去匯入。
  5. [.NET based ActiveX, Optional] 要請使用者事先加入「信任的網站」,或對「網際網路」安全性區域修改以下兩項:「允許不提示就執行從未使用過的 ActiveX 控制項」為「啟用」、「僅允許認可的網域使用 ActiveX 而不提示」為「停用」。
  6. [Optional] 若能在事前讓簽署元件的憑證位於「受信任的發行者」存放區,且上層憑證皆位於「中繼憑證授權單位」或「受信任的根憑證授權單位」,只要瀏覽器視該網站屬於網際網路(不需加入信任的網站),且安全性設定保持在預設值,元件就能不經提示直接下載安裝。
如果是一個傳統 ActiveX,只要滿足前三點即可。如果是 .NET based ActiveX 又沒做到第五點的話,安裝後的第一次執行會出現一個惱人的資訊列提示,大意是說「這個網站想要執行來自 '無法使用' 的 '控制項名稱無法使用'」,真是亂搞!如果使用者教得好,他願意相信這沒問題的話,倒是無妨。當然,這些雜事(第六點除外)也可以一起併到第四點的機碼匯入,不過安裝完之後還得提醒使用者重啟瀏覽器,如果只是對網頁重新整理的話,那個惱人的資訊列提示還是會出現。

[2013/08/09 補充]
以上第五、六點要多做的事,其實源自於第四點整理的機碼不足。後來找到一個簡單的方法:
  1. 同上
  2. 同上
  3. 同上
  4. RegAsm /regfile:a.reg 將元件的註冊指令先匯出
  5. 修改 a.reg 的內容,指向 HKCR 的改成 HKCU
  6. RegAsm import a.reg
這些步驟可以自動化,而且在 Windows 7, 8, 8.1 測試都沒問題。繁瑣的內容就請容許我保留給公司內訓了。

[2014/10/22 補充]
在 Windows Server 2012 摸索的經驗:
  1. 在伺服器上的瀏覽器限制較嚴格,如果能將網站列入「受信任」區域會好很多。
  2. 預設的 Administrator 首次開啟有 ActiveX 的網頁就是不會提示下載,當然也真的沒有下載。必須另外新增使用者,事後要不要將此人加入管理者群組都可以,反正後續的提示下載安裝 ActiveX 都正常了。

星期四, 9月 06, 2012

網頁一片空白?停用代理伺服器也許可解決

IE 無法安裝附加元件的解決方法

  1. 安全性->ActiveX「不」篩選。
  2. 網際網路選項->進階->安全性->「不」啟用記憶體保護以協助避免網路攻擊。
  3. 執行 iexplore -extoff 或在網址列輸入 about:NoAdd-ons,進入「關閉所有附加元件」的狀態,再到管理附加元件->顯示所有附加元件,一一停用。
  4. 關閉所有瀏覽器再開啟,應該就可以安裝附加元件。
  5. 如果是 Windows 7,還有一個「群組原則設定」必須考慮,可參考 http://www.sevenforums.com/system-security/145610-cannot-install-active-x-control.html 其中 jav 的回覆。
[2014/06/25 補充]
  1. 漏了前提假設 :附加元件是經「受信任憑證中心」所發憑證的簽署。如果不是這樣,多半調低安全性即可解決。
  2. 恢復瀏覽器所有的預設值也許有幫助。
  3. 如果是 Windows 7,又將「使用者帳戶設定」拉到最低,也會因為無法提示造成問題,只要恢復使用者帳戶設定回預設值即可。

星期三, 5月 30, 2012

瀏覽器擴充能力

有點好奇,非 IE 瀏覽器到底能不能跑 ActiveX?試了 Firefox + IE Tab / Chrome + IE Tab 都過關,不過前提是「真的有裝 IE」,也就是說非微軟作業系統還是有困難。
管他的,還沒見過使用者像我以前那樣,為了省錢也為一口氣,硬是不裝 Windows OS。