#sql-server #tsql #jar #psexec #xp-cmdshell
#sql-server #tsql #jar #psexec #xp-cmdshell
Вопрос:
Я хочу удаленно запустить jar-файл с сервера SQL на другой компьютер. Для этого я обнаружил, что могу использовать PSEXEC для удаленной отправки команд на целевой компьютер и использовать xp_cmdshell, чтобы я мог вызывать команду psexec из хранимой процедуры.
Я уже извлек PsTools, загруженные с веб-сайта technet. Я скопировал PsExec.exe , PsExec64.exe и Eula.txt в C:Windows папка сервера SQL. Я уже протестировал это в командной строке SQL Server с помощью следующей команды,
psexec \mymachine -u mydomainmyuser -p mypassword cmd /c "java -jar C:WriteToFile.jar"
WriteToFile_U4.jar выполняет запись в текстовый файл в общей папке. Эта общая папка фактически физически расположена на сервере SQL. Выполнение приведенной выше команды обновляет текстовый файл. Однако, когда я пытаюсь запустить WriteToFile_U4.jar через xp_cmdshell с кодом ниже файл не обновляется.
EXEC master..xp_cmdshell 'psexec \mymachine -u mydomainmyuser -p mypassword cmd /c "java -jar C:WriteToFile.jar"'
Также на панели результатов SSMS отображается странный вывод.
Я уже добавил агент службы SQL в папку security, где WriteToFile_U4.jar обновляет текстовый файл.
Кто-нибудь знает, как с этим справиться? Имеет ли значение в моей проблеме, что команды T-SQL, которые я выполняю, выполняются как агент службы SQL? а не как учетная запись администратора сервера?
Обновить:
Я попытался отказаться от идеи xp_cmdshell и просто создал задание агента SQL Server, тип которого — операционная система (CmdExec). Содержимое шага,
cmd.exe /c "D:runjarfileremote.bat"
Содержимое файла bat является,
psexec \computer-name -u domainuser -p password cmd /c "hostname"
просто чтобы проверить, могу ли я запустить psexec в задании агента SQL Server. Но в истории созданного мной задания зарегистрировано следующее.
Однако, если я изменю содержимое файла bat, чтобы он содержал только hostname
. Задание успешно завершается. Итак, я пришел к выводу, что на самом деле psexec не работает должным образом при вызове в качестве задания агента SQL Server. Есть ли какой-либо способ, которым это может работать? Или я просто делаю что-то не так?
Ответ №1:
psexec (как и все текущие инструменты sysinternals) при первом запуске запрашивает у любого пользователя согласие на лицензию. Это может быть вызвано этим, поскольку оно выполняется учетными записями служб.
добавьте /accepteula в команду psexec, если 64-разрядная ОС psexec64 /accepteula