#想定読者
社内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で出力
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窓で入力
※これはリスト読み込みでもよいと思います。
set /p PCNAME="PC名を入力してください: "
###バーションチェック
1. PCが起動しているか確認
pingでPCの起動を確認す
有→処理続行(IEverup.batを呼び出す:引数PC名 バージョン ログ情報)
無→なしであることをログに出力して終了
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→処理を終了して、リモートレジストリ停止
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サービスも同様)
rem Windows Update サービスの停止
sc \\%1 stop wuauserv
echo.
echo ※※※Windows Update サービス停止中※※ && timeout 60
echo.
4. C直下Windows\SoftwareDistributionをRENAME
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
rem Windows Update サービスの開始
sc \\%1 start wuauserv
echo.
echo ※※※Windows Update サービス開始中※※ && timeout 60
echo.
6. Intelligent Transfer ServiceをRESTART
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
rem Cryptographic Services サービスの停止
sc \\%1 stop cryptsvc
echo.
echo ※※※Cryptographic Services サービス停止中※※ && timeout 60
echo.
8. C直下Windows\System32\catroot2をRENAME
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
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に絡む類似案件でも活用できると思います。