我试图获取启动驱动器的序列号,我还没弄明白该怎么做.
我确实知道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;
}
Run Code Online (Sandbox Code Playgroud)
我看过这里:
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));
Run Code Online (Sandbox Code Playgroud)
现在,使用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"]));
}
Run Code Online (Sandbox Code Playgroud)
注意我已经使用过Win32_LogicalDisk,因为我们正在谈论驱动器(在这里命名为逻辑磁盘).