2019年12月6日金曜日

Google Chromeを仮想アプリ化する方法(2019-12-06)

Google Chromeを仮想アプリ化する方法(2019-12-06)

vExpert の Advent Calendar 2019の6日目を担当させていただきます。
https://adventar.org/calendars/4289

アプリ仮想化奉行です。
よろしくおねがいします。
最近更新が滞っていて、すいません。

Google ChromeをThinAppを使って仮想アプリ化するためのTipsについて
書きます。
なかなか手間がかかります。

※お願い:
簡単な動作確認は行っていますが、全ての環境で動作することを保証するものではありません。動かない、一部の機能がおかしい、などなど
くれぐれも自己責任でお願いいたします。

GithubにGoogle Chromeのパッケージ一式を公開してありますので
こちらをダウンロードして、Build.batで作成したほうが早いと思います。
https://github.com/tunemicky/VirtGoogleChrome


必要なもの:
 ・仮想アプリの作成環境:Windows 10やWindows7
 ・VMware ThinApp SetupCapture ver5.2.6 (このバージョン以上でないとNG)
 ・Google Chrome のインストーラー
 ・Chrome.exeのアプリケーションマニフェストを編集するためのリソース書換ツール
  ResourceHackerなど
  http://www.angusj.com/resourcehacker/



手順:
 仮想アプリの作成環境(キャプチャー環境)でGoogle Chromeのキャプチャーを行います。

前半の手順は、省略します。(一般的な手順です。)











ここから、カスタママイズしていきます。
キャプチャーが完了した後のプロジェクトフォルダーから
%Local AppData%
%ProgramFilesDir%を残して、それ以外のフォルダーを削除します。




%Local AppData%
%ProgramFilesDir%を残します。

 %Local AppData%フォルダーから"Google"フォルダー以外を削除します。

%Local AppDAta%\Google\Chrome\フォルダーの配下に
"Application"フォルダーを作成します。
##Attributes.iniファイルをIsolationMode=Fullで作成します。



%Local AppDAta%\Google\Chrome\User Data
フォルダーの中身を##Attributes.iniファイルを残して、その他を全て削除します。



%ProgramFilesDir%\Google フォルダーを残して、その他のフォルダーを削除します。

%ProgramFilesDir%\Google\Chrome\Application\78.0.3904.108
にある、"78.0.3904.108.manifest"ファイルを削除します。
※Google Chromeのバージョンなので適宜 読み替えてください。


%ProgramFilesDir%\Google\Chrome\Application\78.0.3904.108\Installer
フォルダーにあるセットアップ関連のファイルを削除します。
※容量削減



 %ProgramFilesDir%\Google\Chrome\Application\78.0.3904.108
にあるファイル、フォルダーを全てコピーします。
※一つ上の階層に貼り付けます。

 %ProgramFilesDir%\Google\Chrome\Application\
に貼り付けます。
その後、78.0.3904.108フォルダーを削除します。

chrome.exeのマニフェストを書き換えます。
※これが最大のポイントです。
リソースハッカーで 
%ProgramFilesDir%\Google\Chrome\Application\chrome.exeを開きます。
左ペインから、Manifest1:1033を選択します。


マニフェストの内容を以下のものに入れ替えます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
 processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*">
</assemblyIdentity>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false">
</requestedExecutionLevel>
</requestedPrivileges></security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS>
</application></compatibility></assembly>


リソースハッカーのツールバーの「右三角の緑」ボタンを押します。
その後、上書き保存を行います。


HKEY_CURRENT_USER.txtの編集を行います。
既存のものを全て削除してから、

isolation_full HKEY_CURRENT_USER\SOFTWARE\Google\Update
  Value=UpdateDefault
  REG_DWORD=#00#00#00#00

を上書き保存します。
※Chromeの自動アップデートを無効化するオプション



HKEY_LOCAL_MACHINE.txtの編集を行います。
既存のものを全て削除してから、

isolation_full HKEY_LOCAL_MACHINE\SOFTWARE\Google\Update
  Value=UpdateDefault
  REG_DWORD=#00#00#00#00

isolation_full HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
  Value=UpdateDefault
  REG_DWORD=#00#00#00#00

を上書き保存します。
※Chromeの自動アップデートを無効化するオプション

Package.iniの編集を行います。
[BuildOptions]
VirtualizeExternalOutOfProcessCOM=0
ChildProcessEnvironmentDefault=External
IgnoreDDEMessages=1
CopyManifestData=1
SetVirtualModuleFileNameInPeb=1
を追加します。



コマンドラインオプションを指定します。
ここもポイントです。
[Google Chrome.exe]
Source=%ProgramFilesDir%\Google\Chrome\Application\chrome.exe
Shortcut=GoogleChrome78.dat
WorkingDirectory=%ProgramFilesDir%\Google\Chrome\Application
Comment=インターネットにアクセス
Protocols=ftp;http;https
Shortcuts=%Desktop%;%Programs%;%AppData%\Microsoft\Internet Explorer\Quick Launch;%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
CommandLine="%ProgramFilesDir%\Google\Chrome\Application\chrome.exe" --no-sandbox --disalbe-gpu --test-type --user-data-dir=%temp%\Chrome78

