2008-09-23 7 views
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).comment déterminer fabricant de lecteur flash USB?

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?

Répondre

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

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.

Questions connexes