IE8→IE11へのUpdateをDOSバッチで処理

#想定読者
社内PC管理者

#自己紹介
新卒で入社した会社で金融系のゲートウェイ開発を3年間行っていました。
fix電文を来る日も来る日も朝日がのぼるまでひたすら解読する毎日・・・

そんな前職で一人でサーバ構築から保守まで完璧にこなすスーパーインフラマンに出会い、かっこよすぎる！！私もインフラ系の仕事がしてみたい！！！と転職しました。

現在はランスタッドヘルプデスクとして希望通りインフラ業務を少しかじったり、ときにはPCを解体したり刺激的な毎日を過ごしています。

#はじめに
ブラウザのバージョンアップ、WindowsUpdate・・・
会社として、PCのシステムアップデートはいつの時代も必須の業務です。

ランスタッドでも全社1000台を超えるPCに対してブラウザのバージョンをInternetExplore8からInternetExplore11へ変更するプロジェクトがありました。
WSUS経由で対象のパッチを各PCへ配信することでアップデートをかけましたが、一部PCでうまく適用されないPCがありました。
(どんなアップデートだろうと不思議なことに数台はうまくかからないPCが出てくるものです。)

このアップデートかからない問題を切り抜けるため、ない袖を振って作成したバッチについて記録を残します。
というのも、この問題はランスタッドだけで起きている問題ではないからです。
IEを使っているあまたの会社でも同様の悩みがきっとあるでしょう。

私の解決方法は拙く泥臭くほんの1つの方法に過ぎませんが、誰かの助けになれば幸いかと思い掲載します。

#IE8→IE11へのUpdateをDOSバッチで処理する

##やりたいこと
WSUS経由でUpdateがあたらない(IEのバージョンがあがってくれない)PCについて、原因はお決まりのSoftwareDistributionフォルダです。
※windosupdate SoftwareDistributionで検索するとやまほど情報がでてくるのでこちらでは記載しません。
問題を解消するには、下記の作業が必要です。

１. PCが起動しているか確認
２. PCにリモートもしくはリモートレジストリONしてIEのバージョンを確認
３. 8だった場合、WindowsUpdate ServiceをSTOP
４. C直下Windows\SoftwareDistributionをRENAME
５. WindowsUpdate ServiceをSTART
６. Intelligent Transfer ServiceをRESTART
７. Cryptographic ServicesをSTOP
８. C直下Windows\System32\catroot2をRENAME
９. Cryptographic ServicesをSTART

これを下記の通りコードに起こしました。
あとは自分のPC上でバッチをたたけばOKです。

##Dosバッチ処理

###下準備

**★前提**
　PC管理者アカウント権限のあるアカウントでログインしていること

**出力設定**
　ログの出力準備--IEcheck_PCNAME_日付_時間.logで出力

```IEcheck.bat
set time_tmp=%time: =0%
set time_tmp=%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
set LOG=C:\IT\IEcheck_%PCNAME%_%date:~0,4%%date:~5,2%%date:~8,2%_%time_tmp%.log
```
**対象のPC名入力**
　PC名をDOS窓で入力
　※これはリスト読み込みでもよいと思います。

```IEcheck.bat
set /p PCNAME="PC名を入力してください: "
```


###バーションチェック

**１. PCが起動しているか確認**
　pingでPCの起動を確認す
　有→処理続行(IEverup.batを呼び出す：引数PC名 バージョン ログ情報)
　無→なしであることをログに出力して終了

```IEcheck.bat
rem ping反応ありなし判定
ping %PCNAME% -n 4 | find "バイト数 =32" >NUL
@if errorlevel 1 GOTO ping_NG
@if errorlevel 0 GOTO ping_OK

rem ping反応なし
:ping_NG
echo.
echo ***************
echo ping反応なし
echo ***************
echo.

echo %PCNAME%はping反応なしのため、未処理

rem ログに結果出力
echo %PCNAME%はping反応なしのため、未処理 >> %LOG%

pause
GOTO END

rem ping反応あり(処理続行)
:ping_OK
echo.  
echo ***************  
echo pingOK  
echo ***************  
```

**２. PCにリモートもしくはリモートレジストリONしてIEのバージョンを確認**
　Version8→処理続行
　Version11→処理を終了して、リモートレジストリ停止

