Python Windows 系統管理

手動管理 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SDZGS的頭像SDZGS
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論