psexec не работает должным образом при вызове из xp_cmdshell

#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