```IEcheck.bat
echo %PCNAME%はping反応ありのため、IEバージョンチェック
echo .

rem ログに結果出力
echo %PCNAME%はping反応ありのため、IEバージョンチェック >> %LOG%
echo . >> %LOG%

echo 【チェック開始】 >> %LOG%
echo 対象PC名：%PCNAME% >> %LOG%
echo . >> %LOG%

rem リモートレジストリを開始する
sc \\%PCNAME% START RemoteRegistry

echo 【リモートレジストリON】 >> %LOG%
echo . >> %LOG%

echo.
echo.
echo ===================================
echo.
echo      IEバージョンcheck
echo.
echo ===================================
echo.
echo.

echo 【レジストリチェック】 >> %LOG%

rem 「Internet Explorer 10」以前
rem レジストリから「Internet Explorer」の「Version」取得
for /f "tokens=1,2,*" %%I in ('reg query "\\%PCNAME%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer" /v "Version"') do (
	if "%%I"=="Version" SET GET_VERSION=%%K
)

rem 「Internet Explorer 10」以降
rem レジストリから「Internet Explorer」の「svcVersion」取得
for /f "tokens=1,2,*" %%I in ('reg query "\\%PCNAME%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer" /v "svcVersion"') do (
	if "%%I"=="svcVersion" SET GET_VERSION=%%K
)

rem IEバージョン判定
rem IE11なら処理終了→リモートレジストリを終了
if not "%GET_VERSION:11.0=%" == "%GET_VERSION%" echo IEのバージョンは%GET_VERSION%です。処理を終了します。
rem ログ用
if not "%GET_VERSION:11.0=%" == "%GET_VERSION%" echo IEのバージョンは%GET_VERSION%です。処理を終了します。 >> %LOG%

rem IE8ならバージョンアップ開始
if not "%GET_VERSION:8.0=%" == "%GET_VERSION%" call IEverup.bat %PCNAME% %GET_VERSION% %LOG%
if not "%GET_VERSION:9.0=%" == "%GET_VERSION%" call IEverup.bat %PCNAME% %GET_VERSION% %LOG%

rem リモートレジストリを停止する
sc \\%PCNAME% STOP RemoteRegistry

echo 【リモートレジストリOFF】 >> %LOG%

GOTO END
```

###バーションアップ

**３. 8だった場合、WindowsUpdate ServiceをSTOP**
　※停止にかかる時間をみて60秒程度停止(以降Windowsサービスも同様)

```IEverup.bat
rem Windows Update サービスの停止
sc \\%1 stop wuauserv

echo.
echo ※※※Windows Update サービス停止中※※ && timeout 60
echo.

```

**４. C直下Windows\SoftwareDistributionをRENAME**

```IEverup.bat
rem ファイルをリネーム
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "& { ren \\%1\c$\Windows\SoftwareDistribution \\%1\c$\Windows\SoftwareDistributionOld ; exit } "
@if %errorlevel% == 0 echo ファイル名をSoftwareDistributionからSoftwareDistributionOldに変更しました。 >>%3
```

**５. WindowsUpdate ServiceをSTART**

```IEverup.bat
rem Windows Update サービスの開始
sc \\%1 start wuauserv

echo.
echo ※※※Windows Update サービス開始中※※ && timeout 60
echo.
```

**６. Intelligent Transfer ServiceをRESTART**

```IEverup.bat
rem Background Intelligent Transfer Service サービスの停止
sc \\%1 stop bits

echo.
echo ※※※Background Intelligent Transfer Service サービス停止中※※ && timeout 60
echo.

rem Background Intelligent Transfer Service サービスの開始
sc \\%1 start bits

echo.
echo ※※※Background Intelligent Transfer Service サービス開始中※※ && timeout 60
echo.
```

**７. Cryptographic ServicesをSTOP**

```IEverup.bat
rem Cryptographic Services サービスの停止
sc \\%1 stop cryptsvc

echo.
echo ※※※Cryptographic Services サービス停止中※※ && timeout 60
echo.
```

**８. C直下Windows\System32\catroot2をRENAME**

```IEverup.bat
rem ファイルをリネーム
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "& { ren \\%1\c$\Windows\System32\catroot2 \\%1\c$\Windows\System32\catroot2Old ; exit } "
@if %errorlevel% == 0 ( echo ファイル名をcatroot2からcatroot2Oldに変更しました。) >>%3
```

**９. Cryptographic ServicesをSTART**

```IEverup.bat
rem Cryptographic Services サービスの開始
sc \\%1 start cryptsvc

echo.
echo ※※※Cryptographic Services サービス開始中※※ && timeout 60
echo.
```

###終了処理

**END処理**
　内容確認のため、DOS窓が閉じないようにいったん停止

```
:END
rem 処理内容確認用
echo 何かキーを押してください。
echo.
pause >nul
```

#おわりに
今回は一連の処理をDOSバッチとして処理したときの記録になります。
まだIE8から11へUpdateしていない・・ということはないでしょうが、
まだまだ活用するWindowsUpdateに絡む類似案件でも活用できると思います。