Как определить канал SATA для данного диска?
С помощью DISKPART
Утилита командной строки, я могу получить что-то под названием "Путь к месту", который, кажется, дает мне то, что мне нужно, вы можете просмотреть это с помощью команды detail disk
после выбора одного из ваших дисков в diskpart
,
Похоже, я могу получить эту информацию программно через этот класс: MSFT_Disk
Я не уверен, как получить экземпляр этого класса. У меня есть несколько примеров использования ManagementObjectSearcher
за WMI
классы, но этот метод не работает для меня, я также не уверен в MSFT_Disk
Доступность в Windows 7, так как на странице упоминается, что это для Windows 8.
Кто-нибудь знает хороший способ получить информацию о канале SATA или "путь к месту" диска?
3 ответа
Если вы хотите получить путь к местоположению, функция SetupDiGetDeviceRegistryProperty - это функция, которую вы ищете. Установите значение свойства в SPDRP_LOCATION_INFORMATION
,
Я предполагаю, что вы уже знаете, как перечислять устройства, чтобы получить DeviceInfoSet
а также DeviceInfoData
,
Если вы не хотите использовать Windows 8, я считаю, что WMI - это то, что нужно:
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();
}
}
}
Я не взломал свой кейс, чтобы проверить номера портов SATA, но вышеприведенное приложение выглядит так, как будто оно дает разумные результаты на моей машине с 3 жесткими дисками SATA.
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";
}
}
}
}
}
Примечание. Сначала добавьте ссылку на System.Management.dll в.net freamwork 4.0.