获取启动驱动器的序列号和其他信息

我试图获取启动驱动器的序列号,我还没弄明白该怎么做。

我知道partition = \ =硬盘但我想要启动分区的序列。

这就是我到目前为止:

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); int i = 0; foreach (ManagementObject wmi_HD in searcher.Get()) { // get the hardware serial no. if (wmi_HD["SerialNumber"] == null) richTextBox1.Text += "None" + Environment.NewLine; else richTextBox1.Text += "Name: " + wmi_HD["Name"] + Environment.NewLine; richTextBox1.Text += "SerialNumber: " + wmi_HD["SerialNumber"] + Environment.NewLine; richTextBox1.Text += "MediaType: " + wmi_HD["MediaType"] + Environment.NewLine; richTextBox1.Text += "Removable: " + wmi_HD["Removable"] + Environment.NewLine; ++i; } 

我看过这里:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394346(v=vs.85).aspx#properties

看看我是否能看到它是否是启动驱动器,我什么也看不见。

除了SerialNumber之外,我什么都没有得到任何回报,其他一切都是空白的。

这就是我对上面代码的看法:

名称:

SerialNumber:5YZ01J34

媒体类型:

可拆卸:

如何获取启动驱动器的序列号以及上面未显示的信息?

再次感谢!

这里你谈的是一个驱动器 (因为它是可引导的),而不是磁盘 。 驱动器是逻辑的并且由字母(C,D ……等)表示,并且磁盘是物理的并且由数字(从0到N)表示。 在您的示例中,您使用了WMI和Win32_PhysicalMedia ,这是错误的,因为此类是关于磁盘而不是驱动器。

以下是您想要使用P / Invoke的内容:

 namespace ConsoleApplication3 { using System.Runtime.InteropServices; using System.Text; public class Drive { [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool GetVolumeInformation( string rootPathName, StringBuilder volumeNameBuffer, int volumeNameSize, ref uint volumeSerialNumber, ref uint maximumComponentLength, ref uint fileSystemFlags, StringBuilder fileSystemNameBuffer, int nFileSystemNameSize); public string VolumeName { get; private set; } public string FileSystemName { get; private set; } public uint SerialNumber { get; private set; } public string DriveLetter { get; private set; } public static Drive GetDrive(string driveLetter) { const int VolumeNameSize = 255; const int FileSystemNameBufferSize = 255; StringBuilder volumeNameBuffer = new StringBuilder(VolumeNameSize); uint volumeSerialNumber = 0; uint maximumComponentLength = 0; uint fileSystemFeatures = 0; StringBuilder fileSystemNameBuffer = new StringBuilder(FileSystemNameBufferSize); if (GetVolumeInformation( string.Format("{0}:\\", driveLetter), volumeNameBuffer, VolumeNameSize, ref volumeSerialNumber, ref maximumComponentLength, ref fileSystemFeatures, fileSystemNameBuffer, FileSystemNameBufferSize)) { return new Drive { DriveLetter = driveLetter, FileSystemName = fileSystemNameBuffer.ToString(), VolumeName = volumeNameBuffer.ToString(), SerialNumber = volumeSerialNumber }; } // Something failed, returns null return null; } } } Drive drive = Drive.GetDrive("C"); Console.WriteLine(string.Format("Volumne name: {0}", drive.VolumeName)); Console.WriteLine(string.Format("File system name: {0}", drive.FileSystemName)); Console.WriteLine(string.Format("SerialNumber: {0:X}", drive.SerialNumber)); 
  • 如果需要有关驱动器的更多信息,可以使用带有IOCTL_DISK_GET_DRIVE_GEOMETRY控制代码的DeviceIoControl来获取相关磁盘的几何形状(每个群集的字节数,每个磁道的扇区数……)。
  • 您还可以使用IOCTL_DISK_GET_PARTITION_INFO控制代码获取其他信息(起始偏移,分区号,隐藏扇区……)。

现在,使用WMI相同:

 var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); foreach (ManagementObject drive in searcher.Get()) { Console.WriteLine("-------"); Console.WriteLine(string.Format("VolumeName: {0}", drive["VolumeName"])); Console.WriteLine(string.Format("VolumeSerialNumber: {0}", drive["VolumeSerialNumber"])); Console.WriteLine(string.Format("MediaType: {0}", drive["MediaType"])); Console.WriteLine(string.Format("FileSystem: {0}", drive["FileSystem"])); } 

注意我已经使用过Win32_LogicalDisk,因为我们正在谈论驱动器(在这里命名为逻辑磁盘 )。