2012-04-07 13 views

Antwort

1

WMI sollte dies handhaben können ...

Sie erhalten einen Verweis auf die System.Management dll hinzufügen müssen und Sie erhalten die haben müssen: „mit System.Management;“ line ... Link ist am Ende für Screenshots, gründlichere Erklärung ...

using System.Management; 
// Get all the disk drives 

ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); 

// Loop through each object (disk) retrieved by WMI 

foreach (ManagementObject moDisk in mosDisks.Get()) 

{ 

    // Add the HDD to the list (use the Model field as the item's caption) 

    cmbHdd.Items.Add(moDisk["Model"].ToString()); 

} 


private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e) 

{ 

// Get all the disk drives from WMI that match the Model name selected in the ComboBox 

ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'"); 

// Loop through the drives retrieved, although it should normally be only one loop going on here 

foreach (ManagementObject moDisk in mosDisks.Get()) 

{ 

    // Set all the fields to the appropriate values 

    lblType.Text = "Type: " + moDisk["MediaType"].ToString(); 

    lblModel.Text = "Model: " + moDisk["Model"].ToString(); 

    lblSerial.Text = "Serial: " + moDisk["SerialNumber"].ToString(); 

    lblInterface.Text = "Interface: " + moDisk["InterfaceType"].ToString(); 

    // The capacity in gigabytes is easily calculated 

    lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString() + " bytes (" + Math.Round(((((double)Convert.ToDouble(moDisk["Size"])/1024)/1024)/1024), 2) + " GB)"; 

    lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString(); 

    lblSignature.Text = "Signature: " + moDisk["Signature"].ToString(); 

    lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"].ToString(); 

    lblCylinders.Text = "Cylinders: " + moDisk["TotalCylinders"].ToString(); 

    lblSectors.Text = "Sectors: " + moDisk["TotalSectors"].ToString(); 

    lblHeads.Text = "Heads: " + moDisk["TotalHeads"].ToString(); 

    lblTracks.Text = "Tracks: " + moDisk["TotalTracks"].ToString(); 

    lblBytesPerSect.Text = "Bytes per Sector: " + moDisk["BytesPerSector"].ToString(); 

    lblSectorsPerTrack.Text = "Sectors per Track: " + moDisk["SectorsPerTrack"].ToString(); 

    lblTracksPerCyl.Text = "Tracks per Cylinder: " + moDisk["TracksPerCylinder"].ToString(); 

    } 

} 

Von MSDN die win32 Klasse für CIM_DiskDrive hat die folgenden Parameter:

* Es sieht aus, als ob "DeviceID" ist das, was Sie wollen ...

class Win32_DiskDrive : CIM_DiskDrive 
{ 
    uint16 Availability; 
    uint32 BytesPerSector; 
    uint16 Capabilities[]; 
    string CapabilityDescriptions[]; 
    string Caption; 
    string CompressionMethod; 
    uint32 ConfigManagerErrorCode; 
    boolean ConfigManagerUserConfig; 
    string CreationClassName; 
    uint64 DefaultBlockSize; 
    string Description; 
    string DeviceID; 
    boolean ErrorCleared; 
    string ErrorDescription; 
    string ErrorMethodology; 
    string FirmwareRevision; 
    uint32 Index; 
    datetime InstallDate; 
    string InterfaceType; 
    uint32 LastErrorCode; 
    string Manufacturer; 
    uint64 MaxBlockSize; 
    uint64 MaxMediaSize; 
    boolean MediaLoaded; 
    string MediaType; 
    uint64 MinBlockSize; 
    string Model; 
    string Name; 
    boolean NeedsCleaning; 
    uint32 NumberOfMediaSupported; 
    uint32 Partitions; 
    string PNPDeviceID; 
    uint16 PowerManagementCapabilities[]; 
    boolean PowerManagementSupported; 
    uint32 SCSIBus; 
    uint16 SCSILogicalUnit; 
    uint16 SCSIPort; 
    uint16 SCSITargetId; 
    uint32 SectorsPerTrack; 
    string SerialNumber; 
    uint32 Signature; 
    uint64 Size; 
    string Status; 
    uint16 StatusInfo; 
    string SystemCreationClassName; 
    string SystemName; 
    uint64 TotalCylinders; 
    uint32 TotalHeads; 
    uint64 TotalSectors; 
    uint64 TotalTracks; 
    uint32 TracksPerCylinder; 
}; 

Top Teil des Codes Entnommen:

http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html

1

