2015-07-20 10 views
9

Kiedy zadzwonić systemu Windows 10 w wersji z:Okna 10 RTM wersja_systemu_operacyjnego nie wraca czego oczekuję

Environment.OSVersion.ToString() 

Return to

enter image description here

Windows 8 i 8.1 wersja 6.2 nie powrócić 6.3?

Im systemie Windows 10 RTM (upgrade z Insider z Windows Update) VS 2015 i .NET 4.6 RC

teraz muszę dostać odpowiednią wersję systemu Windows, wszystkie rozwiązania?

+3

Należy zachować ostrożność podczas wywoływania błędów i wykonywania z nich wszystkich zakrętek. Istnieje szansa, że ​​sprawdzony framework, którego używasz, nie jest w zasadzie błędny. – zneak

Odpowiedz

11

To nie jest błąd, to jest w MSDN:

Operating System Version

Windows 10 Insider Preview 10.0* 
Windows Server Technical Preview 10.0* 
Windows 8.1 6.3* 

*: Do zastosowań, które zostały przejawia for Windows 8.1 i Windows 10 Insider Preview. Aplikacje niewykazane dla Windows 8.1 lub Windows 10 Insider Preview zwrócą wersję systemu operacyjnego Windows 8 (6.2). Aby zamanifestować swoje aplikacje dla Windows 8.1 lub Windows 10 Insider Preview, zobacz Targeting your application for Windows.

Czego potrzebujesz mimo to wersji dla systemu Windows?

+0

Nie działa w C# .... Widzę przewodnik – user3477026

+0

Environment.OSVersion.ToString() Zwróć 6.2 na Windows 8.1 Aktualizacja 3 nie 6.3! – user3477026

+2

Fakt, że aplikacja daje "6.2" w Windows 8.1 oznacza, że ​​aplikacja nie jest zamanifestowana dla wersji 8.1. Przeczytaj stronę MSDN, w szczególności link [Targeting your application for Windows] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241 (v = vs.85) .aspx). – CodeCaster

13

Zamiast tego użyj zapytania WMI, jest to najbardziej niezawodny sposób uzyskania wersji i powiązanej nazwy produktu.

 public static KeyValuePair<string, string> GetOSVersionAndCaption() 
     { 
       KeyValuePair<string, string> kvpOSSpecs = new KeyValuePair<string, string>(); 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption, Version FROM Win32_OperatingSystem"); 
     try 
     { 

      foreach (var os in searcher.Get()) 
      { 
       var version = os["Version"].ToString(); 
       var productName = os["Caption"].ToString(); 
       kvpOSSpecs = new KeyValuePair<string, string>(productName, version); 
      } 
     } 
     catch { } 

     return kvpOSSpecs; 
    } 
+1

Będziesz także chciał zapytać o ProductType, aby odróżnić Windows 10 od Windows Server 2016.ProductType będzie jednym z: 1: Workstation - Windows 10 2: Kontroler domeny 3: Serwer - Windows Server 2016 –

0

systemu Windows 10 ma nowy klucz rejestru - dostaniesz wynik 10 od Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", Nothing) i (teoretycznie) nie z wcześniejszymi wersjami.

To działa w ciągu 0 milisekund zgodnie z obiektem stopera, podczas gdy metoda WMI zajmuje dla mnie co najmniej 30 ms.

+2

_ "To działa w czasie krótszym niż 0 milisekund" _ - więc mówisz, że ten klucz rejestru się zatrzymuje sekret podróży w czasie? – CodeCaster

+0

Rzeczywiście, zawsze bawi mnie to, gdy czas jest podawany jako 0ms :) –

+0

30 ms nie wydaje się zbyt wysoką ceną za API, do którego wystarczy zadzwonić tylko raz i faktycznie działa poprawnie dla większości wersji (począwszy od Windows 2000) przed Windows 10. Korzystanie z rejestru wymaga obsługi przypadku wcześniejszych wersji, które nie obsługują CurrentMajorVersionNumber. Jeśli używasz rejestru, pamiętaj, że system Windows Server 2016 zgłasza również CurrentMajorVersionNumber = 10. Dostęp do parametru InstallationType jest potrzebny do ich rozróżnienia. Może to być: Klient | Serwer | ... Możesz potrzebować 2-3 dostępu do rejestru. Może to trwać dłużej niż 3 X 0ms :) –