Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定给定磁盘的SATA通道?_C#_.net_Disk_Hard Drive_Sata - Fatal编程技术网

C# 如何确定给定磁盘的SATA通道?

C# 如何确定给定磁盘的SATA通道?,c#,.net,disk,hard-drive,sata,C#,.net,Disk,Hard Drive,Sata,使用DISKPART命令行实用程序,我可以得到一个名为“位置路径”的东西,它似乎提供了我所需的信息。在DISKPART中选择一个磁盘后,您可以使用命令detail disk查看此信息 似乎我可以通过这个类通过编程获得这些信息: 我不确定如何获取此类的实例。我有一些使用ManagementObjectSearcher的WMI类的例子,但这种方法对我不起作用,我也不确定MSFT\u Disk在Windows 7中的可用性,因为页面提到这是针对Windows 8的 有人知道获取SATA通道信息或磁盘“

使用
DISKPART
命令行实用程序,我可以得到一个名为“位置路径”的东西,它似乎提供了我所需的信息。在
DISKPART
中选择一个磁盘后,您可以使用命令
detail disk
查看此信息

似乎我可以通过这个类通过编程获得这些信息:

我不确定如何获取此类的实例。我有一些使用
ManagementObjectSearcher
WMI
类的例子,但这种方法对我不起作用,我也不确定
MSFT\u Disk
在Windows 7中的可用性,因为页面提到这是针对Windows 8的


有人知道获取SATA通道信息或磁盘“位置路径”的好方法吗?

如果不需要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();
        }
    }
}
使用系统;
使用System.Linq;
使用制度管理;
命名空间DiskScanPOC
{
班级计划
{
静态void Main()
{
var managementScope=新的managementScope();
//获取磁盘驱动器
var query=newobjectquery(“从Win32_DiskDrive中选择*);
var searcher=新的ManagementObjectSearcher(managementScope,查询);
var oReturnCollection=searcher.Get();
//列出所有可用的属性,以防下面的属性不是您想要的。
var colList=oReturnCollection.Cast().First();
foreach(colList.Properties中的var属性)
{
WriteLine(“属性:{0}={1}”,Property.Name,Property.Value);
}
//循环查找找到的驱动器并写出信息
foreach(管理对象或归还或归还集合)
{
Console.WriteLine(“名称:+oReturn[“名称”]);
Console.WriteLine(“目标Id:+oReturn[“SCSITargetId]”);
控制台写入线(“端口:+oReturn[“SCSIPort”]);
}
Console.Read();
}
}
}

我没有打开我的机箱来验证SATA端口号,但上面的应用程序似乎在我的带有3个SATA硬盘驱动器的机器上给出了合理的结果。

如果你想获得位置路径,这就是你要寻找的功能。将属性值设置为
SPDRP\u LOCATION\u INFORMATION

我假设您已经知道如何枚举设备以获取
deviceinfo集
deviceinfo数据

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";
                }
            }
        }
    }
}


注意:首先添加对.net freamwork 4.0的System.Management.dll的引用

您可能需要使用。在.NET中找不到太多关于如何使用它的信息,但我确实找到了它,这似乎是通过完成一些任务来实现的。您也可以通过PInvoke来完成。您是否考虑过枚举
HKLM\SYSTEM\CurrentControlSet\Enum\IDE\device\id:LocationInformation
?它包含以下信息:通道4、目标0、Lun 0