手動管理 Windows 系統管理的活動可能會很累。如果我們可以設置一些 Python 代碼,而不是手動管理這些任務,會怎麼樣。在下面的教程中,我們將發現一個這樣的模塊,它允許程序基於系統管理執行不同的過程。這個 Python 模塊被稱為 WMI 模塊。
WMI ,Windows Management Instrumentation 的縮寫,是微軟對 DMTF 通用信息模型(CMI 的簡稱)的實現,這是一種展示管理信息的供應商中立的行業標準方法。它允許程序員以適當的許可權從執行所需代理的任何計算機上查詢幾乎任何數據。
Python 提供了 wmi 模塊,它充當了可用的 WMI 類和功能的輕量級包裝器,系統管理員可以使用它來查詢本地或遠程 Windows 機器的數據。
在本教程中,我們將了解如何使用 wmi 模塊執行基於 Windows 系統管理的各種活動。但是在開始之前,讓我們先安裝所需的模塊。
如何安裝 Python wmi 模塊?
為了安裝 Python 模塊,我們需要「 pip 」,這是一個管理從可信公共存儲庫中安裝模塊所需的包的框架。一旦我們有了「 pip 」,我們就可以使用來自 Windows 命令提示符(CMD)或終端的命令安裝 wmi 模塊,如下所示:
語法:
$ python.exe -m pip install wmi
驗證安裝
一旦模塊安裝完成,我們可以通過創建一個空的 Python 程序文件並編寫一個 import 語句來驗證它,如下所示:
文件:驗證. py
import wmi
現在,保存上述文件,並在終端中使用以下命令執行它:
語法:
$ python verify.py
如果上述 Python 程序文件沒有返回任何錯誤,則模塊安裝正確。但是,在出現異常的情況下,請嘗試重新安裝該模塊,並且還建議參考該模塊的官方文檔。
建立連接
在下一節中,我們將從建立與機器的連接開始。大多數情況下,我們將藉助以下 Python 語法連接到本地機器:
語法:
# connecting to local machine
my_connection = wmi.WMI()
假設我們想要連接到遠程機器。在這種情況下,我們必須提供一個機器名稱(或 IP 地址),並使用以下參數,如「用戶」和「密碼」來傳遞憑據,以便我們可以驗證帳戶以建立遠程 WMI 連接。
示例:
# importing the required module
import wmi
# connecting to a remote machine
my_connection = wmi.WMI("13.78.128.231", user = r"mango", password = "mango@123")
尋找 WMI 班
現在我們已經建立了聯繫;但是,要查詢關於系統的特定信息,我們必須首先找到能夠傳遞該信息的 WMI 類。我們也可以使用 WMI 物體的類屬性,比如 wmi。WMI()。班級,為了歸還 WMI 班級的名單。
從這些提取的類中,我們可以過濾出特定的關鍵字來找到我們正在尋找的特定類,如下例所示:
示例:
# importing the required module
import wmi
# connecting to a local machine
my_connection = wmi.WMI()
# extracting the class names from WMI
for className in my_connection.classes:
if 'Process' in className:
print(className)
輸出:
Win32_ProcessStartTrace
Win32_PerfFormattedData_PerfOS_Processor
Win32_PerfFormattedData_PerfProc_Process
Win32_SessionProcess
Win32_PerfRawData_PerfProc_Process
Win32_PerfRawData_Counters_PerProcessorNetworkInterfaceCardActivity
Win32_PerfRawData_LSM_UserInputDelayperProcess
Win32_PerfFormattedData_Counters_ProcessV2
Win32_PerfFormattedData_LSM_UserInputDelayperProcess
Win32_PerfFormattedData_Counters_PerProcessorNetworkInterfaceCardActivity
Win32_Processor
Win32_ProcessTrace
CIM_OSProcess
CIM_ProcessExecutable
CIM_Processor
CIM_AssociatedProcessorMemory
Win32_ComputerSystemProcessor
Win32_PerfFormattedData_GPUPerformanceCounters_GPUProcessMemory
Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor
Win32_PerfFormattedData_Counters_ProcessorInformation
CIM_ProcessThread
CIM_Process
Win32_PerfFormattedData_Counters_PerProcessorNetworkActivityCycles
Win32_AssociatedProcessorMemory
Win32_PerfRawData_HvStats_HyperVHypervisorRootVirtualProcessor
Win32_PerfFormattedData_Counters_SecurityPerProcessStatistics
Win32_ProcessStartup
Win32_PerfRawData_GPUPerformanceCounters_GPUProcessMemory
Win32_PerfRawData_Counters_ProcessorInformation
Win32_PerfRawData_Counters_ProcessV2
Win32_PerfRawData_Counters_PerProcessorNetworkActivityCycles
Win32_PerfRawData_Counters_SecurityPerProcessStatistics
Win32_PerfFormattedData_HvStats_HyperVHypervisorLogicalProcessor
Win32_Process
Win32_PerfFormattedData_HvStats_HyperVHypervisorRootVirtualProcessor
Win32_NamedJobObjectProcess
Win32_SystemProcesses
Win32_ProcessStopTrace
Win32_PerfRawData_PerfOS_Processor
說明:
在上面的代碼片段中,我們已經導入了 wmi 模塊,並與本地機器建立了連接。然後我們從 wmi 模塊中提取類名,使用進行循環迭代模塊中的每個可用類。
WMI 類的發現方法和性質
即使我們知道 WMI 類的名稱,我們仍然需要這些類提供的屬性的精確名稱和能夠執行特定操作的方法。為了檢索 as 特定的 WMI 類的方法和屬性,我們可以創建一個 WMI 連接並使用點運算符(。)和「類名」來訪問命名空間,然後使用「屬性或「方法屬性來返回屬性/方法名稱的 Python 列表。
讓我們考慮下面的例子來證明這一點:
示例:
# importing the wmi module
import wmi
# printing all properties
print("Properties of WMI class:")
print(wmi.WMI().Win32_Process.methods.keys())
# printing all methods
print("\nMethods of WMI class:")
print(wmi.WMI().Win32_Process.properties.keys())
輸出:
Properties of WMI class:
dict_keys(['Create', 'Terminate', 'GetOwner', 'GetOwnerSid', 'SetPriority', 'AttachDebugger', 'GetAvailableVirtualSize'])
Methods of WMI class:
dict_keys(['Caption', 'CommandLine', 'CreationClassName', 'CreationDate', 'CSCreationClassName', 'CSName', 'Description', 'ExecutablePath', 'ExecutionState', 'Handle', 'HandleCount', 'InstallDate', 'KernelModeTime', 'MaximumWorkingSetSize', 'MinimumWorkingSetSize', 'Name', 'OSCreationClassName', 'OSName', 'OtherOperationCount', 'OtherTransferCount', 'PageFaults', 'PageFileUsage', 'ParentProcessId', 'PeakPageFileUsage', 'PeakVirtualSize', 'PeakWorkingSetSize', 'Priority', 'PrivatePageCount', 'ProcessId', 'QuotaNonPagedPoolUsage', 'QuotaPagedPoolUsage', 'QuotaPeakNonPagedPoolUsage', 'QuotaPeakPagedPoolUsage', 'ReadOperationCount', 'ReadTransferCount', 'SessionId', 'Status', 'TerminationDate', 'ThreadCount', 'UserModeTime', 'VirtualSize', 'WindowsVersion', 'WorkingSetSize', 'WriteOperationCount', 'WriteTransferCount'])
說明:
在上面的代碼片段中,我們已經導入了所需的模塊。然後,我們使用 WMI() 與遠程機器建立連接。然後我們寫了 WMI 類的名字,後跟點運算符(。)連同關鍵字「屬性」和「方法」一起為用戶列印所有屬性和方法。
處理過程
由於我們已經收集了關於類「 Win32_Process 」的方法和屬性的信息,我們現在將使用 WMI 的類名,後跟一個開&右括弧,以便返回 WMI 類的對象。
讓我們考慮下面的例子來證明這一點:
示例:
# importing the wmi module
import wmi
# establishing the connection with a local machine
my_connection = wmi.WMI()
# processing list
for process in my_connection.Win32_Process():
print("ID: {0}\nHandle Count: {1}\nProcess Name: {2}\n".format(
process.ProcessId, process.HandleCount, process.Name
)
)
輸出:
ID: 0
Handle Count: 0
Process Name: System Idle Process
ID: 4
Handle Count: 5863
Process Name: System
ID: 160
Handle Count: 0
Process Name: Registry
ID: 540
Handle Count: 57
Process Name: smss.exe
ID: 788
Handle Count: 773
Process Name: csrss.exe
ID: 892
Handle Count: 149
Process Name: wininit.exe
ID: 912
Handle Count: 765
Process Name: csrss.exe
ID: 964
Handle Count: 714
Process Name: services.exe
ID: 984
Handle Count: 1571
Process Name: lsass.exe
ID: 568
Handle Count: 267
Process Name: winlogon.exe
ID: 1056
Handle Count: 1746
Process Name: svchost.exe
ID: 1084
Handle Count: 33
Process Name: fontdrvhost.exe
.
.
.
ID: 14104
Handle Count: 301
Process Name: python3.9.exe
說明:
在上面的代碼片段中,我們已經導入了 wmi 模塊,並與本地機器建立了成功的連接。我們使用的來提取流程列表——循環迭代每個流程及其標識、句柄計數和流程名稱。
我們還可以用進程的名稱和屬性過濾這些進程,只列印選定的進程。例如,我們希望選擇本地運行的名為「code.exe」的所有進程,然後藉助條件語句過濾掉必須處理計數超過 100 的進程: if < condition >
讓我們考慮以下腳本來理解相同的內容:
示例:
# importing the wmi module
import wmi
# establishing the connection with a local machine
my_connection = wmi.WMI()
# filtering specific processes
for process in my_connection.Win32_Process(name = "code.exe"):
if process.HandleCount > 100:
# only processes with Handle Count above 100
print("ID: {0}\nHandle Count: {1}\nProcess Name: {2}\n".format(
process.ProcessId, process.HandleCount, process.Name
)
)
輸出:
ID: 10464
Handle Count: 859
Process Name: Code.exe
ID: 14796
Handle Count: 228
Process Name: Code.exe
ID: 12388
Handle Count: 704
Process Name: Code.exe
ID: 2504
Handle Count: 284
Process Name: Code.exe
ID: 1044
Handle Count: 485
Process Name: Code.exe
ID: 12668
Handle Count: 334
Process Name: Code.exe
ID: 8088
Handle Count: 362
Process Name: Code.exe
ID: 10720
Handle Count: 180
Process Name: Code.exe
ID: 8976
Handle Count: 210
Process Name: Code.exe
ID: 14804
Handle Count: 278
Process Name: Code.exe
說明:
在上面的代碼片段中,我們再次導入了 wmi 模塊,並與本地機器建立了連接。然後,我們使用for-循環來遍歷 WMI 類中的流程,並指定流程的名稱來過濾掉所需的流程。我們還包括 if 條件語句,以便僅列印那些處理計數大於 100 的過程細節。
WMI 模塊還允許程序員開始一個新的過程,並殺死任何現有的過程。
讓我們考慮下面的示例,演示我們已經創建了一個新流程,然後存儲流程標識來唯一標識該流程,以便我們以後可以使用該標識終止它:
示例:
# importing the wmi module
import wmi
# establishing the connection with the local machine
my_connection = wmi.WMI()
# starting a new process and capturing the process ID
process_id, return_val = my_connection.Win32_Process.Create(CommandLine = "notepad.exe")
# killing the process using process ID
my_connection.Win32_Process(ProcessId = process_id)[0].Terminate()
說明:
在上面的代碼片段中,我們已經導入了 wmi 模塊,並與本地機器建立了成功的連接。然後,我們使用創建()功能啟動了一個新的進程,並存儲了它的進程標識。最後,我們使用了終止()功能來終止進程。
搬運服務
我們可以採用類似的方法,在名為 Win32_Service 的 WMI 類的幫助下,列出並過濾出在機器上工作的服務。
讓我們考慮下面的代碼片段來證明這一點:
示例:
# importing the wmi module
import wmi
# establishing connection with a local machine
my_connection = wmi.WMI()
# listing services
for service in my_connection.Win32_Service(StartMode = "Auto", State = "Running"):
# filtering the service names
if 'Windows' in service.DisplayName:
print("Status: {0} \nStart Mode: {1} \nService Name: {2} \nDisplay Name: {3} \n\n".format(
service.State, service.StartMode, service.Name, service.DisplayName
)
)
輸出:
Status: Running
Start Mode: Auto
Service Name: AudioEndpointBuilder
Display Name: Windows Audio Endpoint Builder
Status: Running
Start Mode: Auto
Service Name: Audiosrv
Display Name: Windows Audio
Status: Running
Start Mode: Auto
Service Name: EventLog
Display Name: Windows Event Log
Status: Running
Start Mode: Auto
Service Name: FontCache
Display Name: Windows Font Cache Service
Status: Running
Start Mode: Auto
Service Name: mpssvc
Display Name: Windows Defender Firewall
Status: Running
Start Mode: Auto
Service Name: StiSvc
Display Name: Windows Image Acquisition (WIA)
Status: Running
Start Mode: Auto
Service Name: Wcmsvc
Display Name: Windows Connection Manager
Status: Running
Start Mode: Auto
Service Name: Winmgmt
Display Name: Windows Management Instrumentation
Status: Running
Start Mode: Auto
Service Name: WpnService
Display Name: Windows Push Notifications System Service
Status: Running
Start Mode: Auto
Service Name: WSearch
Display Name: Windows Search
Status: Running
Start Mode: Auto
Service Name: WpnUserService_a17f9
Display Name: Windows Push Notifications User Service_a17f9
說明:
在上面的代碼片段中,我們已經導入了 wmi 模塊,並與本地機器建立了連接。然後,我們使用的循環在給定條件下遍歷 wmi 模塊的 Win32_Services 類。我們還使用了條件語句來過濾掉所需的服務。
我們可以用這些類執行其他幾個功能,比如啟動和停止服務等等。
原創文章,作者:SDZGS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/129982.html