|
|
|
import psutil
|
|
import wmi
|
|
import pynvml
|
|
import threading
|
|
import time
|
|
|
|
|
|
def safe_call(func, name):
|
|
try:
|
|
return func()
|
|
except Exception as e:
|
|
print(f"[WARN] {name} konnte nicht geladen werden: {e}")
|
|
return None
|
|
|
|
|
|
def get_physical_drives_with_partitions_and_labels():
|
|
c = wmi.WMI()
|
|
drive_map = {}
|
|
|
|
for disk in c.Win32_DiskDrive():
|
|
disk_id = disk.DeviceID.split("\\")[-1].upper()
|
|
if disk_id not in drive_map:
|
|
drive_map[disk_id] = []
|
|
|
|
partitions = disk.associators("Win32_DiskDriveToDiskPartition")
|
|
for partition in partitions:
|
|
logical_disks = partition.associators("Win32_LogicalDiskToPartition")
|
|
for logical_disk in logical_disks:
|
|
letter = logical_disk.DeviceID.upper().strip()
|
|
volume_name = logical_disk.VolumeName or "Kein Name"
|
|
if not any(d["letter"] == letter for d in drive_map[disk_id]):
|
|
drive_map[disk_id].append({
|
|
"letter": letter,
|
|
"label": volume_name
|
|
})
|
|
print("[DEBUG] Drive Info:", drive_map)
|
|
return drive_map
|
|
|
|
|
|
|
|
def get_cpu_info():
|
|
cpu_freq = psutil.cpu_freq()
|
|
cpu_info = {
|
|
"logical_cores": psutil.cpu_count(logical=True),
|
|
"physical_cores": psutil.cpu_count(logical=False),
|
|
"frequency": round(cpu_freq.max) if cpu_freq else None,
|
|
}
|
|
return cpu_info
|
|
|
|
|
|
def get_ram_info():
|
|
mem = psutil.virtual_memory()
|
|
ram_info = {
|
|
"total_gb": round(mem.total / (1024 ** 3)),
|
|
"available_gb": round(mem.available / (1024 ** 3)),
|
|
}
|
|
print("[DEBUG] RAM Info:", ram_info)
|
|
return ram_info
|
|
|
|
|
|
|
|
def get_gpu_info():
|
|
gpu_info = []
|
|
pynvml.nvmlInit()
|
|
try:
|
|
device_count = pynvml.nvmlDeviceGetCount()
|
|
for i in range(device_count):
|
|
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
|
|
name_raw = pynvml.nvmlDeviceGetName(handle)
|
|
name = name_raw.decode() if isinstance(name_raw, bytes) else name_raw
|
|
mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
|
|
|
|
try:
|
|
max_temp = pynvml.nvmlDeviceGetTemperatureThreshold(
|
|
handle,
|
|
pynvml.NVML_TEMPERATURE_THRESHOLD_GPU_MAX
|
|
)
|
|
except Exception:
|
|
max_temp = 90
|
|
|
|
gpu_info.append({
|
|
"name": name,
|
|
"memory_total_mb": int(mem_info.total / 1024**2),
|
|
"max_temp": max_temp
|
|
})
|
|
except Exception as e:
|
|
print(f"[WARN] GPU-Info konnte nicht geladen werden: {e}")
|
|
finally:
|
|
pynvml.nvmlShutdown()
|
|
print("[DEBUG] RAM Info:", gpu_info)
|
|
return gpu_info
|
|
|
|
|
|
def get_network_adapters():
|
|
c = wmi.WMI()
|
|
adapters = []
|
|
for nic in c.Win32_NetworkAdapterConfiguration(IPEnabled=True):
|
|
if hasattr(nic, 'Description'):
|
|
adapters.append(nic.Description)
|
|
print("[DEBUG] RAM Info:", adapters)
|
|
return adapters
|
|
|
|
|
|
def detect_hardware():
|
|
drive_map = safe_call(get_physical_drives_with_partitions_and_labels, "Laufwerke") or {}
|
|
cpu_info = safe_call(get_cpu_info, "CPU") or {}
|
|
gpu_info = safe_call(get_gpu_info, "GPU") or []
|
|
ram_info = safe_call(get_ram_info, "RAM") or {}
|
|
network_adapters = safe_call(get_network_adapters, "Netzwerkadapter") or []
|
|
'''
|
|
device_partitions = [
|
|
(dev, part)
|
|
for dev, parts in drive_map.items()
|
|
for part in parts
|
|
]
|
|
'''
|
|
return {
|
|
'cpu_info': cpu_info,
|
|
'ram_info': ram_info,
|
|
'gpu_info': gpu_info,
|
|
'network_adapters': network_adapters,
|
|
'drive_map': drive_map
|
|
}
|
|
|
|
|
|
|
|
def main():
|
|
print("[INFO] Starte Hardware-Erkennung...\n")
|
|
hardware_info = detect_hardware()
|
|
|
|
|
|
|
|
|
|
|
|
print("\n[INFO] Warte 5 Sekunden...")
|
|
time.sleep(5)
|
|
print("[INFO] Hardware Erkennung beendet.")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
|