Получить локальный путь к файлообменнику 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
Другие вопросы по тегам