:::

從瀏覽器連結開啟Windows本機的檔案:System Protocol / Open Windows Local File with A Link in Brower: System Protocol

image

作業系統中可以設定捷徑開啟網頁(請參考「自製網頁應用程式!使用Chrome的命令列選項app來製作網頁應用程式捷徑」這篇),那麼網頁能不能反過來開啟作業系統裡面的檔案呢?答案就是Registering an Application to a URI Scheme,在Windows裡面將應用程式登錄為指定通訊協定(Protocol)。我參考從網頁呼叫使用者電腦應用程式的寫法,製作了System Protocol程式。它可以讓我們的電腦用「sp://"c:\file.doc"」來開啟本機檔案的連結方式,甚至還可以傳遞參數。但是這個方法會為作業系統大開後門,使用的時候必須先瞭解它的安全性風險。


下載與配置 / Download and Deployment

請解壓縮後擺到電腦內的任意位置,例如「d:\system_protocol」。

安裝 / Install

image

要使用System Protocol,必須現在Windows裡面登錄應用程式的資訊。請點選System Protocol裡面的「install.exe」。

image

程式會要求使用登錄檔編輯器。請按下「確定」。

image

系統會提示你使用登錄檔的風險,請按下「確定」。

image

完成登錄。這樣子就安裝完成了。

使用 / Usage

一旦登錄完成之後,未來我們就可以將在網頁上以「sp://」開頭的連結的指令傳遞給Windows電腦本機端。

image

舉例來說,我們在命令提示字元裡面可以用「explorer.exe d:\」指令開啟檔案總管、並跳到「d:\」路徑。

而我們可以將上面這個指令轉換成連結,就可以在網頁上執行如在命令提示字元一樣的指令:

image

在Google Chrome裡面會跳出上圖的訊息,而在其他瀏覽器則會有不同的訊息。請按下 開啟「URL:System Protocol」,然後就會開啟檔案總管、並跳到「d:\」路徑底下了。

如果勾選 記住我對「URL:System Protocol」連結的選擇,再按下 開啟「URL:System Protocol」 ,這樣下次就不會跳出這個提示,就可以直接執行指令了。

開啟檔案 / Open File

我們可以直接將連結指定為檔案名稱,例如:

這樣點選連結就會直接用本機端的Power Point開啟位於「D:\簡報1.pptx」的簡報檔。

由於現在我們很多時候都用網頁工具來記錄事情,像是Google KeepEvernote。有了System Protocol之後,我們就能從網頁連結上直接開啟本機端的檔案了,是不是很方便呢?

安全性問題 / Security

方便的同時,伴隨而來的是安全性的隱憂。可以用網頁上設定的連結來執行你本機端中的指令,這其實是非常危險的行為。

System Protocol執行本機端程式的方式是使用了AutoIt的ShellExecuteWait。它雖然不能執行DOS指令,但卻可以執行任何在你電腦上的檔案。

試想,如果有駭客將一個可以將你電腦全部格式化的檔案「format.exe」傳送到你電腦的c:\底下,然後又誘使你開啟「sp://c:\format.exe」,那你的電腦就會因此壞掉了。

雖然實際上可能沒有駭客會用這種低級的手段,不過System Protocol終究是會造成系統漏洞的一個隱憂,使用時不得不甚。


小結 / In closing

這次會研究Registering an Application to a URI Scheme的原因是因為覺得不能從網頁上開啟本機檔案非常不方便。

其實Dropbox之類的雲端硬碟有實作類似的「開啟」按鈕,可以讓我們在瀏覽器上開啟存放在Dropbox的檔案。但這也只有放在Dropbox上的檔案能用,而且也只能開啟常見的檔案類型,像是Microsoft Office。我覺得不太靈活。

我試著從網路上找找看解法,沒想到真的有從網頁呼叫使用者電腦應用程式這樣的介紹。那篇是用Visual C#來寫執行檔,我不會用Visual,所以我得選擇用其他語言作為開啟sp://的應用程式。

一開始我用的是bat,不需要編譯,程式碼也是明碼,有需要的人可以很輕鬆地調整它。但是sp://的做法會傳送多個參數給應用程式,而bat在接受參數時會大幅度調整參數的內容。例如以「sp://chrome.exe -app=http://blog.pulipuli.info」來說,它會傳送給應用程式的參數為「sp://chrome.exe」跟「-app=http://blog.pulipuli.info」,但bat接收後者參數時會將=斷開,變成接收到「sp://chrome.exe」、「-app」、「http://blog.pulipuli.info」三個參數。這樣子會造成開啟程式的誤判,是不能用的。

後來我才改成使用AutoIt的ShellExecuteWait來實作。但是又發現sp://傳遞的指令會將中文以encodeURI編碼,最後執行的指令會是有%的亂碼。例如「sp://D:\簡報1.pptx」,實際接收到的參數是「sp://D:%E7%B0%A1%E5%A0%B11.pptx」,這逼得我又得找其他方法來解決。最後發現原來AutoIt也能夠使用JavaScript程式語言中的decodeURI(),這樣就能將被編碼的指令還原成原本的中文,讓指令順利執行了。

總之,AutoIt真的蠻好用的。又小又簡單,還可以用JavaScript,實在是太好用了。