C# 监听WMI事件

1、什么是WMI事件

看了一下微软MSDN上对WMI事件的解释,但是没怎么看懂,不过也大概明白了。WMI事件是系统内部在执行一些动作时触发的事件,比如:打开(或关闭)某一个进程、打印、插入USB检测、打开某一个文件。

2、WMI事件查询

SELECT * FROM __InstanceCreationEvent WITHIN 0.001 WHERE TargetInstance ISA \"Win32_PrintJob\"

这条看似SQL语句的查询语句就是查询WMI事件的,我们来分析一下这条语句。

__InstanceCreationEvent这个对象翻译成中文就是:实例创建事件,就是添加或创建类的事件都是从这个对象中查询,比如我们创建一个进程或一个文件。我们不止可以查询创建事件,增、删、改这几种类型的事件都可以查询到,修改是:__InstanceModificationEvent,删除是:__InstanceDeletionEvent。查询好像没有。

within 0.001,这个参数指的是查询的轮询时间,隔多长时间去查询一次这个事件,单位是秒,这里的轮询时间是1毫秒

TargetInstance,目标实例的名称;ISA,就是is a 的缩写,连起来就是目标实例是什么

Win32_PrintJob,目标实例的名称,这里的例子是windows系统的打印任务。

整个查询的意思就是:每隔1毫秒去查询windows系统中的新建的打印任务

如果我们要查询具体实例的名称,比如我们要查询系统创建一个什么进程,那查询语句应该是这样的:

Select * From __InstanceCreationEvent WITHIN 60 Where TargetInstance ISA 'Win32_Process' and TargetInstance.Name = 'notepad.exe'

3、代码实现

引用程序集:System.Management

ManagementEventWatcher createPrintJobWatcher = new ManagementEventWatcher();

// Create event query to be notified within 1 milli second of a change in a service
WqlEventQuery createPrintJobQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.001 WHERE TargetInstance ISA \"Win32_PrintJob\"");



createPrintJobWatcher.Query = createPrintJobQuery;
// times out watcher.WaitForNextEvent in 20 seconds
createPrintJobWatcher.Options.Timeout = new TimeSpan(0, 0, 20);
//set the print event handler
createPrintJobWatcher.EventArrived += new EventArrivedEventHandler(createPrintJobListener);

createPrintJobWatcher.Start();

监听到事件后的事件处理程序 

static void createPrintJobListener(object sender, EventArrivedEventArgs e)
        {

            SelectQuery query = new SelectQuery("Win32_PrintJob");
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
            using (ManagementObjectCollection printJobs = searcher.Get())
                foreach (ManagementObject printJob in printJobs)
                {

                    foreach (var item in printJob.Properties)
                    {
                        Console.WriteLine($"属性名称:{item.Name},属性值:{item.Value}");
                    }
                    Console.WriteLine("c1:", printJob);
                    Console.WriteLine("ID: {0}", printJob.GetPropertyValue("JobId").ToString());
                    Console.WriteLine("name: {0}", printJob.GetPropertyValue("name").ToString());
                    Console.WriteLine("status: {0}", printJob.GetPropertyValue("status").ToString());
                    if (printJob.GetPropertyValue("JobStatus") != null)
                    {
                        Console.WriteLine("JobStatus: {0}", printJob.GetPropertyValue("JobStatus").ToString());
                    }
                    else
                    {
                        Console.WriteLine("JobStatus: NULLLLLL");
                    }

                    Console.WriteLine("PC: {0}", printJob.GetPropertyValue("HostPrintQueue").ToString());
                    Console.WriteLine("TOTOAL PAGES: {0}", printJob.GetPropertyValue("TotalPages").ToString());
                }
        }

最后附上MSDN的地址:WMI 事件 | Microsoft Docs

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中获取WMI共享文件夹的物理目录是通过查询Win32_Share类来实现的。以下是一个实现的示例代码: 首先,您需要进行以下引用: ```csharp using System.Management; ``` 然后,您可以使用以下代码来获取WMI共享文件夹的物理路径: ```csharp public static string GetSharedFolderPath(string shareName) { string folderPath = ""; ManagementScope scope = new ManagementScope(); try { // 连接WMI命名空间 scope.Connect(); ObjectQuery query = new ObjectQuery($"SELECT Path FROM Win32_Share WHERE Name = '{shareName}'"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection sharedFolders = searcher.Get(); foreach (ManagementObject sharedFolder in sharedFolders) { folderPath = sharedFolder["Path"].ToString(); break; // 如果只有一个共享文件夹,您可以删除这一行 } } catch (ManagementException ex) { // 处理异常 Console.WriteLine("An error occurred while querying WMI: " + ex.Message); } return folderPath; } ``` 您可以调用此方法并传递共享文件夹的名称参数,例如: ```csharp string sharedFolderPath = GetSharedFolderPath("ShareName"); Console.WriteLine("Shared folder path: " + sharedFolderPath); ``` 此代码将返回共享文件夹的物理路径,并将其打印到控制台。如果有多个具有相同名称的共享文件夹,该代码将仅返回第一个找到的共享文件夹的物理路径。 请注意,您需要具有适当的权限才能查询WMI。如果遇到权限问题,请确保您的应用程序以管理员权限运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值