Python获取本机硬件信息及网络信息(IP地址、网关等)
本帖最后由 糊涂虫晓晓 于 2022-5-30 23:10 编辑利用wmi获取本机的配置信息
主要是硬件配置信息和网络配置信息
这也是新手作品,大家可以即拿即用,懒人必备
解说
1、两个配置信息分别放在两个字典中了,方便后期使用,包括存数据库等
2、当然,不喜欢的可以把字典改为列表,用列表的append()直接把获取到的放进列表中,汉字一块存进列表也行但不建议
3、硬盘和显卡加了判断是因为我本意是要存入数据库里的,字段都是设置好的,所以有了else:后面的东西
废话不多说,直接上代码,自行修改使用吧
#code:UTF-8
import wmi
import os
import pyodbc
pc = wmi.WMI()
def get_network():
dict01={}
for interface in pc.Win32_NetworkAdapterConfiguration(IPEnabled=1):
if not "Virtual" in interface.Caption:
dict01["IP地址"]=f'{interface.IPAddress}'
dict01["子网掩码"]=f'{interface.IPSubnet}'
dict01["网关"]=f'{interface.DefaultIPGateway}'
dict01["首选DNS服务器"]=f'{interface.DNSServerSearchOrder}'
try:
dict01["备选DNS服务器"]=f'{interface.DNSServerSearchOrder}'
except:
dict01["备选DNS服务器"]='没有备选DNS服务器'
dict01["MAC地址"]=f'{interface.MACAddress}'
return dict01
def System_spec():
os_info=pc.Win32_OperatingSystem()
processor=pc.Win32_Processor()
#Gpu=pc.Win32_VideoController()
dict02={}
os_name=os_info.Name.encode('utf-8').split(b'|').decode('utf-8')#操作系统
ram=float(os_info.TotalVisibleMemorySize)/1048576#内存
#print(f'操作系统:{os_name}')
#print(f'CPU:{processor.Name}')
dict02["操作系统"]=f'{os_name}'
dict02["CPU"]=f'{processor.Name}'
if len(pc.Win32_VideoController())>1:
for i in range(0, len(pc.Win32_VideoController())):
for j in pc.Win32_VideoController():#显卡
dict02["显卡"+str(i)]=' '.join(j.Caption.split())
else:
dict02["显卡0"] = ' '.join(pc.Win32_VideoController().Caption.split())
dict02["显卡1"]="没有其他显卡"
#print(f'内存:{round(ram)}GB')
dict02["内存"]=f'{round(ram)}GB'
#print(f'显卡{Gpu.Name}')
disk=pc.Win32_DiskDrive()
disk_len=len(disk)
if disk_len>1:
for i in range(0, disk_len):# 硬盘
dict02["硬盘" + str(i) ]=' '.join(disk.Caption.split()) + "容量:" + str(round(int(disk.Size) / 1000 / 1000 / 1000)) + "GB"
else:
dict02["硬盘" + str(i)] = ' '.join(disk.Caption.split()) + "容量:" + str(round(int(disk.Size) / 1000 / 1000 / 1000)) + "GB"
dict02["硬盘1"]="没有第二块硬盘"
dict02["计算机名"] = f'{os.environ.get("COMPUTERNAME")}'
dict02["用户名"] = f'{os.getlogin()}'
return dict02
def sqlconn(text):
conn = pyodbc.connect('driver={sql server};server=192.168.1.180,1433;database=driveinfo;uid=sa;pwd=123456')
#conn = pyodbc.connect('driver={sql server};server=192.168.6.4,1433;database=driveinfo;uid=sa;pwd=123456')
cursor = conn.cursor()# 获取游标
dict01=get_network()
dict02=System_spec()
network_sql = "insert into networkinfo(MACID,IP,MASK,GATEWAY,FRIST_DNS,SECOND_DNS,MAC) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}')".format(dict01["MAC地址"].replace(":",""),dict01["IP地址"], dict01["子网掩码"], dict01["网关"], dict01["首选DNS服务器"], dict01["备选DNS服务器"],dict01["MAC地址"])
System_sql = "insert into configinfo(MACID,name,username,computername,systemname,CPU,RAM,Graphics0,Graphics1,Harddisk0,Harddisk1) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')".format(dict01["MAC地址"].replace(":",""),text, dict02["用户名"], dict02["计算机名"],dict02["操作系统"],dict02["CPU"], dict02["内存"],dict02["显卡0"],dict02["显卡1"],dict02["硬盘0"],dict02["硬盘1"])
#sql = "insert into networkinfo(MACID,IP,MASK,GATEWAY,FRIST_DNS,SECOND_DNS,MAC) values('8C164591B40A','192.168.6.2','255.255.254.0','192.168.6.1','192.168.6.213','114.114.114.114','8C:16:45:91:B4:0A')"
cursor.execute(network_sql)
conn.commit()
select_sql = "Select * from networkinfo"
cursor.execute(select_sql)
result = cursor.fetchall()# fetchall()返回多行记录
cursor.execute(System_sql)
conn.commit()
conn.close()
if __name__ == "__main__":
dict001=System_spec()
dict002=get_network()
print(dict001)
print(dict002)
mygaryge 发表于 2022-5-25 08:26
48行逻辑有点问题吧?j的循环在if中,else没有j啊
dict02["硬盘" + str(i)] = ' '.join(pc.Win32_DiskDrive().Caption.split()) + "容量:" + str(round(int(pc.Win32_DiskDrive().Size) / 1000 / 1000 / 1000)) + "GB"
确实是,我只把前面改了,后面的J忘记改了,嘿嘿 jshon 发表于 2022-5-19 13:25
用这个获取网络信息的目的是什么?用来备份的吗?
再做个py写数据库录入,录入的信息就是上面这些东西,整成exe分发下去,让他们运行一下,运维的时候,我能用的上。(换言之,我们单位现在IP地址管理比较差,我也才刚去没半年,之前搞了别的东西,下一步该搞IP地址了) 用这个获取网络信息的目的是什么?用来备份的吗? 硬盘应该除以1024,这才是正确的容量。除以1000是硬盘的计算方法,不是系统的计算方法,所以应该以1024为准。 小小学习下 g5cc 发表于 2022-5-19 14:23
硬盘应该除以1024,这才是正确的容量。除以1000是硬盘的计算方法,不是系统的计算方法,所以应该以1024为准 ...
硬盘容量也就是个大体数,你一看到round( )就知道我遇到了小数点的问题 谢谢分享。 学习了,谢谢分享 谢谢分享。。 48行逻辑有点问题吧?j的循环在if中,else没有j啊
页:
[1]
2