Как да получите информация за UNC устройство на Disconnected Network Drive

Изпълняваме някои процеси в разпределена изчислителна среда. Процесите на една машина трябва да комуникират информация с процеси на други машини. Една от тези части от информацията е местоположението на определени файлове. По този начин процес на една машина може да е поставил информация в определен файл на конкретен мрежов дял и трябва да съобщи местоположението на процес на друга машина.

Нямаме проблем с комуникационната част. Проблемът е с определянето на информацията за "местоположение", която машината трябва да разпространи. Пътищата на файлове, включващи картографиране на устройства, са очевидно безполезни: различните машини ще имат различни картографиране на устройства. По този начин, това, от което се нуждаем, за да му съобщим пълното 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$", което според мен е това, което търсите. Тогава можете просто да направите a

$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