Betriebssystem Win11 auslesen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Betriebssystem Win11 auslesen

    Moin!

    in Anlehnung an Betriebssystem auslesen für Windows 10 würde mich interessieren, wie man ziemlich sicher Win11 auslesen kann bzw. mir reicht es eigentlich schon aus festzustellen, dass es sich um "Win10" oder "Win11" handelt.

    Mein Code bisher ist

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function GetWindwosClientVersion4Folder(Optional Log As EBL.Logger.Log = Nothing) As String
    2. '------ http://ms-wiki-1/eblwiki/index.php?title=Miscellaneous_(Klasse_von_EBL.Service)#GetWindwosClientVersion4Folder ---
    3. ' Quelle: https://www.vb-paradise.de/index.php/Thread/116592-Betriebssystem-auslesen-f%C3%BCr-Windows-10/
    4. Dim major As Integer = System.Environment.OSVersion.Version.Major
    5. Dim minor As Integer = System.Environment.OSVersion.Version.Minor
    6. Dim build As Integer = System.Environment.OSVersion.Version.Build
    7. If System.IO.File.Exists(_k_EBL_OSystem) = False Then
    8. Log.WriteAsError("Kein Zugriff auf das Verzeichnis:" & Environment.NewLine &
    9. _k_EBL_OSystem & Environment.NewLine &
    10. "Diese Datei wird für die Ermittlung des Betriebssystems benötigt!" & Environment.NewLine & Environment.NewLine &
    11. "major:= " & major.ToString & Environment.NewLine &
    12. "minor:= " & minor.ToString & Environment.NewLine &
    13. "build:= " & build.ToString)
    14. Return ""
    15. End If
    16. Try
    17. If major = 6 AndAlso minor = 1 Then
    18. Return "Win7"
    19. 'ElseIf major = 6 AndAlso minor = 2 AndAlso build = 9200 Then
    20. ' Return "Win8"
    21. 'ElseIf major = 6 AndAlso minor = 2 AndAlso build = 9600 Then
    22. ' Return "Win8"
    23. ElseIf major = 10 AndAlso minor = 0 AndAlso build = 10240 Then
    24. Return "Win10"
    25. ElseIf major = 6 AndAlso minor = 2 AndAlso build = 9200 Then
    26. Return "Win10"
    27. ElseIf major = 10 AndAlso minor = 0 AndAlso build = 16299 Then ' PC SchlaussSe
    28. Return "Win10"
    29. ElseIf major = 10 AndAlso minor = 0 AndAlso build = 14393 Then ' Server 2016 - ms-kanaldatdb-1
    30. Return "Win10"
    31. ElseIf major = 10 AndAlso minor = 0 Then ' damit es weitestgehend passt
    32. Return "Win10"
    33. Else
    34. Log.WriteAsError("Es liegt eine Version vor, die nicht unterstützt wird!" & Environment.NewLine & _
    35. "major:= " & major.ToString & Environment.NewLine & _
    36. "minor:= " & minor.ToString & Environment.NewLine & _
    37. "build:= " & build.ToString)
    38. End If
    39. Catch ex As Exception
    40. Log.WriteAsError("unvorhergesehener Fehler in EBL.Service > Miscellaneous > GetWindwosClientVersion4Folder" & Environment.NewLine & _
    41. "major:= " & major.ToString & Environment.NewLine & _
    42. "minor:= " & minor.ToString & Environment.NewLine & _
    43. "build:= " & build.ToString & Environment.NewLine & ex.ToString)
    44. End Try
    45. Return ""
    46. End Function



    Kann mir einer weiterhelfen?

    Gruß Jan
    @jan99 Probierma
    ' ab Framework 4.8 oder so

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. '-----
    3. MessageBox($"System: {RuntimeInformation.OSDescription}")

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja, die 22631 sagt Dir das Du Win11 23H2 hast -> learn.microsoft.com/de-de/wind…ows11-release-information

    Edit: Du kannst auch entsprechende APIs zum auslesen der Versionsinfo nutzen. z.B. learn.microsoft.com/de-de/wind…/wdm/nf-wdm-rtlgetversion mit Struct OSVERSIONINFOEXW. Ansonsten gibt es noch weitere APIs. Schaust Du hier: https://learn.microsoft.com/de-de/windows/win32/sysinfo/version-helper-apis

    Edit2: Hier gibt es eine komplette Klasse VersionHelper auf Basis entsprechender APIs: stackoverflow.com/questions/31…he-new-version-helper-api
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    Ich mach das in meinen aktuellen Projekten so:

    VB.NET-Quellcode

    1. 'Betriebssystem prüfen
    2. If Not My.Computer.Info.OSFullName.Contains("indows 10") And Not My.Computer.Info.OSFullName.Contains("indows 11") Then
    3. MessageboxSelf("Windows 10 oder Windows 11 erforderlich!", "Windows 10 or Windows 11 expected", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    4. End
    5. End If


    MessageboxSelf() ist eine Custom-Messagebox

    Das hat bisher immer funktioniert, egal welche Version man verwendet (IOT, Value, Enterprise ...).
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @jan99 Auf die schnelle per API. Leicht abgeändertetes Bsp. nach dem SO Thread.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' https://en.wikipedia.org/wiki/Windows_10_version_history
    2. ' https://en.wikipedia.org/wiki/Windows_11_version_history
    3. Imports System.Runtime.InteropServices
    4. Public Class Form1
    5. #Region "APIs"
    6. <DllImport("Ntdll.dll", EntryPoint:="RtlGetVersion")>
    7. Private Shared Function RtlGetVersion(ByRef lpVersionInformation As OSVERSIONINFOEXW) As Integer
    8. End Function
    9. #End Region
    10. #Region "Const"
    11. Private Const WIN32_WINNT_WIN10 As Short = &HA00 ' Windows 10, 11
    12. #End Region
    13. #Region "Structure"
    14. Private Structure OSVERSIONINFOEXW
    15. Dim dwOSVersionInfoSize As Integer
    16. Dim dwMajorVersion As Integer
    17. Dim dwMinorVersion As Integer
    18. Dim dwBuildNumber As Integer
    19. Dim dwPlatformId As Integer
    20. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Dim szCSDVersion As String
    21. Dim wServicePackMajor As Short
    22. Dim wServicePackMinor As Short
    23. Dim wSuiteMask As Short
    24. Dim wProductType As Byte
    25. Dim wReserved As Byte
    26. End Structure
    27. #End Region
    28. #Region "Functions"
    29. Private Shared Function LoByte(ByVal w As Short) As Byte
    30. Return CByte(w And &HFF)
    31. End Function
    32. Private Shared Function HiByte(ByVal w As Short) As Byte
    33. Return CByte(w >> 8 And &HFF)
    34. End Function
    35. Private Function IsWindowsVersionOrGreater(dwMajorVersion As Integer,
    36. dwMinorVersion As Integer,
    37. wServicePackMajor As Short,
    38. Optional wServicePackMinor As Short = 0,
    39. Optional dwBuild As Integer = 0) As Boolean
    40. Dim Ret As Boolean
    41. Dim OSVERSIONINFO As New OSVERSIONINFOEXW With {
    42. .dwOSVersionInfoSize = Marshal.SizeOf(Of OSVERSIONINFOEXW)
    43. }
    44. If RtlGetVersion(OSVERSIONINFO) = 0 Then
    45. With OSVERSIONINFO
    46. Select Case True
    47. Case .dwMajorVersion > dwMajorVersion : Ret = True
    48. Case .dwMinorVersion > dwMinorVersion : Ret = True
    49. Case .wServicePackMajor > wServicePackMajor : Ret = True
    50. Case .wServicePackMinor > wServicePackMinor : Ret = True
    51. Case .dwBuildNumber >= dwBuild : Ret = True
    52. End Select
    53. End With
    54. End If
    55. Return Ret
    56. End Function
    57. Public Function IsWindows10_OrGreater() As Boolean
    58. IsWindows10_OrGreater = IsWindowsVersionOrGreater(HIBYTE(WIN32_WINNT_WIN10), LOBYTE(WIN32_WINNT_WIN10), 0, 0, 0)
    59. End Function
    60. ' => Win11 21H2
    61. Public Function IsWindows11_OrGreater() As Boolean
    62. IsWindows11_OrGreater = IsWindowsVersionOrGreater(HIBYTE(WIN32_WINNT_WIN10), LOBYTE(WIN32_WINNT_WIN10), 0, 0, 22000)
    63. End Function
    64. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    65. Debug.Print(IsWindows10_OrGreater.ToString)
    66. Debug.Print(IsWindows11_OrGreater.ToString)
    67. End Sub
    68. #End Region
    69. End Class

    Mfg -Franky-