Как определить канал 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.

Другие вопросы по тегам