如何通过Python获取局域网内计算机的硬件与系统信息
局域网内远程获取计算机硬件与系统信息方案
需求概述
需要获取局域网内多台计算机的以下信息:
- IP地址、MAC地址
- 计算机名、当前登录用户
- 内存(RAM)、主板信息
- 操作系统版本、处理器信息
当前仅能通过platform、Win32_ComputerSystem获取本机信息,前提是目标计算机均拥有相同的管理员账号,需实现远程获取方案。
实现思路
Windows局域网环境下,通过WMI(Windows Management Instrumentation)远程连接实现:
- 利用WMI的远程访问能力,传入目标计算机的IP/主机名、管理员账号和密码,建立远程WMI连接
- 通过远程WMI实例,查询对应的Win32类获取所需信息:
Win32_ComputerSystem:计算机名、RAM、当前用户、系统类型Win32_OperatingSystem:操作系统版本Win32_Processor:处理器信息Win32_BaseBoard:主板制造商、型号Win32_NetworkAdapterConfiguration:IP、MAC地址(筛选启用的网卡)
代码示例
以下是支持远程获取的GUI工具代码,可输入目标IP、管理员账号密码获取信息:
import tkinter as tk from tkinter import messagebox import wmi def get_remote_info(): target_ip = entry_ip.get().strip() username = entry_user.get().strip() password = entry_pwd.get().strip() if not all([target_ip, username, password]): messagebox.showerror("错误", "请填写完整信息") return try: # 建立远程WMI连接 remote_wmi = wmi.WMI(computer=target_ip, user=username, password=password) # 获取系统基础信息 cs = remote_wmi.Win32_ComputerSystem()[0] ram = str(round(int(cs.TotalPhysicalMemory) / (1024.0 **3)))+" GB" current_user = cs.UserName.split('\\')[-1] if cs.UserName else "无登录用户" # 获取操作系统信息 os = remote_wmi.Win32_OperatingSystem()[0] os_version = f"{os.Caption} ({os.Version})" # 获取处理器信息 cpu = remote_wmi.Win32_Processor()[0] cpu_info = cpu.Name.strip() # 获取主板信息 board = remote_wmi.Win32_BaseBoard()[0] board_info = f"{board.Manufacturer} - {board.Product}" # 获取IP和MAC地址(筛选已启用的网卡) net_adapters = remote_wmi.Win32_NetworkAdapterConfiguration(IPEnabled=True) if net_adapters: ip_addr = net_adapters[0].IPAddress[0] mac_addr = net_adapters[0].MACAddress else: ip_addr = "未找到可用IP" mac_addr = "未找到MAC地址" # 更新显示信息 result_text.delete(1.0, tk.END) result_text.insert(tk.END, f"计算机名: {cs.Name}\n") result_text.insert(tk.END, f"当前用户: {current_user}\n") result_text.insert(tk.END, f"IP地址: {ip_addr}\n") result_text.insert(tk.END, f"MAC地址: {mac_addr}\n") result_text.insert(tk.END, f"操作系统: {os_version}\n") result_text.insert(tk.END, f"处理器: {cpu_info}\n") result_text.insert(tk.END, f"内存(RAM): {ram}\n") result_text.insert(tk.END, f"主板信息: {board_info}\n") result_text.insert(tk.END, f"系统类型: {cs.SystemType}\n") except Exception as e: messagebox.showerror("连接失败", f"错误信息: {str(e)}") # 创建GUI界面 root = tk.Tk() root.title("局域网计算机信息获取工具") # 输入区域 frame_input = tk.Frame(root, padx=10, pady=10) frame_input.pack() label_ip = tk.Label(frame_input, text="目标IP:") label_ip.grid(row=0, column=0, sticky="w") entry_ip = tk.Entry(frame_input, width=20) entry_ip.grid(row=0, column=1, padx=5) label_user = tk.Label(frame_input, text="管理员账号:") label_user.grid(row=1, column=0, sticky="w") entry_user = tk.Entry(frame_input, width=20) entry_user.grid(row=1, column=1, padx=5) label_pwd = tk.Label(frame_input, text="密码:") label_pwd.grid(row=2, column=0, sticky="w") entry_pwd = tk.Entry(frame_input, width=20, show="*") entry_pwd.grid(row=2, column=1, padx=5) btn_get = tk.Button(frame_input, text="获取信息", command=get_remote_info) btn_get.grid(row=3, column=0, columnspan=2, pady=5) # 结果显示区域 frame_result = tk.Frame(root, padx=10, pady=10) frame_result.pack() result_text = tk.Text(frame_result, width=50, height=12) result_text.pack() root.mainloop()
注意事项
- 目标计算机需开启WMI服务(Winmgmt),可通过
services.msc检查 - 目标计算机防火墙需允许WMI入站连接(默认域环境下已允许,工作组环境需手动添加规则)
- 输入的账号必须是目标计算机的本地管理员或域管理员账号
- 确保本机与目标计算机在同一局域网,网络可达(可先通过
ping测试)
内容的提问来源于stack exchange,提问作者huynt
相关产品推荐
相关产品推荐

