كيفية تحديد الشركة المصنعة لمحرك أقراص فلاش USB؟

StackOverflow https://stackoverflow.com/questions/123986

  •  02-07-2019
  •  | 
  •  

سؤال

أحتاج إلى أن يعمل برنامجي فقط مع بعض محركات أقراص USB المحمولة (من شركة مصنعة واحدة) ويتجاهل جميع محركات أقراص USB المحمولة الأخرى (من أي شركات مصنعة أخرى).

هل من الممكن التحقق من إدخال بطاقة USB محددة على النوافذ باستخدام .NET 2.0؟كيف؟

إذا وجدته من خلال WMI، فهل يمكنني بطريقة ما تحديد حرف محرك الأقراص الذي يعمل عليه محرك أقراص USB؟

هل كانت مفيدة؟

المحلول

يحرر: تمت إضافة رمز لطباعة حرف محرك الأقراص.


تحقق مما إذا كان هذا المثال مناسبًا لك.ويستخدم WMI.

Console.WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
...
Console.WriteLine("    Name: {0}", c["Name"]); // here it will print drive letter

نموذج الكود الكامل:

namespace WMISample
{
    using System;
    using System.Management;

    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\CIMV2",
                    "SELECT * FROM Win32_DiskDrive");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
                    Console.WriteLine("PNPDeviceID: {0}", queryObj["PNPDeviceID"]);
                    Console.WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
                    Console.WriteLine("Model: {0}", queryObj["Model"]);
                    foreach (ManagementObject b in queryObj.GetRelated("Win32_DiskPartition"))
                    {
                        Console.WriteLine("  Name: {0}", b["Name"]);
                        foreach (ManagementBaseObject c in b.GetRelated("Win32_LogicalDisk"))
                        {
                            Console.WriteLine("    Name: {0}", c["Name"]); // here it will print drive letter
                        }
                    }
                    // ...
                    Console.WriteLine("--------------------------------------------");
                }      
            }
            catch (ManagementException e)
            {
                Console.WriteLine(e.StackTrace);
            }

            Console.ReadLine();
        }
    }
}

أعتقد أن هذه الخصائص يجب أن تساعدك على التمييز بين محركات أقراص USB الأصلية ومحركات الأقراص الأخرى.اختبر باستخدام عدة محركات أقراص القلم للتحقق مما إذا كانت القيم متماثلة.انظر المرجع الكامل ل Win32_DiskDrive الخصائص هنا:

http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx

تحقق مما إذا كانت هذه المقالة مفيدة لك أيضًا:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/48a9758c-d4db-4144-bad1-e87f2e9fc979

نصائح أخرى

يمكنك استخدام مكالمات Win32 API غير المُدارة للتعامل مع هذا الأمر.

http://www.codeproject.com/KB/system/EnumDeviceProperties.aspx

المرور عبر Win32 CM_ (إدارة الأجهزة) أو WMI والحصول على معرف PNP.ابحث عن VID (معرف البائع).

أرى معلومات خاصة بالجهاز الذي أدخلته للتو Win32_USBControllerDevice و Win32_DiskDrive.

قد تتمكن من الحصول على هذه المعلومات من خلال WMI.يوجد أدناه برنامج نصي vbs (انسخ إلى ملف نصي بامتداد .vbs للتشغيل) والذي يستخدم WMI للحصول على بعض المعلومات حول Win32_DiskDrive أشياء.قد تشير معلومات الشركة المصنعة فقط إلى محرك الأقراص القياسي، ولكن قد يحتوي رقم الطراز على ما تبحث عنه.

