Ошибка SQL Server xp_cmdshell 5

Когда я выполняю следующую инструкцию в SQL Server 2008:

declare @s varchar(100)
set @s='dir'
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'xp_cmdshell',1
reconfigure
exec xp_cmdshell @s

Это дает следующую ошибку:

выполнить xp_cmdshell error.invoke 'CreateProcess' не удалось, код ошибки: '5'.

Как я могу это исправить? Я включил процедуру xp_cmdshell и дал папке права на чтение и запись.

Я искал в Интернете советы по добавлению пользователя домена в группу администраторов. Но я так и не понял принципа. Я был бы признателен за любые идеи. Спасибо!


person Dolphin    schedule 21.10.2013    source источник


Ответы (3)


Код ошибки 5 означает - доступ запрещен.

Пожалуйста, проверьте, имеет ли учетная запись, используемая для службы MSSQL, права на команду, которую вы пытаетесь запустить.

Подробности: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/bbdffb3c-6604-4011-ac5f-5ea8ecb1a32c/xpcmdshell-a-call-to-createprocess-failed-with-error-code-5-under-sql2005-rtm?forum=sqlsecurity

person Sergey N Lukin    schedule 21.10.2013
comment
Я прочитал документ и знаю причину ошибки, но я до сих пор не знаю, как с ним работать. Я использую net localgroup в cmd для отображения группы пользователей, и я не знаю, какого пользователя следует добавить в группу администраторов? используя net localgroup /add administrator username - person Dolphin; 21.10.2013

Хотя для многих это, вероятно, очень просто, я потратил на это огромное количество времени ... и ошибка не была очевидна ... надеюсь, это поможет кому-то еще.

(Проверено на SQL2012)

Шаг 1. Включите функцию xp_cmdshell в SQL Server.

            USE master
            Go
            EXEC sp_configure 'show advanced options', 1
            Go
            RECONFIGURE
            Go
            EXEC sp_configure 'xp_cmdshell', 1 
            GO 
            RECONFIGURE 
            GO
            EXEC sp_configure 'show advanced options', 0
            Go
            RECONFIGURE
            Go

Шаг 2: Запустите команду dos «whoami /all», используя xp_cmdshell и две наши команды остановки службы.

            EXEC xp_cmdshell 'whoami /all'
            exec xp_cmdshell 'net stop MR2012ApplicationService';
            exec xp_cmdshell 'net stop MR2012ProcessService';

Среди прочего, это покажет, что мой контекст выполнения — «nt Authority\network service S-1-5-20». Показанная учетная запись должна иметь разрешения на перезапуск службы. Две другие команды, пытающиеся остановить службы, не работают из-за разрешений:

            System error 5 has occurred.
            Access is denied.

Шаг 3: Используя SUBINACL, давайте посмотрим на разрешения для службы, прежде чем мы начнем. Поскольку именно здесь у меня возникли проблемы, давайте удостоверимся, что мы знаем полный путь к SUBINACL.exe.

            where SUBINACL
            SUBINACL.exe /SERVICE MR2012ProcessService /DISPLAY

Если у вас была та же проблема, что и у меня, вы увидите, что путь к SUBINACL находится там, где вы могли ранее извлечь «Инструменты набора ресурсов Windows Server 2003» (это моя машина для разработки), и это версия 4.0.1.1604. Тем не менее, обратите внимание, что «nt Authority\Network Service» не имеет разрешений. Роджер? Роджер!

Шаг 4: Давайте предоставим эти разрешения!

            SUBINACL.exe /SERVICE MR2012ApplicationService /GRANT="nt authority\network service"=LQSTOP
            SUBINACL.exe /SERVICE MR2012ProcessService /GRANT="nt authority\network service"=LQSTOP

Шаг 5: Обратите особое внимание на вывод этих двух команд! Не похоже, что они много сделали, не так ли?

            +SERVICE MR2012ApplicationService
            /GRANT=nt authority\network service=LQSTOP

            Elapsed Time: 00 00:00:00
            Done:        0, Modified        0, Failed        0, Syntax errors        0

Хм. Что ж, поскольку мы рассмотрели разрешения ДО того, как начали, давайте посмотрим, как они выглядят сейчас:

            SUBINACL.exe /SERVICE MR2012ProcessService /DISPLAY

Ну это отстой. Это не сработало! Что ж, как оказалось, я потратил ОГРОМНОЕ количество времени, пробуя всякие сумасшедшие дела, и корень проблемы — известная ошибка в SUBINACL!

Шаг 6: Давайте возьмем самую новую версию и установим ее в C:\Dev\Tools:

            https://www.microsoft.com/en-us/download/details.aspx?id=23510

После установки еще раз проверим путь/версию к exe.

            where SUBINACL

Хм, это та же версия, но теперь есть SUBINACL.exe.old.

Шаг 7: Давайте попробуем снова предоставить эти разрешения! Теперь вывод должен выглядеть так:

            MR2012ApplicationService : new ace for DOMAIN\MyProxyAccount
            MR2012ApplicationService : 1 change(s)

            Elapsed Time: 00 00:00:00
            Done:        1, Modified        1, Failed        0, Syntax errors        0
            Last Done  : MR2012ApplicationService

Есть еще одна морщинка; учетная запись выполнения будет служебной учетной записью сервера sql (т. е. nt Authority\network service). Однако, если это нежелательно, можно настроить прокси.

Шаг 8: Настройка учетной записи прокси должна быть настроена следующим образом:

            EXEC sp_xp_cmdshell_proxy_account 'DOMAIN\MyProxyAccount', '$ome$uper$ecureP@ssword';

Чтобы было ясно, это не моя установка, просто мое понимание того, как это работает.

Шаг 9: И, конечно же, у этой учетной записи прокси должны быть разрешения:

            C:\Dev\Tools\SUBINACL.exe /SERVICE MR2012ApplicationService /GRANT=DOMAIN\MyProxyAccount=LQSTOP
            C:\Dev\Tools\SUBINACL.exe /SERVICE MR2012ProcessService /GRANT=DOMAIN\MyProxyAccount=LQSTOP

Кроме того, учетной записи службы потребуется «Вход в систему как пакетное задание» в локальных политиках.

С уважением,

Стюарт

person Stuart    schedule 14.12.2015

Вы можете сделать это из SQL Server Management Studio следующим образом:

Щелкните сервер правой кнопкой мыши и выберите «Фасеты».

person arnav    schedule 15.11.2016