comment déterminer fabricant de lecteur flash USB?


6

J'ai besoin de mon programme pour fonctionner uniquement avec certains lecteurs Flash USB (d'un seul fabricant) et ignorer tous les autres lecteurs Flash USB (de tous les autres fabricants).

est-il possible de vérifier que la carte USB spécifique est insérée sur Windows en utilisant .NET 2.0? Comment? Si je le trouve via WMI, puis-je déterminer en quelque sorte la lettre de lecteur de la clé USB?

11

EDIT: Code Ajouté à imprimer lettre de lecteur.


Vérifiez si cet exemple fonctionne pour vous. Il utilise WMI.

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

L'échantillon complet de code:

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(); 
     } 
    } 
} 

Je pense que ces propriétés devraient vous aider à distinguer les lecteurs USB d'origine des autres. Testez avec plusieurs lecteurs de stylo pour vérifier si les valeurs sont les mêmes. Voir la référence complète pour Win32_DiskDrive propriétés ici:

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

Vérifiez si cet article est d'aucune aide pour vous:

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


0

Peut-être #usblib:

http://www.icsharpcode.net/OpenSource/SharpUSBLib/


2

Vous pouvez utiliser l'API Win32 non géré appelle à gérer cela.

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


2

Aller soit par Win32 CM_ (Device Management) ou WMI et saisissant l'ID PNP. Recherchez VID (ID du fournisseur).

Je vois des informations pour l'appareil que je viens d'insérer sous Win32_USBControllerDevice et Win32_DiskDrive.


2

Vous pouvez obtenir ces informations via WMI. Voici un script vbs (copie au fichier texte avec .vbs à exécuter) qui utilise WMI pour obtenir des informations sur les objets Win32_DiskDrive. L'information du fabricant peut simplement dire Disque dur standard, mais le numéro de modèle peut avoir ce que vous recherchez.

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

Salut essayez ceci dans l'utilisation de 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 être plus utile que le fabricant. Vous regardez FirmwareRevision si vous voulez verrouiller votre application maintenant à un seul fabricant et une (certaines) révision de firmware.

Espérons que ça aide.


1

Si Win32_DiskDrive objets ne fournissent pas les informations que vous recherchez, vous pouvez également regarder Win32_PhysicalMedia classe d'objets WMI.Ils ont des propriétés Manufacturer, Model, PartNumber et description qui peuvent s'avérer utiles.


0

Juste au cas où quelqu'un d'autre est assez fou pour faire cela en C++ - CLI, voici un port de réponse de 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(); 
} 

Note: je devais ajouter manuellement une référence à la bibliothèque System.Management dans mon porject Propriétés.