Как получить информацию о диске UNC на отключенном сетевом диске

Мы запускаем некоторые процессы в распределенной вычислительной среде. Процессы на одной машине должны обмениваться информацией с процессами на других машинах. Одним из таких фрагментов информации является расположение определенных файлов. Таким образом, процесс на одном компьютере может поместить информацию в конкретный файл на определенном сетевом ресурсе, и ему необходимо сообщить об этом местоположении процессу на другом компьютере.

У нас нет проблем с коммуникативной частью. Проблема заключается в определении информации о «местоположении», которую машина должна распространять. Пути к файлам с сопоставлением дисков явно бесполезны: разные машины будут иметь разные сопоставления дисков. Таким образом, нам нужно сообщить полное имя пути UNC.

По большей части мы можем легко получить эту информацию. Одно место, где у нас возникают проблемы, — это скрипт powershell, которому необходимо получить эту информацию. В настоящее время мы используем следующий код:

$l_logicalDisk = Gwmi Win32_LogicalDisk -filter "DeviceID = '$l_currentDrive'"
if ( $l_logicalDisk.DriveType -eq 4 )
{
    $l_base = $l_logicalDisk.ProviderName
}

а $l_base предоставляет информацию \\computername\share. Однако в определенных обстоятельствах это не удается. Иногда по какой-то неизвестной причине подключенный диск отображается в Explorer.exe как «Отключенный сетевой диск», даже если диск и все его файлы доступны. (На самом деле запущенный скрипт находится даже на предполагаемом «Отключенном сетевом диске».) В этой ситуации поле ProviderName информации о логическом диске пусто. Кажется, ничто не переворачивает статус «Отключенный сетевой диск», и я не нашел способа обновить информацию ProviderName.

Итак, кто-нибудь знает либо (1) как «повторно подключить» отключенный сетевой диск из powershell, либо (2) как в Powershell получить информацию о пути UNC для каталога более надежным методом, описанным выше? Спасибо.


person David I. McIntosh    schedule 07.03.2014    source источник
comment
Я считаю, что лучше всего вообще избегать использования карт букв дисков.   -  person Warren Stevens    schedule 07.03.2014


Ответы (1)


Вы всегда можете запросить реестр, это должно работать на отключенных дисках (где $DrvLtr соответствует желаемой букве подключенного к сети диска, например Z или M):

Pushd
cd HKCU:
$UNC=(gci network|?{$_.Name -match "$DrvLtr"}|%{Get-ItemProperty -Path $_}).RemotePath
Popd

Тогда $UNC должна быть строкой со значением типа «\Server01\FileShare$», что, я думаю, вам и нужно. Тогда вы можете просто сделать

$Path.Replace("$DrvLtr`:",$UNC)

И все готово

person TheMadTechnician    schedule 07.03.2014
comment
Хороший. Спасибо. Это работает до сих пор в ситуациях, которые я смог проверить. Однако нужно еще немного протестировать. В частности, нужно протестировать ситуацию с отключенным сетевым диском, которую я не могу воспроизвести на машине, которая у меня есть прямо сейчас. - person David I. McIntosh; 09.03.2014
comment
Это действительно работает для отключенных дисков и в других ситуациях, когда Gwmi Win32_LogicalDisk не дает никакой информации. благодаря. - person David I. McIntosh; 09.02.2015