Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WMI Series :管理对象的信息查询和方法访问

WMI Series :管理对象的信息查询和方法访问

作者头像
Java架构师必看
发布于 2021-03-22 03:16:12
发布于 2021-03-22 03:16:12
56400
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

管理对象的信息查询和方法访问

在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的 System.Management 命名空间中的相关类对象。

管理对象的信息查询

管理对象的信息查询有两种方式,一种是直接枚举管理对象的各种属性,而获取我们感兴趣的数据;一种方法是通过 SQL 查询语句的方式来过滤冗余的数据,而得到感兴趣的数据。

对于一个 Win32_LogicalDisk 实例对象而言,它有那些属性,也就是它有那些信息可以供我们访问呢?这些属性名是什么样的?这是开发人员在开发过程中经常遇到的问题,通常我们是可以去查 MSDN ,但是在这里我给出一种通过编程的方法获取代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 *****************************************************
 //获取Win32_LogicalDisk WMI对象可供访问的属性
 public
  static void FetchProperties()
      {
      ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
      diskClass.Get();
      Console.WriteLine("Win32_LogicalDisk对象共有" + diskClass.Properties.Count + " 属性。");
 .    PropertyDataCollection diskProperties = diskClass.Properties;    
      foreach (PropertyData diskProperty in diskProperties) 
           {
               Console.WriteLine("diskClass[{0}] ",diskProperty.Name);
          }
      }
 *****************************************************

知道了那些属性可以供我们访问,下一步就是来具体的获取管理对象 Win32_LogicalDisk 的信息。首先用第一种方法,即枚举属性而回去数据的方法。在这里我们通过列举 WMI 类 Win32_LogicalDisk 实例对象的数据,获取您的计算机上各种逻辑磁盘分区,包括软驱和光驱,并输出每个逻辑磁盘分区的一些信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 *****************************************************
 //获取Win32_LogicalDisk对象的数据信息
 public static void FetchInfo()
      {
          ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
          ManagementObjectCollection disks = diskClass.GetInstances(); 
          foreach (ManagementObject disk in disks) 
           { 
               Console.WriteLine("Disk_DeviceID= {0}" ,disk["DeviceID"].ToString());
               Console.WriteLine("Disk_Name = {0}" , disk["Name"].ToString());
                if(disk["FileSystem"]!=null)
               Console.WriteLine("Disk_FileSystem = {0}" , disk["FileSystem"].ToString());
               Console.WriteLine("Disk_Description = {0}" , disk["Description"].ToString());
               if(disk["Size"]!=null)
               Console.WriteLine("Disk_Size ={0} " ,System.Convert.ToInt64(disk["Size"].ToString()));
               Console.WriteLine("Disk_type = {0}" , System.Convert.ToInt16(disk["DriveType"].ToString()));                    
          }
      }
 *****************************************************

提示:( 1 )由于你的软驱和光驱的 FileSystem Size 属性为空,所有加了 if 判断,否则输出会产生异常。

2 Size 属性的数据是以 bytes 字节为单位。

上面访问的方法其实很简单,我们再看看如何通过 SQL 查询的方式来访问管理对象的数据。以下的例子是以 win32_Process管理对象为例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 *****************************************************
 //通过SQL查询方式访问管理对象数据
 public static void QueryInfo()
      {
          ManagementObjectSearcher searcher = new 
          ManagementObjectSearcher("select * from Win32_Process");
           foreach (ManagementObject process in searcher.Get()) 
               {
                    Console.WriteLine("process = " + process["Name"]);
               }
      }
 *****************************************************

至此,我们可以轻松的通过上面的方式访问管理对象的数据了。

管理对象方法的访问

在 Windows2000 的任务管理器中,我们可以终止进程,也可以启动进程;在服务管理器中,我们可以启动、暂停、 7 终止服务,那么您肯定会问通过程序怎样完成类似上面的任务。是的,对于那些可供用户操作的管理对象,它提供可一些公开的方法供客户端应用程序来调用,从而完成各种任务。上面的例子只是给出了单向的信息访问,接下来的内容,我们将看看如何访问管理对象的方法。

并不是所有的管理对象会公开方法,是否公开方法和公开那些方法取决于需要。对于逻辑磁盘来说,可能会公开一个 Format 的方法用于格式化磁盘,对于运行的进程来说,可能公开 Start 、 Stop 方法来开始终止进程。我们将以启动一个进程为例来说明这个问题。

创建一个进程,需要调用 Win32_Process WMI对象的Create方法。Create方法有四个输入参数,分别为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 uint32 Create(
  string CommandLine,
  string CurrentDirectory,
  Win32_ProcessStartup ProcessStartupInformation,
  uint32* ProcessId
 );

