كيفية تحديد الشركة المصنعة لمحرك أقراص فلاش USB؟
سؤال
أحتاج إلى أن يعمل برنامجي فقط مع بعض محركات أقراص 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
تحقق مما إذا كانت هذه المقالة مفيدة لك أيضًا:
نصائح أخرى
يمكنك استخدام مكالمات 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.لديهم خصائص الشركة المصنعة والنموذج ورقم الجزء والوصف التي قد تكون مفيدة.
ربما #usblib:
مرحبًا، جرب هذا باستخدام 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
مكتبة في خصائص مشروعي.