Wenn Sie nur überprüfen müssen, wenn das Gerät angeschlossen ist, ist das Problem viel einfacher. Sie müssen nach dem Ereignis DBT_DEVICEARRIVAL suchen. Wenn Sie eine Windows Forms-Anwendung erstellen, können Sie dies tun, indem Sie die Schnittstelle IMessageFilter implementieren und an die AddMessageFiler-Funktion in Application übergeben. Wenn Sie keine Forms-App verwenden, müssen Sie eine Klasse von NativeWindow ableiten und WndProc überschreiben. Denken Sie daran, CreateHandle anzurufen, damit es der Windows-Nachrichtenwarteschlange hinzugefügt wird.

Sobald Sie den Weg haben, DBT_DEVICEARRIVAL zu erhalten, müssen Sie es analysieren. (Folgendes wurde nicht in einer IDE geschrieben, so ist es nicht getestet)

// Constants from from Dbt.h 
const int WM_DEVICECHANGE = 0x219; 
const int DBT_DEVICEARRIVAL = 0x8000; 
const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05; 
const Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); 


bool PreFilterMessage(ref Message m) 
{ 
    if(m.Msg == case WM_DEVICECHANGE && m.WParam == DBT_DEVICEARRIVAL) 
     var broadcast = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_HDR)); 
     if(broadcast.dbch_DeviceType == DBT_DEVTYP_DEVICEINTERFACE) 
     { 
      var devInterface = (DEV_BROADCAST_DEVICEINTERFACE)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_DEVICEINTERFACE)); 
      if(devInterface.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE) 
      { 
       // devInterface.dbcc_name will contain the VID and PID for example: 
       // \\?\USB#Vid_067b&Pid_2517#6&12115ad4&2&1#{GUID} 
       DoSomthingSpecial(devInterface.dbcc_name); 
      } 
     } 
    } 
    return false; 
} 

[StructLayout(LayoutKind.Sequential)] 
struct DEV_BROADCAST_HDR { 
    public uint dbch_Size; 
    public uint dbch_DeviceType; 
    public uint dbch_Reserved; 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
public struct DEV_BROADCAST_DEVICEINTERFACE 
{ 
     public int dbcc_size; 
     public int dbcc_devicetype; 
     public int dbcc_reserved; 
     public Guid dbcc_classguid; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)] 
     public string dbcc_name; 
} 

Wenn Sie alle Geräte bereits aufzählen müssen angeschlossen würde ich nur empfehlen, die WMI method verwenden. Wenn Sie sehen möchten, wie es ohne WMI funktioniert, überprüfen Sie den Code zu USBView in der Windows Driver Development Kit, kann es Ihnen helfen, Sie zu starten.

+0

Dies ist viel bessere Lösung für OP Frage, weil WMI total Overkill ist. –

1
public static bool GetDriveVidPid(string szDriveName, ref ushort wVID, ref ushort wPID) 
{ 
    bool bResult = false; 
    string szSerialNumberDevice = null; 

    ManagementObject oLogicalDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='" + szDriveName.TrimEnd('\\') + "'"); 
    foreach(ManagementObject oDiskPartition in oLogicalDisk.GetRelated("Win32_DiskPartition")) 
    { 
     foreach(ManagementObject oDiskDrive in oDiskPartition.GetRelated("Win32_DiskDrive")) 
     { 
     string szPNPDeviceID = oDiskDrive["PNPDeviceID"].ToString(); 
     if(!szPNPDeviceID.StartsWith("USBSTOR")) 
      throw new Exception(szDriveName + " ist kein USB-Laufwerk."); 

     string[] aszToken = szPNPDeviceID.Split(new char[] { '\\', '&' }); 
     szSerialNumberDevice = aszToken[aszToken.Length - 2]; 
     } 
    } 

    if(null != szSerialNumberDevice) 
    { 
     ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(@"root\CIMV2", "Select * from Win32_USBHub"); 
     foreach(ManagementObject oResult in oSearcher.Get()) 
     { 
     object oValue = oResult["DeviceID"]; 
     if(oValue == null) 
      continue; 

     string szDeviceID = oValue.ToString(); 
     string[] aszToken = szDeviceID.Split(new char[] { '\\' }); 
     if(szSerialNumberDevice != aszToken[aszToken.Length - 1]) 
      continue; 

     int nTemp = szDeviceID.IndexOf(@"VID_"); 
     if(0 > nTemp) 
      continue; 

     nTemp += 4; 
     wVID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier); 

     nTemp += 4; 
     nTemp = szDeviceID.IndexOf(@"PID_", nTemp); 
     if(0 > nTemp) 
      continue; 

     nTemp += 4; 
     wPID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier); 

     bResult = true; 
     break; 
     } 
    } 

    return bResult; 
}