locked
Windows 10で.NETクラスのWindowsVersionクラスで正しい情報が取得できない RRS feed

  • 質問

  • .NET4.0を用いて、次のようにOSのバージョンを取得しましたが、Windows10なのに、Windows 8/Server 2012と表示されます。

    new WindowsVersion() { Version = (string)o }.Name;

    2015年7月14日 1:34

回答

  • Windows10検証 さん、

    前に示したスクリーンショットの元になるソフトのコードから一部をピックアップしました。
      元のコードでは DataGridView に取得データを入れて表示していました。
      そのままでは参考にならないので、修正してみました。
      デバッグ・実行していない、机上のソースコードですので、適宜変更してください。
      言語は VB.NET です。

    ' -- Import 部
    Imports System.Management    ' --- WMI 利用([参照]で .NET から System.Management を追加)
    
    ' -- コード 部(C# など他の言語をお使いなら、適宜変換してください。)
    Dim mc As New System.Management.ManagementClass("Win32_OperatingSystem")
    Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances()
    Dim mo As System.Management.ManagementObject
    
    ' ---● OS のビット数(行 3)
    If System.Environment.Is64BitOperatingSystem Then
    	Debug.WriteLine("Mode : 64-bit")
    Else
    	Debug.WriteLine("Mode : 32-bit")
    End If
    ' --- 列 1 に項目の値をセット
    For Each mo In moc
        ' --- OSの簡単な説明
        Debug.WriteLine("OS : " & mo("Caption"))
        ' --- OSバージョンとビルド番号:x.x (Build xxxx)
        Dim OS_Version As String = mo("Version").ToString
        Dim LastPeriod As Integer = OS_Version.LastIndexOf(".")
        Dim Build_Length As Integer = OS_Version.Length - LastPeriod - 1
        Dim tempString as string = OS_Version.Substring(0, LastPeriod)
        Debug.WriteLine(tempString += "(Build : " & OS_Version.Substring(LastPeriod + 1, Build_Length) & ")"
        ' --- サービスパック
        If mo("CSDVersion") = "" OrElse IsDBNull(mo("CSDVersion")) Then
            Debug.WriteLine("Service Pack : -")
        Else
            Debug.WriteLine("Service Pack : " & mo("CSDVersion"))
        End If
        ' --- ループ中の後始末
        mo.Dispose()
    Next mo
    ' --- ループ終了後の後始末
    moc.Dispose()
    mc.Dispose()
    


    • 回答の候補に設定 佐伯玲 2015年7月16日 0:45
    • 回答としてマーク 佐伯玲 2015年7月22日 4:15
    2015年7月15日 10:41
  • DOBON.NET さんのサイトに「注意」と書かれている部分をちゃんと読まれましたか?

    Windows 8.1 でそうであったように、Windows 10 でもマニフェストで指定しないとその方法で正しいバージョンを取得することはできないはずです。
    https://msdn.microsoft.com/en-us/library/dn481241

    • 回答の候補に設定 佐伯玲 2015年7月16日 0:45
    • 回答としてマーク 佐伯玲 2015年7月22日 4:15
    2015年7月15日 14:36

すべての返信

  • Windows10検証 さん、はじめまして。
    私は個人事業主として幾つかの Windows ソフトを開発しています。

    "Windows 8/Server 2012" と表示されるのは、.NET 4.0 が原因なのではなく、OS の情報の取得手段に原因があるように思います。

    下図は拙作ソフトの一つで表示した画面です。
    Windows 10 上で動かすと、正しく "Windows 10 Build 10166" と表示されます。
      

    Windows10検証さんはどのような方法で OS のバージョンを取得されているのでしょうか?

    ちなみに、私は OS 情報の取得に Windows Managemet Instruction を利用しています。
    VB.NET で開発しているソフト(.NET Framework は 4.5)です。
    もし必要でしたら、関連するコードを開示いたします。

    以上




    2015年7月14日 10:27
  • 内容確認しました。

    "Windows 8/Server 2012"は上記の結果をプログラムで書き換えしていただけの情報でした。すみません。


    http://dobon.net/vb/dotnet/system/osversion.html

    上記のサイトにあるようなサンプルプログラムを実行すると、Windows 8と同様の結果が取得されます。

    テストしている環境はWindows 8のマシンをデュアルブートで、Windows 10を入れた環境になります。

    System.OperatingSystemがハードウェアの情報をみてそうしているのかもしれないです。

    System.OperatingSystem.Version …6.2.9200.0
    System.OperatingSystem.Platform …Win32NT
    System.OperatingSystem.Version.Major …6
    System.OperatingSystem.Version.Minor …2


    2015年7月15日 7:14
  • Windows10検証 さん、

    前に示したスクリーンショットの元になるソフトのコードから一部をピックアップしました。
      元のコードでは DataGridView に取得データを入れて表示していました。
      そのままでは参考にならないので、修正してみました。
      デバッグ・実行していない、机上のソースコードですので、適宜変更してください。
      言語は VB.NET です。

    ' -- Import 部
    Imports System.Management    ' --- WMI 利用([参照]で .NET から System.Management を追加)
    
    ' -- コード 部(C# など他の言語をお使いなら、適宜変換してください。)
    Dim mc As New System.Management.ManagementClass("Win32_OperatingSystem")
    Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances()
    Dim mo As System.Management.ManagementObject
    
    ' ---● OS のビット数(行 3)
    If System.Environment.Is64BitOperatingSystem Then
    	Debug.WriteLine("Mode : 64-bit")
    Else
    	Debug.WriteLine("Mode : 32-bit")
    End If
    ' --- 列 1 に項目の値をセット
    For Each mo In moc
        ' --- OSの簡単な説明
        Debug.WriteLine("OS : " & mo("Caption"))
        ' --- OSバージョンとビルド番号:x.x (Build xxxx)
        Dim OS_Version As String = mo("Version").ToString
        Dim LastPeriod As Integer = OS_Version.LastIndexOf(".")
        Dim Build_Length As Integer = OS_Version.Length - LastPeriod - 1
        Dim tempString as string = OS_Version.Substring(0, LastPeriod)
        Debug.WriteLine(tempString += "(Build : " & OS_Version.Substring(LastPeriod + 1, Build_Length) & ")"
        ' --- サービスパック
        If mo("CSDVersion") = "" OrElse IsDBNull(mo("CSDVersion")) Then
            Debug.WriteLine("Service Pack : -")
        Else
            Debug.WriteLine("Service Pack : " & mo("CSDVersion"))
        End If
        ' --- ループ中の後始末
        mo.Dispose()
    Next mo
    ' --- ループ終了後の後始末
    moc.Dispose()
    mc.Dispose()
    


    • 回答の候補に設定 佐伯玲 2015年7月16日 0:45
    • 回答としてマーク 佐伯玲 2015年7月22日 4:15
    2015年7月15日 10:41
  • DOBON.NET さんのサイトに「注意」と書かれている部分をちゃんと読まれましたか?

    Windows 8.1 でそうであったように、Windows 10 でもマニフェストで指定しないとその方法で正しいバージョンを取得することはできないはずです。
    https://msdn.microsoft.com/en-us/library/dn481241

    • 回答の候補に設定 佐伯玲 2015年7月16日 0:45
    • 回答としてマーク 佐伯玲 2015年7月22日 4:15
    2015年7月15日 14:36