`

如何使用WMI获取进程信息(异步处理)

阅读更多

以下示例演示如何使用WMI 获得本地机器的进程列表(当然,WMI 也能获得 远程机器的进程列表,远不只例子中的功能),示例代码是我简化codeproject 的例子而来:

 

// 用于表示进程信息的结构

public struct structProcessInfo

{

    // 进程名

     public string stringName;

    // 进程ID

     public string stringProcessID;

    // 父进程ID

     public string stringParentProcessID;

    // 用户名

     public string stringUserName;

}

 

public class ProcessesInfo

{

     private structProcessInfo _value;

     public structProcessInfo Value

     {

         get {return _value;}

         set {_value = value ;}

     }

}

 

// 用于保存进程信息的字典类,继承于NameObjectCollectionBase

public class ProcessesDictionary : NameObjectCollectionBase

{

    public void Clear()

    {

        BaseClear();

    }

 

    public void Add(string name, ProcessesInfo processObj)

    {

        BaseAdd(name, processObj);

    }

 

    public void Remove(string name)

    {

        BaseRemove(name);

    }

 

    public void RemoveAt(int index)

    {

        BaseRemoveAt(index);

    }

 

    public ProcessesInfo this [int index]

    {

        get { return (ProcessesInfo )BaseGet(index); }

        set { BaseSet(index, value ); }

    }

 

    public ProcessesInfo this [string name]

    {

        get { return (ProcessesInfo )BaseGet(name); }

        set { BaseSet(name, value ); }

    }

}

 

=  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =

 

// 用于表示进程CPU 及内存使用情况的结构

public struct structPerformance

{

    public string stringPercentProcessorTime;

    public string stringVirtualBytes;

}

 

public class ProcessPerf

{

    private structPerformance _value;

 

    public structPerformance Value

    {

        get { return _value; }

        set { _value = value ; }

    }

}

 

// 用于保存进程CPU 及内存使用情况的字典类

public class ProcessesPerformanceDictionary : NameObjectCollectionBase

{

    public void Clear()

    {

        BaseClear();

    }

 

    public void Add(string name, ProcessPerf processPerformance)

    {

        BaseAdd(name, processPerformance);

    }

 

    public void Remove(string name)

    {

        BaseRemove(name);

    }

 

     public void RemoveAt(int index)

    {

        BaseRemoveAt(index);

    }

 

    public ProcessPerf this [int index]

    {

        get { return (ProcessPerf )BaseGet(index); }

        set { BaseSet(index, value ); }

    }

 

    public ProcessPerf this [string name]

    {

        get { return (ProcessPerf )BaseGet(name); }

        set { BaseSet(name, value ); }

    }

}

 

=  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =

 

// 表示ManagementObject 对象的异步调用方法 是否完成

public class MyHandler

{

    private bool isComplete = false ;

    private ManagementBaseObject returnObject;

 

    public void Done(object sender, ObjectReadyEventArgs e)

    {

        isComplete = true ;

        returnObject = e.NewObject;

    }

 

    public bool IsComplete

    {

         get

        {

            return isComplete;

        }

    }

 

    public ManagementBaseObject ReturnObject

    {

        get

        {

            return returnObject;

        }

    }

}

 

=  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =   =  =  =  =  =  =  =  =  =

 

一个窗体,添加一个ListViewlvProcess ,一个ButtonbtList 用于显示进程列表,一个ButtonbtClose 用于关闭窗体:

private void btList_Click(object sender, EventArgs e)

{

    this .lvProcess.Items.Clear();

 

    ManagementOperationObserver observer = new ManagementOperationObserver ();

    MyHandler invokeHandler = new MyHandler ();

    observer.ObjectReady += new ObjectReadyEventHandler (invokeHandler.Done);

 

    ProcessesDictionary pDict = new ProcessesDictionary ();

    ProcessesPerformanceDictionary perDict = new ProcessesPerformanceDictionary ();

 

    ProcessesInfo pInfo;

    structProcessInfo pStruct;

 

    ProcessPerf perInfo;

    structPerformance perStruct;

 

    string [] lvData = new string [5];

 

    #region 获取进程名称、ID 、 父进程ID 、进程所属用户名

    ManagementObjectCollection moc = this .ExecSearch("SELECT * FROM Win32_Process" );

    if (moc == null )

    {

        MessageBox .Show("Error:null" );

        return ;

    }

 

    foreach (ManagementObject mo in moc)

    {

        pInfo = new ProcessesInfo ();

        pStruct = new structProcessInfo ();

        pStruct.stringName = mo["Name" ].ToString();

        pStruct.stringProcessID = mo["ProcessID" ].ToString();

        pStruct.stringParentProcessID = mo["ParentProcessID" ].ToString();

 

        mo.InvokeMethod(observer, "GetOwner" , null );

        while (!invokeHandler.IsComplete)

        {

            System.Threading.Thread .Sleep(500);

        }

 

        // 判断获取用户名的操作是否成功

        if (invokeHandler.ReturnObject["returnValue" ].ToString() == "0" )

        {

            pStruct.stringUserName = invokeHandler.ReturnObject.Properties["User" ].Value.ToString();

        }

        else

        {

            pStruct.stringUserName = "" ;

        }

 

        // 保存该进程信息到字典类中

        pInfo.Value = pStruct;

        pDict.Add(mo["ProcessID" ].ToString(), pInfo);

    }

    #endregion

 

    #region 获得进程的CPU 及 内存使用情况

    ManagementObjectCollection moc1 = this .ExecSearch("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process" );

    if (moc1 == null )

    {

        MessageBox .Show("Error:null" );

        return ;

    }

 

    foreach (ManagementObject mo1 in moc1)

    {

        perInfo = new ProcessPerf ();

        perStruct = new structPerformance ();

 

        perStruct.stringPercentProcessorTime = mo1.Properties["PercentProcessorTime" ].Value.ToString();

        perStruct.stringVirtualBytes = mo1["VirtualBytes" ].ToString();

 

        // 添加CPU 及内存使用情况到字典类中

        perInfo.Value = perStruct;

        perDict.Add(mo1["IDProcess" ].ToString(), perInfo);

        perInfo = null ;

    }

    #endregion

 

    #region 显示列表

    foreach (string stringProcessID in pDict)

    {

        pStruct = pDict[stringProcessID].Value;

        lvData[0] = pStruct.stringName.ToString();

        lvData[4] = pStruct.stringProcessID.ToString();

        lvData[1] = pStruct.stringUserName.ToString();

 

        try

        {

            lvData[2] = perDict[pStruct.stringProcessID.ToString()].Value.stringPercentProcessorTime.ToString();

            lvData[3] = perDict[pStruct.stringProcessID.ToString()].Value.stringVirtualBytes.ToString();

        }

        catch (NullReferenceException )

        {

            // 无法获取CPU 及内存情况

            lvData[2] = "0" ;

            lvData[3] = "0" ;

         }

 

        ListViewItem lvItem = new ListViewItem (lvData, 0);

        lvProcess.Items.Add(lvItem);

    }

    #endregion

 

    pDict.Clear();

    pDict = null ;

    perDict.Clear();

    perDict = null ;

}

 

/// <summary>

/// 执行查询

/// </summary>

/// <param name="command"> 查询语句 </param>

/// <returns></returns>

private ManagementObjectCollection ExecSearch(string command)

{

    ManagementObjectCollection moc = null ;

    ObjectQuery objQuery = new ObjectQuery (command);

    string stringMachineName = "localhost" ;

    ManagementScope scope = new ManagementScope ("\\\\" + stringMachineName + "\\root\\cimv2" );

    ManagementObjectSearcher searcher = new ManagementObjectSearcher (scope, objQuery);

 

    try

    {

        moc = searcher.Get();

    }

    catch (Exception x)

     {

        MessageBox .Show("Error:" + x.Message);

    }

 

    return moc;

}

 

 

private void btClose_Click(object sender, EventArgs e)

{

    this .Close();

}

分享到:
评论

相关推荐

    C++调用WMI遍历进程

    此外,你可能还需要处理查询结果的错误,以及考虑性能优化,比如使用异步查询和批处理。 这个压缩包中的“WmiTest”文件可能是包含完整代码和注释的示例项目,你可以直接编译运行,了解和学习如何在C++中通过WMI...

    WMI.rar_CSharp wmi_wmi

    6. **异步操作**:在C#中使用Asynchronous Operations处理WMI查询,以避免阻塞主线程。 7. **错误处理和权限**:理解WMI操作可能遇到的错误类型,并学会处理权限问题,例如提升应用程序的管理员权限。 8. **性能...

    MSDN WMI Reference.pdf

    文档中提供了使用C++开发WMI应用程序的多个示例,如调用提供者方法、异步获取本机和远程计算机的WMI数据、接收事件通知和创建WMI应用程序的示例代码。 ### 连接到WMI使用VBScript 还介绍了如何使用VBScript连接到...

    使用Python玩转WMI共15页.pdf.zip

    如果处理WMI请求可能耗时,可以使用异步模式。pywmi库支持回调函数和协程两种异步方式。 3. **权限和安全** 在处理远程WMI连接时,需要注意权限设置和身份验证,确保安全连接。 **四、实际应用场景** 1. **...

    wmi-client-master.rar

    在这个项目中,开发者可能使用了Node.js的异步I/O特性来与WMI服务进行交互,同时利用Promise或async/await语法来处理非阻塞操作。通过调用WMI接口,他们可能实现了如监控系统资源、收集性能数据、执行系统管理任务等...

    WMI VB 中文视频 脚本

    5. **错误处理和异步操作**:说明如何在VB中处理WMI操作可能出现的错误,并介绍如何使用异步调用来提高性能。 6. **实际案例分析**:可能提供了几个实用的例子,如监控CPU使用率、管理网络连接、控制服务状态等,...

    Python库 | pywmi-0.7.9.tar.gz

    例如,你可以获取所有运行中的进程信息,或者修改系统设置。 4. **低级访问**:对于需要更底层控制的用户,`pywmi`也提供了直接访问WMI COM接口的能力,以便于进行复杂或特定的WMI操作。 5. **跨平台兼容性**:...

    Delphi 操作wmi的类库

    此外,类库可能还提供了异步事件处理机制,使你能够监听系统事件,如新进程的创建或服务的状态变化。 在 Delphi 中,使用 WMI 类库的步骤大致如下: 1. 创建 `TWMIClient` 实例并连接到 WMI 服务器(通常是本地...

    c++ 获取局域网内其他计算机的信息

    7. **Windows API**:在Windows环境下,可以使用`WMI`(Windows Management Instrumentation)来获取远程计算机的详细信息。WMI提供了一整套的类库和接口,可以通过C++的COM编程来访问。 8. **代码实现**:`...

    用C#开发较完整的Windows任务管理器

    例如,`OpenProcess` API用于获取进程句柄,`TerminateProcess` API则可以结束指定的进程。 3. **SystemInfo 类**: 这个类是项目的核心,它封装了一系列方法来获取系统信息。以下是部分关键方法的实现: - **CPU...

    vb监视进程流量 #资源达人分享计划#

    WMI提供了丰富的类库,如`Win32_Process`和`Win32_PerfFormattedData_PerfProc_Process`,可以获取进程的详细信息。通过`CreateObject`函数创建WMI连接,然后执行查询,即可获得进程的CPU使用率、内存使用量等。 3....

    任务管理器

    - **Win32 API**:Windows操作系统提供的底层接口,如`OpenProcess`用于获取进程句柄,`GetProcessMemoryInfo`获取进程内存信息。 - **使用P/Invoke调用Win32 API**:C#中通过DllImport特性导入这些API,然后在C#...

    LvServerInfo .NET探针.rar

    例如,System.Management命名空间下的ManagementObject类可以用来获取硬件信息,而System.Diagnostics.Process类则可以用于监视进程和内存使用情况。 源码分析是学习和理解.NET编程的重要途径,通过阅读...

    VB CPU监测 源码

    例如,可以使用`GetSystemTimes`或`GetProcessTimes` API函数来获取系统或特定进程的时间信息,进而计算CPU使用率。 2. **系统信息获取**:通过`Win32_PerfFormattedData_PerfOS_Processor` WMI类,VB可以访问到...

    C#远程控制程序(含源码)

    通过WMI,开发者可以获取系统信息,执行操作系统级别的任务,如管理系统服务、进程、设备驱动、用户账户等。在C#中,我们可以通过System.Management命名空间中的类来访问和利用WMI的功能。 在远程控制程序中,关键...

    C#windows任务管理器

    使用`System.Diagnostics.Process`类可以获取和管理进程信息。以下代码展示了如何获取所有运行的进程并显示其名称: ```csharp Process[] processes = Process.GetProcesses(); foreach (Process process in ...

    控制Load&Power.zip

    例如,你可以通过WMI(Windows Management Instrumentation)接口来获取系统的电源信息,甚至设置电源策略,如休眠、睡眠或关闭。 1. **WMI(Windows Management Instrumentation)**:它是Windows操作系统提供的一...

    ASP.NET双向探针

    1. **服务器信息获取**:通过调用.NET Framework提供的API或者使用Windows Management Instrumentation (WMI)技术,收集服务器的硬件信息(如CPU、内存、磁盘等)、操作系统信息、网络状态、进程和线程信息等。...

    C#远程监控(类似冰河的)

    7. **进程与文件系统控制**:通过System.Diagnostics.Process类,可以远程启动、停止、管理和获取进程信息。同时,System.IO命名空间提供了对文件和目录的操作,如读写文件、创建目录等。 8. **用户界面**:虽然...

    VC++修改DNS

    在VC++中,可以使用`AdjustTokenPrivileges`函数提升进程权限,但这也增加了潜在的安全风险,因此需谨慎处理。 通过理解以上知识点,并结合VC++的编程技巧,可以编写出能够安全、高效地修改DNS服务器地址的程序。在...

Global site tag (gtag.js) - Google Analytics