※コマンドラインオプションの説明
 --no-sandbox Chromeのサンドボックスの無効化←必須
   --disable-gpu GPUの無効化←これは任意です。GPU有効でも動きます。
 --test-type 必須
 --user-data-dir ユーザーデータの保存先を%temp%\Chrome78に永続化します。
 これをThinAppSandboxに格納すると、ハングする頻度が上がります。



Build.batを実行します。



完成!!!!
お疲れさまでした、完成です。
今回のプロジェクトフォルダーのリストです。
C:.
│  build.bat
│  HKEY_CURRENT_USER.txt
│  HKEY_LOCAL_MACHINE.txt
│  HKEY_USERS.txt
│  Package.ini
├─%Local AppData%
│  │  ##Attributes.ini
│  │
│  └─Google
│      │  ##Attributes.ini
│      │
│      └─Chrome
│          │  ##Attributes.ini
│          │
│          ├─Application
│          │      ##Attributes.ini
│          │   
│          └─User Data
│                  ##Attributes.ini
├─%ProgramFilesDir%
│  │  ##Attributes.ini
│  │
│  └─Google
│      │  ##Attributes.ini
│      └─Chrome
│          │  ##Attributes.ini
│          └─Application
│              │  ##Attributes.ini
│              │  chrome.dll
│              │  chrome.dll.sig
│              │  chrome.exe
│              │  chrome.exe.sig
│              │  chrome.VisualElementsManifest.xml
│              │  chrome_100_percent.pak
│              │  chrome_200_percent.pak
│              │  chrome_child.dll
│              │  chrome_child.dll.sig
│              │  chrome_elf.dll
│              │  chrome_proxy.exe
│              │  chrome_watcher.dll
│              │  d3dcompiler_47.dll
│              │  elevation_service.exe
│              │  eventlog_provider.dll
│              │  icudtl.dat
│              │  libegl.dll
│              │  libglesv2.dll
│              │  master_preferences
│              │  nacl64.exe
│              │  nacl_irt_x86_32.nexe
│              │  nacl_irt_x86_64.nexe
│              │  natives_blob.bin
│              │  notification_helper.exe
│              │  resources.pak
│              │  v8_context_snapshot.bin
│              ├─default_apps
│              │      ##Attributes.ini
│              │      docs.crx
│              │      drive.crx
│              │      external_extensions.json
│              │      gmail.crx
│              │      youtube.crx
│              ├─Extensions
│              │      ##Attributes.ini
│              │      external_extensions.json
│              ├─Installer
│              │      ##Attributes.ini
│              ├─Locales
│              │      ##Attributes.ini
│              │      am.pak
│              │      ar.pak
│              │      bg.pak
│              │      bn.pak
│              │      ca.pak
│              │      cs.pak
│              │      da.pak
│              │      de.pak
│              │      el.pak
│              │      en-GB.pak
│              │      en-US.pak
│              │      es-419.pak
│              │      es.pak
│              │      et.pak
│              │      fa.pak
│              │      fi.pak
│              │      fil.pak
│              │      fr.pak
│              │      gu.pak
│              │      he.pak
│              │      hi.pak
│              │      hr.pak
│              │      hu.pak
│              │      id.pak
│              │      it.pak
│              │      ja.pak
│              │      kn.pak
│              │      ko.pak
│              │      lt.pak
│              │      lv.pak
│              │      ml.pak
│              │      mr.pak
│              │      ms.pak
│              │      nb.pak
│              │      nl.pak
│              │      pl.pak
│              │      pt-BR.pak
│              │      pt-PT.pak
│              │      ro.pak
│              │      ru.pak
│              │      sk.pak
│              │      sl.pak
│              │      sr.pak
│              │      sv.pak
│              │      sw.pak
│              │      ta.pak
│              │      te.pak
│              │      th.pak
│              │      tr.pak
│              │      uk.pak
│              │      vi.pak
│              │      zh-CN.pak
│              │      zh-TW.pak
│              ├─MEIPreload
│              │      ##Attributes.ini
│              │      manifest.json
│              │      preloaded_data.pb
│              ├─SetupMetrics
│              │      ##Attributes.ini
│              │      20191205171904.pma
│              ├─swiftshader
│              │      ##Attributes.ini
│              │      libegl.dll
│              │      libglesv2.dll
│              ├─VisualElements
│              │      ##Attributes.ini
│              │      logo.png
│              │      logobeta.png
│              │      logocanary.png
│              │      logodev.png
│              │      smalllogo.png
│              │      smalllogobeta.png
│              │      smalllogocanary.png
│              │      smalllogodev.png
│              └─WidevineCdm
│                  │  ##Attributes.ini
│                  │  license
│                  │  manifest.json
│                  └─_platform_specific
│                      │  ##Attributes.ini
│                      └─win_x86
│                              ##Attributes.ini
│                              widevinecdm.dll
│                              widevinecdm.dll.sig
└─bin
        Google Chrome.exe
        GoogleChrome78.dat
        GoogleChrome78.dat.alt