VBA Tipp: Windows-Version ermitteln

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte per VBA-Code ermitteln, welche Windows-Version mein Zielrechner hat.

Lösung 1

Das geht mit der folgenden Funktion, die in einem globalen Modul gespeichert wird:

Public Function WindowsVersion()
 
 'Name, Versionsnummer mit Build, Servicepack, Architektur des Betriebssystems ermitteln
 'Quelle: www.dbwiki.net oder www.dbwiki.de
 
 Dim objWMI      As Object  'Windows Management Instrumentation (WMI)
 Dim objWMIe     As Object
 Dim obj         As Object
 Dim sql         As String
 Dim meldung     As String
 Dim strComputer As String
 
 On Error Resume Next
 
 ' Lokaler Rechner
 strComputer = "."
 
 ' WMI-Objekt erstellen
 Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 
 ' SQL
 sql = "SELECT * FROM Win32_OperatingSystem"
 
 ' Abfrage ausführen
 Set objWMIe = objWMI.ExecQuery(sql)
 
 ' Ergebnisliste durchlaufen
 For Each obj In objWMIe
 
   ' Name des Betriebssystems
   meldung = "Betriebssystem: " & obj.Caption & vbCrLf
 
   ' Versionsnummer und Build
   meldung = meldung & "Versionsnummer und Build: " & obj.Version & vbCrLf
 
   ' ServicePack
   meldung = meldung & "ServicePack: " & obj.CSDVersion & vbCrLf
 
 Next obj
 
 
 ' SQL
 sql = "SELECT * FROM Win32_ComputerSystem"
 
 ' Abfrage ausführen
 Set objWMIe = objWMI.ExecQuery(sql)
 
 ' Ergebnisliste durchlaufen
 For Each obj In objWMIe
   meldung = meldung & "Architektur: " & obj.SystemType & vbCrLf
 Next obj
 
 Set obj = Nothing
 Set objWMIe = Nothing
 Set objWMI = Nothing
 
 WindowsVersion = meldung
 
End Function

Aufruf

MsgBox WindowsVersion

Web-Links


Lösung 2

  • Das geht mit der folgenden API-Funktion und VBA-Funktion, die in einem globalen Modul gespeichert werden.
  • Die Ergebnisse der VBA-Funktion (Rückgabewert) werden in der anschließenden Tabelle ausgewertet.
'Konstanten für wProductType (Produkt Typ)
Private Const VER_NT_WORKSTATION As Byte = &H1       '1 Arbeitsplatz
Private Const VER_NT_DOMAIN_CONTROLLER As Byte = &H2 '2 Server und Domain-Controller
Private Const VER_NT_SERVER As Byte = &H3            '3 Server
 
Private Type RTL_OSVERSIONINFOEXW
  dwOSVersionInfoSize As Long
  dwMajorVersion      As Long
  dwMinorVersion      As Long
  dwBuildNumber       As Long
  dwPlatformId        As Long
  szCSDVersion        As String * 256
  wServicePackMajor   As Integer
  wServicePackMinor   As Integer
  wSuiteMask          As Integer
  wProductType        As Byte
  wReserved           As Byte
End Type
 
Private Declare Function RtlGetVersion Lib "ntdll" _
                         (lpVersionInformation As RTL_OSVERSIONINFOEXW) As Long
 
Public Function WindowsVersion() As String
 
 'Quelle: www.dbwiki.net oder www.dbwiki.de
 
 Dim v As RTL_OSVERSIONINFOEXW
 Dim SP As String
 
 v.dwOSVersionInfoSize = Len(v)
 Call RtlGetVersion(v)
 
 'String für Servicepack aufbereiten
 SP = Left(v.szCSDVersion, InStr(1, v.szCSDVersion, vbNullChar) - 1)
 
 WindowsVersion = " Plattform-ID: " & v.dwPlatformId & vbCrLf & _
                  " Windows-Hauptversion: " & v.dwMajorVersion & vbCrLf & _
                  " Windows-Unterversion: " & v.dwMinorVersion & vbCrLf & _
                  " Build: " & v.dwBuildNumber & vbCrLf & _
                  " ServicePack: " & SP & vbCrLf & _
                  " ServicePack-Hauptversion: " & v.wServicePackMajor & vbCrLf & _
                  " ServicePack-Unterversion: " & v.wServicePackMinor & vbCrLf & _
                  " Ausgabe-Variante: " & v.wSuiteMask & vbCrLf & _
                  " Produkt-Typ: " & v.wProductType & vbCrLf & _
                  " Reserve: " & v.wReserved
 
End Function

Aufruf

MsgBox WindowsVersion


Auswertung der Ergebnisse der Funktion WindowsVersion() in Lösung 2
Windows
Hauptversion
Windows
Nebenversion
Produkt-Typ Windows Produkt-Name
10 0 1 Windows 10
10 0 ungleich 1 Windows Server 2016
6 3 1 Windows 8.1
6 3 ungleich 1 Windows Server 2012 R2
6 2 1 Windows 8
6 2 ungleich 1 Windows Server 2012
6 1 1 Windows 7
6 1 ungleich 1 Windows Server 2008 R2
6 0 1 Windows Vista
6 0 ungleich 1 Windows Server 2008
5 2 Windows Server 2003 R2
5 2 Windows Home Server
5 2 Windows Server 2003
5 2 1 Windows XP Professional x64 Edition
5 1 Windows XP
5 0 Windows 2000


Wiki hinweis.png Anmerkung: Die Vorgänger-Lösung mit der API-Funktion GetVersionEx und den Strukturen OSVERSIONINFO bzw. OSVERSIONINFOEX funktioniert nur bis Windows 8.0., und ist daher veraltet.


Web-Links