Feedback

C# - Version des Betriebssystem

Veröffentlicht von am 2/27/2014
(1 Bewertungen)
Gibt die Version des Windows OS als string zurück.

Info :
Alle Version unter Windows Vista werden niemals angezeigt, da das entsprechende Framework dort nicht installiert werden kann. Zur Vollständigkeit wurden sie dennoch hinzugefügt.

(.NET4.5/VS2012) auf Berufung von :
http://www.gaijin.at/lstwinver.php
public static string GetWindwosClientVersion()
        {
            int major = System.Environment.OSVersion.Version.Major;
            int minor = System.Environment.OSVersion.Version.Minor;
            int build = System.Environment.OSVersion.Version.Build;
            

            if (major == 4 && minor == 0 && build == 950)
                return "Win95 Release 1";
            else if (major == 4 && minor == 0 && build == 1111)
                return "Win95 Release 2";
            else if (major == 4 && minor == 3 && (build == 1212 || build == 1213 || build == 1214))
                return "Win95 Release 2.1";
            else if (major == 4 && minor == 10 && build == 1998)
                return "Win98";
            else if (major == 4 && minor == 10 && build == 2222)
                return "Win98 Second Edition";
            else if (major == 4 && minor == 90)
                return "WinMe";
            else if (major == 5 && minor == 0)
                return "Win2000";
            else if (major == 5 && minor == 1 && build == 2600)
                return "WinXP";
            else if (major == 6 && minor == 0)
                return "Vista";
            else if (major == 6 && minor == 1)
                return "Win7";
            else if (major == 6 && minor == 2 && build == 9200)
                return "Win8 | Win8.1";
            else if (major == 6 && minor == 2 && build == 9600)
                return "Win8.1 Update 1";
            else if (major == 10 && minor == 0 && build == 10240)
                return "Win10";
            else
                return "Can not find os version.";
        }

9 Kommentare zum Snippet

Patrick Semmler schrieb am 2/28/2014:
So weit ich das mitbekommen habe, ist die API-Funktion, die im Hintergrund die Versionsnummer liefert, seit Windows 8.1 deprecated und liefert nur 6.2 als Version (Windows 8.0). Mann muss entweder im Manifest Windows 8.1 explizit als unterstützte Windows-Version angeben oder mit den Ersatz-API-Funktionen arbeiten.
Über WMI wird weiterhin die korrekte Versionsnummer ausgelesen. Mal schauen, ob das in Windows 9 auch noch der Fall ist...
Koopakiller schrieb am 3/1/2014:
Also mir wird ordnungsgemäß "win8.1" geliefert. (.NET 4.5/VS 2013)
Trotzdem sollte man die Methode static und wahrscheinlich auch public machen. So braucht man weder eine Klasseninstanz noch x-mal den selben Code.

Ich habe eben nochmal nachgeschaut. Intern wird die GetVersion bzw. GetVersionEx-Methode verwendet:
http://referencesource-beta.microsoft.com/#mscorlib/system/environment.cs#67900ccbbcff63a2
Laut MSDN sind die beiden Funktionen erst nach Win8.1 nicht mehr up-to-date. Allerdings verhält es sich dann wahrscheinlich so, dass die Frameworks auf dem neueren Windows ensprechende Updates bekommen und somit andere Funktionen aufrufen.
Patrick Semmler schrieb am 3/4/2014:
@Koopakiller:
Bei mir wird mit .Net 3.5 nur Version 6.2 unter Windows 8.1 geliefert:
System.Environment.OSVersion.Version: 6.2.9200.0
Vielleicht wird mit VS2013 die Anwendung entsprechend "gemanifist..." ääh "gemanifestet":

With the release of Windows 8.1, the behavior of the GetVersion API has changed in the value it will return for the operating system version. The value returned by the GetVersion function now depends on how the application is manifested.
Koopakiller schrieb am 3/4/2014:
@Patrick: Entweder das oder dir fehlt ein Update ;) Mit VS 2010 sieht es bei mir genauso aus, mit VS 2013 und .NET 3.4 klappt aber alles.
Wie auch immer, solange nicht win98 heraus kommt bin ich schon zufrieden.

PS: Das hab' ich das letzte mal vergessen, die ersten 4 else if sind verdreht.
Koopakiller schrieb am 12/3/2014:
Mittlerweile kann ich das Problem mit der "falschen" Versionsnummer unter 8.1 reproduzieren. Ich weiß allerdings nicht mehr, was ich damals anders gemacht habe.

Ergänzend noch ein Link auf mein aktuelles Snippet:
http://dotnet-snippets.de/snippet/os-version-name-mit-wmi/4929
Dort ermittle ich den Namen mit Hilfe der WMI
Enrico Wüstenberg schrieb am 7/6/2015:
Korrekturen wurden eingearbeitet und auf den neusten Stand gebracht.
Test's werden in kürze durchgeführt.
PadMan schrieb am 8/30/2015:
Ich habe den Code auf Windows 10 (Version 10, Build 10240), VS 2015 getestet, leider liefert der Code trotz Manifest-Datei Win8 als Ergebnis zurück. Leider kenne ich mit der Materie nicht so gut aus um den Fehler zu beheben. M$ hat wohl leider ein wenig zu viel unter der "Haube" geschraubt. Gibt man in der CMD set ein, steht z.B. folgendes: OS=Windows_NT
Koopakiller schrieb am 8/31/2015:
Das dürfte daran liegen das System.Environment.OSVersion noch immer auf GetVersionEx setzt. Das wird nach Windows 8.1 nicht mehr unterstützt (lt. MSDN).
Vielleicht ist aber meine WMI Version etwas für dich:
http://dotnet-snippets.de/snippet/os-version-name-mit-wmi/4929
ThoBe schrieb am 9/9/2015:
Um unter Windows 8.1 / Windows 10 die richtige OS Version zu bekommen, ist es notwendig, dass die Application ein app.manifest Datei enthält. und hier die SupportedOS Versionen (vorallem 8.1 und 10) eingetragen sind. siehe auch:
https://social.msdn.microsoft.com/Forums/azure/en-US/07cbfc3a-bced-45b7-80d2-a9d32a7c95d4/supportedos-manifest-for-windows-10?forum=windowsgeneraldevelopmentissues
 

Logge dich ein, um hier zu kommentieren!