系统密码查看器,.NET(C#)自己做一个系统信息查看器

当你右键点击我的电脑的属性后,Windows会显示系统属性窗口,显然这不是用C#写的,但这并不代表着.NET(C#)不可以
image.NET(C#)自己做一个系统信息查看器系统密码查看器
 
下面是我写的简单的系统属性查看器(C#/WPF)
imageimage.NET(C#)自己做一个系统信息查看器系统密码查看器
 
 
注意:
 
    程序全部用托管代码实现,主要查询依赖WMI.NET,因此示例代码运行需要引用System.Windows.Management.dll,并需在代码开头加入:using System.Management; 命名空间。
    文章需要读者对WMI有基本了解。
 
推荐参考的链接:
WMI.NET概述:http://msdn.microsoft.com/en-us/library/ms257340(v=VS.80).aspx
WMI Win32类:http://msdn.microsoft.com/en-us/library/aa394084.aspx
 
 
下载程序或源代码
点击下载
 
(此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载)
程序环境:.NET Framework 4.0 Client Profile
源代码环境:Visual C# 2010 Express SP1
 
 
注意:
程序的源代码主要执行函数是用中文写的,代表功能一目了然,因此就不一一介绍所有函数了,文章下面只会写一些需要注意的地方!
imageimageimage.NET(C#)自己做一个系统信息查看器系统密码查看器
 
 
目录
  • 判断处理器架构
  • 判断内存类型
  • 判断内存大小
  • 判断显卡名称
  • 判断计算机工作组

 
 
 
返回目录

判断处理器架构

 
首先我想到的还是用WMI,于是参考WMI类中的Win32_Processor里的Architecture属性,MSDN里清楚地阐述了这个属性各种值的具体意义(地址:http://msdn.microsoft.com/en-us/library/aa394373(v=VS.85).aspx)。比如32位/64位/PowerPC架构等,非常强大。于是我写出如下WMI查询代码:
        static ManagementObjectSearcher Processor = new ManagementObjectSearcher("select * from Win32_Processor");
 
        public static string 系统类型()
        {
            var val = (ushort)GetValue(Processor, "Architecture");
            switch (val)
            {
                case 0:
                    return "32位";
                case 1:
                    return "MIPS";
                case 2:
                    return "Alpha";
                case 3:
                    return "PowerPC";
                case 6:
                    return "基于Itanium";
                case 9:
                    return "64位";
                default:
                    return "无法识别";
            }
        }
 
        static object GetValue(ManagementObjectSearcher searcher, string propName)
        {
            foreach (ManagementObject mobj in searcher.Get())
                return mobj[propName];
            throw new NotSupportedException();
        }
 
 
可结果在我的32位Win7上运行竟然返回是64位,始终不解……(贴在上面,谁可以解释一下求教导)
 
查阅资料,才知.NET 4.0中Environment类中有判读64位系统的直接属性,直接用它:
        public static string 系统类型()
        {
            return Environment.Is64BitOperatingSystem ? "64位" : "32位";
        }
 
 
不过貌似现在.NET 4.0还不是很普及哈(可能有人此时会对着屏幕说:“其实.NET就根本没有普及过”……呵呵,,,扯远了),总之如果不是.NET 4.0环境,我们依然可以通过系统环境变量:PROCESSOR_ARCHITECHTURE来判断,参考这篇文章(http://msdn.microsoft.com/en-us/library/aa384274.aspx),我写出如下代码:
        public static string 系统类型()
        {
            var val = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", EnvironmentVariableTarget.Machine);
            //貌似可能的值是:x86, x64, AMD64, IA64
            if (val.Contains("86"))
                return "32位";
            if (val.Contains("64"))
                return "64位";
            //如果不属于这些值,我就不瞎翻译了,返回人家原值
            return val;
        }
 
 
返回目录

判断内存类型

定义在WMI中Win32_PhysicalMemory的MemoryType属性,不过目前还不能直接判断DDR3的类型,DDR3内存会返回0(代表未知类型)
可以参考:http://msdn.microsoft.com/en-us/library/aa394347(v=VS.85).aspx
 
测试代码:(下面switch中仅列出常见类型,你可以参考MSDN链接并加入更多的内存判断支持)
        static ManagementObjectSearcher PhysicalMemory = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
 
        public static string 内存类型()
        {
            var val = (ushort)GetValue(PhysicalMemory, "MemoryType");
            switch (val)
            {
                case 0:
                    return "未知(可能是DDR3)";
                case 2:
                    return "DRAM";
                case 17:
                    return "SDRAM";
                case 20:
                    return "DDR";
                case 21:
                    return "DDR2";
                default:
                    return "未知类型";
            }
        }
 
        static object GetValue(ManagementObjectSearcher searcher, string propName)
        {
            foreach (ManagementObject mobj in searcher.Get())
                return mobj[propName];
            throw new NotSupportedException();
        }
 
 
 
返回目录

判断内存大小

或许你已经查询过.NET(C#)判断物理内存大小的方法,但网上大多数方式是调用GlobalMemoryStatus Win32 API或者是应用 Microsoft.VisualBasic.dll并使用其中的Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory属性。可以看着个网页(http://stackoverflow.com/questions/105031/c-how-do-you-get-total-amount-of-ram-the-computer-has)
 
但是这两种方法,一种需要P/Invoke,另一种可能在C#下去使用VB的类库,虽然针对.NET的类库都是通用的跨语言的,但还是不舒服的(就像在WPF下引用Windows Forms的类库),还是我上面所推荐的,这种操作能用.NET中内置的就用它,如果没有,WMI.NET还是比较天然的选择。
 
当然,无论那种方法都可以正确得到结果的。
 
下面贴出WMI查询代码,其实一点也不复杂,就是用Win32_PhysicalMemory 类的Capacity属性:
        static ManagementObjectSearcher PhysicalMemory = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
 
        public static string 物理内存()
        {
            //除两个1024 将 字节转换成兆字节(byte -> MB)
            return String.Format("{0} MB", Convert.ToInt64(GetValue(PhysicalMemory, "Capacity")) / 1024 / 1024);
        }
 
        static object GetValue(ManagementObjectSearcher searcher, string propName)
        {
            foreach (ManagementObject mobj in searcher.Get())
                return mobj[propName];
            throw new NotSupportedException();
        }
 
在我的电脑,输出2048 MB(2GB)
 
 
返回目录

判断显卡名称

WMI的Win32_VideoController的Caption属性,MSDN(http://msdn.microsoft.com/en-us/library/aa394512(v=VS.85).aspx)
        static ManagementObjectSearcher VideoController = new ManagementObjectSearcher("select * from Win32_VideoController");
 
        public static string 显卡名称()
        {
            return (string)GetValue(VideoController, "Caption");
        }
 
        static object GetValue(ManagementObjectSearcher searcher, string propName)
        {
            foreach (ManagementObject mobj in searcher.Get())
                return mobj[propName];
            throw new NotSupportedException();
        }
 
 
 
返回目录

判断计算机工作组

.NET中System.Environment类中并没有获取计算机工作组(Workgroup)的属性,只能通过WMI的Win32_ComputerSystem的Workgroup属性来获取
(MSDN:http://msdn.microsoft.com/en-us/library/aa394102(v=VS.85).aspx)
        static ManagementObjectSearcher CompSys = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
 
        public static string 工作组()
        {
            return (string)GetValue(CompSys, "Workgroup");
        }
 
        static object GetValue(ManagementObjectSearcher searcher, string propName)
        {
            foreach (ManagementObject mobj in searcher.Get())
                return mobj[propName];
            throw new NotSupportedException();
        }
 
我的电脑输出:WORKGROUP
Tags: 

延伸阅读

最新评论

发表评论