Betriebssystem ermitteln
Betriebssystem ermitteln
Hallo Leute!
Ich bin auf der Suche nach Routine, mit der man nicht nur grob das verwendete Betriebssystem (über osversion() ist das kein problem) feststellen kann, sondern auch welche (Windows-)version (bei XP z.B. MCE) und welche Servicepacks installiert sind. Außerdem wäre noch wichtig, ob es 32- oder 64-Bit Windows ist.
Suche schon länger danach, konnte aber noch nix finden. Danke schonmal für Eure Mühe. Ach ja, bin Anfänger. Wenn jemand nen Quelltext postet, bitte mit Kommentare dazu, damit ich es nachvollziehen kann.
Gruß
Ich bin auf der Suche nach Routine, mit der man nicht nur grob das verwendete Betriebssystem (über osversion() ist das kein problem) feststellen kann, sondern auch welche (Windows-)version (bei XP z.B. MCE) und welche Servicepacks installiert sind. Außerdem wäre noch wichtig, ob es 32- oder 64-Bit Windows ist.
Suche schon länger danach, konnte aber noch nix finden. Danke schonmal für Eure Mühe. Ach ja, bin Anfänger. Wenn jemand nen Quelltext postet, bitte mit Kommentare dazu, damit ich es nachvollziehen kann.
Gruß
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Willkommen an Board!
nur mal Angemerkt:
OSVersion() dient nicht zur Unterscheidung von LINUX, MacOS und Windows,
ich weiß nicht, warum sich diese Anti-Information so hartnäckig hält und oft wiederholt wird.
LINUX und MacOS sind schließlich keine Versionen von Windows!
Es sind völlig andere Betriebssysteme, auf denen Windows-Executables noch nicht einmal laufen.
deswegen würde es auch nicht den geringsten Sinn ergeben, eine Funktion zu haben,
die zur Laufzeit ermitteln kann, ob das Programm auf Linux oder Windows läuft,
weil das Programm das schon alleine daran "unterscheiden" könnte, ob es überhaupt startet oder nicht.
OSVersion() dient einzig und allein zur Unterscheidung der verschiedenen Windows Versionen,
wie man aus der Hilfe unschwer herauslesen kann, können die Rückgabewerte folgendes sein:
#PB_OS_Windows_NT3_51
#PB_OS_Windows_95
#PB_OS_Windows_NT_4
#PB_OS_Windows_98
#PB_OS_Windows_ME
#PB_OS_Windows_2000
#PB_OS_Windows_XP
#PB_OS_Windows_Server_2003
#PB_OS_Windows_Vista
#PB_OS_Windows_Server_2008
ich sehe hier kein LINUX und kein Mac....
................
zu ServicePack und Edition werden dir vielleicht später unsere API-Profis was sagen können,
wenn es dafür Routinen gibt, dann sind die von Microsoft selber.
aber bei so spezifischen Abfragen wird dir vielleicht die MSDN besser weiterhelfen können.
nur mal Angemerkt:
OSVersion() dient nicht zur Unterscheidung von LINUX, MacOS und Windows,
ich weiß nicht, warum sich diese Anti-Information so hartnäckig hält und oft wiederholt wird.
LINUX und MacOS sind schließlich keine Versionen von Windows!
Es sind völlig andere Betriebssysteme, auf denen Windows-Executables noch nicht einmal laufen.
deswegen würde es auch nicht den geringsten Sinn ergeben, eine Funktion zu haben,
die zur Laufzeit ermitteln kann, ob das Programm auf Linux oder Windows läuft,
weil das Programm das schon alleine daran "unterscheiden" könnte, ob es überhaupt startet oder nicht.
OSVersion() dient einzig und allein zur Unterscheidung der verschiedenen Windows Versionen,
wie man aus der Hilfe unschwer herauslesen kann, können die Rückgabewerte folgendes sein:
#PB_OS_Windows_NT3_51
#PB_OS_Windows_95
#PB_OS_Windows_NT_4
#PB_OS_Windows_98
#PB_OS_Windows_ME
#PB_OS_Windows_2000
#PB_OS_Windows_XP
#PB_OS_Windows_Server_2003
#PB_OS_Windows_Vista
#PB_OS_Windows_Server_2008
ich sehe hier kein LINUX und kein Mac....
................
zu ServicePack und Edition werden dir vielleicht später unsere API-Profis was sagen können,
wenn es dafür Routinen gibt, dann sind die von Microsoft selber.
aber bei so spezifischen Abfragen wird dir vielleicht die MSDN besser weiterhelfen können.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Hallo und danke für die schnelle Antwort. Es scheint also nicht so einfach zu sein. Daß ein Windowsprogramm nicht auf nem Mac oder auf Linux (ohne Emulator) läuft, weiß ich. Vielleicht habe ich mich da falsch ausgedrückt. Ich hatte gehofft, daß man einfach ein paar Systemvariablen abfragen kann, um raus zu kriegen, welches Windows genau gerade läuft. Nur das mit osversion() ist nicht genau genug. Ich brauche das, weil ich nach der Abfrage der Windowsversion automatisch einen Treiber (den richtigen für das verwendete Betriebssystem) installieren lassen will. Deshalb auch die Frage, wie man feststellen kann, ob es 32- oder 64-Bit Windows ist. Vielleicht hat ja jemand so eine Routine schonmal fertig geschrieben.
Gruß
Gruß
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> Deshalb auch die Frage, wie man feststellen kann, ob es 32- oder 64-Bit Windows ist.
das ist eigentlich ziemlich einfach
was das "Betriebssystem" betrifft, ok, da haben wir wohl aneinander vorbei geredet.
Unterschiedliche Betriebssysteme sind z.b. Linux und Windows.
Windows2000 und WindowsXP sind unterschiedliche Versionen.
XP-Home, XP-Pro und XP-MDE sind unterschiedliche Editionen oder Ausgaben.
zum Unterschied 32bit / 64bit ist mir die offizielle Bezeichnung nicht momentan,
da wird zwar auch oft "Version" gesagt, aber der Begriff ist irreführend,
da gibt es auch eine offizelle genau passende Bezeichnung.
wie gesagt, so etwas wirst du grundsätzlich auf der MSDN finden,
wenn MicroSoft so etwas zur Verfügung stellt, dann ist die Info irgendwo dort vergraben.
.... und eventuell kommt hier ja noch eine fruchtbarere Antwort als ich in der Lage war zu liefern...
das ist eigentlich ziemlich einfach
Code: Alles auswählen
size = SizeOf(Integer)
If size = 4
Debug "32bit System"
ElseIf size = 8
Debug "64bit System"
Else
Debug "this line should never debug"
EndIf
Unterschiedliche Betriebssysteme sind z.b. Linux und Windows.
Windows2000 und WindowsXP sind unterschiedliche Versionen.
XP-Home, XP-Pro und XP-MDE sind unterschiedliche Editionen oder Ausgaben.
zum Unterschied 32bit / 64bit ist mir die offizielle Bezeichnung nicht momentan,
da wird zwar auch oft "Version" gesagt, aber der Begriff ist irreführend,
da gibt es auch eine offizelle genau passende Bezeichnung.
wie gesagt, so etwas wirst du grundsätzlich auf der MSDN finden,
wenn MicroSoft so etwas zur Verfügung stellt, dann ist die Info irgendwo dort vergraben.
.... und eventuell kommt hier ja noch eine fruchtbarere Antwort als ich in der Lage war zu liefern...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
@ Kaeru
Das ist nicht ganz richtig. So unterscheidet man zur Laufzeit nicht, ob es sich um ein 32- oder 64-Bitsystem handelt.
Denn mit einer x86 IDE auf einem x64 OS gibtimmer 4 aus. Dies kann man also höchstens zur Kompilezeit ermitteln.
Das ist nicht ganz richtig. So unterscheidet man zur Laufzeit nicht, ob es sich um ein 32- oder 64-Bitsystem handelt.
Denn mit einer x86 IDE auf einem x64 OS gibt
Code: Alles auswählen
Debug SizeOf(Integer)
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Gerne doch:
Bekomme hier immer 64, egal ob mit PBx86 oder PBx64 kompiliert - so solls ja auch sein.
Hinweis: Der erste Fall in der Prozedur kann auch so angepasst werden, dass man erkennen kann, ob ein 32-Bit Programm auf einem 64-Bit OS läuft! habs hier aber so gelassen, dass man die echte Architektur des OS zurückbekommt.
Code: Alles auswählen
Procedure getProcessorArchitechture()
If GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") = "AMD64"
ProcedureReturn 64 ; OS is 64-Bit, but program is 32-Bit
ElseIf GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") = "AMD64"
ProcedureReturn 64 ; OS and program are both 64-Bit
ElseIf GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") = "x86"
ProcedureReturn 32 ; both are 32-Bit
EndIf
; return 0, if failed
EndProcedure
Debug getProcessorArchitechture()
Hinweis: Der erste Fall in der Prozedur kann auch so angepasst werden, dass man erkennen kann, ob ein 32-Bit Programm auf einem 64-Bit OS läuft! habs hier aber so gelassen, dass man die echte Architektur des OS zurückbekommt.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
hiermit kann man die OS-Version nebst Service-Pack ermitteln.
(benötigt COMate von srod)
mit WMI geht noch etliches mehr (einfach mal ausprobieren).
Grüße ... Kiffi
(benötigt COMate von srod)
Code: Alles auswählen
IncludePath #PB_Compiler_Home + "srod\comate\"
XIncludeFile "comate.pbi"
Procedure.s Get_OS_Infos()
Protected objWMIService.COMateObject
Protected OS_Info.COMateObject
Protected OS_Infos.COMateEnumObject
objWMIService = COMate_GetObject("winmgmts:\\.\root\cimv2", "")
If objWMIService
OS_Infos = objWMIService\CreateEnumeration("ExecQuery('Select * from Win32_OperatingSystem')")
If OS_Infos
OS_Info = OS_Infos\GetNextObject()
While OS_Info
Debug "OS Name: " + OS_Info\GetStringProperty("Name")
Debug "Version: " + OS_Info\GetStringProperty("Version")
Debug "Service Pack: " + OS_Info\GetStringProperty("ServicePackMajorVersion") + "." + OS_Info\GetStringProperty("ServicePackMinorVersion")
OS_Info\Release()
OS_Info = OS_Infos\GetNextObject()
Wend
OS_Infos\Release()
EndIf
objWMIService\Release()
Else
Debug COMate_GetLastErrorDescription()
EndIf
EndProcedure
Get_OS_Infos()
Grüße ... Kiffi
Hygge
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Da hat Peter eine dem Fragesteller wichtige Option vorenthalten
Diese Zeile noch einfügen
Gruß
Thomas
Code: Alles auswählen
Debug "OSArchitektur: " + OS_Info\GetStringProperty("OSArchitecture")
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
ts-soft hat geschrieben:Da hat Peter eine dem Fragesteller wichtige Option vorenthalten
ich habe Euch noch ein paar Optionen mehr vorenthalten:
Code: Alles auswählen
BootDevice
BuildNumber
BuildType
Caption
CodeSet
CountryCode
CreationClassName
CSCreationClassName
CSDVersion
CSName
CurrentTimeZone
DataExecutionPrevention_32BitApplications
DataExecutionPrevention_Available
DataExecutionPrevention_Drivers
DataExecutionPrevention_SupportPolicy
Debug
Description
Distributed
EncryptionLevel
ForegroundApplicationBoost
FreePhysicalMemory
FreeSpaceInPagingFiles
FreeVirtualMemory
InstallDate
LargeSystemCache
LastBootUpTime
LocalDateTime
Locale
Manufacturer
MaxNumberOfProcesses
MaxProcessMemorySize
MUILanguages
Name
NumberOfLicensedUsers
NumberOfProcesses
NumberOfUsers
OperatingSystemSKU
Organization
OSArchitecture
OSLanguage
OSProductSuite
OSType
OtherTypeDescription
PAEEnabled
PlusProductID
PlusVersionNumber
Primary
ProductType
QuantumLength
QuantumType
RegisteredUser
SerialNumber
ServicePackMajorVersion
ServicePackMinorVersion
SizeStoredInPagingFiles
Status
SuiteMask
SystemDevice
SystemDirectory
SystemDrive
TotalSwapSpaceSize
TotalVirtualMemorySize
TotalVisibleMemorySize
Version
WindowsDirectory
deswegen auch:
Grüße ... KiffiKiffi hat geschrieben:mit WMI geht noch etliches mehr (einfach mal ausprobieren).
Hygge