CommandLine 参数为进程的可执行文件全名,如启动一个记事本 Notepad.exe ;

CurrentDirectory 为被启动进程的当前工作目录,若为 Null ,则子进程和父进程之间共享一个工作目录;

ProcessStartupInformation :进程启动的配置信息,可参考其他资料;

ProcessId :进程的全局唯一标识 ID ,当进程被创建时即被分配。

而在我们的客户端管理应用程序中并不是直接的调用 Create 方法来启动进程,而是通过调用 ManagementClass. InvokeMethod()方法来间接启动进程的。InvokeMethod()方法有两种原型,一种是输入参数为数组,一种是输入参数为ManagementBaseObject对象,为了简单起见,我们在这里使用的是ManagementBaseObject对象作为输入和输出参数。

public ManagementBaseObject InvokeMethod(string, ManagementBaseObject, InvokeMethodOptions);

InvokeMethodOptions为调用方法的选项,包括调用延时等等。

由于WMI对象是如此之多,每个被管理的WMI对象的公开的方法又是不同的,InvokeMethod()方法是如何能区分这些不同的WMI对象以及WMI对象不同的公开方法,因为方法的不同就意味这参数不一样,因此我们还得知道Create这个特定的启动进程方法的参数。ManagementClass. GetMethodParameters()通过在运行时来获取不同的方法输入和输出参数。

解决了这些关键的问题,下面我们就可以看看代码是怎么实现的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 *****************************************************
 //管理对象的方法调用
 public static void InvokeMethod()
      {
           ManagementClass processClass = new ManagementClass("Win32_Process");
  
 //取得输入参数
          ManagementBaseObject inParams = processClass.GetMethodParameters("Create");              
          inParams["CommandLine"] = "notepad.exe";
  
 //执行创建进程
          ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null);
  
 //显示创建进程的结果
          Console.WriteLine("Creation of calculator process returned: " + outParams["returnValue"]);
          Console.WriteLine("Process ID: " + outParams["processId"]);
      }
 *****************************************************

看看运行的结果,打开了一个记事本程序,同时输出类似下面的信息:

Creation of calculator process returned: 0

Process ID: 2340

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WMI使用技巧集
WMI使用技巧集 很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不运维
Java架构师必看
2021/03/22
8770
.NET 框架中的 WMI 命名空间
.NET 框架中与 WMI 规范有关的命名空间有两个 , 分别是 System.Management 和 System.Management.Instrumentation 两个命名空间。其中 System.Managemen 命名空间提供的类对象为访问各种管理对象提供了面向对象的编程接口,而 System.Management.Instrumentation 命名空间提供的类用来设置用户自定义的应用程序,使得这些应用程序对象能够符合 WMI 的规范,从而通过 WMI 向使用该应用程序的管理者公开其提供的管理信息和事件,这些使用者有可能是 Microsoft Application Center 或 Microsoft Operations Manager 这样的,也有可能是自定义编写的高端管理应用程序(您可以通过 System.Management 命名空间提供的类对象来编写自己的管理应用程序)。因此,如果您想使自己的产品的管理可以在这些管理工具,您就得使您自己的应用程序符合 WMI 的规范,而针对 .NET 平台上的应用程序 WMI 规范编写来说,使用的是 System.Management.Instrumentation 命名空间提供的类。
Java架构师必看
2021/03/22
1.1K0
dotnet 通过 WMI 获取指定进程的输入命令行
使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令
林德熙
2019/03/13
7270
System.Management 概述
System.Management 是一个用于访问和管理 Windows 系统信息的命名空间,基于 Windows Management Instrumentation (WMI) 提供了丰富的管理功能。
郑子铭
2025/03/20
560
System.Management 概述
PS常用命令之系统WMI查看和操作相关命令
[TOC] 0x00 前言简述 Q: 什么是WMI? 答: WMI出现至今已经多年,但很多人对它并不熟悉。知道它很好很强大,但不知道它从哪里来,怎么工作,使用范围是什么? WMI有一组API我们不管
全栈工程师修炼指南
2022/09/29
1.5K0
在 C# 中获取操作系统相关信息
在开发应用程序时,获取操作系统的信息对程序的功能和兼容性至关重要。我们可以通过操作系统的相关信息来进行环境检测、功能适配和错误报告等功能。本文将介绍如何在 C# 中获取操作系统的详细信息,涵盖操作系统名称、版本、体系结构等内容,并提供详尽的代码示例和解释。
Michel_Rolle
2024/07/22
2.7K0
内网横向移动执行命令方法之 wmic 利用总结
内网中,由于大多数 Windows 系统自带 wmic 命令, 所以 WMIC 是内网横向的常用方法之一,使用 WMI 的前置要求是,目标端口开放 135 端口,且允许随机一个高位端口进行通信。这是由于 WMI 是先通过 135 端口建立连接,而后通过随机的高位端口进行数据传输。
信安之路
2021/11/02
5.1K0
内网横向移动执行命令方法之 wmic 利用总结
Python wmi 模块的学习
# -*- coding:utf-8 -*- import datetime import os import wmi import time import _winreg import pythoncom import threading import win32api import win32con import Queue c = wmi.WMI() # 如果要连接远程机器,只需要在WMI构造器中指定远程机器名即可 # c = wmi.WMI("some_other_machine") # Li
py3study
2020/01/08
2.9K0
WMI技术介绍和应用——查询正在运行的进程信息
       在《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》一文中,我们介绍到了一个半同步查询WMI类的框架。本文将是该技术的一个应用,介绍如何使用WMI技术查询正在运行的进程信息。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
