簡體   English   中英

使用驅動器號c#查找USB驅動器的序列號

[英]find serial number of USB drive using drive letter c#

ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
foreach (ManagementObject currentObject in theSearcher.Get())
{
    ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
    MessageBox.Show(theSerialNumberObjectQuery["SerialNumber"].ToString());
}

這段代碼返回USB驅動器的序列號,但是我需要使用驅動器號或驅動器路徑(對於特定驅動器)查找序列號

我看到的獲取序列號的唯一方法是使用Win32(PInvoke):

class Program
{
    static void Main(string[] args)
    {
        var volumeInfo = VolumeInformation.GetVolumeInformation("c");
    }
}

[DebuggerDisplay("{ Volume,nq} ({ Name,nq })")]
class VolumeInformation
{
    #region Fields

    private const int BufferLength = 256;

    #endregion

    #region Properties

    public string Volume
    {
        get;
    }

    public string Name
    {
        get;
    }

    public uint SerialNumber
    {
        get;
    }

    public string SystemName
    {
        get;
    }

    #endregion

    #region Constructors

    private VolumeInformation(string volume, string name, uint serialNumber, string systemName)
    {
        Volume = volume;
        Name = name;
        SerialNumber = serialNumber;
        SystemName = systemName;
    }

    #endregion

    #region Methods

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern bool GetVolumeInformation(string letter, StringBuilder name, uint nameSize, out uint serialNumber, out uint serialNumberLength, out uint flags, StringBuilder systemName, uint systemNameSize);

    public static VolumeInformation GetVolumeInformation(string volume)
    {
        var name = new StringBuilder(BufferLength);
        var systemName = new StringBuilder(BufferLength);
        var serialNumber = 0u;
        var serialNumberLength = 0u;
        var flags = 0u;

        volume = (volume ?? String.Empty).Trim();

        if(volume.Length == 1)
        {
            volume = $"{volume}:\\";
        }
        if(!volume.EndsWith(@"\"))
        {
            volume = $"{volume}\\";
        }

        if (GetVolumeInformation(volume, name, BufferLength, out serialNumber, out serialNumberLength, out flags, systemName, BufferLength))
        {
            return new VolumeInformation(volume, name.ToString(), serialNumber, systemName.ToString());
        }
        else
        {
            return null;
        }
    }

    #endregion
}

我還沒有填充標志信息,但這可以從Win32返回的標志中看出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM