新元号対応 Windows、Office、.NET Framework オフラインインストール手順

元号対応用に作成した、Windows、Office、.NET Framework オフラインインストール手順をまとめています。

# 調査

## 以下の「.NET、Office、Windows」に関するページから調査

- [新元号への対応について](https://www.microsoft.com/ja-jp/mscorp/newera/default.aspx)
    - [2019 年 5 月の新元号への変更に関する更新](https://support.microsoft.com/ja-jp/help/4470918/updates-for-may-2019-japan-era-change)
        - [.NET の新元号対応に関する情報](https://support.microsoft.com/ja-jp/help/4477957/new-japanese-era-updates-for-net-framework)
        - [Office の新元号対応に関する情報](https://support.microsoft.com/ja-jp/help/4478844/office-updates-for-new-japanese-era)
        - [Windows の新元号対応に関する情報](https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068)

## 該当ダウンロードファイル調査のヒント

1. 適用対象となる環境を確認する
    - .NET Frameworkのバージョン（3.5 or 4.5.2 or 4.6以降）
    - Officeのバージョン、サービスパックのバージョン
        - 使用している製品（Wordなど）
    - Windows のバージョン、サービスパックのバージョン、プラットフォーム（x86 or x64）

2. 以下の順番で対象となるプログラムを確認する
    1. 最新のロールアップ（累積アップデート）
        - 前提となる更新プログラム（KB）があるなら、そちらも確認する
            - 例えば、最新の SSU（サービススタック更新プログラム）、などがある。
    2. 最新のロールアップの後に出ている更新プログラム
        - 前提となる更新プログラム（KB）があるなら、そちらも確認する

# 媒体作成

## ファイルダウンロード

### .NET Framework、Windows

1. [Microsoft Update Catalog](https://www.catalog.update.microsoft.com/Home.aspx)からダウンロードする
    - 拡張子がmsu
    - KB番号を入力してダウンロード
    - KB番号ごとにフォルダを作成して保存。フォルダ名、ファイル名は後述

### Office

1. 各更新の「更新プログラムのダウンロードおよびインストール方法」のリンクからダウンロード
    - 拡張子がexe
    - KB番号ごとにフォルダを作成して保存。フォルダ名、ファイル名は後述

### 保存（フォルダ分け）

```:フォルダ書式
＜＜NET or Office or Windows＞＞_＜＜西暦下2桁＋月＞＞_＜＜KB番号＞＞
```

```:フォルダ例
NET_1903_kb4488669
```

```:ファイル書式
＜＜NET or Office or Windows＞＞_＜＜西暦下2桁＋月＞＞_＜＜元のファイル名＞＞
```

```:ファイル例
NET_1903_ndp45-kb4488669-x86_7e600795492a759f2ad7889765690746e027b806.exe
```

## スクリプトの作成

### オフラインインストール用スクリプト

```:copyandupdate.bat
@echo off
cls
pause
xcopy "%~dp0\windows_update_patch" "c:\windows_update_patch" /s /e /i
cscript "c:\windows_update_patch\installallatonce.vbs
```

```vb:installallatonce.vbs
Set objShell=CreateObject("Shell.Application") 
   objShell.ShellExecute "cmd.exe", _
   """" & "/k c:\windows_update_patch\bat\install_updates.bat" & """", _
   "", _
   "runas", _
   1
```

```:getwindowsupdatelist.bat
@echo off
 
rem ソフトウェア名をファイルに出力(DisplayNameで開始している行のみ、セキュリティの更新ソフトのみ
for /F "delims=" %%A IN ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") DO (
	for /F "tokens=2,*" %%I in ('reg query %%A /s ^| findstr "\<DisplayName" ^| findstr "(KB"') do (
		echo %%J
	)
)

rem ソフトウェア名をファイルに出力(DisplayNameで開始している行のみ、セキュリティの更新ソフトのみ
for /F "delims=" %%A IN ("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall") DO (
	for /F "tokens=2,*" %%I in ('reg query %%A /s ^| findstr "\<DisplayName" ^| findstr "(KB"') do (
		echo %%J
	)
)
```

```:install_updates.bat
@echo off
REM "install_updates.bat"
 
REM Note: Don't use a space in the following paths.
REM Note: If the other machine's OS is 32-bit, you must set "OS=86".
set PATCH_HOME=C:\windows_update_patch\
set PATCH_DIR=target\
set BAT_DIR=bat\
set MSU_KEYWORD=Windows6.1
set EXE_KEYWORD=
REM set OS=64
set OS=86
set INFO_LOG1=install_pc_info_pre.txt
set INFO_LOG2=install_pc_info_after.txt
set MSU_LOG=installed_msu_list.txt
set EXE_LOG=installed_exe_list.txt
set OTHER_LOG=installed_other_list.txt
set EVENT_LOG=installed_log.evtx
  
cd %PATCH_HOME%%PATCH_DIR%
  
echo Windows Updates are starting...

pause
  
echo %date% %time% > %PATCH_HOME%%INFO_LOG1%
echo インストール前 >> %PATCH_HOME%%INFO_LOG1%
systeminfo >> %PATCH_HOME%%INFO_LOG1%
call %PATCH_HOME%%BAT_DIR%getwindowsupdatelist.bat >> %PATCH_HOME%%INFO_LOG1%
echo %date% %time% >> %PATCH_HOME%%INFO_LOG1%

REM msu
echo %date% %time% > %PATCH_HOME%%MSU_LOG%
for /f "usebackq" %%I in (`dir /b /a-d /s *%MSU_KEYWORD%*-x%OS%*.msu`) do (
  echo Installing "%%I".
  echo %%I >> %PATCH_HOME%%MSU_LOG%
  wusa %%I /quiet /norestart /log:%PATCH_HOME%%EVENT_LOG%
)
echo %date% %time% >> %PATCH_HOME%%MSU_LOG%
  
REM exe
echo %date% %time% > %PATCH_HOME%%EXE_LOG%
for /f "usebackq" %%I in (`dir /b /a-d /s *%EXE_KEYWORD%*-x%OS%*.exe`) do (
  echo Installing "%%I".
  echo %%I >> %PATCH_HOME%%EXE_LOG%
  %%I /quiet /norestart /log:%PATCH_HOME%%EVENT_LOG%
)
echo %date% %time% >> %PATCH_HOME%%EXE_LOG%
  
del /f %PATCH_HOME%%EVENT_LOG%.dpx

echo %date% %time% > %PATCH_HOME%%INFO_LOG2%
echo インストール後 >> %PATCH_HOME%%INFO_LOG2%
systeminfo >> %PATCH_HOME%%INFO_LOG2%
call %PATCH_HOME%%BAT_DIR%getwindowsupdatelist.bat >> %PATCH_HOME%%INFO_LOG2%
echo %date% %time% >> %PATCH_HOME%%INFO_LOG2%

echo Windows Updates are done.
echo Reboot now!
  
shutdown /r /t 0
```

### OSに合わせて、以下の部分を編集する

```cmd:install_updates.bat
set MSU_KEYWORD=Windows6.1
set OS=86
```

## ファイルの配置

1. 以下に従いファイルを配置する

```
ISO
│copyandupdate.bat
└windows_update_patch
　│installallatonce.vbs
　└bat
　　│getwindowsupdatelist.bat
　　│install_updates.bat
　└target
　　│ダウンロードしたファイル（msu, exe）
```

# インストールテスト

## テスト環境の準備

1. 仮想環境で、調査したOS、Office、.NETで環境を構築する
2. 事前にスナップショット（Hyper-Vならチェックポイント）を取る

## インストール

1. ISOフォルダを、ネットワーク、または媒体（ISOイメージでもよい）に配置する
2. 可能なら、IPアドレスを設定する（アップデート後にIPアドレスの設定が消失することがある事象に対する確認のため）
3. copyandupdate.batを実行する

## レジストリの編集

1. 必要に応じ、[レジストリの編集](https://qiita.com/tfukumori/items/1dc60eb473eff5efb994#microsoft%E8%A3%BD%E5%93%81%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA)を行う。ただし、令和の追加は、運用環境では動作保証外なので注意。令和の追加、パッチの中で追加されるべきもの。

# 参考にしたサイト

[tips][Windows] Windows Updateを一括で行う方法
https://casualdevelopers.com/tag/bat/