1.8K0
C/C++ 运用WMI接口查询系统信息
Windows Management Instrumentation(WMI)是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口,通过这个接口,可以获取有关计算机系统硬件、操作系统和应用程序的信息,以及对系统进行管理和控制的能力。
王瑞MVP
2023/11/19
3630
C/C++ 运用WMI接口查询系统信息
WMI列出Windows中某个目录的用户权限
ManagementPath path = new ManagementPath( );
Java架构师必看
2021/03/22
1.6K0
WMI列出磁盘配额
ManagementClass c = new ManagementClass("Win32_DiskQuota");
Java架构师必看
2021/03/22
9340
ManagementClass类解析和C#如何获取硬件的相关信息
彭泽0902
2018/01/04
3.8K1
ManagementClass类解析和C#如何获取硬件的相关信息
终端安全系列-计划任务详解
任务计划程序服务(Task Scheduler service)是Windows操作系统中的一个核心服务,它负责管理和执行计划任务。任务计划程序服务(Task Scheduler service)在后台运行,并由 svchost.exe 进程来托管。任务计划程序服务允许用户创建、编辑和删除计划任务。用户可以通过图形用户界面(Task Scheduler GUI)、命令行工具(如schtasks)或编程接口来管理计划任务,用于在预定的时间或特定事件发生时自动执行一系列任务。
黑白天安全
2023/08/28
2.4K0
终端安全系列-计划任务详解
在C#中利用wmi操作DNS服务器
public class DNSAdminLib { //要连接的DNS服务器 private string sServerPath; //用户名 private string username = null; //密码 private string password = null; //服务器名称或IP地址 private string DNSName = null; //表示管理操作的范围.这里是用来执行DNS的命名空间 private ManagementScope DNS; //用于返回检索的ManagementObject集合 private System.Management.ManagementObjectCollection Q; // private ManagementClass DnsClass; // private ManagementBaseObject MI; /// <summary> /// DNS服务器名称或IP地址 /// </summary> public string ServerName { set { this.sServerPath = string.Format(@”//{0}/root/MicrosoftDNS”, value); this.DNSName = value; } }
全栈程序员站长
2022/11/10
9410
WMI利用(横向移动)
上一篇文章我们简单的解释了什么是WMI,WMI做什么,为什么使用WMI。本文是笔者在阅读国内部分的解释WMI横向移动的文章后写下的一篇文章,希望帮助同学们在攻防中进入横向移动后根据实际场景利用WMI来解决问题。在横向移动中的固定过程中一定离不开“信息收集”,然后分析信息根据实际场景(工作组或者域)来进行横向移动,至于使用什么工具,为什么使用这个工具,笔者使用WMI的意见。所以本文分为三个段落,信息收集、横向移动、部分意见。 信息收集。
谢公子
2022/01/19
2.9K0
WMI利用(横向移动)
Python WMI获取Windows系统信息
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 #http://www.cnblogs.com/liu-ke/ 4 import wmi 5 import os 6 import sys 7 import platform 8 import time 9 10 def sys_version(): 11 c = wmi.WMI () 12 #获取操作系统版本 13 for sys in
流柯
2018/08/30
7270
WMI ——重写版
本文是以WMI的重写版,本来这份笔记会更长,原版的笔记以Black Hat 2015的Abusing Windows Management Instrumentation (WMI) to Build a Persistent, Asyncronous, and Fileless Backdoor为主要学习资料,在笔记写到大概一万字的时候,Typora 中保存的内容部分丢失。于是重新整理,有了这份,我认为精简版的WMI笔记。
Ms08067安全实验室
2020/08/12
2.2K0
WMI ——重写版
dotnet 通过 WMI 获取系统信息
Win32_OperatingSystem class - Windows applications
林德熙
2019/03/13
5200
dotnet 通过 WMI 获取系统信息
Win32_OperatingSystem class - Windows applications
林德熙
2022/08/07
3890
相关推荐
WMI使用技巧集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验