Разрешить не-системному пользователю выполнять xp_cmdshell
из SSMS
Я помог устранить проблему, когда нам нужно было предоставить разработчику приложения доступ для выполнения xp_cmdshell
из сеанса SSMS, а не « Запуск от имени » из задания агента SQL на некритическом сервере разработки, не делая его системным администратором в экземпляре SQL Server.
Что мы сделали
Примечание. Учетная запись пользователя домена может быть заменена учетной записью рабочей группы, учетной записью локального компьютера и т.д.
Важное замечание: Вам необходимо понимать риск, позволяющий пользователям в вашей среде выполнять команды уровня ОС, и вы должны предоставлять этот уровень разрешений только для xp_cmdshell
тем, кто достаточно надежен с таким уровнем безопасности с помощью метода proxy .
Создал новую учетную запись пользователя домена с надежным паролем и принял к сведению имя пользователя и пароль. Убедитесь, что учетная запись была включена, и пароль был установлен, чтобы никогда не истек.
Создано новое имя входа SQL Server, привязанное к новой учетной записи пользователя домена, которую мы создали.
Созданы новые учетные данные прокси, привязанные к учетной записи пользователя домена.
EXEC sp_xp_cmdshell_proxy_account '<Domain>\<NewUser>', '<password>' -- you have to type actual password
Допустим , что SQL Server Войти Явный EXECUTE
доступ к системе расширенного ХП от имени Master
sys.xp_cmdshell
DB.
--see who all has execute access to xp_cmdshell
Use master
EXEC sp_helprotect 'xp_cmdshell'
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
-- Grant execute permissions to account
GRANT EXECUTE ON xp_cmdshell TO [<Domain>\<NewUser>]
Предоставьте пользователю, который использует олицетворение EXECUTE AS
разрешение на новый вход в систему SQL Server.
GRANT IMPERSONATE ON LOGIN::[<Domain>\<NewUser>] TO [<Domain>\<UserGrantingExecuteAsUser>]
Теперь запустите команду с EXECUTE AS LOGIN и передайте команду net stop
хранимой процедуре xp_cmdshell
. Участник безопасности, указанный на шаге 5 выше в <Domain>\<UserGrantingExecuteAsUser>
должен быть тем, у кого вы используете SSMS в качестве контекста безопасности для этой задачи.
EXECUTE AS LOGIN = '<Domain>\<NewUser>'
DECLARE @COMMAND nvarchar(4000)
SET @COMMAND = 'net stop <servicename>'
EXEC xp_cmdshell @COMMAND
REVERT
Дополнительные ресурсы