本文概述
- 重要的提示
- 显卡(GPU)
- 硬盘驱动器(和其他类型的驱动器)
- 处理器
- 操作系统
- 网络接口
- 声卡(音频设备)
- 印表机
在本文中, 你将学习如何在Winforms中使用C#检索系统的基本和高级信息。
重要的提示 在某些示例中, 你需要在项目中添加以下参考, 以检索有关系统的信息:
using System.Management;
但是, 在某些Visual Studio版本中(特别是在2010年和更高版本中), 你还需要在项目中手动添加引用(.DLL)。为此, 请按照下列步骤操作:
- 右键单击项目, 添加引用
- 选择”
程序集(框架)”
选项卡, 然后搜索System.Management, 最后添加引用, 然后单击”
确定”
。
文章图片
我们需要添加System.Management来在WMI类中创建查询。在此处阅读有关在msdn中检索.NET中的WMI类的更多信息。
另一方面, 请记住, 所有使用ManagementObjectSearcher类来获取系统信息的实现, 其属性值为整数值(0-100), 并且这些值与属性名称无关(例如, 使用Video_Controller GPU类)返回0到9之间的值的Architecture属性), 并且你期望一个非常特定的值(例如x86或x64), 则可能是你传递了一些信息!请阅读Microsoft开发人员网络网站上的类的文档(分别在文章的每个部分中提供), 以获取每个属性的详细说明。
例如, 如前所述, Architecture属性返回一个整数(对于你来说, 这对值没有意义), 但是此值指定下表的索引(而不是值本身):
编号 | 值 |
---|---|
0 | x86 |
1 | MIPS |
2 | Α |
3 | PowerPC |
5 | 臂 |
6 | ia64(基于Itanium的系统) |
9 | x64 |
现在你知道了, 让我们开始吧!
显卡(GPU) 要获取有关GPU的信息, 我们需要使用ManagementObjectSearcher类对Win32_VideoController类创建系统查询。
首先向你的班级添加以下参考:
using System.Management;
如果在代码中使用该类时仍然看到错误, 请阅读本文开头的” 重要说明” 。
如果一切正确, 那么你将能够查询Win32_VideoController类。 Win32_VideoController WMI类表示运行Windows的计算机系统上视频控制器的功能和管理能力。
要访问WMI类, 我们需要如前所述, 创建一个查询。可以使用ManagementObjectSearcher类(在System.Management中提供)创建此查询。它根据指定的查询检索管理对象的集合。此类是检索管理信息的更常用入口点之一。
请参阅ManagementObjectSearcher的以下实现, 以查询Win32_VideoController类以检索有关GPU的高级信息:
ManagementObjectSearcher myVideoObject = new ManagementObjectSearcher("select * from Win32_VideoController");
foreach (ManagementObject obj in myVideoObject.Get()){Console.WriteLine("Name-" + obj["Name"]);
Console.WriteLine("Status-" + obj["Status"]);
Console.WriteLine("Caption-" + obj["Caption"]);
Console.WriteLine("DeviceID-" + obj["DeviceID"]);
Console.WriteLine("AdapterRAM-" + obj["AdapterRAM"]);
Console.WriteLine("AdapterDACType-" + obj["AdapterDACType"]);
Console.WriteLine("Monochrome-" + obj["Monochrome"]);
Console.WriteLine("InstalledDisplayDrivers-" + obj["InstalledDisplayDrivers"]);
Console.WriteLine("DriverVersion-" + obj["DriverVersion"]);
Console.WriteLine("VideoProcessor-" + obj["VideoProcessor"]);
Console.WriteLine("VideoArchitecture-" + obj["VideoArchitecture"]);
Console.WriteLine("VideoMemoryType-" + obj["VideoMemoryType"]);
}
Win32_VideoController的ManagementObject具有更多属性, 你可以在此处阅读有关此类的更多信息以及Microsoft开发人员网络文档中的所有可用属性。
注意:请记住, 与Windows显示驱动程序模型(WDDM)不兼容的硬件对于此类的实例返回的属性值不准确, 或者仅返回空值。
输出应类似于以下内容:
/** Name-NVIDIA GeForce GTX 760Status-OKCaption-NVIDIA GeForce GTX 760DeviceID-VideoController1AdapterRAM-2147483648AdapterDACType-Integrated RAMDACMonochrome-FalseInstalledDisplayDrivers-nvd3dumx.dll, nvwgf2umx.dll, nvwgf2umx.dll, nvwgf2umx.dll, nvd3dum, nvwgf2um, nvwgf2um, nvwgf2umDriverVersion-21.21.13.7306VideoProcessor-GeForce GTX 760VideoArchitecture-5VideoMemoryType-2**/
此外, 如果要将AdapterRAM值转换为人类可读的值(MB, GB)而不是字节, 还可以在” 硬盘” 区域中使用提到的SizeSuffix方法:
// Convert the string obj["AdapterRAM"] into a Long valueConsole.WriteLine("AdapterRAM-" + SizeSuffix((long)Convert.ToDouble(obj["AdapterRAM"])));
// Outputs : AdapterRAM-2, 0 GB
硬盘驱动器(和其他类型的驱动器) 为了获得有关台式机上已安装驱动器的信息, 我们将依赖于System.IO名称空间中包含的DriveInfo类。此类提供对驱动器上信息的访问权限, 对驱动器进行建模, 并提供查询驱动器信息的方法和属性。使用DriveInfo可以确定哪些驱动器可用以及它们的驱动器类型。如果你的课程尚未被引用, 则需要向其添加以下引用:
using System;
using System.IO;
你可以使用它来查询以确定驱动器上的容量和可用空间。请参见以下示例:
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives){Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine("Drive type: {0}", d.DriveType);
if (d.IsReady == true){Console.WriteLine("Volume label: {0}", d.VolumeLabel);
Console.WriteLine("File system: {0}", d.DriveFormat);
Console.WriteLine("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
Console.WriteLine("Total available space:{0, 15} bytes", d.TotalFreeSpace);
Console.WriteLine("Total size of drive:{0, 15} bytes ", d.TotalSize);
Console.WriteLine("Root directory:{0, 12}", d.RootDirectory);
}}
allDrives变量将是一个可迭代的数组, 其中每个项目都包含有关系统中一个可用磁盘的信息(该磁盘可以是可移动[USB, USB硬盘], 固定[硬盘]和CDRom驱动器)。由于并非每个显示的磁盘都包含信息(对于CDRom, 当其中没有CD时), 你需要使用if语句drive.IsReady属性检查驱动器是否可用。前面的代码将在Output控制台中产生以下输出:
/**Output of the information about the drives available in the systemDrive C:\Drive type: FixedVolume label: File system: NTFSAvailable space to current user:1835493908480 bytesTotal available space:1835493908480 bytesTotal size of drive:1999804297216 bytes Root directory:C:\Drive D:\Drive type: CDRomDrive E:\Drive type: FixedVolume label: File system: NTFSAvailable space to current user:164813348864 bytesTotal available space:164813348864 bytesTotal size of drive:500096991232 bytes Root directory:E:\Drive F:\Drive type: FixedVolume label: CarlosFile system: NTFSAvailable space to current user:39133581312 bytesTotal available space:39133581312 bytesTotal size of drive:320059994112 bytes Root directory:F:\Drive G:\Drive type: RemovableVolume label: UBUNTU 16_1File system: FAT32Available space to current user:30001135616 bytesTotal available space:30001135616 bytesTotal size of drive:31600672768 bytes Root directory:G:\**/
如你所见, 关于驱动器的可用空间和容量, 该值将以字节为单位返回。你可以使用以下实现(函数)以更易于理解的值(MB, GB, TB)检索短输出。该值将自动转换为最合理的值(如果可用兆字节, 则该值将以兆字节显示):
static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
static string SizeSuffix(Int64 value){if (value <
0) { return "-" + SizeSuffix(-value);
}if (value =http://www.srcmini.com/= 0) { return"0.0 bytes";
}int mag = (int)Math.Log(value, 1024);
decimal adjustedSize = (decimal)value / (1L <
<
(mag * 10));
return string.Format("{0:n1} {1}", adjustedSize, SizeSuffixes[mag]);
}
要将长字节值转换为人类可读的值, 只需在返回数字值的值中使用SizeSuffix函数:
Console.WriteLine("Available space to current user:{0, 15}", SizeSuffix(d.AvailableFreeSpace));
Console.WriteLine("Total available space:{0, 15}", SizeSuffix(d.TotalFreeSpace));
Console.WriteLine("Total size of drive:{0, 15} ", SizeSuffix(d.TotalSize));
现在, 所生成的输出值应该以使用Windows的方式更具可读性:
/**Output of the information about the drives available in the system with readable valuesDrive C:\Drive type: FixedVolume label: File system: NTFSAvailable space to current user:1, 7 TBTotal available space:1, 7 TBTotal size of drive:1, 8 TBRoot directory:C:\Drive D:\Drive type: CDRomDrive E:\Drive type: FixedVolume label: File system: NTFSAvailable space to current user:153, 5 GBTotal available space:153, 5 GBTotal size of drive:465, 8 GBRoot directory:E:\Drive F:\Drive type: FixedVolume label: CarlosFile system: NTFSAvailable space to current user:36, 4 GBTotal available space:36, 4 GBTotal size of drive:298, 1 GBRoot directory:F:\Drive G:\Drive type: RemovableVolume label: UBUNTU 16_1File system: FAT32Available space to current user:27, 9 GBTotal available space:27, 9 GBTotal size of drive:29, 4 GBRoot directory:G:\**/
处理器 要获取有关CPU的信息, 我们需要使用ManagementObjectSearcher类对Win32_Processor类创建系统查询。
首先向你的班级添加以下参考:
using System.Management;
如果在代码中使用该类时仍然看到错误, 请阅读本文开头的” 重要说明” 。
如果一切正确, 那么你将能够查询Win32_Processor类。 Win32_Processor WMI类表示可以解释在Windows操作系统上运行的计算机上的指令序列的设备。
要访问WMI类, 我们需要如前所述, 创建一个查询。可以使用ManagementObjectSearcher类(在System.Management中提供)创建此查询。
请参阅ManagementObjectSearcher的以下实现, 以查询Win32_Processor类以检索有关CPU的高级信息:
ManagementObjectSearcher myProcessorObject = new ManagementObjectSearcher("select * from Win32_Processor");
foreach (ManagementObject obj in myProcessorObject.Get()){Console.WriteLine("Name-" + obj["Name"]);
Console.WriteLine("DeviceID-" + obj["DeviceID"]);
Console.WriteLine("Manufacturer-" + obj["Manufacturer"]);
Console.WriteLine("CurrentClockSpeed-" + obj["CurrentClockSpeed"]);
Console.WriteLine("Caption-" + obj["Caption"]);
Console.WriteLine("NumberOfCores-" + obj["NumberOfCores"]);
Console.WriteLine("NumberOfEnabledCore-" + obj["NumberOfEnabledCore"]);
Console.WriteLine("NumberOfLogicalProcessors-" + obj["NumberOfLogicalProcessors"]);
Console.WriteLine("Architecture-" + obj["Architecture"]);
Console.WriteLine("Family-" + obj["Family"]);
Console.WriteLine("ProcessorType-" + obj["ProcessorType"]);
Console.WriteLine("Characteristics-" + obj["Characteristics"]);
Console.WriteLine("AddressWidth-" + obj["AddressWidth"]);
}
Win32_Processor的ManagementObject具有更多属性, 你可以在此处阅读有关此类的更多信息以及Microsoft开发人员网络文档中的所有可用属性。
输出应类似于以下内容:
/**Name-Intel(R) Core(TM) i5-4590 CPU @ 3.30GHzDeviceID-CPU0Manufacturer-GenuineIntelCurrentClockSpeed-3300Caption-Intel64 Family 6 Model 60 Stepping 3NumberOfCores-4NumberOfEnabledCore-4NumberOfLogicalProcessors-4Architecture-9Family-205ProcessorType-3Characteristics-4AddressWidth-64*/
操作系统 要获取有关Operative系统的信息, 我们需要使用ManagementObjectSearcher类对Win32_OperatingSystem类创建系统查询。
首先向你的班级添加以下参考:
using System.Management;
如果在代码中使用该类时仍然看到错误, 请阅读本文开头的” 重要说明” 。
如果一切正确, 那么你将能够查询Win32_OperatingSystem类。 Win32_OperatingSystem WMI类表示计算机上安装的基于Windows的操作系统。
要访问WMI类, 我们需要如前所述, 创建一个查询。可以使用ManagementObjectSearcher类(在System.Management中提供)创建此查询。
请参阅下面的ManagementObjectSearcher实现, 以查询Win32_OperatingSystem类以检索有关Operative System的高级信息:
ManagementObjectSearcher myOperativeSystemObject = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
foreach (ManagementObject obj in myOperativeSystemObject.Get()){Console.WriteLine("Caption-" + obj["Caption"]);
Console.WriteLine("WindowsDirectory-" + obj["WindowsDirectory"]);
Console.WriteLine("ProductType-" + obj["ProductType"]);
Console.WriteLine("SerialNumber-" + obj["SerialNumber"]);
Console.WriteLine("SystemDirectory-" + obj["SystemDirectory"]);
Console.WriteLine("CountryCode-" + obj["CountryCode"]);
Console.WriteLine("CurrentTimeZone-" + obj["CurrentTimeZone"]);
Console.WriteLine("EncryptionLevel-" + obj["EncryptionLevel"]);
Console.WriteLine("OSType-" + obj["OSType"]);
Console.WriteLine("Version-" + obj["Version"]);
}
Win32_OperatingSystem的ManagementObject具有更多属性, 你可以在此处阅读有关此类的更多信息以及Microsoft开发人员网络文档中的所有可用属性。
输出应类似于以下内容:
/**Caption-Microsoft Windows 10 ProWindowsDirectory-C:\WindowsProductType-1SerialNumber-00000-00000-00000-00000SystemDirectory-C:\Windows\system32CountryCode-49CurrentTimeZone-60EncryptionLevel-256OSType-18Version-10.0.10586*/
网络接口 若要获取有关网络接口的信息, 可以使用System.Net.NetworkInformation命名空间中可用的NetworkInterface类。此类提供网络接口的配置和统计信息。
首先将以下引用添加到你的类中:
using System;
using System.Net.NetworkInformation;
并检查以下简单的实现, 其中列出了所有可用的网络接口以及每个对象的某些可用属性:
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
if (nics == null || nics.Length <
1){Console.WriteLine("No network interfaces found.");
}else{foreach (NetworkInterface adapter in nics){IPInterfaceProperties properties = adapter.GetIPProperties();
Console.WriteLine();
Console.WriteLine(adapter.Description);
Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '='));
Console.WriteLine("Interface type .......................... : {0}", adapter.NetworkInterfaceType);
Console.WriteLine("Physical Address ........................ : {0}", adapter.GetPhysicalAddress().ToString());
Console.WriteLine("Operational status ...................... : {0}", adapter.OperationalStatus);
}}
你可以在此处阅读有关msdn中的NetworkInterface类的更多信息。前面的代码应生成类似的输出:
/**Realtek PCIe GBE Family Controller==================================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : UpTAP-Windows Adapter V9======================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : DownBluetooth Device (Personal Area Network)========================================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : DownSoftware Loopback Interface 1=============================Interface type .......................... : LoopbackPhysical Address ........................ : Operational status ...................... : UpTeredo Tunneling Pseudo-Interface=================================Interface type .......................... : TunnelPhysical Address ........................ : 00000000000000E0Operational status ...................... : UpMicrosoft ISATAP Adapter========================Interface type .......................... : TunnelPhysical Address ........................ : 00000000000000E0Operational status ...................... : Down*/
但是, 你可以使用NetworkInterfaces和IPGlobalProperty创建更详细的示例, 以检查网络接口是否支持IPv4和IPv6。如果可用, 它也会列出可用的蓝牙网络:
public static void ShowNetworkInterfaces(){IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
Console.WriteLine("Interface information for {0}.{1}", computerProperties.HostName, computerProperties.DomainName);
if (nics == null || nics.Length <
1){Console.WriteLine("No network interfaces found.");
return;
}Console.WriteLine("Number of interfaces .................... : {0}", nics.Length);
foreach (NetworkInterface adapter in nics){IPInterfaceProperties properties = adapter.GetIPProperties();
Console.WriteLine();
Console.WriteLine(adapter.Description);
Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '='));
Console.WriteLine("Interface type .......................... : {0}", adapter.NetworkInterfaceType);
Console.WriteLine("Physical Address ........................ : {0}", adapter.GetPhysicalAddress().ToString());
Console.WriteLine("Operational status ...................... : {0}", adapter.OperationalStatus);
string versions = "";
// Create a display string for the supported IP versions.if (adapter.Supports(NetworkInterfaceComponent.IPv4)){versions = "IPv4";
}if (adapter.Supports(NetworkInterfaceComponent.IPv6)){if (versions.Length >
0){versions += " ";
}versions += "IPv6";
}Console.WriteLine("IP version .............................. : {0}", versions);
//ShowIPAddresses(properties);
// The following information is not useful for loopback adapters.if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback){continue;
}Console.WriteLine("DNS suffix .............................. : {0}", properties.DnsSuffix);
string label;
if (adapter.Supports(NetworkInterfaceComponent.IPv4)){IPv4InterfaceProperties ipv4 = properties.GetIPv4Properties();
Console.WriteLine("MTU...................................... : {0}", ipv4.Mtu);
if (ipv4.UsesWins){IPAddressCollection winsServers = properties.WinsServersAddresses;
if (winsServers.Count >
0){label = "WINS Servers ............................ :";
//ShowIPAddresses(label, winsServers);
}}}Console.WriteLine("DNS enabled ............................. : {0}", properties.IsDnsEnabled);
Console.WriteLine("Dynamically configured DNS .............. : {0}", properties.IsDynamicDnsEnabled);
Console.WriteLine("Receive Only ............................ : {0}", adapter.IsReceiveOnly);
Console.WriteLine("Multicast ............................... : {0}", adapter.SupportsMulticast);
}}
ShowNetwork的执行应生成类似于以下内容的输出:
/**Interface information for **MyComputerName**.Number of interfaces .................... : 6Realtek PCIe GBE Family Controller==================================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : UpIP version .............................. : IPv4 IPv6DNS suffix .............................. : fritz.boxMTU...................................... : 1500DNS enabled ............................. : FalseDynamically configured DNS .............. : TrueReceive Only ............................ : FalseMulticast ............................... : TrueTAP-Windows Adapter V9======================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : DownIP version .............................. : IPv4 IPv6DNS suffix .............................. : MTU...................................... : 1500DNS enabled ............................. : FalseDynamically configured DNS .............. : TrueReceive Only ............................ : FalseMulticast ............................... : TrueBluetooth Device (Personal Area Network)========================================Interface type .......................... : EthernetPhysical Address ........................ : XXXXXXXXXXXXOperational status ...................... : DownIP version .............................. : IPv4 IPv6DNS suffix .............................. : MTU...................................... : 1500DNS enabled ............................. : FalseDynamically configured DNS .............. : TrueReceive Only ............................ : FalseMulticast ............................... : TrueSoftware Loopback Interface 1=============================Interface type .......................... : LoopbackPhysical Address ........................ : Operational status ...................... : UpIP version .............................. : IPv4 IPv6Teredo Tunneling Pseudo-Interface=================================Interface type .......................... : TunnelPhysical Address ........................ : 00000000000000E0Operational status ...................... : UpIP version .............................. : IPv6DNS suffix .............................. : DNS enabled ............................. : FalseDynamically configured DNS .............. : FalseReceive Only ............................ : FalseMulticast ............................... : FalseMicrosoft ISATAP Adapter========================Interface type .......................... : TunnelPhysical Address ........................ : 00000000000000E0Operational status ...................... : DownIP version .............................. : IPv6DNS suffix .............................. : fritz.boxDNS enabled ............................. : FalseDynamically configured DNS .............. : TrueReceive Only ............................ : FalseMulticast ............................... : False*/
声卡(音频设备) 要获取有关音频设备的信息, 我们需要使用ManagementObjectSearcher类对Win32_SoundDevice类创建系统查询。
首先向你的班级添加以下参考:
using System.Management;
如果在代码中使用该类时仍然看到错误, 请阅读本文开头的” 重要说明” 。
如果一切正确, 那么你将能够查询Win32_SoundDevice类。 Win32_SoundDevice WMI类表示运行Windows的计算机系统上声音设备的属性。
要访问WMI类, 我们需要如前所述, 创建一个查询。可以使用ManagementObjectSearcher类(在System.Management中提供)创建此查询。
以下代码段将列出所有音频设备(麦克风, 扬声器, 声卡等)及其属性:
ManagementObjectSearcher myAudioObject = new ManagementObjectSearcher("select * from Win32_SoundDevice");
foreach (ManagementObject obj in myAudioObject.Get()){Console.WriteLine("Name-" + obj["Name"]);
Console.WriteLine("ProductName-" + obj["ProductName"]);
Console.WriteLine("Availability-" + obj["Availability"]);
Console.WriteLine("DeviceID-" + obj["DeviceID"]);
Console.WriteLine("PowerManagementSupported-" + obj["PowerManagementSupported"]);
Console.WriteLine("Status-" + obj["Status"]);
Console.WriteLine("StatusInfo-" + obj["StatusInfo"]);
Console.WriteLine(String.Empty.PadLeft(obj["ProductName"].ToString().Length, '='));
}
Win32_SoundDevice的ManagementObject具有更多属性, 你可以在此处阅读有关此类的更多信息以及Microsoft开发人员网络文档中的所有可用属性。
上一个代码段的输出应类似于以下内容:
/**Name-Logitech Mic (QuickCam S5500)ProductName-Logitech Mic (QuickCam S5500)Availability-DeviceID-USB\VID_046D&
PID_09A1&
MI_02\8&
1DEC173F&
0&
0002PowerManagementSupported-FalseStatus-OKStatusInfo-3=============================Name-NVIDIA High Definition AudioProductName-NVIDIA High Definition AudioAvailability-DeviceID-HDAUDIO\FUNC_01&
VEN_10DE&
DEV_0040&
SUBSYS_1043847A&
REV_1001\5&
2F2C87F6&
0&
0001PowerManagementSupported-FalseStatus-OKStatusInfo-3============================Name-High Definition Audio-Ger?tProductName-High Definition Audio-Ger?tAvailability-DeviceID-HDAUDIO\FUNC_01&
VEN_10EC&
DEV_0892&
SUBSYS_1462D816&
REV_1003\4&
C65B857&
0&
0001PowerManagementSupported-FalseStatus-OKStatusInfo-3===========================Name-Creative X-Fi Audio Processor (WDM)ProductName-Creative X-Fi Audio Processor (WDM)Availability-DeviceID-PCI\VEN_1102&
DEV_000B&
SUBSYS_00431102&
REV_04\4&
2F87A1B6&
0&
00E4PowerManagementSupported-FalseStatus-OKStatusInfo-3===================================Name-NVIDIA Virtual Audio Device (Wave Extensible) (WDM)ProductName-NVIDIA Virtual Audio Device (Wave Extensible) (WDM)Availability-DeviceID-ROOT\UNNAMED_DEVICE\0000PowerManagementSupported-FalseStatus-OKStatusInfo-3===================================================*/
印表机 要获取有关音频设备的信息, 我们需要使用ManagementObjectSearcher类对Win32_Printer类创建系统查询。
首先向你的班级添加以下参考:
using System.Management;
如果在代码中使用该类时仍然看到错误, 请阅读本文开头的” 重要说明” 。
如果一切正确, 那么你将能够查询Win32_Printer类。 Win32_Printer WMI类表示连接到在Microsoft Windows操作系统上运行的计算机的设备, 该设备可以在纸张或其他介质上产生打印的图像或文本。
要访问WMI类, 我们需要如前所述, 创建一个查询。可以使用ManagementObjectSearcher类(在System.Management中提供)创建此查询。
以下代码段列出了系统中所有可用的打印机(甚至包括Microsoft Print to PDF服务):
ManagementObjectSearcher myPrinterObject = new ManagementObjectSearcher("select * from Win32_Printer");
foreach (ManagementObject obj in myPrinterObject.Get()){Console.WriteLine("Name-" + obj["Name"]);
Console.WriteLine("Network-" + obj["Network"]);
Console.WriteLine("Availability-" + obj["Availability"]);
Console.WriteLine("Is default printer-" + obj["Default"]);
Console.WriteLine("DeviceID-" + obj["DeviceID"]);
Console.WriteLine("Status-" + obj["Status"]);
Console.WriteLine(String.Empty.PadLeft(obj["Name"].ToString().Length, '='));
}
Win32_Printer的ManagementObject具有更多属性, 你可以在此处阅读有关此类的更多信息以及microsoft开发人员网络文档中的所有可用属性。
输出应类似于:
/**Name-Microsoft XPS Document WriterNetwork-FalseAvailability-Is default printer-FalseDeviceID-Microsoft XPS Document WriterStatus-Unknown=============================Name-Microsoft Print to PDFNetwork-FalseAvailability-Is default printer-FalseDeviceID-Microsoft Print to PDFStatus-Unknown======================Name-FaxNetwork-FalseAvailability-Is default printer-FalseDeviceID-FaxStatus-Unknown===Name-Enviar a OneNote 2013Network-FalseAvailability-Is default printer-FalseDeviceID-Enviar a OneNote 2013Status-Unknown=====================Name-Brother HL-3070CW seriesNetwork-FalseAvailability-Is default printer-TrueDeviceID-Brother HL-3070CW seriesStatus-Unknown========================**/
【如何使用C#在Winforms中检索基本和高级硬件和软件信息(GPU,硬盘,处理器,操作系统,打印机)】玩得开心 !
推荐阅读
- 如何解决PHP cURL警告(curl_set_opt_array():设置open_basedir时无法激活CURLOPT_FOLLOWLOCATION)
- 如何在PHP中加密由TCPDF生成的PDF(密码保护)
- 如何在Symfony 3中使用phpseclib连接到SFTP服务器
- 如何在Symfony 3中使用Twig(或在控制器中)在表单上显示所有(或单个)错误
- 如何为特定活动禁用Android Soft Keyboard()
- 没有标签视图使用android(labelFor =“@ + id / @ + id /”属性指向此文本字段)
- 如何连续删除键盘退格键上的字符长按android
- android如何将EditText光标设置为其文本的末尾[复制]