イントラネットに、Growiというwikiを設置した(された)んですが、そこのページからファイルサーバーへのリンクを張ろうとすると…できません。
イントラネットなんだし、多少セキュリティがガバっても利便性を取ろうってことで、なんとかやろうとしたことに辿り着くまでの話です。
真似をしても、当方は一切責任を負いません。自己責任で実施してください。
ブラウザの制約
現代のブラウザだとfile:
プロトコルでリンクを貼っても、クリックしても開けません。
Firefoxだと、about:config
で設定を変える必要があるようです。
Chromeだと、起動オプションを設定する必要があるようです。
Edgeは知りませんが、多分同様なんでしょう。
なるべくブラウザを問わない解決方法となると、独自プロトコルを使います。
クリックするとiTunesが開くitmss://music.apple.com/...
とか、Githubでx-github-client://openRepo/https://github.com/...
ってなっているやつですね。
(蛇足ですが、calculator:
というリンクにすると、電卓が立ち上がります。)
今回やろうとしている事は、fileプロトコルをブラウザ自体で開くのではなく、エクスプローラーなり関連付けられているアプリケーションで開ければ良いので好都合です。
Firefoxの様にホワイトリストでリンク元を制限できればいいのですが、独自プロトコルはリンク元がイントラネットかどうか問いません。
悪用されかねないため、独自プロトコルの名前は外部に漏れないようにし、可能な限り推測できないもの(GUIDとか)を使用したほうが良いでしょう。
(面倒だと適当なプレフィックスにしちゃいます。)
プロトコルハンドラーを追加する。
独自プロトコルをアプリケーションで開くには、レジストリにプロトコルハンドラーを設定します。
プロトコルハンドラーの実装はvbscriptとかでもいいのですが、今回はc++で実装しました。
ネイティブアプリなのでwindows defenderなどのセキュリティーソフトからは警告が出まくります。
(オレオレ)コード証明書でサインする運用が良いでしょう。
登録と解除の機能も兼ね備えています。
コードはRegistering an Application to a URI Schemeあたりを参考にしました。
ShellExecuteEx
でファイルを開くので、ローカルファイルを実行できない様にPathIsNetworkPath
でパスに制約を掛けてます。(気休めだけど。)
ビルド
ニッチなアプリケーションなので、バイナリでの配布はしていません。
CustomFileProtocolHandlerはVisual Studio 2017以降(Express)でビルドできます。
Windows SDK バージョンは環境に合わせて適宜変更してください。
Wikiのリンクを独自プロトコルに変換する
growiのmarkdownでは、file:
プロトコルへはリンクが張れない様に制限がかかっています。
[doc.txt](file://Contoso/share/doc.txt)
と書くと、リンクにならずそのまま表示されます。
カスタムプロトコルハンドラーで開かれるように、
[doc.txt](A6C4D2B1-62BA-4C53-9018-B186E2E6A5EC://Contoso/share/doc.txt)
もしくは
[doc.txt](A6C4D2B1-62BA-4C53-9018-B186E2E6A5EC:\\\Contoso\share\doc.txt)
と書くようにします。
わざわざカスタムプロトコルを書くのが面倒な場合は、tampermonkeyやgreasemonkey等のuserscriptで、\\\Contoso\share\doc.txt
を独自プロトコルを用いたリンクに置き換えます。
userscriptの代わりにGrowiのカスタムスクリプト機能でもできそうですが、管理者権限が無いため私は未確認です。