2012-08-16 11 views
6

Usando la utilidad de línea de comandos DISKPART, puedo obtener algo llamado "ruta de ubicación" que parece darme lo que necesito, puede ver esto usando el comando detail disk después de seleccionar uno de sus discos en diskpart.¿Cómo puedo determinar el canal SATA para un disco dado?

Parece que puedo obtener esta información mediante programación a través de esta clase: MSFT_Disk

estoy seguro acerca de cómo obtener una instancia de esta clase. Tengo un par de ejemplos del uso de un ManagementObjectSearcher para WMI clases pero ese método no funciona para mí, también estoy seguro de la disponibilidad MSFT_Disk 's en Windows 7 como la página menciona que esto es para Windows 8.

¿Alguien saber de una buena manera de obtener información de canal SATA o la "ruta de ubicación" de un disco?

+0

es probable que tenga que utilizar [VDS] (http://msdn.microsoft .com/en-us/library/windows/desktop/bb986750% 28v = vs.85% 29.aspx). No puedo encontrar mucho sobre cómo usarlo desde .NET, pero sí encontré [esto] (http://esotericalstuff.wordpress.com/2010/11/18/vds-activities-under-c-2/) que parece para completar algunas tareas También es posible que puedas invocarlo a través de él. –

+0

¿Ha pensado en enumerar 'HKLM \ SYSTEM \ CurrentControlSet \ Enum \ IDE \ device \ id: LocationInformation'? Contiene información como esta ** Channel 4, Target 0, Lun 0 ** – vane

Respuesta

0

Si desea no requiere Windows 8, creo WMI es el camino a seguir:

using System; 
using System.Linq; 
using System.Management; 

namespace DiskScanPOC 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var managementScope = new ManagementScope(); 

      //get disk drives 
      var query = new ObjectQuery("select * from Win32_DiskDrive"); 
      var searcher = new ManagementObjectSearcher(managementScope, query); 
      var oReturnCollection = searcher.Get(); 

      //List all properties available, in case the below isn't what you want. 
      var colList = oReturnCollection.Cast<ManagementObject>().First(); 
      foreach (var property in colList.Properties) 
      { 
       Console.WriteLine("Property: {0} = {1}", property.Name, property.Value); 
      } 

      //loop through found drives and write out info 
      foreach (ManagementObject oReturn in oReturnCollection) 
      { 
       Console.WriteLine("Name : " + oReturn["Name"]); 
       Console.WriteLine("Target Id: " + oReturn["SCSITargetId"]); 
       Console.WriteLine("Port: " + oReturn["SCSIPort"]); 
      } 
      Console.Read(); 
     } 
    } 
} 

yo no grieta abrir mi caso para verificar los números de puertos SATA, pero la aplicación citadas es el da resultados razonables en mi máquina con 3 discos duros SATA.

0

Si desea obtener la ruta de ubicación, SetupDiGetDeviceRegistryProperty es la función que está buscando. Establezca el valor de propiedad en SPDRP_LOCATION_INFORMATION.

Supongo que ya sabe cómo enumerar los dispositivos para obtener DeviceInfoSet y DeviceInfoData.

0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using System.Management; 

namespace Hard_Disk_Interface 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnCheck_Click(object sender, EventArgs e) 
     { 
      WqlObjectQuery q = new WqlObjectQuery("SELECT * FROM Win32_IDEController"); 
      ManagementObjectSearcher res = new ManagementObjectSearcher(q); 
      lblHDDChanels.Text = string.Empty; 
      foreach (ManagementObject o in res.Get()) 
      { 
       string Caption = o["Caption"].ToString(); 

       lblHDDChanels.Text += Caption + "\n\n"; 
       if (Caption.Contains("Serial")) 
       { 
        lblInterface.Text = "S-ATA"; 
       } 
      } 
     } 
    } 
} 

This is demo...

Nota: Primero se debe agregar la referencia de System.Management.dll de freamwork .NET 4.0

Cuestiones relacionadas