從瀏覽器連結開啟Windows本機的檔案:System Protocol / Open Windows Local File with A Link in Brower: System Protocol
作業系統中可以設定捷徑開啟網頁(請參考「自製網頁應用程式!使用Chrome的命令列選項app來製作網頁應用程式捷徑」這篇),那麼網頁能不能反過來開啟作業系統裡面的檔案呢?答案就是Registering an Application to a URI Scheme,在Windows裡面將應用程式登錄為指定通訊協定(Protocol)。我參考從網頁呼叫使用者電腦應用程式的寫法,製作了System Protocol程式。它可以讓我們的電腦用「sp://"c:\file.doc"」來開啟本機檔案的連結方式,甚至還可以傳遞參數。但是這個方法會為作業系統大開後門,使用的時候必須先瞭解它的安全性風險。
下載與配置 / Download and Deployment
- GitHub原始碼保存庫:https://github.com/pulipulichen/system_protocol
- 壓縮檔案下載:
https://github.com/pulipulichen/system_protocol/archive/master.zip
請解壓縮後擺到電腦內的任意位置,例如「d:\system_protocol」。
安裝 / Install
要使用System Protocol,必須現在Windows裡面登錄應用程式的資訊。請點選System Protocol裡面的「install.exe」。
程式會要求使用登錄檔編輯器。請按下「確定」。
系統會提示你使用登錄檔的風險,請按下「確定」。
完成登錄。這樣子就安裝完成了。
使用 / Usage
一旦登錄完成之後,未來我們就可以將在網頁上以「sp://」開頭的連結的指令傳遞給Windows電腦本機端。
舉例來說,我們在命令提示字元裡面可以用「explorer.exe d:\」指令開啟檔案總管、並跳到「d:\」路徑。
而我們可以將上面這個指令轉換成連結,就可以在網頁上執行如在命令提示字元一樣的指令:
- 原始指令:explorer.exe d:\
- 連結:sp://explorer.exe d:\
在Google Chrome裡面會跳出上圖的訊息,而在其他瀏覽器則會有不同的訊息。請按下 開啟「URL:System Protocol」,然後就會開啟檔案總管、並跳到「d:\」路徑底下了。
如果勾選 記住我對「URL:System Protocol」連結的選擇,再按下 開啟「URL:System Protocol」 ,這樣下次就不會跳出這個提示,就可以直接執行指令了。
開啟檔案 / Open File
我們可以直接將連結指定為檔案名稱,例如:
- 檔案在電腦中的位置:D:\簡報1.pptx
- 連結:sp://D:\簡報1.pptx
這樣點選連結就會直接用本機端的Power Point開啟位於「D:\簡報1.pptx」的簡報檔。
由於現在我們很多時候都用網頁工具來記錄事情,像是Google Keep或Evernote。有了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,實在是太好用了。
最近chrome的更新,導致無法使用了,是否有解決方式
回覆刪除Chrome 版本130.0.6723.59
因為這個方法可能帶來的安全性問題比較嚴重。
刪除比起Chrome禁止自訂通訊協定的功能,更有可能是其他資安因素的限制。
https://blogger.googleusercontent.com/img/a/AVvXsEjmIS-PwrzbLjM2bytlgL8o-hqx2m5qU-SjKuhNO9OGcIj-DYUVDdmqpziZIuichfcRZL8sS4Lprx5Gg7s_dfp3BmHjgUnNSvg4cswW4D7-wQzsfG14yMOQbFwH9sc06wEKc61n-1zidnRpnGK_nBCPp1rxC6znwnQeyH9YC0Z5sAkj6R2XDMJKkQ
你可以試試看在網址列開啟「ms-settings:display」
如果能夠開啟Windows的顯示功能,表示Chrome還是允許自訂連結。
如果無法運作,表示是其它問題。
檢查看看你的防毒軟體跟Windows政策的限制吧。
上面是可以運作的
刪除https://ibb.co/MBk8ZZz
圖中是我出現的錯誤
感覺是到網址上自動把冒號去除了
不知道有沒有辦法從程式做處理呢
同一時間edge也有這問題
目前使用火狐則是正常
你用了冒號「:」,要記得作encodeURI
刪除