(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章