Получить локальный путь к файлообменнику Windows при удаленном запуске сценария PowerShell через WinRM
У меня есть пакетный скрипт Windows, который копирует EXE или пакетный файл на удаленный файловый ресурс и запускает его на удаленном сервере с помощью PowerShell WinRM. Строка, которая запускает команду удаленно, выглядит следующим образом:
ECHO Invoke-Command -Authentication CredSSP -Credential %USERDOMAIN%\%USERNAME% -ComputerName %SERVER_NAME% -ScriptBlock { cd (gwmi Win32_Share -Filter "name='%SHARE_NAME%'").Path ; .\%MY_EXE_TO_RUN% } |PowerShell.exe -Command -
Мне нужно изменить текущую директорию на директорию fileshare, где находится исполняемый файл EXE/batch (это зависит от этого). Это также должен быть локальный каталог - если я попытаюсь CD \\%SERVER_NAME%\%SHARE_NAME%
это работает для EXE, но не для командного файла, cmd.exe не поддерживает UNC-путь в качестве текущего каталога. Однако я также не хочу жестко прописывать в сценарии локальный путь к общему ресурсу, поэтому я пытаюсь найти его в WMI.
Это прекрасно работает для администраторов, но не для администраторов с ошибкой " Отказано в доступе". Эти пользователи без прав администратора могут RDP на сервер, открыть PowerShell и успешно запустить gwmi Win32_Share
там. Таким образом, похоже, что проверки разрешений несколько отличаются при запуске через WinRM!
Я нашел http://www.adilhindistan.com/2013/10/permissions-to-access-wmi-remotely.html но на многих серверах это выглядит довольно сложно. Мне не нужен удаленный доступ WMI для чего-либо, кроме этого. Возможно, есть другой способ разрешить локальный путь для общего ресурса? Или, в качестве альтернативы, можно ли как-то выполнить запрос WMI и применить к нему локальные проверки разрешений? В конце концов, я уже пишу код на удаленном сервере, поэтому должен быть какой-то способ сделать это.
1 ответ
Я могу дать только подсказку, так как предоставленный фрагмент кода кажется мне немного неясным.
Хотя cmd
не поддерживает UNC- имена, так как в текущем каталоге вы все равно можете использовать временную карту дисковода pushd
Команда, при условии, что расширения команд включены:
PUSHD: если указан путь UNC,
PUSHD
создаст временную карту дисков, а затем будет использовать этот новый диск.
Временные буквы дисков располагаются в обратном алфавитном порядке, поэтому, еслиZ:
бесплатно, он будет использован первым.
pushd \\%SERVER_NAME%\%SHARE_NAME%
Не забудьте удалить временное сопоставление дисков через приложение popd
команда:
POPD: измените каталог обратно на путь / папку, последний раз сохраненный
PUSHD
команда.POPD
также удалит все временные карты дисков, созданныеPUSHD
,
Смотрите также cmd /?
и SETLOCAL для получения дополнительной информации о расширениях команд.
Обновление: Powershell
поддерживает имена UNC в качестве текущего каталога:
Push-Location \\$env:SERVER_NAME\$env:SHARE_NAME\$env:MY_SUBDIR_UNDER_SHARE