2016年5月8日日曜日

VB OS のバージョンを取得 ( Windows10 対応 )

Windows 10 なのに、 6.2.9200 ?。
何これ! と、浦島太郎 状態の私。
今まで使っていた Windows 7 sp1 & Visual Studio 2013 Community Update5 の VB で書いたものが、
Windows 10 上で返す OS のバージョン ... 。  あらまぁ。


確か、 Windows 10 のバージョンって、今、 10.0.10586 じゃぁ なかったでした っけ?。  個人的な勘違いですか ? ... 。.
そう、バージョン って、 1511 も、バージョンですが ... ??? 。
あ~あ、 ややこしい事 !!! 。
昔風に考えた時、 6. で始まるナンバーは Vista 系 の Vista/7/8/8.1 と繋がる系列に振られた番号ですよね。
6 は OS カーネルが 大きく変わらない事を現していましたよね。
そう言えば、 Windows 10 の最初の Issue (事前公開) も 6.4 でしたっけ?。
でも、 正式版は、カーネルの変更を反映して、 10.0 表記に変わり ... 。

それなのに、現行では、VB では、 OSVersion の返す値は 6.2.9200 ? が返って来るのですよね ... 。
    Visual Studio 2013 Community Update5 での お話 です。 *1.
    Visual Studio 2017 では こんな事はありません。  (対処不要)  *1.


こんなコードでした。
My.Computer.Info.OSPlatform & "  (V" & My.Computer.Info.OSVersion & ")"

解決策は ... 。
それを、
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.LocalMachine.OpenSubKey( _
        "SOFTWARE\Microsoft\Windows NT\CurrentVersion", False)
Me.Label1.Text = My.Computer.Info.OSPlatform & ".v." & My.Computer.Info.OSVersion & " / " & _
                                        regkey.GetValue("ProductName").ToString & " " & "(b:" & _
                                        regkey.GetValue("CurrentBuild").ToString & ") "

の様に、 レジストリに設定してある OS 絡みの設定値を併記するものに改めました。


OS の方針変更は、時として、この様に、 悩み多い問題 を提示します。
この問題は、既に、既知の類なのでしょうが、
Windows 7 を使い続けて、やっと、Windows 10 に上がった私には、 浦島太郎 的 ショック なのでした ... 。
Windows 8.1 になった頃、 この辺りの仕組みの方針転換があった様ですね。
だから、 Windows 10 上から、OS のバージョンを尋ねても、方針転換前の 8 の値 6.2.9200 を返しているのでしょう。.

話を戻して、
レジストリはユーザーが書き換え可能ですが、
認証を通らなくする様な、故意の 或いは 不注意による 値変更のケースは 考えたくないので、
これを信じる事にします。



プログラムを公開するなら、
マニフェストを それ用に しっかり 調整 する事で、 変数の戻り値は正確なものになるんだそうです。
つまり、サポートする OS の範囲を明記だそうです。  未検証。.



別の方法として、

System.Management.dll を参照設定して、

Dim mc As New System.Management.ManagementClass("Win32_OperatingSystem")
Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances()
Dim moName As String = ""
Dim moVers As String = ""
For Each mo As System.Management.ManagementObject In moc
            moName = mo("Caption").ToString
            moVers = mo("Version").ToString
Next

ですって。  未検証。.
参照設定は面倒ですが、これも正解なのでしょうね。



それにしても、 面倒な事になっているもんですね。
あ~、びっくりした。



尚、 msdn に正式な記述があります。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms724832%28v=vs.85%29.aspx

それの一部を 引用して置きます。  外部リンクの部分は参照を外しています。.

* For applications that have been manifested for Windows 8.1 or Windows 10. Applications not manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version value (6.2). To manifest your applications for Windows 8.1 or Windows 10, refer to Targeting your application for Windows.

まったく もう。



[2016/06/01] コードの不備を訂正 Me.Label1.Text = My.Computer.Info.OSPlatform の部分.
[2017/07/28] 誤字訂正 及び VS2017 の件を追記 *1.

0 件のコメント:

コメントを投稿