BrowserSelctorはMicrosoft Windows上で動作するウェブブラウザラウンチャーです。開くURLに応じて適切なウェブ ブラウザを選択します。イントラネット用ウェブアプリケーションでは今なおInternet Explorer(以下IE)のみを対象としたものが数多く存在するため、企業ユーザーは状況 に応じてIEとモダンブラウザ(Mozilla FirefoxやGoogle Chrome)を切り替えて使用す る必要性に迫られています。このアプリケーションは、URLをクリックしたり、ロケーシ ョンエントリにURLを入力したりする際に自動的に適切なウェブブラウザを選択します。
このソフトウェアは以下の2つのモジュールから成ります。
- BrowserSelector.exe: ウェブブラウザラウンチャーです。 既定のウェブブラウザとして設定して使用します。
- BrowserSelectorBHO.dll: IE用のBHO(ブラウザーヘルパーオブジェクト)です。 URLを開く際に、自動的にMozilla FirefoxやGoogle Chromeに切り替えます。
モダンブラウザ向けの連携アドオンも提供しています:
- Microsoft Edge (Enterprise Developer Edition)
- Google Chrome (Enterprise Developer Edition)
- Mozilla Firefox
- Microsoft Visual Studio 2019
- v142ビルドツール用C++ MFC (x86およびx64)
- Visual Studio拡張機能「Microsoft Visual Studio Installer Projects」
- Microsoft Visual Studio 2010でBrowserSelector.slnを開きます
- ツールバーの「ソリューション構成」で「リリース」を選択します
- F7キーを押下してビルドします
あるいはコマンドラインで実行することもできます。
- スタートメニューから「Developer Command Prompt for VS 2019」を開く
cd \path\to\BrowserSelector
devenv.com BrowserSelector.sln /build Release
- BrowserSelector本体のバージョンとアドオンのバージョンは同期せず、それぞれ別々に管理する。
- tagはBrowserSelector本体のバージョンに対してのみ作成する。(アドオンの改修に対してはtagは作成しない)
webextensions
配下の各ディレクトリーで make
を実行すると、パッケージが作成されます。
$ cd webextensions/edge
$ make
ChromeおよびEdgeにおいては、Native Messaging Hostとの通信の都合上、開発段階においては make dev
で開発用のIDを伴ったビルドを作成する必要があります。
$ cd webextensions/edge
$ make dev
このようにして dev/
配下に生成されたデバッグビルドを、パッケージ化されていない拡張機能として読み込んでください。
ChromeおよびEdgeでは、BrowserSelectorのアドオンはグループポリシー経由で強制インストールされた場合のみ期待通りに機能します。
(一般公開のアドオンではwebRequestBlocking
の権限が無効化されるため、リクエストを他のブラウザーにリダイレクトすることができません。)
開発段階での動作テストには、以下の手順を経る必要があります。
- このリポジトリーの
webextensions
フォルダーを、端末上の任意の場所にコピーする。 ここではC:\Users\Public\webextensions
の位置に置いたと仮定する。 - Chrome用アドオンの開発版パッケージを用意する。
- Chromeを起動する。
- アドオンの管理画面(
chrome:extensions
)を開く。 デベロッパーモード
を有効化する。拡張機能をパッケージ化
でwebextensions¥chrome
をパックする。(1つ上のディレクトリーにchrome.crx
とchrome.pem
が作られる)chrome.crx
をChromeのアドオン管理画面にドラッグ&ドロップし、インストールして、IDを控える。例:egoppdngdcoikeknmbgiakconmchahhf
- アドオンを一旦アンインストールする。
C:\Program Files (x86)\ClearCode\BrowserSelector\BrowserSelectorTalkChrome.json
の"allowed_origins"
に、先ほど控えたIDに基づくURLを追加する。例:"chrome-extension://egoppdngdcoikeknmbgiakconmchahhf/"
- Edgeアドオンの開発版パッケージを用意する。
- Edgeを起動する。
- アドオンの管理画面(
edge:extensions
)を開く。 開発者モード
を有効化する。拡張機能のパック
でwebextensions¥edge
をパックする。(1つ上のディレクトリーにedge.crx
とedge.pem
が作られる)edge.crx
をEdgeのアドオン管理画面にドラッグ&ドロップし、インストールして、IDを控える。例:oapdkmbdgdcjpacbjpcdfhncifimimcj
- アドオンを一旦アンインストールする。
C:\Program Files (x86)\ClearCode\BrowserSelector\BrowserSelectorTalkEdge.json
の"allowed_origins"
に、先ほど控えたIDに基づくURLを追加する。例:"chrome-extension://oapdkmbdgdcjpacbjpcdfhncifimimcj/"
- インストール用マニフェストファイルを作成する。
先ほど控えたChromeアドオンとEdgeアドオンのIDを含める形で、以下のような内容のXMLファイルを作成し、
chrome.crx
やedge.crx
と同じ位置に置く。 ここではC:\Users\Public\webextensions¥manifest.xml
の位置に置いたと仮定する。このとき、<?xml version='1.0' encoding='UTF-8'?> <gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'> <app appid='egoppdngdcoikeknmbgiakconmchahhf'><!-- 先ほど控えたChrome用アドオンのIDを書く --> <updatecheck codebase='file:///C:/Users/Public/webextensions/chrome.crx' version='1.0.0' /><!-- `chrome.crx` の実際のFile URLを書く --> </app> <app appid='oapdkmbdgdcjpacbjpcdfhncifimimcj'><!-- 先ほど控えたEdge用アドオンのIDを書く --> <updatecheck codebase='file:///C:/Users/Public/webextensions/edge.crx' version='1.0.0' /><!-- `edge.crx` の実際のFile URLを書く --> </app> </gupdate>
version
の値はmanifest.json
に記述された実際のバージョンに合わせる。 - Chromeのグループポリシーテンプレートを導入し、Chromeでアドオンを読み込むための設定を行う。
- https://support.google.com/chrome/a/answer/187202?hl=ja#zippy=%2Cwindows
から
Google Chromeバンドル
をダウンロードし、保存されたzipファイルを展開する。 Configuration\admx\*.admx
と、Configuration\admx\en-US
やConfiguration\admx\ja
などをC:\Windows\PolicyDefinitions
にコピーする。gpedit.msc
を起動し、Local Computer Policy
→Computer Configuration
→Administrative Templates
→Google
→Google Chrome
→Extensions
→Configure the list of force-installed apps and extensions
(ローカル コンピューター ポリシー
→コンピューターの構成
→管理用テンプレート
→Google
→Google Chrome
→拡張機能
→自動インストールするアプリと拡張機能のリストの設定
)を開く。- 設定値を
Enabled
(有効)に切り替える。 Show...
(表示...
)をクリックする。- 設定のデータ一覧に
<ChromeアドオンのID>;<マニフェストファイルの位置>
を追加する。 ここまでの例に倣った場合、egoppdngdcoikeknmbgiakconmchahhf;file:///C:/Users/Public/webextensions/manifest.xml
のようになる。
- https://support.google.com/chrome/a/answer/187202?hl=ja#zippy=%2Cwindows
から
- Edgeのグループポリシーテンプレートを導入し、Chromeでアドオンを読み込むための設定を行う。
- https://www.microsoft.com/ja-jp/edge/business/download の「ポリシー ファイルを取得」からポリシーテンプレートをダウンロードし、保存されたMicrosoftEdgePolicyTemplates.cabファイル(zipをcabで再圧縮されている)を展開する。
windows\admx\*.admx
と、windows\admx\en-US
やwindows\admx\ja-JP
などをC:\Windows\PolicyDefinitions
にコピーする。gpedit.msc
を起動し、Local Computer Policy
→Computer Configuration
→Administrative Templates
→Microsoft Edge
→Extensions
→Configure the list of force-installed apps and extensions
(ローカル コンピューター ポリシー
→コンピューターの構成
→管理用テンプレート
→Microsoft Edge
→拡張機能
→サイレント インストールされる拡張機能を制御する
)を開く。- 設定値を
Enabled
(有効)に切り替える。 Show...
(表示...
)をクリックする。- 設定のデータ一覧に
<EdgeアドオンのID>;<マニフェストファイルの位置>
を追加する。 ここまでの例に倣った場合、oapdkmbdgdcjpacbjpcdfhncifimimcj;file:///C:/Users/Public/webextensions/manifest.xml
のようになる。
- 端末がドメイン参加状態でない場合、管理者権限で
cmd.exe
を開き、以下のコマンド群を実行してドメイン参加状態にする。 (参考: https://hitco.at/blog/apply-edge-policies-for-non-domain-joined-devices/ )reg add HKLM\SOFTWARE\Microsoft\Enrollments\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v EnrollmentState /t reg_dword /d 1 /f reg add HKLM\SOFTWARE\Microsoft\Enrollments\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v EnrollmentType /t reg_dword /d 0 /f reg add HKLM\SOFTWARE\Microsoft\Enrollments\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v IsFederated /t reg_dword /d 0 /f reg add HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v Flags /t reg_dword /d 0xd6fb7f /f reg add HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v AcctUId /t reg_sz /d "0x000000000000000000000000000000000000000000000000000000000000000000000000" /f reg add HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v RoamingCount /t reg_dword /d 0 /f reg add HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v SslClientCertReference /t reg_sz /d "MY;User;0000000000000000000000000000000000000000" /f reg add HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /v ProtoVer /t reg_sz /d "1.2" /f
- Chromeを起動し、アドオンが自動的にインストールされることを確認する。 (もしインストールされなかった場合、デバッグログを参照する。)
- Edgeを起動し、アドオンが自動的にインストールされることを確認する。 (もしインストールされなかった場合、デバッグログを参照する。)
アドオンの実装を変更した場合、以下の手順でパッケージを更新します。
- Chrome用アドオンの開発版パッケージを用意する。
- Chromeを起動する。
- アドオンの管理画面(
chrome:extensions
)を開く。 拡張機能をパッケージ化
でwebextensions¥chrome
をパックする。(証明書ファイルにはⅠつ上のディレクトリーのchrome.pem
を指定する。)
- Edgeアドオンの開発版パッケージを用意する。
- Edgeを起動する。
- アドオンの管理画面(
edge:extensions
)を開く。 拡張機能のパック
でwebextensions¥edge
をパックする。(証明書ファイルにはⅠつ上のディレクトリーのedge.pem
を指定する。)
- ChromeとEdgeのグループポリシーを編集し、アドオンの強制インストールを無効化する。(
<アドオンのID>;<マニフェストファイルの位置>
を#<アドオンのID>;<マニフェストファイルの位置>
と書き換えるなど。) - ChromeとEdgeを起動し、アドオンがアンインストールされたことを確認する。
- ChromeとEdgeを終了する。
- ChromeとEdgeのグループポリシーを編集し、アドオンの強制インストールを再度有効化する。(
#<アドオンのID>;<マニフェストファイルの位置>
を<アドオンのID>;<マニフェストファイルの位置>
と書き換えるなど。) - ChromeとEdgeを起動し、アドオンがアンインストールされたことを確認する。
ドメイン非参加状態の端末で開発を行っていて、開発作業を終えた場合、以下の手順でドメイン非参加状態に戻します。
- 管理者権限でコマンドプロンプトを開き、以下のコマンド群を実行する。
(参考: https://hitco.at/blog/apply-edge-policies-for-non-domain-joined-devices/ )
reg delete HKLM\SOFTWARE\Microsoft\Enrollments\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /f reg delete HKLM\SOFTWARE\Microsoft\Provisioning\OMADM\Accounts\FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF /f
インストーラは BrowserSelectorSetup\Release\BrowserSelectorSetup.msi にビルドさ れています。これを実行してインストールします。
あらゆるアプリケーションから使用するウェブブラウザを自動選択したい場合は、デス クトップの既定のウェブブラウザをBrowserSelector.exeに変更する必要があります。 その方法は使用するOSや管理方法によって異なりますので、以下のページ等を参考にし て下さい。
- https://support.microsoft.com/en-us/help/4028606/windows-10-change-your-default-browser
- https://docs.microsoft.com/en-us/internet-explorer/ie11-deploy-guide/set-the-default-browser-using-group-policy
BHOのみを使用してBrowserSelector.exeが必要無い場合、この手順は必要ありません。
このソフトウェアにはユーザーインターフェースがありません。システム管理者がレジ ストリ設定あるいはINI形式の設定ファイルを直接管理し、ユーザーには設定を編集させ ないことを想定しています。設定は以下の箇所から、以下の順番で読み込まれます。
HKEY_LOCAL_MACHINE
(HKLM
)レジストリ- HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ClearCode\BrowserSelector
- (32bit OSの場合: HKEY_LOCAL_MACHINE\SOFTWARE\ClearCode\BrowserSelector)
- インストールフォルダのiniファイル
- 例: C:\Program Files (x86)\ClearCode\BrowserSelector\BrowserSelector.ini
- デフォルトでは上記ファイルは存在しません。 手動で設置する必要があります。
HKEY_CURRENT_USER
(HKCU
)レジストリ- HKEY_CURRENT_USER\SOFTWARE\WOW6432Node\ClearCode\BrowserSelector
- (32bit OSの場合: HKEY_CURRENT_USER\SOFTWARE\ClearCode\BrowserSelector)
- ユーザーフォルダのAppData内のiniファイル
- 例: C:\Users[UserName]\AppData\Roaming\ClearCode\BrowserSelector\BrowserSelectror.ini
- デフォルトでは上記フォルダやファイルは存在しません。 手動で設置する必要があります。
上記複数の設定が存在する場合、それらの設定は統合されます(後に読み込まれる設定 で上書きされます)。
設定例は以下のファイルを参照して下さい。
設定できる項目は、一部を除いて共通です。
レジストリ設定においてレジストリキー直下に設定する項目は、INIファイルの場合には
[Common]
セクションに記述します。
特定のURLを指定したウェブブラウザで開かせるために、URLやホスト名のパターンを設
定する必要があります。これらの設定はレジストリキーURLPatterns
あるいは
HostNamePatterns
配下に文字列値として格納します。文字列値の名前には任意の文字列を
使用できますが、適用順序を明確化するために0001
といった数字を使用することをお
勧めします。文字列値のデータにはホスト名やURLのパターンをセットします。また、
「|」を区切り文字として、末尾に使用するブラウザ名を付加することもできます。
例)
URLPatterns
0001
=http://*.example.com|firefox
HostNamePatterns
0001
=*.example.org|firefox
ホスト名やURL名のパターンを指定するために、以下のワイルドカードがサポートされて います。
*
: 任意の文字列にマッチします?
: 任意の一文字にマッチします
URLはhttp:
またはhttps:
で始まる物のみ対応しています。それ以外のスキーマのURLは、
常に現在のブラウザで処理されます1。
ブラウザ名としては、以下の値がサポートされています:
ie
: Internet Explorerfirefox
: Mozilla Firefoxchrome
: Google Chrome
ブラウザ名を指定しない場合は後述のDefaultBrowser
やSecondBrowser
が使用されま
す。
Internet Explorerのセキュリティゾーンごとに起動するブラウザを設定します。
記法はURLPatterns
およびHostNamePatterns
と同様です。
例)
0001
=intra|ie
0002
=internet
以下のセキュリティゾーン名がサポートされています。
- Type: String
local
intra
trusted
internet
restricted
URLPatterns
とHostNamePatterns
のルールはZonePatterns
に優先することに
注意してください。
URLのパターンを指定する方法として、単純なワイルドカードの代わりに、正規表現を 使用することもできます。正規表現を使用したい場合は、BrowserSelectorのレジ ストリキー直下に以下のDWORD値をセットします:
"UseRegex"
=dword:00000001
この状態においては、すべてのパターンが正規表現での指定として解釈されます。 単純なワイルドカードのパターン指定は併用できず、すべての指定を妥当な正規表現で 記述する必要があることに注意して下さい。
正規表現は部分一致ではなく、URL文字列全体にマッチするかどうかで判定されます。
特定のホストの任意のパスにマッチするよう指定する場合、パターンの末尾に.*
を指定
する必要があることにご注意下さい。
正規表現の具体的な文法については以下を参照して下さい:
正規表現を使用する場合にも、使用するブラウザを個別に指定することができます。
以下のように、パターンの終端を表す$
アサーションの直後にブラウザ名を記述して下さい:
0001
=^http(s)?://(.+\\.)?example\\.(org|com)(/.*)?$firefox
BrowserSelector
キー直下に文字列値DefaultBrowser
をセットすることで、パターン
に一致しなかった場合に使用するブラウザを指定することができます。
- 値の型: 文字列
ie
(デフォルト)firefox
chrome
例)
DefaultBrowser
=firefox
ホスト名やURLパターンでブラウザを指定しなかった場合、既定ではDefaultBrowser
で
指定したブラウザが使用されます。パターン毎に個別にブラウザを指定せずに、パター
ンにマッチしたURLに対して別のブラウザを使用したい場合は、BrowserSelector
キー
直下に文字列値SecondBrowser
をセットして下さい。
- 値の型: 文字列
- 空文字列 (デフォルト)
ie
firefox
chrome
例)
SecondBrowser
=chrome
URLPagtterns
0001
=http://*.example.com
0002
=http://*.example.org
- ...
システムに複数のバージョンのFirefoxをインストールしている場合に、どのFirefoxを 起動するかを指定できます。
- 値の型: 文字列
- 空文字列 (デフォルト)
- 通常のWindowsパス形式: C:\path\to\firefox.exe
外部ブラウザ起動後に残された空タブを閉じるか否かの設定です。
- 値の型: DWORD
- 1: 閉じる (デフォルト)
- 0: 閉じない
リンクのクリックのみをブラウザ切り替えの対象とするか否かの設定です。
- 値の型: DWORD
- 0: すべてのページ遷移をブラウザ切り替えの対象とする(デフォルト)
- 1: リンクのクリックのみをブラウザ切り替えの対象とする
追加で読み込む外部INIファイルのパスを指定します。読み込まれた外部INIファイルから さらに外部INIファイルを読み込むことはできません。
- 値の型: 文字列
- 以下のいずれかの形式を使用可能
- 通常のWindowsパス形式:
C:\path\to\file.ini
- UNC形式:
\\HostName\ShareName\path\to\file.ini
外部iniファイルにアクセスできない場合に、キャッシュを使用するかどうかを指定しま す。
- 値の型: DWORD
- 0: 使用しない(デフォルト)
- 1: 使用する
キャッシュは%USERPROFILE%\AppData\LocalLow
(shell:LocalAppDataLow
) 以下に保存されます。
なお、キャッシュファイル名は、Include
で指定されたパスの\
と:
を_
に置換したものになります。
例)
-
Include="c:\\Users\\Public\\BrowserSelector.ini"
C:\Users\[UserName]\AppData\LocalLow\ClearCode\BrowserSelector\C__Users_Public_BrowserSelectror.ini
-
Include="\\\\HostName\\ShareName\\path\\to\\BrowserSelector.ini"
C:\Users\[UserName]\AppData\LocalLow\ClearCode\BrowserSelector\__HostName_ShareName_path_to_BrowserSelectror.ini
- 共通オプションの
Debug
を1
に設定する。 例えば、BrowserSelector.ini の[Common]
セクションにDebug=1
と追記する。 - デバッグ情報収集用ツールをダウンロードする。 https://docs.microsoft.com/en-us/sysinternals/downloads/debugview 「Download DebugView」のリンク先をファイルとして保存する。
- 保存したファイルを展開する。
- 展開されたファイルの中の
Dbgview.exe
を管理者権限で実行して、DebugViewを起動する。 - DebugViewの
Capture
メニューでCapture Win32
Capture Global Win32
の両方にチェックを入れた状態にする。 - 調査したい現象を再現させる。
- DebugViewの
File
メニューのSave As...
でログを保存する。
- Chromeのショートカットをデスクトップ又は任意の場所にコピーする。
- ショートカットを右クリックし、メニューから「プロパティ」を選ぶ。
- リンクターゲット欄にコマンドライン引数
--enable-logging=1
を追加する。 (実行ファイルへのパスとコマンドラインオプションの間にスペースを入れることを忘れないこと。) - タスクマネージャーを使用し、
chrome.exe
のプロセスが残留していないことを確認する。- 残留していた場合には、すべての残留プロセスを強制終了する。
- 編集したショートカットからChromeを起動する。
- 調査したい現象を再現させる。
- Chromeを終了する。
%LocalAppData%\Google\Chrome\User Data\chrome_debug.log
の位置に出力されたログを採取する。
- 共通オプションの
ChromeDebug
を1
に設定する。 例えば、BrowserSelector.ini の[Common]
セクションにChromeDebug=1
と追記する。- さらに詳細なログを収集する場合は、共通オプションの
ChromeDebugVerbose
を1
以上3
以下の値に設定する。 例えば、BrowserSelector.ini の[Common]
セクションにChromeDebugVerbose=1
と追記する。
- さらに詳細なログを収集する場合は、共通オプションの
- タスクマネージャーを使用し、
chrome.exe
のプロセスが残留していないことを確認する。- 残留していた場合には、すべての残留プロセスを強制終了する。
- 他のブラウザーからChromeへのリダイレクトで発生する現象を再現させる。
- Chromeを終了する。
%LocalAppData%\Google\Chrome\User Data\chrome_debug.log
の位置に出力されたログを採取する。
- Edgeのショートカットをデスクトップ又は任意の場所にコピーする。
- ショートカットを右クリックし、メニューから「プロパティ」を選ぶ。
- リンクターゲット欄にコマンドライン引数
--enable-logging=1
を追加する。 (実行ファイルへのパスとコマンドラインオプションの間にスペースを入れることを忘れないこと。) - タスクマネージャーを使用し、
msedge.exe
のプロセスが残留していないことを確認する。- 残留していた場合には、すべての残留プロセスを強制終了する。
- 編集したショートカットからEdgeを起動する。
- 調査したい現象を再現させる。
- Edgeを終了する。
%LocalAppData%\Microsoft\Edge\User Data\chrome_debug.log
の位置に出力されたログを採取する。
- 共通オプションの
EdgeDebug
を1
に設定する。 例えば、BrowserSelector.ini の[Common]
セクションにEdgeDebug=1
と追記する。- さらに詳細なログを収集する場合は、共通オプションの
EdgeDebugVerbose
を1
以上3
以下の値に設定する。 例えば、BrowserSelector.ini の[Common]
セクションにEdgeDebugVerbose=1
と追記する。
- さらに詳細なログを収集する場合は、共通オプションの
- タスクマネージャーを使用し、
chrome.exe
のプロセスが残留していないことを確認する。- 残留していた場合には、すべての残留プロセスを強制終了する。
- 他のブラウザーからEdgeへのリダイレクトで発生する現象を再現させる。
- Edgeを終了する。
%LocalAppData%\Microsoft\Edge\User Data\chrome_debug.log
の位置に出力されたログを採取する。
Footnotes
-
これは、Chromeにおいてfile: URLへのアクセスにはユーザーの明示的な許可が常に必要であるという制限事項があるためです。 ↩