Не удается получить доступ к сетевому диску в PowerShell, запущенном как администратор
Я запускаю PowerShell на виртуальной машине Windows 7 x64. У меня есть общая папка на хосте, отображаемая как сетевой диск (Z:). Когда я запускаю PS, я могу получить доступ к этому диску просто отлично, но если я запустил его "как администратор", он скажет мне:
Set-Location : Cannot find drive. A drive with the name 'Z' does not exist.
At line:1 char:13
+ Set-Location <<<< Z:
+ CategoryInfo : ObjectNotFound: (Z:String) [Set-Location], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
Как получить доступ к сетевым дискам в качестве администратора?
Ответы
Ответ 1
В конце концов, исправление было просто для перепрограммирования буквы диска во время работы в качестве администратора:
net use Z: "\\vmware-host\Shared Folders"
Это не нужно делать из одного экземпляра PowerShell (или из PowerShell вообще) - это просто то, что нужно сделать один раз для всего сеанса входа в систему.
Ответ 2
В моем случае я смог просто использовать UNC-путь вместо сопоставления дисков, и он работал нормально.
Итак, в вашем примере вместо использования сопоставленного диска Z: \, я просто использовал "\\ vmware-host\Shared Folder" в качестве пути.
Ответ 3
Еще один обходной путь, на который мне понадобилось несколько лет, - запуск net use
из запланированной задачи в качестве учетной записи NT AUTHORITY\SYSTEM. Видимо, диски, подключенные под этой учетной записью, отображаются для всех пользователей и всех уровней прав доступа.
Я проверил это, и это работает даже на NFS-ресурсах (что может быть немного привередливым). Просто создайте запланированный набор задач для запуска при запуске системы и укажите обычную команду:
net use Z: \\server\share /persistent:no
Возможно, это может сработать, чтобы запустить его только один раз с /persistent:yes
, но я этого не пробовал. Конечно, "просто сопоставьте это снова" тоже работает, но этот диск все равно не будет виден запланированным задачам, выполняющимся в разных контекстах. Недостатком является то, что все реальные пользователи видят это тоже, так что не так хорошо для многопользовательских установок.
Ответ 4
Я использую следующее хакерское решение, где я воссоздаю "отсутствующие" PSDrives в profile.ps1, когда Powershell работает в повышенном режиме.
Gist
# Reconnect PSDrives for network connections when running with elevated privileges
$elevated = (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
if( $elevated ) {
net use | ?{ $_ -match ":\s+\\\\" -and !$_.StartsWith("Unavailable") } | %{
$tokens = $_.split(":")
$psdrivename = $tokens[0][$tokens[0].length-1]
$path = $tokens[1].trim().split(" ")[0].trim()
if( !(get-psdrive | ?{ $_.Name -eq $psdrivename } )) {
write-host ( "Restoring PSDrive for {0}: {1}" -f $psdrivename, $path )
new-psdrive $psdrivename FileSystem $path | out-null
}
}
}
Ответ 5
Как отобразить новый psdrive для доступа к этим данным? PSDrives работают так же хорошо, если не лучше, чем системные сопоставленные диски при написании сценариев или доступе к сетевым хранилищам данных в powershell.
Инструкции по использованию командлета Новый-PSDrive приведены здесь: Техника: New-PSDrive
Если вы не хотите создавать новый psdrive каждый раз, когда можете добавить его в профили как для администратора, так и для вашей учетной записи пользователя, и он будет автоматически доступен каждый раз, когда вы откроете PowerShell.
~ Dan
Ответ 6
Похоже, известная проблема для Microsoft с Vista.
Microsoft Известная базовая статья с исправлением небезопасной.
В настоящее время мы оцениваем этот подход, поскольку некоторые из наших ребят испытывают чувства, что машина не может начать после этого; -)
Ответ 7
Ни один из других ответов не работал для меня; но ответ @TimothyLeeRussell указал мне верное направление.
В моем случае у меня был файл .bat
расположенный на сетевом диске. Когда я запускал его как администратор, он просто высвечивал окно командной строки и мгновенно исчезал; он работал нормально, когда я запускал содержимое файла из командной строки с повышенными правами.
Наконец я понял, что попытался запустить файл .bat
с подключенного сетевого диска. Я изменил исполнение файла, чтобы использовать путь UNC, и это сработало.