come determinare il produttore di unità flash USB?


6

Ho bisogno che il mio programma funzioni solo con determinate unità USB Flash (di un unico produttore) e ignori tutte le altre unità USB Flash (di qualsiasi altro produttore).

E 'possibile verificare che una specifica scheda USB sia inserita su Windows utilizzando .NET 2.0? Come?

se lo trovo tramite WMI, posso in qualche modo determinare quale lettera dell'unità è inserita sull'unità USB?

11

EDIT: codice Aggiunto stampare lettera di unità.


Controlla se questo esempio funziona per te. Usa WMI.

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

L'esempio di codice completo:

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

penso che queste proprietà dovrebbero aiutare a distinguere autentiche unità USB dagli altri. Provare con diverse pen drive per verificare se i valori sono gli stessi. Visualizza intera riferimento per Win32_DiskDrive proprietà qui:

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

Controllare se questo articolo è anche di alcun aiuto a voi:

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


0

Forse #usblib:

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


2

è possibile utilizzare non gestito chiamate API Win32 per gestire questa situazione.

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


2

Passando attraverso sia Win32 CM_ (Device Management) o WMI e afferrando l'ID PNP. Cerca VID (ID fornitore).

Vedo le informazioni per il dispositivo che ho appena inserito in Win32_USBControllerDevice e Win32_DiskDrive.


2

Potrebbe essere possibile ottenere queste informazioni tramite WMI. Di seguito è riportato uno script vbs (copia in file di testo con .vbs da eseguire) che utilizza WMI per ottenere alcune informazioni sugli oggetti Win32_DiskDrive. Le informazioni del produttore potrebbero semplicemente dire unità disco standard, ma il numero di modello potrebbe avere quello che stai cercando.

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

Hi provare questo utilizzando 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 essere più utile di Produttore. Si guardi su FirmwareRevision se si desidera bloccare l'app ora su un solo produttore e su una (alcune) revisioni del firmware.

Spero che aiuti.


1

Se gli oggetti Win32_DiskDrive non forniscono le informazioni desiderate, è possibile anche esaminare la classe Win32_PhysicalMedia di oggetti WMI.Hanno proprietà, modello, numero parte e proprietà descrittive che possono rivelarsi utili.


0

Solo nel caso qualcuno altro è abbastanza pazzo da farlo in C++ - CLI, ecco un porto di risposta di 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(); 
} 

Nota: ho dovuto aggiungere manualmente un riferimento alla libreria System.Management nel mio porject proprietà.