Я пишу часть программного обеспечения, которое отображает сетевой диск с помощью API WNetAddConnection2. На всякий случай это актуально, это привод WebDAV, а не обычный SMB-ресурс.
Привод принимает имя по умолчанию, которое я хотел бы изменить.
Некоторые ответы в сети рекомендуют использовать System.IO.DriveType, например:
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (var drive in allDrives)
{
if (drive.DriveType == DriveType.Network && drive.Name.StartsWith("Z:"))
{
drive.VolumeLabel = "DriveInfo";
}
}
Это не работает на сетевых дисках, и это подкреплено MSDN, где указано, что будет выброшено исключение UnauthorizedAccessException
.
Во-вторых, я попытался использовать метод оболочки:
Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2) shell.NameSpace("Z:")).Self.Name = "Shell";
Код выполняется без ошибок, но диск не переименовывается. И вот где это странно, я нашел путь реестра, где эти вещи записываются:
HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ MountPoints2
В приведенном выше коде создается ключ, который выглядит корректно, и добавляет _LabelFromReg
REG_SZ с "Shell" в качестве значения. Однако это НЕ отражается в проводнике или где-либо еще.
Затем я вручную переименовал отображаемый диск, щелкнув правой кнопкой мыши и выбрав "Переименовать".
Это создает новый, немного другой ключ в MountPoints2
, который отлично работает.
Итак, приведенный выше код оболочки не совсем правильно разрешает путь - есть ли что-то еще, что я могу попробовать? Вышеприведенное приводит меня к выводу, что Windows должна использовать другой API-вызов для переименования диска?
Обновление 1
Это определенно связано с тем, что они являются дисками WebDAV. Должна быть какая-то обработка под капотом.
Мои карты программного обеспечения https://[email protected]/stuff/destination/docs
. Точный путь можно увидеть с помощью команды Net Use
. Это путь, который добавляет код shell
выше в реестр и пытается назвать его.
Однако, зависание над диском в Проводнике Windows дает мне https://[email protected]/anotherfolder/stuff/destination
, и этот путь, который переименовывает вручную в Explorer, добавляет в реестр.
Все, что мне удалось выяснить до сих пор, - это вернуть второй путь из вызова WMI (Win32_LogicalDisk → ProviderName), но я действительно хочу избежать подхода к записи в ручном режиме.