背景:

Linux、FreeBSD )的时就在想,既然有那么多监听系统状态的函数没有兼容win系统

那么是不是应该还有某些模块,可以单独为win系统 服务于监听其系统状态呢?这一搜还真的让我找到了 WMI 一个由微软官方维护发行的模块,开发放了很多调用windows

底层,和获取win系统配置,状态等信息的接口,OK,老样子废话少说,直接给小伙伴们梦整理好最全,最简单“开箱即用”的代码。

安装OR引入:

#安装
pip install wmi
# OR
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple wmi-U

#导入
import wmi
# 如果觉得名字太长也可以重命名使用哦
import wmi as w

开箱使用

CPU

#cpu*类型**
    print('cpu*类型*'.center(20,'~'))
    for cpu in c.Win32_Processor():
        print ("CPUID:", cpu.ProcessorId.strip())
        print ("Processor ID: %s" % cpu.DeviceID)
        print ("Process Name: %s" % cpu.Name.strip())

硬盘

#硬盘***
    print('硬盘'.center(20,'~'))
    for disk in c.Win32_DiskDrive():
        print ('disk id:', disk.SerialNumber.strip())
#获取硬盘信息与分区情况***
    print('获取硬盘信息和分区情况'.center(20,'~'))
    for physical_disk in c.Win32_DiskDrive ():
        for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"):
            for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"):
                print (physical_disk.Caption, partition.Caption, logical_disk.Caption)
#显示硬盘可用百分比***
    print('显示硬盘可用百分比'.center(20,'~'))
    for disk in c.Win32_LogicalDisk (DriveType=3):
        print (disk.Caption, "%0.2f%% free" % (100.0 * int(disk.FreeSpace) / int(disk.Size)))

主板

#主板***
    print('主板'.center(20,'~'))
    for board in c.Win32_BaseBoard():
        print ("main board id:", board.SerialNumber.strip())

设备地址

#mac地址
    print('mac地址'.center(20,'~'))
    for networkAdapter in c.Win32_NetworkAdapterConfiguration (IPEnabled = True):
        print ("mac address:", networkAdapter.MACAddress)
#打印IP和MAC地址***
    print('显示IP和MAC'.center(20,'~'))
    for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
        print (interface.Description, interface.MACAddress)
    for ip_address in interface.IPAddress:
      print (ip_address)

BIOS

#bios***
    print('bios'.center(20,'~'))
    for bios in c.Win32_BIOS():
        print ("bios number:", bios.SerialNumber.strip())

内存

#内存大小***
    print('内存大小'.center(20,'~'))
    totalMemSize=0
    for memModule in c.Win32_PhysicalMemory():
      totalMemSize+=int(memModule.Capacity)
    print ("Memory Capacity: %.2fMB" %(totalMemSize/1048576))

进程

#所有进程***
    print('所有进程'.center(20,'~'))
    for process in c.Win32_Process ():
        print ("%5s %s" % (process.ProcessId, process.Name))
#指定进程***
    print('输出指定服务Pid号'.center(20,'~'))
    for process in c.Win32_Process (name="YoudaoDict.exe"): 
        print ("进程号(PID): %5s; 服务名: %s" % (process.ProcessId, process.Name))
#打开服务,监听其进程,2s后终止该进程***
    print('打开服务,监听其进程,2s后终止该进程'.center(20,'~'))
    process_id, return_value = c.Win32_Process.Create (CommandLine="notepad.exe")
    for process in c.Win32_Process (ProcessId=process_id):
        print ("进程号(PID): %5s; 服务名: %s" % (process.ProcessId, process.Name))
        time.sleep(2)
        process.Terminate() #关闭这个进程服务

文件夹/路径

#显示共享文件夹及其路径***
    print('显示共享文件夹及其路径'.center(20,'~'))
    for share in c.Win32_Share ():
        print ("共享文件: %6s; 路径: %s" % (share.Name, share.Path))

服务

#显示 自动服务和当前未启动的服务***
    print('显示服务和当前未启动的服务'.center(20,'~'))
    stopped_services = c.Win32_Service (StartMode="Auto", State="Stopped")
    if stopped_services:
        for s in stopped_services:
            print (s.Caption+"   "+ "service is not running")
    else:
        print ("No auto services stopped")
