import wmi
import re
import win32com
############ 1. 擷取硬體資訊,輸出 macode
# 1.CPU序列号(ID) 2.本地連接配接 無線區域網路 以太網的MAC 3.硬碟序列号(唯一) 4.主機闆序列号(唯一)
s = wmi.WMI()
def get_memory_info():
data = []
# 這個子產品用SQL語言擷取資料
wmi_service_obj = win32com.client.Dispatch("WbemScripting.SWbemLocator")
wmi_service_connector = wmi_service_obj.ConnectServer(".", "root\cimv2")
ram_collections = wmi_service_connector.ExecQuery("Select * from Win32_PhysicalMemory")
for ram in ram_collections: # 主機中存在很多根記憶體,要循環所有的記憶體資料
ram_size = int(int(ram.Capacity) / (1024 ** 3)) # 轉換記憶體機關為GB
item_data = {
"slot": ram.DeviceLocator.strip(),
"capacity": ram_size,
"model": ram.Caption,
"manufacturer": ram.Manufacturer,
"sn": ram.SerialNumber,
}
data.append(item_data) # 将每條記憶體的資訊,添加到一個清單裡
return data # 再對data清單封裝一層,傳回一個字典,友善上級方法的調用
# cpu 序列号
def get_CPU_info():
cpu = []
cp = s.Win32_Processor()
for u in cp:
cpu.append(
{
"Name": u.Name,
"Serial Number": u.ProcessorId,
"CoreNum": u.NumberOfCores
}
)
# print(":::CPU info:", json.dumps(cpu))
return cpu
# 硬碟序列号
def get_disk_info():
disk = []
for pd in s.Win32_DiskDrive():
disk.append(
{
"Serial": s.Win32_PhysicalMedia()[0].SerialNumber.lstrip().rstrip(), # 擷取硬碟序列号,調用另外一個win32 API
"ID": pd.deviceid,
"Caption": pd.Caption,
"size": str(int(float(pd.Size) / 1024 / 1024 / 1024)) + "G"
}
)
# print(":::Disk info:", json.dumps(disk))
return disk
# mac 位址(包括虛拟機的)
def get_network_info():
network = []
for nw in s.Win32_NetworkAdapterConfiguration(): # IPEnabled=0
if nw.MACAddress != None:
network.append(
{
"MAC": nw.MACAddress, # 無線區域網路擴充卡 WLAN 實體位址
"ip": nw.IPAddress
}
)
# print(":::Network info:", json.dumps(network))
return network
# 主機闆序列号
def get_mainboard_info():
mainboard = []
for board_id in s.Win32_BaseBoard():
mainboard.append(board_id.SerialNumber.strip().strip('.'))
return mainboard
# 由于機器碼太長,故選取機器碼字元串部分字元
# E0:DB:55:B5:9C:16BFEBFBFF00040651W3P0VKEL6W8T1Z1.CN762063BN00A8
# 1 61 k 8Z
# machinecode_str = ""
# machinecode_str = machinecode_str+a[0]['MAC']+b[0]['Serial Number']+c[0]['Serial']+d[0]
# gpu序列号
def get_gpu_info():
#for video in s.Win32_VideoController():
# print("video: %s" % video) # caption屬性可以從1中得到
gpuInfo=re.split('_|&',s.Win32_VideoController()[1].PNPDeviceID)
return gpuInfo[1]+gpuInfo[3]+gpuInfo[5][4:8]+gpuInfo[5][0:4]
if __name__ == '__main__':
print("get_disk_info Serial Number",get_disk_info()[0]["Serial"])
print("get_CPU_info Serial Number",get_CPU_info()[0]['Serial Number'])
print("get_network_info mac Number",get_network_info()[0]['MAC'])
print("get_mainboard_info Serial Number",get_mainboard_info()[0])
print("get_gpu_info Serial Number",get_gpu_info())
print("get_memory_info Serial Number", get_memory_info())
with open("test.txt", "w") as f:
f.write("get_disk_info Serial Number "+str(get_disk_info()[0]["Serial"])+"\n")
f.write("get_CPU_info Serial Number "+str(get_CPU_info()[0]['Serial Number'])+"\n")
f.write("get_network_info mac Number "+str(get_network_info()[0]['MAC'])+"\n")
f.write("get_mainboard_info Serial Number "+str(get_mainboard_info()[0])+"\n")
f.write("get_gpu_info Serial Number "+str(get_gpu_info())+"\n")
f.write("get_memory_info Serial Number "+ str(get_memory_info())+"\n")
"C:\Program Files\Python36\python.exe" F:/sxj/untitled1/rename.py
get_disk_info Serial Number **AK****
get_CPU_info Serial Number **EBF*******906ED
get_network_info mac Number **:**:**:*0:00:01
get_mainboard_info Serial Number 1*****026302***
get_gpu_info Serial Number 10********770000
F:\sxj\untitled1>pyinstaller -F collectcomputerInfo.py