首页 > 解决方案 > 从 Vb.net 到 C# 实现 WMI 相关模块

问题描述

我想将此模块从我找到的其他 Visual Basic 程序添加到我的 C# 程序中。

我试图转换它,但我收到错误:CS1061、CS0428、CS1579 编译时。还添加了参考(MS.VB、Sys.Management)。

视觉基础:

Public Shared Sub KillLastProc()
    Dim objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & Environment.UserDomainName & "\root\cimv2")
    Dim colProcess = objWMIService.ExecQuery("Select * from Win32_Process")
    Dim wmiQuery As String = String.Format("select CommandLine from Win32_Process where Name='{0}'", "explorer.exe")
    Dim searcher As Management.ManagementObjectSearcher = New Management.ManagementObjectSearcher(wmiQuery)
    Dim retObjectCollection As Management.ManagementObjectCollection = searcher.Get
        For Each retObject As Object In colProcess
            If retObject.CommandLine.ToString.Contains("--CMD=") Then
                retObject.Terminate()
            End If
    End Sub

夏普:

public static void KillLastProc()
{
    var objWMIService = Interaction.GetObject("winmgmts:" + @"{impersonationLevel=impersonate}!\" + Environment.UserDomainName + @"\root\cimv2");
    var colProcess = objWMIService.ExecQuery("Select * from Win32_Process");
    string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", "explorer.exe");
    System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(wmiQuery);
    System.Management.ManagementObjectCollection retObjectCollection = searcher.Get;
    foreach (object retObject in colProcess)
    {
       if (retObject.CommandLine.ToString().Contains("--CMD="))
           retObject.Terminate();
    }
}

标签: c#.net

解决方案


您的编译器错误有多种原因。此外,原始 VB 代码有不必要的 WMI 调用。

在处理 WMI 代码之前,我建议您使用 .NetSystem.Diagnostics.Process类来处理 C# 中的进程。

Process
    .GetProcessesByName("explorer")
    .Where(x => x.StartInfo.Arguments.Contains("--CMD="))
    .ToList()
    .ForEach(x => x.Kill());

关于 WMI 代码,您将完成以下任务:

string wmiQuery = string.Format("select * from Win32_Process where Name='{0}'", "explorer.exe");
var searcher = new ManagementObjectSearcher(wmiQuery);
var processes = searcher.Get();
foreach (ManagementObject retObject in processes)
{
    foreach(var prop in retObject.Properties)
    {
        if (prop.Name == "CommandLine" && prop.Value.ToString().Contains("--CMD="))
        {
            retObject.InvokeMethod("Terminate", null);
        }
    }
}

推荐阅读