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. Die Funktion verwendet die WMI (Windows Management Instrumentation).

Public Function WindowsVersion()
 
 ' - Name des Betriebssystems,
 ' - Versionsnummer mit Build,
 ' - Servicepack
 ' - und Architektur ermitteln
 ' Late Binding: Kein Verweis auf 'Microsoft WMI Scripting V1.2 Library' notwendig
 ' Quelle: www.dbwiki.net oder www.dbwiki.de
 
 Dim objWMI      As Object  ' WbemScripting.SWbemObject
 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

Lösung 2

  • Das geht mit der folgenden API-Deklaration 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.


Weblinks