Получение разрешения на выполнение для xp_cmdshell
Я вижу сообщение об ошибке при попытке выполнить xp_cmdshell из хранимой процедуры.
xp_cmdshell включен в экземпляре. И разрешение на выполнение было предоставлено моему пользователю, но я все еще вижу исключение.
У разрешения EXECUTE было отказано в объекте 'xp_cmdshell, database' mssqlsystemresource, schema 'sys
Отчасти проблема заключается в том, что это общий кластер, и у нас есть единая база данных для экземпляра, поэтому у нас нет полного разрешения администратора. Поэтому я не могу войти и предоставить разрешения, а что нет.
Ответы
Ответ 1
Для пользователей, которые не являются членами роли sysadmin в экземпляре SQL Server, вам необходимо выполнить следующие действия, чтобы предоставить доступ к расширенной хранимой процедуре xp_cmdshell. Кроме того, если вы забыли один из шагов, я перечислил ошибку, которая будет выбрана.
-
Включить процедуру xp_cmdshell
Msg 15281, уровень 16, состояние 1, процедура xp_cmdshell, строка 1 SQL Server заблокировал доступ к процедуре "sys.xp_cmdshell" компонента "xp_cmdshell" , поскольку этот компонент отключен как часть конфигурации безопасности для этого сервера. Системный администратор может включить использование "xp_cmdshell" с помощью sp_configure. Дополнительные сведения о включении "xp_cmdshell" см. В разделе "Конфигурация поверхности" в электронной документации по SQL Server. *
-
Создайте логин для пользователя, не являющегося пользователем sysadmin, который имеет открытый доступ к основной базе данных
Msg 229, уровень 14, состояние 5, процедура xp_cmdshell, строка 1 Разрешение EXECUTE было отклонено для объекта "xp_cmdshell" , базы данных "mssqlsystemresource", схемы "sys". *
-
Предоставить разрешение EXEC для хранимой процедуры xp_cmdshell
Msg 229, уровень 14, состояние 5, процедура xp_cmdshell, строка 1 Разрешение EXECUTE было отклонено для объекта "xp_cmdshell" , базы данных "mssqlsystemresource", схемы "sys". *
-
Создайте учетную запись прокси-сервера, в которой будет выполняться xp_cmdshell с помощью sp_xp_cmdshell_proxy_account
Msg 15153, уровень 16, состояние 1, процедура xp_cmdshell, строка 1 Информация учетной записи прокси-сервера xp_cmdshell не может быть восстановлена или недействительна. Убедитесь, что учетные данные '## xp_cmdshell_proxy_account ##' существуют и содержат достоверную информацию. *
По вашей ошибке, казалось бы, был пропущен либо шаг 2, либо 3. Я не знаком с кластерами, чтобы узнать, есть ли что-то особенное для этой установки.
Ответ 2
Я хочу выполнить ответ из tchester.
(1) Включить процедуру 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
(2) Создайте логин "Domain\TestUser" (пользователь Windows) для пользователя, не являющегося пользователем sysadmin, который имеет открытый доступ к основной базе данных
(3) Предоставьте разрешение EXEC для хранимой процедуры xp_cmdshell:
GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]
(4) Создайте прокси-учетную запись, в которой будет запущен xp_cmdshell с помощью sp_xp_cmdshell_proxy_account
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd'
-- Note: pwd means windows password for [Domain\TestUser] account id on the box.
-- Don't include square brackets around Domain\TestUser.
(5) Разрешение сервера управления грантом для пользователя
USE master;
GRANT CONTROL SERVER TO [Domain\TestUser]
GO
Ответ 3
tchester сказал:
(2) Создайте логин для пользователя, не являющегося пользователем sysadmin, который имеет открытый доступ к основной базе данных
Я перешел в список пользовательских баз данных (сервер/безопасность/подключения/мое имя пользователя/свойства/сопоставление пользователя и хотел установить флажок для базы данных master.I получил сообщение об ошибке, сообщающее, что пользователь уже существует в главном базы данных.Чтобы запустить базу данных, отбросив пользователя, вернитесь к "сопоставлению пользователей" и отметьте поле для мастера. Посмотрите "общедоступный" ниже.
После этого вам нужно повторно отправить выполнение grant на xp_cmdshell на "мое имя пользователя"
Ив
Ответ 4
Чтобы расширить доступ к тому, что было предоставлено для автоматического экспорта данных в виде csv в общий сетевой ресурс с помощью агента SQL Server.
(1) Включить процедуру 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
(2) Создайте логин "Domain\TestUser" (пользователь Windows) для пользователя, не являющегося пользователем sysadmin, который имеет открытый доступ к основной базе данных. Выполнено с помощью пользовательского сопоставления
(3) Дайте логин в качестве пакетного задания. Перейдите в Локальная политика безопасности → Локальные политики → Назначение прав пользователя. Добавить пользователя в "Войти в качестве пакетного задания"
(4) Разрешения на чтение/запись в сетевой папке для домена\пользователь
(5) Предоставьте разрешение EXEC для хранимой процедуры xp_cmdshell:
GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]
(6) Создайте учетную запись прокси-сервера, в которой будет выполняться xp_cmdshell при использовании sp_xp_cmdshell_proxy_account
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user'
(7) Если команда sp_xp_cmdshell_proxy_account не работает, вручную создайте ее
create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password'
(8) Включить агент SQL Server. Откройте диспетчер конфигурации SQL Server, перейдите в Службы SQL Server, включите агент SQL Server.
(9) Создайте автоматическую работу. Откройте SSMS, выберите Агент SQL Server, затем щелкните правой кнопкой мыши и нажмите "Новое задание".
(10) Выберите "Владелец" в качестве вашего созданного пользователя. Выберите "Шаги", введите "type" = T-SQL. Заполните поле команд, как показано ниже. Установите разделитель как ','
EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s ","
(11) Заполните соответственно графики.
Ответ 5
Время внести свой вклад сейчас. Я являюсь ролью системного администратора и работал над тем, чтобы заставить двух пользователей с открытым доступом выполнить xp_cmdshell. Я могу выполнить xp_cmdshell, но не два пользователя.
Я сделал следующие шаги:
создать новую роль:
использовать мастер
СОЗДАТЬ РОЛЬ [CmdShell_Executor] АВТОРИЗАЦИЯ [dbo]
GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]
добавить пользователей в основную базу данных: Безопасность → Пользователи. Членство проверяет только [CmdShell_Executor], который только что создан
настроить учетную запись прокси:
EXEC sp_xp_cmdshell_proxy_account 'домен\пользователь1', 'пароль пользователя Windows1'
EXEC sp_xp_cmdshell_proxy_account 'domain\user2', 'users2 Windows password'
Затем оба пользователя могут выполнить хранимую процедуру, содержащую xp_cmdshell, вызывающую запуск сценария R. Я позволил пользователям приходить на мой ПК, чтобы ввести пароль, выполнить однострочный код, а затем удалить пароль.