2008-09-23 43 views
6

我需要我的程序只能使用某些USB闪存驱动器(来自单个制造商)并忽略所有其他USB闪存驱动器(来自任何其他制造商)。如何确定USB闪存盘制造商?

是否可以使用.NET 2.0检查在Windows上是否插入了特定的USB卡?怎么样?

如果我通过WMI找到它,我可以以某种方式确定USB驱动器在哪个驱动器号上?

回答

11

编辑:添加代码打印驱动器号。


检查此示例是否适合您。它使用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

2

通过任何的Win32 CM_(设备管理)或去WMI并获取PNP ID。查找VID(供应商ID)。

我看到我刚刚插入的设备信息是Win32_USBControllerDeviceWin32_DiskDrive

2

您可能能够通过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 
0

嗨尝试这种使用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 

Modelcould比制造商更有帮助。如果你想立即锁定你的应用程序到只有一个制造商和一个(一些)固件版本,你可以看看FirmwareRevision。

希望它有帮助。

1

如果Win32_DiskDrive对象不会产生您正在查找的信息,您还可以查看Win32_PhysicalMedia类的WMI对象。它们具有制造商,型号,部件编号和描述属性,这些属性可能是有用的。

0

万一别人是疯狂到做这在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库属性。

相关问题