Windows
IE
bat
dos
WindowsUpdate
RandstadDay 10

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