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

Ero*_*ocM 5 c# hardware

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

我确实知道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

媒体类型:

可拆卸:

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

再次感谢!

ken*_*n2k 8

这里你谈的是驱动器(因为它是可引导的),而不是磁盘.驱动器是逻辑的并且由字母(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,因为我们正在谈论驱动器(在这里命名为逻辑磁盘).