Home > Windows にまつわる e.t.c.

497日問題の確認


Windows Server 2008 / 2008 R2 には497日問題と呼ばれる不具合があります。

詳しくはこちら

Ask the Network & AD Support Team
497 日以上連続稼動させたときに生じる問題について

 

困った事に、TCP/IP は何度ととなく更新されているので、blog に書かれているKBチェックでは497日問題対策済みか否かがわからない状況になっています。

497日問題対応がされているか否かは、tcpip.sysのファイルバージョンが対策版以降であるか否かで判定できます。

判定する際は、OS、SPの有無に加えてて、GDR(Windows Updateとかでのリリース)かLDR(QFEで更新)したかを判別する必要があります。

GDR (General Distribution Release)
LDR (Limited Distribution Release)

 

ファイルバージョンの確認は、wmic コマンドまたは C:\Windows\System32\drivers\tcpip.sys のプロパティのファイルバージョンで確認できます。

C:\> wmic datafile where name="C:\\Windows\\System32\\drivers\\tcpip.sys" get name,size,version

 

ファイルバージョンのコード体系

A.A.BBBC.DEEEE

A.A : OS バージョン

6.0 → Windows Server 2008
6.1 → Windows Server 2008 R2

BBBC : ビルド番号

C : SP

0 → SPなし
1 → SP1

D : GDR/LDR区別

1 → GDR
2 → LDR

DEEEE : プライベートパート(バージョン詳細)

 

例) 6.1.7601.18438

Windows Server 2008 R2
SP1
GDR

 

ファイルバージョンを取得したら、対策済みファイルバージョン以降になっていればOKです。

OS SP GDR/LDR 応済みファイルバージョン
Windows Server 2008 GDR 要対応
LDR 6.0.6002.22643
Windows Server 2008 R2 GDR 6.1.7600.16943
LDR 6.1.7600.21122
Windows Server 2008 R2 SP1 GDR 6.1.7601.17757
LDR 6.1.7601.21893

Windows Server 2008 (とVista)の場合は、497日問題のGDRが提供されていないので、tcpip.sysがGDRだったらアウトですので、Ask the Network & AD Support Team の blog を見て対策してください。

Windows Server 2008 R2(と Windows 7)この問題は Windows Update で解決されます。

 

PowerShellであれば、猶予日数も合わせて確認ができます。

(.ps1 にしなくてもコピペで貼り付ければ OK )

$FileVertion = (Get-WmiObject -query "Select * from CIM_Datafile Where Name = 'C:\\Windows\\System32\\drivers\\tcpip.sys'").Version

$OS = $FileVertion.SubString(0,3)
$SP = $FileVertion.SubString(7,1)
$DR = $FileVertion.SubString(9,1)
$PrivatePart = [int]$FileVertion.SubString(9,5)

# 対策版のファイルバージョン(プライベートパート)
$08_LDR = 22643         # 6.0.6002.22643
$08R2_GDR_woSP1 = 16943 # 6.1.7600.16943
$08R2_LDR_woSP1 = 21122 # 6.1.7600.21122
$08R2_GDR_wSP1 = 17757  # 6.1.7601.17757
$08R2_LDR_wSP1 = 21893  # 6.1.7601.21893

$NeedUpdate = $False

# Windows Server 2008 の場合
if( $OS -eq "6.0"){
    # GDR の場合
    if( $DR -eq "1" ){
        $NeedUpdate = $True
    }
    # LDR の場合
    else{
        if( $PrivatePart -lt $08_LDR ){
            $NeedUpdate = $True
        }
    }
}
# Windows Server 2008 R2 の場合
elseif( $OS -eq "6.1" ){
    # SP なしの場合
    if( $SP -eq "0" ){
        # GDR の場合
        if( $DR -eq "1" ){
            if( $PrivatePart -lt $08R2_GDR_woSP1 ){
                $NeedUpdate = $True
            }
        }
        # LDR の場合
        else{
            if( $PrivatePart -lt $08R2_LDR_woSP1 ){
                $NeedUpdate = $True
            }
        }
    }
    # SP1 の場合
    else{
        # GDR の場合
        if( $DR -eq "1" ){
            if( $PrivatePart -lt $08R2_GDR_wSP1 ){
                $NeedUpdate = $True
            }
        }
        # LDR の場合
        else{
            if( $PrivatePart -lt $08R2_LDR_wSP1 ){
                $NeedUpdate = $True
            }
        }
    }
}

if( $NeedUpdate ){
    $WMI_OpreationSystem = Get-WmiObject win32_operatingsystem
    $Now = $WMI_OpreationSystem.LocalDateTime
    $Boot = $WMI_OpreationSystem.LastBootUpTime
    $BootDateTime = $WMI_OpreationSystem.ConvertToDateTime($Boot)
    $NowDateTime = $WMI_OpreationSystem.ConvertToDateTime($Now)
    $UpTime = $NowDateTime - $BootDateTime
    $Remaining = 497 - $UpTime.Days
    echo "Needs to be updated within $Remaining days !!"
}
else{
    echo "Good condition."
}


 

PowerShell に詳しい方だと、「どうして Get-ItemProperty で FileVersion 調べないの?」って疑問に思われると思います。
実は、Get-ItemProperty の FileVersion では、ファイルバージョンが正しく取得できないのです。(ProductVersion が返ってくる)
この対策のために WMI でファイルバージョン取ているのです。

これが PowerShell の不具合なのかサポートに問い合わせたら、既知の問題ではあるがフィードバックが少なく、回避方法もあるので現状修正予定はないそうです。

回避方法は FileVersion ではなく、ファイルバージョンを構成している各値を組み合わせてファイルバージョンにするとの事でした。

つまり、こう言う事ですね。

$FileVertionData = Get-ItemProperty "C:\Windows\System32\drivers\tcpip.sys"
$FileVertion = [String]$FileVertionData.VersionInfo.FileMajorPart + "." + `
               [String]$FileVertionData.VersionInfo.FileMinorPart + "." + `
               [String]$FileVertionData.VersionInfo.FileBuildPart + "." + `
               [String]$FileVertionData.VersionInfo.FilePrivatePart

ちなみに

[System.Diagnostics.FileVersionInfo]::GetVersionInfo("C:\Windows\System32\drivers\tcpip.sys")

こう書いてもファイルバージョンが正しく取れないので、PowerShellと言うより.NET Frameworkの問題かも?

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.