2012-08-16 13 views
6

Utilizzo dell'utilità della riga di comando DISKPART, È possibile ottenere qualcosa chiamato "Percorso posizione" che sembra darmi quello che mi serve, è possibile visualizzarlo utilizzando il comando detail disk dopo aver selezionato uno dei propri dischi in diskpart.Come posso determinare il canale SATA per un dato disco?

Sembra che posso ottenere queste informazioni programatically tramite questa classe: MSFT_Disk

Io sono sicuro su come ottenere un'istanza di questa classe. Ho un paio di esempi di utilizzo di un ManagementObjectSearcher per WMI classi, ma che il metodo non funziona per me, io sono anche sicuro di disponibilità MSFT_Disk s' in Windows 7 come pagina menziona il fatto che questo è per Windows 8.

Qualcuno conosci un buon modo per ottenere informazioni sul canale SATA o il "percorso di localizzazione" di un disco?

+0

probabilmente dovrete usare [VDS] (http://msdn.microsoft .com/it-it/library/windows/desktop/bb986750% 28v = vs.85% 29.aspx). Non riesco a trovare molto su come usarlo da .NET, ma ho trovato [questo] (http://esotericalstuff.wordpress.com/2010/11/18/vds-activities-under-c-2/) che sembra passare attraverso alcuni compiti. Potresti essere in grado di farti strada attraverso. –

+0

Hai mai pensato di enumerare 'HKLM \ SYSTEM \ CurrentControlSet \ Enum \ IDE \ device \ id: LocationInformation'? Contiene informazioni come questa ** Canale 4, Target 0, Lun 0 ** – vane

risposta

0

Se si desidera non richiede Windows 8, credo che WMI è la strada da percorrere:

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

non ho crack aprire il mio caso per verificare i numeri di porta SATA, ma l'applicazione di cui sopra sembra che fornisce risultati ragionevoli sulla mia macchina con 3 dischi rigidi SATA.

0

Se si desidera ottenere il percorso di posizione, SetupDiGetDeviceRegistryProperty è la funzione che si sta cercando. Impostare il valore della proprietà su SPDRP_LOCATION_INFORMATION.

Suppongo che tu sappia già come enumerare i dispositivi per ottenere il DeviceInfoSet e 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: Prima Aggiungere il riferimento di System.Management.dll di .net 4.0 freamwork

Problemi correlati