Хотя для многих это, вероятно, очень просто, я потратил на это огромное количество времени ... и ошибка не была очевидна ... надеюсь, это поможет кому-то еще.
(Проверено на 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