C#通过获取快捷方式指向目标的小示例触碰WMI

.Net本身没有封装对快捷方式的操作类,所以要在C#中操作快捷方式,需要借助“外力”。市面上常见的方法是通过Windows Script Host Object Model这个COM组件来完成。这种方法的缺憾是你的程序必须带上Interop.IWshRuntimeLibrary.dll这个文件(不过也许可以把这个dll并入exe中再动态加载什么的)。

Anyway~今天说的是另一个途径——WMI(Windows Management Instrumentation),这个东东我了解不深,只知道很强大,几乎涉及win系统软硬件资源的方方面面,使用一种叫WQL的查询语言(SQL它妹)获取资源信息,我也是现学现用,抛砖引玉,告知还不知道的童鞋们除了Win32 API,还有WMI这货可以解决某些.Net解决不了的问题,所以~WMI大牛撸过即可。

小二~上代码:

using System;
using System.Management;//需先引用System.Management.dll程序集

class Program
{
    static void Main(string[] args)
    {
        string scope = @"\\.\root\cimv2";//指定WMI的命名空间,如果不指定,默认就是这货,不区分大小写

         string wql = @"SELECT Name, Target
                       FROM Win32_ShortcutFile
                       WHERE Name = 'C:\\Users\\Administrator\\Desktop\\newemax参数.xlsx.lnk'";
        //构建WQL语句,我说是SQL它妹不是乱盖,WQL只有SELECT和WHERE,还有个GROUP,但似乎跟SQL的GROUP BY不是一回事

         ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, wql);//构建一个查询器
         ManagementObjectCollection objs = searcher.Get();//调用查询器的Get方法以执行查询,并将查询结果装入一个对象集合

         //遗憾的是该集合不支持[]下标索引,要获取里面的对象必须foreach,即使你明确知道里面只有1个对象,操蛋~
        foreach (ManagementBaseObject obj in objs)
        {
           //通过对象["属性名"]的方式获取该属性的值,可以理解为上述WQL语句中SELECT后的字段名
             Console.WriteLine("{0} 指向的目标:{1}", obj["name"], obj["Target"]);
        }

        Console.ReadKey();
    }
}

WMI的世界自成一体,也有命名空间,类,对象/实例,属性,方法等概念。我目前倾向用数据库的结构来理解它:WMI就好比一个SQL实例,不同的命名空间就是SQL实例上不同的库,而WMI的类就是库里面的表,类的属性就是表里的字段,其余的方法什么的我目前还没概念,就不妄言了。

最后,推荐几个WMI工具:

1、系统自带。运行wbemtest

2、WMI Explorer。http://www.ks-soft.net/hostmon.eng/wmi/index.htm

3、还是WMI Explorer,只是主人不同,来自脚本工具大家人户SAPIEN,但目前在它官网找不到该工具的下载入口,好在这儿可以下:http://www.softpedia.com/get/System/System-Info/SAPIEN-WMI-Explorer.shtml

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏进击的程序猿

如何组织PHP中的异常

本文的主题是怎么组织php的异常?在大型项目中异常往往被我们忽略,但是如果前期没有很好的规划好,越到项目后期,重构的成本会越大。

1391
来自专栏杨建荣的学习笔记

同样的sql执行结果不同的原因分析 (r4笔记第27天)

今天开发的同事问我一个问题,说有一个sql语句,在weblogic的日志中执行没有结果,但是手动拷贝数据到客户端执行,却能够查到。这种奇怪的问题一下子就能引起我...

2988
来自专栏Golang语言社区

网游内存数据库的设计(1)

网络游戏的数据变动比较频繁,如果每次数据变动都刷往后端数据库,会导致数据库不负重荷。在游戏逻辑和数据库间提供一层缓冲服务,有利于减轻这重压力. 首先,网络游戏的...

3716
来自专栏腾讯Bugly的专栏

那些年,我们一起写过的“单例模式”

本文来自:“天天P图攻城狮”公众号(ttpic_dev) 题记 度娘上对设计模式(Design pattern)的定义是:“一套被反复使用、多数人知晓的、经过分...

4504
来自专栏微服务生态

野谈系列之高性能可定制化分布式发号器

刘兵,花名玄靖,开源技术爱好者,高性能Redis中间件NRedis-Proxy作者,目前研究方向为java中间件,微服务等技术。

833
来自专栏Golang语言社区

网游内存数据库的设计(1)

网络游戏的数据变动比较频繁,如果每次数据变动都刷往后端数据库,会导致数据库不负重荷。在游戏逻辑和数据库间提供一层缓冲服务,有利于减轻这重压力. 首先,网络游戏的...

3827
来自专栏更流畅、简洁的软件开发方式

Step By Step 一步一步写网站[1] —— 填加数据

填加数据是一个项目必不可少的部分,也是一个基础操作,使用也是最频繁的。 那么您是怎么实现添加数据的呢? 添加数据可以分为几种情况。 1、单表添加,不需要事务。...

20910
来自专栏Golang语言社区

Golang单例模式

单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实...

3817
来自专栏小樱的经验随笔

CTF---Web入门第六题 因缺思汀的绕过

因缺思汀的绕过分值:20 来源: pcat 难度:中 参与人数:6479人 Get Flag:2002人 答题人数:2197人 解题通过率:91% 访问...

3738
来自专栏C/C++基础

CVTE2017秋季校招笔试题回忆(C++后台岗)

2016.09.06晚参加了CVTEC++岗的在线笔试。笔试题型分为不定向选择题和编程题,总共27题。其中不定项选择题为25道,编程题2道。其特点是不定项选择题...

961

扫码关注云+社区

领取腾讯云代金券