У меня есть пакетный сценарий 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 -
Мне нужно изменить текущий каталог на каталог общего доступа, где находится исполняемый EXE / пакетный файл (он полагается на это). Это также должен быть локальный каталог - если я попытаюсь 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 и применить к нему локальные проверки разрешений? В конце концов, я уже пишу код на удаленном сервере, поэтому должен быть какой-то способ сделать это.
Я могу дать только подсказку, поскольку предоставленный фрагмент кода кажется мне немного неясным.
Хотя 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