Get the serial number of USB storage devices in .Net Core 2.1

This Class performs a series of queries on the WMI Win32_DiskDrive class and its associators: Win32_DiskDriveToDiskPartition and CIM_LogicalDiskBasedOnPartition, to retrieve informations on the active USB Drives on a System (local or remote).

It might seem redundant (probably because it is), since you just asked for the USB Drives Serial Number. But, you never know what you will need next, and it could be useful to someone else.

It requires Microsoft .Net System.Management 4.5 for .Net Core 2.1 (NuGet Package)
Can be easily found and installed using the Visual Studio NuGet Package Manager.
About Linux support, read here:
Windows Management Instrumentation Now A Formal Bus With Linux 4.13

Also, keep an eye out for Windows Compatibility Pack for .NET Core.
New cross-platform assemblies are constantly added and updated.

The main class implements all the required functionalities and it has quite a simple structure.
The WMI queries use the Associator syntax, a method to correlate WMI class objects related to each other.
The Class properties meaning is self-explanatory.

Can be instantiated this way:
SystemUSBDrives systemUSBDrives = new SystemUSBDrives("[Computer Name]");

When [Computer Name] is null or empty, it uses the Local Machine name.

To get the List of USB Devices and their properties, call the GetUSBDrivesInfo() method:

var USBDrivesEnum = systemUSBDrives.GetUSBDrivesInfo([UserName], [Password], [Domain]);

[UserName], [Password], [Domain] are used to connect to a NT Domain.
These parameters, if not needed, can be null or an empty string.

Sample class instantiation and function call (Local Machine, no authentication):

SystemUSBDrives systemUSBDrives = new SystemUSBDrives(null);
var USBDrivesEnum = systemUSBDrives.GetUSBDrivesInfo(null, null, null);

Tested on:
Visual Studio Pro 15.7.6 - 15.8.5
.Net Framework Core 2.1
C# 6.0 -> 7.3
.Net System.Management 4.5

using System.Management;

public class SystemUSBDrives
{
    string m_ComputerName = string.Empty;
    public SystemUSBDrives(string ComputerName)
    {
        this.m_ComputerName = string.IsNullOrEmpty(ComputerName)
                            ? Environment.MachineName
                            : ComputerName;
    }

    public class USBDriveInfo
    {
        public bool Bootable { get; private set; }
        public bool BootPartition { get; private set; }
        public string Caption { get; private set; }
        public string DeviceID { get; private set; }
        public UInt32 DiskIndex { get; private set; }
        public string FileSystem { get; private set; }
        public string FirmwareRevision { get; private set; }
        public UInt64 FreeSpace { get; private set; }
        public string InterfaceType { get; private set; }
        public string LogicalDisk { get; private set; }
        public bool MediaLoaded { get; private set; }
        public string MediaType { get; private set; }
        public string Model { get; private set; }
        public UInt32 Partitions { get; private set; }
        public UInt64 PartitionBlockSize { get; private set; }
        public UInt64 PartitionNumberOfBlocks { get; private set; }
        public UInt64 PartitionStartingOffset { get; private set; }
        public string PNPDeviceID { get; private set; }
        public bool PrimaryPartition { get; private set; }
        public string SerialNumber { get; private set; }
        public UInt64 Size { get; private set; }
        public string Status { get; private set; }
        public bool SupportsDiskQuotas { get; private set; }
        public UInt64 TotalCylinders { get; private set; }
        public UInt32 TotalHeads { get; private set; }
        public UInt64 TotalSectors { get; private set; }
        public UInt64 TotalTracks { get; private set; }
        public UInt32 TracksPerCylinder { get; private set; }
        public string VolumeName { get; private set; }
        public string VolumeSerialNumber { get; private set; }

        public void GetDiskDriveInfo(ManagementObject DiskDrive)
        {
            this.Caption = DiskDrive["Caption"]?.ToString();
            this.DeviceID = DiskDrive["DeviceID"]?.ToString();
            this.FirmwareRevision = DiskDrive["FirmwareRevision"]?.ToString();
            this.InterfaceType = DiskDrive["InterfaceType"]?.ToString();
            this.MediaLoaded = (bool?)DiskDrive["MediaLoaded"] ?? false;
            this.MediaType = DiskDrive["MediaType"]?.ToString();
            this.Model = DiskDrive["Model"]?.ToString();
            this.Partitions = (UInt32?)DiskDrive["Partitions"] ?? 0;
            this.PNPDeviceID = DiskDrive["PNPDeviceID"]?.ToString();
            this.SerialNumber = DiskDrive["SerialNumber"]?.ToString();
            this.Size = (UInt64?)DiskDrive["Size"] ?? 0L;
            this.Status = DiskDrive["Status"]?.ToString();
            this.TotalCylinders = (UInt64?)DiskDrive["TotalCylinders"] ?? 0;
            this.TotalHeads = (UInt32?)DiskDrive["TotalHeads"] ?? 0U;
            this.TotalSectors = (UInt64?)DiskDrive["TotalSectors"] ?? 0;
            this.TotalTracks = (UInt64?)DiskDrive["TotalTracks"] ?? 0;
            this.TracksPerCylinder = (UInt32?)DiskDrive["TracksPerCylinder"] ?? 0;
        }