#脚本运行程序,并等待直到它关闭,并且显示内容***
    print('运行记事本,等待直到它关闭,并且文件内容'.center(20,'~'))
    filename = r"C:\\Users\Administrator\Desktop\\test.txt"
    process = c.Win32_Process
    process_id, result = process.Create (CommandLine="notepad.exe " + filename)
    watcher = c.watch_for (
        notification_type="Deletion",
        wmi_class="Win32_Process",
        delay_secs=1,
        ProcessId=process_id
    )
    watcher ()
    print ("This is what you wrote:")
    print (open(filename).read())
#自启动 程序,位置和命令***
    print('自启动程序,位置和命令'.center(20,'~'))
    for s in c.Win32_StartupCommand ():
        print ("[%s] %s <%s>" % (s.Location, s.Caption, s.Command))

简单封装

进程信息太多了,一下封装省略。如果需要查看众多进程信息,请自行封装或打印哦

编译为 .exe  程序

# -*- coding: utf-8 -*-
import wmi
import os

# 声明
Statement = """
使用说明:\n
1 请打开计算机基础配置文件夹,进入到dist目录下,双击运行:基础配置信息.exe 文件(此文件)\n
2 在命令行窗口输入保存的文件名,运行完成后打开生成的txt文本即可查看获取到的计算机基础配置信息
"""
print(Statement)
while True:
    fname=input('enter filename>')
    if os.path.exists(fname):
        print("Error:'%s' already exists" %fname)
    else:
        break
# open函数在打开目录中进行检查,如果有则打开,否则新建
fobj=open(fname,'a',encoding='utf-8')

# 获取操作系统版本信息
def sys_version():
    c = wmi.WMI()
    for sys in c.Win32_OperatingSystem():
        print("操作系统版本:%s" % sys.Caption)
        fobj.write('操作系统版本:' + sys.Caption)
        print("操作系统位数:",sys.OSArchitecture)
        fobj.write('\n' + '操作系统位数:' + sys.OSArchitecture)
# 获取机器IP和MAC地址以及网卡类型
def getIP():
    c = wmi.WMI()
    for interface in c.Win32_NetworkAdapterConfiguration(IPEnabled=1):
        print("网口型号为:",interface.Description)
        fobj.write('\n' + '网口型号为:' + interface.Description)
        for ip_address in interface.IPAddress:
            print(ip_address)
            fobj.write('\n' + 'IP地址和MAC地址:' + ip_address)
# 获取CPU和内存大小
def cpu_and_mem():
    c = wmi.WMI()
    for cpu in c.Win32_Processor():
        print("CPU: %s" % cpu.Name.strip())
        fobj.write('\n' + 'CPU:' + cpu.Name.strip())
    for Memory in c.Win32_PhysicalMemory():
        print("内存大小: %.fGB" % ( (int(Memory.Capacity) / 1048576) /1024) )
        fobj.write('\n' + "内存大小: %.fGB" % ( (int(Memory.Capacity) / 1048576) /1024) )
# 获取磁盘分区和各分区大小
def disk():
    c = wmi.WMI()
    # 获取硬盘分区
    for physical_disk in c.Win32_DiskDrive():
        for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
            for logical_disk in partition.associators("Win32_LogicalDiskToPartition"):
                print(physical_disk.Caption, partition.Caption, logical_disk.Caption)
                fobj.write('\n' + '磁盘分区:' + physical_disk.Caption + partition.Caption + logical_disk.Caption)
    # 获取各个磁盘分区大小
    for disk in c.Win32_LogicalDisk(DriveType=3):
        # print(disk.Caption, "%0.2f%% free" % (100.0 * int(disk.FreeSpace) / int(disk.Size)))
        print(disk.Caption,"磁盘大小: %0.1fGB, 剩余空间:%0.2f%%" % ((int(disk.Size) / 1048576) / 1024,100.0 * int(disk.FreeSpace) / int(disk.Size)))
        fobj.write('\n' +disk.Caption + "磁盘大小: %0.1fGB, 剩余空间:%0.2f%%" % ((int(disk.Size) / 1048576) / 1024,100.0 * int(disk.FreeSpace) / int(disk.Size)))
def main():
    sys_version()
    getIP()
    cpu_and_mem()
    disk()
if __name__ == '__main__':
    main()

fobj.close()

不编译,正常打印查看

import wmi
import time

