См. информацию об управлении дисками с помощью С#

Когда я открываю Disk Management (щелкните правой кнопкой мыши Мой компьютер->Управление), я вижу: введите здесь описание изображения

Как узнать, что путь F:\ принадлежит Disk5? Другими словами, мне нужно знать, какие диски доступны с C#.

Причина, по которой мне нужно это знать, заключается в том, что у меня есть USB-накопитель, который зашифрован, и мне нужно передать параметр \Device\Harddisk5 в TrueCrypt вместе с паролем, чтобы смонтировать зашифрованное устройство с кодом.

Редактировать

Я знаю, как смотреть информацию о дисках. Я просто не знаю, как узнать, например, что диск 1 принадлежит диску 0. Другими словами, у меня возникли проблемы с определением номера диска. Я ищу реализовать:

public string GetDiskNumber(char letter)
{
   // implenetation
   return Disk5;
}

где я буду называть это как:

GetDiskNumber('F');

person Tono Nam    schedule 23.01.2014    source источник
comment
Я предполагаю, что вы делаете это с помощью кода С#..? вы смотрели на использование WMI   -  person MethodMan    schedule 24.01.2014
comment
WMI — это то, что я бы использовал для получения этой информации, проверьте эти классы Win32_DiskDrive и Win32_DiskPartition.   -  person nGX    schedule 24.01.2014


Ответы (2)


Вы можете использовать WMI для получения этой информации

System.Management.ManagementObject("Win32_LogicalDisk.DeviceID=" & DriveLetter & ":")

Дополнительные сведения см. в классе Win32_LogicalDisk. Надеюсь, это помогает. Кстати есть и PInvoke GetVolumeInformation.

Если вам нужен «PHYSICALDRIVE0», вы должны использовать класс Win32_PhysicalMedia. и класс Win32_DiskDrivePhysicalMedia склеить оба.

Пример вашей потребности в С#

public string GetDiskNumber(string letter)
{
    var ret = "0";
    var scope = new ManagementScope("\\\\.\\ROOT\\cimv2");
    var query = new ObjectQuery("Associators of {Win32_LogicalDisk.DeviceID='" +     letter + ":'} WHERE ResultRole=Antecedent");
    var searcher = new ManagementObjectSearcher(scope, query);
    var queryCollection = searcher.Get();
    foreach (ManagementObject m in queryCollection)
    {
        ret = m["Name"].ToString().Replace("Disk #", "")[0].ToString();
    }
    return ret;
}
person gblmarquez    schedule 23.01.2014
comment
Это дает много информации. когда я пытаюсь, например, System.Management.ManagementObject("Win32_LogicalDisk.DeviceID=c:"), как я могу узнать его диск 0? - person Tono Nam; 24.01.2014
comment
Если вам нужно имя типа «PHYSICALDRIVE0», вам нужен класс Win32_PhysicalMedia. - person gblmarquez; 24.01.2014

Сделали метод получения буквы диска и его номера в словаре;

public Dictionary<string, string> GetDrives()
        {
            var result = new Dictionary<string, string>();
            foreach ( var drive in new ManagementObjectSearcher( "Select * from Win32_LogicalDiskToPartition" ).Get().Cast<ManagementObject>().ToList() )
            {
                var driveLetter = Regex.Match( (string)drive[ "Dependent" ], @"DeviceID=""(.*)""" ).Groups[ 1 ].Value;
                var driveNumber = Regex.Match( (string)drive[ "Antecedent" ], @"Disk #(\d*)," ).Groups[ 1 ].Value;
                result.Add( driveLetter, driveNumber );
            }
            return result;
        }
person Jake Rote    schedule 23.01.2014
comment
Это не говорит мне, какой номер диска у диска F :( - person Tono Nam; 24.01.2014
comment
Тоже работает. Сначала я попробовал другой ответ. +1 за большую помощь! спасибо! - person Tono Nam; 24.01.2014