【问题标题】:Get Serial Number of Boot Drive and other info获取引导驱动器的序列号和其他信息
【发布时间】:2012-02-20 18:16:03
【问题描述】:

我正在尝试获取启动驱动器的序列号,但我还没有弄清楚如何去做。

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

这是我目前所拥有的:

        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

看看我是否可以看到它是否是引导驱动器,但我什么也没看到。

除了序列号,我什么都没有返回,其他都是空白的。

这是我在上面的代码中得到的:

姓名:

序列号:5YZ01J34

媒体类型:

可移动:

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

再次感谢!

【问题讨论】:

  • 在我的系统(有一个内部 SATA 硬盘)上,除了 SerialNumberTag 之外的所有值都为 NULL; Tag\\.\\PHYSICALDRIVE0Win32_PhysicalMedia 中没有任何信息告诉您它是否是启动盘。 (无论如何,您不会从物理媒体启动;您从位于“Win32_LogicalDisk”中的逻辑磁盘启动,但这只是列出了分区;它不会告诉您从哪个启动。您可能想要获取免费的MagWMI 组件 - 包含的演示可让您执行 WMI 查询并查看输出。
  • 感谢您的意见,但我尽量避免使用任何第 3 方应用程序。如果我与他们有问题,那么我将任由他们摆布。到目前为止,我已经能够避免这样做。
  • 我建议为 you 使用 MagWMI 演示来查看各种查询结果中可用的内容,而不是用于其他任何事情。这是一个非常有用(免费)的实用程序,用于测试 WMI 内容并查看它们的所有可用输出。
  • 对不起,我看错了。我去看看
  • 您知道这是识别机器的一种非常糟糕的方法吗?在 RAID 设置中,某些控制器会为您提供恰好可用的任何驱动器的 ID。

标签: c# hardware


【解决方案1】:

这里您说的是驱动器(因为它是可引导的),而不是磁盘。驱动器是逻辑的,用字母(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));

现在,同样使用 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(此处命名为逻辑磁盘)。

【讨论】:

  • Windows 可能仅将术语“驱动器”用作逻辑事物,但在 Windows 之外,“驱动器”是物理事物,如磁带驱动器。名称“Win32_LogicalDisk”意味着即使是 Windows 也不认为磁盘始终是物理的。一个更好的解释概念是将一个物理驱动器变成多个逻辑驱动器的分区。
猜你喜欢
  • 2020-12-15
  • 2020-05-15
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多