Получение разрешения на выполнение для 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, но не два пользователя.

Я сделал следующие шаги:

  1. создать новую роль:

    использовать мастер
    СОЗДАТЬ РОЛЬ [CmdShell_Executor] АВТОРИЗАЦИЯ [dbo]
    GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]

  2. добавить пользователей в основную базу данных: Безопасность → Пользователи. Членство проверяет только [CmdShell_Executor], который только что создан

  3. настроить учетную запись прокси:

    EXEC sp_xp_cmdshell_proxy_account 'домен\пользователь1', 'пароль пользователя Windows1'
    EXEC sp_xp_cmdshell_proxy_account 'domain\user2', 'users2 Windows password'

Затем оба пользователя могут выполнить хранимую процедуру, содержащую xp_cmdshell, вызывающую запуск сценария R. Я позволил пользователям приходить на мой ПК, чтобы ввести пароль, выполнить однострочный код, а затем удалить пароль.