Betriebssystem ermitteln

Anfängerfragen zum Programmieren mit PureBasic.
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Betriebssystem ermitteln

Beitrag von texti »

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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Willkommen an Board! :D

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.
texti
Beiträge: 42
Registriert: 13.03.2009 13:24

Beitrag von texti »

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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Deshalb auch die Frage, wie man feststellen kann, ob es 32- oder 64-Bit Windows ist.

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
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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ 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 gibt

Code: Alles auswählen

Debug SizeOf(Integer)
immer 4 aus. Dies kann man also höchstens zur Kompilezeit ermitteln.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

aha, gut.

... dann hilf mal weiter.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Gerne doch: :wink:

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()
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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

hiermit kann man die OS-Version nebst Service-Pack ermitteln.

(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()
mit WMI geht noch etliches mehr (einfach mal ausprobieren).

Grüße ... Kiffi
Hygge
Benutzeravatar
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

Beitrag von ts-soft »

Da hat Peter eine dem Fragesteller wichtige Option vorenthalten :wink:

Code: Alles auswählen

Debug "OSArchitektur: " + OS_Info\GetStringProperty("OSArchitecture")
Diese Zeile noch einfügen

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.
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ts-soft hat geschrieben:Da hat Peter eine dem Fragesteller wichtige Option vorenthalten :wink:
:lol:

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
war nur zu faul, das alles umzusetzen ;-)

deswegen auch:
Kiffi hat geschrieben:mit WMI geht noch etliches mehr (einfach mal ausprobieren).
Grüße ... Kiffi
Hygge
Antworten