def PrintDiskInfo():
    c = wmi.WMI()
    #cpu*类型**
    print('cpu*类型*'.center(20,'~'))
    for cpu in c.Win32_Processor():
        print ("CPUID:", cpu.ProcessorId.strip())
        print ("Processor ID: %s" % cpu.DeviceID)
        print ("Process Name: %s" % cpu.Name.strip())
    #硬盘***
    print('硬盘'.center(20,'~'))
    for disk in c.Win32_DiskDrive():
        print ('disk id:', disk.SerialNumber.strip())
    #获取硬盘信息与分区情况***
    print('获取硬盘信息和分区情况'.center(20,'~'))
    for physical_disk in c.Win32_DiskDrive ():
        for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"):
            for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"):
                print (physical_disk.Caption, partition.Caption, logical_disk.Caption)
    #显示磁盘可用百分比***
    print('显示磁盘可用百分比'.center(20,'~'))
    for disk in c.Win32_LogicalDisk (DriveType=3):
        print (disk.Caption, "%0.2f%% free" % (100.0 * int(disk.FreeSpace) / int(disk.Size)))
    #主板***
    print('主板'.center(20,'~'))
    for board in c.Win32_BaseBoard():
        print ("main board id:", board.SerialNumber.strip())
    #mac地址
    print('mac地址'.center(20,'~'))
    for networkAdapter in c.Win32_NetworkAdapterConfiguration (IPEnabled = True):
        print ("mac address:", networkAdapter.MACAddress)
    #显示IP和MAC***
    print('显示IP和MAC'.center(20,'~'))
    for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
        print (interface.Description, interface.MACAddress)
    for ip_address in interface.IPAddress:
      print (ip_address)
    #bios***
    print('bios'.center(20,'~'))
    for bios in c.Win32_BIOS():
        print ("bios number:", bios.SerialNumber.strip())
    #内存大小***
    print('内存大小'.center(20,'~'))
    totalMemSize=0
    for memModule in c.Win32_PhysicalMemory():
      totalMemSize+=int(memModule.Capacity)
    print ("Memory Capacity: %.2fMB" %(totalMemSize/1048576))
    # #所有进程***
    # print('所有进程'.center(20,'~'))
    # for process in c.Win32_Process ():
    #     print ("%5s %s" % (process.ProcessId, process.Name))
    # #指定进程***
    # print('输出指定服务Pid号'.center(20,'~'))
    # for process in c.Win32_Process (name="YoudaoDict.exe"): 
    #     print ("进程号(PID): %5s; 服务名: %s" % (process.ProcessId, process.Name))
    # #打开服务,监听其进程,2s后终止该进程***
    # print('打开服务,监听其进程,2s后终止该进程'.center(20,'~'))
    # process_id, return_value = c.Win32_Process.Create (CommandLine="notepad.exe")
    # for process in c.Win32_Process (ProcessId=process_id):
    #     print ("进程号(PID): %5s; 服务名: %s" % (process.ProcessId, process.Name))
    #     time.sleep(2)
    #     process.Terminate() #关闭这个进程服务
    #显示共享文件夹及其路径***
    print('显示共享文件夹及其路径'.center(20,'~'))
    for share in c.Win32_Share ():
        print ("共享文件: %6s; 路径: %s" % (share.Name, share.Path))
    #显示为自动,当前未启动的服务***
    print('显示为自动,当前未启动的服务'.center(20,'~'))
    stopped_services = c.Win32_Service (StartMode="Auto", State="Stopped")
    if stopped_services:
        for s in stopped_services:
            print (s.Caption+"   "+ "service is not running")
    else:
        print ("No auto services stopped")
    #运行记事本,等待直到它关闭,并且显示内容***
    print('运行记事本,等待直到它关闭,并且文件内容'.center(20,'~'))
    filename = r"C:\\Users\Administrator\Desktop\\test.txt"
    process = c.Win32_Process
    process_id, result = process.Create (CommandLine="notepad.exe " + filename)
    watcher = c.watch_for (
        notification_type="Deletion",
        wmi_class="Win32_Process",
        delay_secs=1,
        ProcessId=process_id
    )
    watcher ()
    print ("This is what you wrote:")
    print (open(filename).read())
    #自启动程序,位置和命令***
    print('自启动程序,位置和命令'.center(20,'~'))
    for s in c.Win32_StartupCommand ():
        print ("[%s] %s <%s>" % (s.Location, s.Caption, s.Command))

if __name__ == "__main__":
    PrintDiskInfo()