        public void GetDiskPartitionInfo(ManagementObject Partitions)
        {
            this.Bootable = (bool?)Partitions["Bootable"] ?? false;
            this.BootPartition = (bool?)Partitions["BootPartition"] ?? false;
            this.DiskIndex = (UInt32?)Partitions["DiskIndex"] ?? 0;
            this.PartitionBlockSize = (UInt64?)Partitions["BlockSize"] ?? 0;
            this.PartitionNumberOfBlocks = (UInt64?)Partitions["NumberOfBlocks"] ?? 0;
            this.PrimaryPartition = (bool?)Partitions["PrimaryPartition"] ?? false;
            this.PartitionStartingOffset = (UInt64?)Partitions["StartingOffset"] ?? 0;
        }

        public void GetLogicalDiskInfo(ManagementObject LogicalDisk)
        {
            this.FileSystem = LogicalDisk["FileSystem"]?.ToString();
            this.FreeSpace = (UInt64?)LogicalDisk["FreeSpace"] ?? 0;
            this.LogicalDisk = LogicalDisk["DeviceID"]?.ToString();
            this.SupportsDiskQuotas = (bool?)LogicalDisk["SupportsDiskQuotas"] ?? false;
            this.VolumeName = LogicalDisk["VolumeName"]?.ToString();
            this.VolumeSerialNumber = LogicalDisk["VolumeSerialNumber"]?.ToString();
        }
    }

    public List<USBDriveInfo> GetUSBDrivesInfo(string UserName, string Password, string Domain)
    {
        List<USBDriveInfo> WMIQueryResult = new List<USBDriveInfo>();
        var connOptions = GetConnectionOptions(UserName, Password, Domain);
        var mOptions = GetEnumerationOptions(false);
        var mScope = new ManagementScope(@"\\" + this.m_ComputerName + @"\root\CIMV2", connOptions);
        var selQuery = new SelectQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
        mScope.Connect();

        using (var moSearcher = new ManagementObjectSearcher(mScope, selQuery, mOptions))
        {
            foreach (ManagementObject moDiskDrive in moSearcher.Get()) {

                var usbInfo = new USBDriveInfo();
                usbInfo.GetDiskDriveInfo(moDiskDrive);

                var relQuery = new RelatedObjectQuery("Associators of {Win32_DiskDrive.DeviceID='" +
                                                      moDiskDrive.Properties["DeviceID"].Value.ToString() + "'} " +
                                                      "where AssocClass=Win32_DiskDriveToDiskPartition");

                using (var moAssocPart = new ManagementObjectSearcher(mScope, relQuery, mOptions)) {
                    foreach (ManagementObject moAssocPartition in moAssocPart.Get()) {

                        usbInfo.GetDiskPartitionInfo(moAssocPartition);
                        relQuery = new RelatedObjectQuery("Associators of {Win32_DiskPartition.DeviceID='" +
                                                          moAssocPartition.Properties["DeviceID"].Value.ToString() + "'} " +
                                                          "where AssocClass=CIM_LogicalDiskBasedOnPartition");

                        using (var moLogDisk = new ManagementObjectSearcher(mScope, relQuery, mOptions)) {
                            foreach (ManagementObject moLogDiskEnu in moLogDisk.Get()) {

                                usbInfo.GetLogicalDiskInfo(moLogDiskEnu);
                                moLogDiskEnu.Dispose();
                            }
                        }
                        moAssocPartition.Dispose();
                    }
                    WMIQueryResult.Add(usbInfo);
                }
                moDiskDrive.Dispose();
            }
            return WMIQueryResult;
        }
    }   //GetUSBDrivesInfo()

    private ConnectionOptions GetConnectionOptions(string UserName, string Password, string DomainAuthority)
    {
        var conOptions = new ConnectionOptions()
        {
            EnablePrivileges = true,
            Timeout = ManagementOptions.InfiniteTimeout,
            Authentication = AuthenticationLevel.PacketPrivacy,
            Impersonation = ImpersonationLevel.Impersonate,
            Username = UserName,
            Password = Password,
            Authority = DomainAuthority  //Authority = "NTLMDOMAIN:[domain]"
        };
        return conOptions;
    }

    private System.Management.EnumerationOptions GetEnumerationOptions(bool DeepScan)
    {
        var enumOptions = new System.Management.EnumerationOptions()
        {
            Rewindable = false,        //Forward only query => no caching
            ReturnImmediately = true,  //Pseudo-async result
            DirectRead = true,         //True => Direct access to the WMI provider, no super class or derived classes
            EnumerateDeep = DeepScan   //False => only immediate derived class members are returned.
        };
        return enumOptions;
    }
}  //SystemUSBDrives