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で検索するとやまほど情報がでてくるのでこちらでは記載しません。
問題を解消するには、下記の作業が必要です。

1. PCが起動しているか確認
2. PCにリモートもしくはリモートレジストリONしてIEのバージョンを確認
3. 8だった場合、WindowsUpdate ServiceをSTOP
4. C直下Windows\SoftwareDistributionをRENAME
5. WindowsUpdate ServiceをSTART
6. Intelligent Transfer ServiceをRESTART
7. Cryptographic ServicesをSTOP
8. C直下Windows\System32\catroot2をRENAME
9. 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名を入力してください: "

バーションチェック

1. 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 ***************  

2. 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

バーションアップ

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

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

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

4. 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

5. WindowsUpdate ServiceをSTART

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

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

6. 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.

7. Cryptographic ServicesをSTOP

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

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

8. 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

9. 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に絡む類似案件でも活用できると思います。