Set Drives = GetObject("winmgmts:{impersonationLevel=impersonate,(Backup)}").ExecQuery("select * from Win32_DiskDrive")
for each drive in drives
Wscript.echo "Drive Information:" & vbnewline & _
       "Availability: " & drive.Availability & vbnewline & _
       "BytesPerSector: " & drive.BytesPerSector & vbnewline & _
       "Caption: " & drive.Caption & vbnewline & _
       "CompressionMethod: " & drive.CompressionMethod & vbnewline & _
       "ConfigManagerErrorCode: " & drive.ConfigManagerErrorCode & vbnewline & _
       "ConfigManagerUserConfig: " & drive.ConfigManagerUserConfig & vbnewline & _
       "CreationClassName: " & drive.CreationClassName & vbnewline & _
       "DefaultBlockSize: " & drive.DefaultBlockSize & vbnewline & _
       "Description: " & drive.Description & vbnewline & _
       "DeviceID: " & drive.DeviceID & vbnewline & _
       "ErrorCleared: " & drive.ErrorCleared & vbnewline & _
       "ErrorDescription: " & drive.ErrorDescription & vbnewline & _
       "ErrorMethodology: " & drive.ErrorMethodology & vbnewline & _
       "Index: " & drive.Index & vbnewline & _
       "InterfaceType: " & drive.InterfaceType & vbnewline & _
       "LastErrorCode: " & drive.LastErrorCode & vbnewline & _
       "Manufacturer: " & drive.Manufacturer & vbnewline & _
       "MaxBlockSize: " & drive.MaxBlockSize & vbnewline & _
       "MaxMediaSize: " & drive.MaxMediaSize & vbnewline & _
       "MediaLoaded: " & drive.MediaLoaded & vbnewline & _
       "MediaType: " & drive.MediaType & vbnewline & _
       "MinBlockSize: " & drive.MinBlockSize & vbnewline & _
       "Model: " & drive.Model & vbnewline & _
       "Name: " & drive.Name & vbnewline & _
       "NeedsCleaning: " & drive.NeedsCleaning & vbnewline & _
       "NumberOfMediaSupported: " & drive.NumberOfMediaSupported & vbnewline & _
       "Partitions: " & drive.Partitions & vbnewline & _
       "PNPDeviceID: " & drive.PNPDeviceID & vbnewline & _
       "PowerManagementSupported: " & drive.PowerManagementSupported & vbnewline & _
       "SCSIBus: " & drive.SCSIBus & vbnewline & _
       "SCSILogicalUnit: " & drive.SCSILogicalUnit & vbnewline & _
       "SCSIPort: " & drive.SCSIPort & vbnewline & _
       "SCSITargetId: " & drive.SCSITargetId & vbnewline & _
       "SectorsPerTrack: " & drive.SectorsPerTrack & vbnewline & _
       "Signature: " & drive.Signature & vbnewline & _
       "Size: " & drive.Size & vbnewline & _
       "Status: " & drive.Status & vbnewline & _
       "StatusInfo: " & drive.StatusInfo & vbnewline & _
       "SystemCreationClassName: " & drive.SystemCreationClassName & vbnewline & _
       "SystemName: " & drive.SystemName & vbnewline & _         
       "TotalCylinders: " & drive.TotalCylinders & vbnewline & _         
       "TotalHeads: " & drive.TotalHeads & vbnewline & _        
       "TotalSectors: " & drive.TotalSectors & vbnewline & _        
       "TotalTracks: " & drive.TotalTracks & vbnewline & _         
       "TracksPerCylinder: " & drive.TracksPerCylinder & vbnewline
next

لو Win32_DiskDrive الكائنات لا تقدم المعلومات التي تبحث عنها، يمكنك أيضًا الاطلاع عليها Win32_PhysicalMedia فئة كائنات WMI.لديهم خصائص الشركة المصنعة والنموذج ورقم الجزء والوصف التي قد تكون مفيدة.

مرحبًا، جرب هذا باستخدام WMI

Option Explicit
Dim objWMIService, objItem, colItems, strComputer

' On Error Resume Next
strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" _
& strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery(_
"Select Manufacturer from Win32_DiskDrive")

For Each objItem in colItems
Wscript.Echo "Computer: " & objItem.SystemName & VbCr & _
   "Manufacturer: " & objItem.Manufacturer & VbCr & _
   "Model: " & objItem.Model
Next

يمكن أن يكون النموذج أكثر فائدة من الشركة المصنعة.يمكنك إلقاء نظرة على FirmwareRevision إذا كنت تريد قفل تطبيقك الآن على شركة مصنعة واحدة فقط ومراجعة واحدة (بعض) للبرامج الثابتة.

نأمل أن يساعد.

فقط في حالة ما إذا كان أي شخص آخر مجنونًا بما يكفي للقيام بذلك في C++ -CLI، فإليك منفذ إجابة smink:

using namespace System;
using namespace System::Management;

void GetUSBDeviceList()
{
    try
    {
        ManagementObjectSearcher^ searcher =
            gcnew ManagementObjectSearcher("root\\CIMV2",
            "SELECT * FROM Win32_DiskDrive");

        for each (ManagementObject^ queryObj in searcher->Get())
        {
            Console::WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
            Console::WriteLine("PNPDeviceID: {0}", queryObj["PNPDeviceID"]);
            Console::WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
            Console::WriteLine("Model: {0}", queryObj["Model"]);
            for each (ManagementObject^ b in queryObj->GetRelated("Win32_DiskPartition"))
            {
                Console::WriteLine("  Name: {0}", b["Name"]);
                for each (ManagementBaseObject^ c in b->GetRelated("Win32_LogicalDisk"))
                {
                    Console::WriteLine("    Name: {0}", c["Name"]); // here it will print drive letter
                }
            }
            // ...
            Console::WriteLine("--------------------------------------------");
        }      
    }
    catch (ManagementException^ e)
    {
        Console::WriteLine(e->StackTrace);
    }

    Console::ReadLine();
}

ملحوظة:اضطررت إلى إضافة مرجع يدويًا إلى ملف System.Management مكتبة في خصائص مشروعي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top