(3)Python笔记:使用WMI模块+TCP/IP来远程监控系统信息

说起来写这个的初衷有点尴尬,前几天有人用‘永恒之蓝’攻击公司的系统,刚好我和我老大晚上没关电脑跑东西,还没开启自动更新(win7,你说这时候要是win10多好),然后就喜闻乐见的中招了,还好及时在第二天查杀掉了,然后PM表示以后开始你们2个就每人一个月轮着来检查其他人的电脑防毒软件(公司指定)/系统自动更新是不是开启了,查到没开的就拉入伙一起负责检查_ (:3」∠*)_。
本着为老大排(懒)忧(的)解(跑)难(动)的初衷,为啥不写个远程监控,自动记录日志的软件呢。刚好也正在研究Python,就直接动手吧。
目标:
1.一个简单的日志记录服务器,负责将客户端发送过来的检测结果记录到日志文件中。
2.客户端,负责检测用户电脑的MAC,IP地址,系统型号,CPU型号。是否开启自动更新,是否打开了XXX防毒软件。

工具准备:
首先因为公司电脑有32位的,为了之后打包成exe后没有兼容问题,所以这里就选用python 3.6.3 32位
Windows x86 executable installer这个
https://www.python.org/downloads/release/python-363/

WMI:更新时间感人= = WMI-1.4.9.win32.exe (md5)
https://pypi.python.org/pypi/WMI/

WMI依赖pywin32(win32.com)
选最新的文件夹点进去,选择适合自己版本的,我这里因为python是32位的,所以选择pywin32-221.win32-py3.6.exe;上面amd64的就是64位的(对应python 64位,和电脑系统无关)
https://sourceforge.net/projects/pywin32/files/pywin32/

安装WMI和pywin32,一般来说就是直接next…会自动查询安装的电脑上是否存在对应版本的python填入安装参数,如果报找不到python类的错,那就是版本不兼容的问题了

上面都完成后就可以开始码代码了,直接上代码
服务器端
因为我这里是将自己电脑作为了服务器端,所以如果想部署到linux服务器上的话还需要点小改动
服务端主要就是TCP连接端+多线程,多线程这里直接用threading.Thread,这里之后可以添加一个ctrl+C退出功能。

#coding:utf-8
import socket
import threading
import time
import sys                                                                    
import signal
def saveInfo(info):
#   try:
        fileAll='d:\\1\\tcp\\data.txt'
        with open(fileAll,'a',encoding='utf-8') as file_write:
            file_write.write(info+'\n')
#   except:
#       print('error:something faile')
#def quit(signum, frame):  
#    print('') 
#    print('stop fusion')  
#    sys.exit()
def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome!')
    buffer = []#
    while True:
        data = sock.recv(1024)
        if data:
            buffer.append(data)
        else :
            break
        #sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    dataStr = b''.join(buffer)
    if mutex.acquire(True):
        saveInfo(str(dataStr,'utf-8'))
        print(dataStr)
        mutex.release()

#signal.signal(signal.SIGINT, quit)                                  
#signal.signal(signal.SIGTERM, quit)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('服务器地址', 9999))
s.listen(5)
threads = []
mutex = threading.Lock()
print('Waiting for connection...')
while True:
    sock, addr = s.accept()
    t = threading.Thread(target=tcplink, args=(sock, addr)) 
    threads.append(t)
    t.start()

客户端
直接使用WMI封装好的方法来获取各项系统信息,各个功能模块基本都用注释标明了,组装后发给服务器

#client
#coding:utf-8
import socket
import wmi

#获取本机进程列表
def getWinProList():
    ProList = [] 
    c = wmi.WMI() 
    for process in c.Win32_Process(): 
        ProList.append(str(process.Name)) 
    return ProList
#获取本机服务列表
def getWinSerList():
    SerList = [] 
    c = wmi.WMI() 
    for service in c.Win32_Service(): 
        SerList.append(str(service.Name)) 
    return SerList
#获取本机系统,CPU,内存信息
def getSystemInfo():
    c = wmi.WMI()
    systemInfo=''
    for sys in c.Win32_OperatingSystem():
        systemInfo+='Version:'+sys.Caption+' Vernum:'+sys.BuildNumber
        systemInfo+=' '+sys.OSArchitecture
    for processor in c.Win32_Processor():
        systemInfo+=" Process Name:"+processor.Name.strip()
        for Memory in c.Win32_PhysicalMemory():
            systemInfo+=" Memory Capacity:"+str(int(Memory.Capacity)/1024/1024/1024)+' GB'
    return systemInfo
#获取本机Mac,IP地址
def getIp():
    c = wmi.WMI()
    ipInfo=''
    for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled= True):
        ipInfo+="MAC:"+interface.MACAddress
        for ip_address in interface.IPAddress:
            ipInfo+=" ip:"+ip_address
    return ipInfo
#扫描本机
def scanSystem():
    resultInfo=''
    resultInfo+=getIp()+' '+getSystemInfo()
    systemCheck1=systemCheck2=systemCheck3='N'
    ProList=getWinProList()
    for pro in ProList:
        if pro == 'PccNTMon.exe':#XXX防毒软件的进程
            systemCheck1='Y'
    SerList=getWinSerList()
    for ser in SerList:
        if ser == 'TMBMServer':#XXX防毒软件的服务
            systemCheck2='Y'        
        if ser == 'wuauserv':#windows update服务
            systemCheck3='Y'    
    if systemCheck1 == 'Y':
        resultInfo+=' XXX软件进程已开启'
    else:
        resultInfo+=' XXX软件进程未开启'
    if systemCheck2 == 'Y':
        resultInfo+=' XXX服务已开启'
    else:
        resultInfo+=' XXX服务未开启'
    if systemCheck3 == 'Y':
        resultInfo+=' 系统已开启自动更新'
    else:
        resultInfo+=' 系统未开启自动更新'
    return resultInfo

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('服务器地址', 9999))
print(s.recv(1024).decode('utf-8'))
s.send(bytes(scanSystem(),encoding='utf-8'))
s.close()

最后的总体思路是,使用windows系统自带的计划任务,让每台电脑都在特定的时间执行打包完成的客户端.exe文件(PS:这一步正在找可已免配置自动执行的方法),然后将服务器端放在一台测试用的服务器上即可(毕竟组里自己用的东西,放生产环境就太那啥了_ (:3」∠*)_)。

讲下python 3.6打包成exe文件的流程吧。
1.因为是Python 3.6,所以直接进入 python安装目录\Scripts 文件夹,在文件夹内运行cmd命令行:pip install pyinstaller 安装pyinstaller
2.安装完毕后到https://github.com/pyinstaller/pyinstaller下载压缩包,解压后复制里面的PyInstaller文件夹,黏贴到 python安装目录\Lib\site-packages下,因为现在还不支持Python 3.6的打包。
3.将需要打包的py文件放在 python安装目录\Scripts 目录下 ,cmd执行pyinstaller -F 需打包.py。然后生成的exe可执行文件就在同目录下的dist文件夹内。替换文件图片等操作可以查询pyinstaller相关参数。


10.27更新,添加多线程互斥锁同步文件写入操作

https://github.com/SecondMagic/-1-python-csdn/tree/master/3.WMI%2BTCP%20IP%E8%BF%9C%E7%A8%8B%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值