Получение разрешения на выполнение для xp_cmdshell - PullRequest
32 голосов
/ 07 января 2010

Я вижу сообщение об ошибке при попытке выполнить xp_cmdshell из хранимой процедуры.

xp_cmdshell включен в экземпляре. И разрешение на выполнение было предоставлено моему пользователю, но я все еще вижу исключение.

Отказано в разрешении EXECUTE для объекта "xp_cmdshell", база данных "mssqlsystemresource", схема "sys"

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

Ответы [ 4 ]

55 голосов
/ 08 января 2010

Для пользователей, которые не являются членами роли sysadmin в экземпляре SQL Server, необходимо выполнить следующие действия, чтобы предоставить доступ к расширенной хранимой процедуре xp_cmdshell. Кроме того, если вы забыли один из шагов, я перечислил ошибку, которая будет выдана.

  1. Включить процедуру xp_cmdshell

    Сообщение 15281, уровень 16, состояние 1, процедура xp_cmdshell, строка 1 SQL Server заблокировал доступ к процедуре 'sys.xp_cmdshell' компонента 'xp_cmdshell', поскольку этот компонент отключен как часть конфигурации безопасности для этого сервера. Системный администратор может разрешить использование «xp_cmdshell» с помощью sp_configure. Дополнительные сведения о включении xp_cmdshell см. В разделе «Настройка поверхности» электронной документации по SQL Server. *

  2. Создание имени входа для пользователя, не являющегося системным администратором, который имеет открытый доступ к базе данных master

    Сообщение 229, Уровень 14, Состояние 5, Процедура xp_cmdshell, Строка 1 Разрешение EXECUTE было отклонено для объекта «xp_cmdshell», базы данных «mssqlsystemresource», схемы «sys». *

  3. Предоставить разрешение EXEC для хранимой процедуры xp_cmdshell

    Сообщение 229, Уровень 14, Состояние 5, Процедура xp_cmdshell, Строка 1 Разрешение EXECUTE было отклонено для объекта «xp_cmdshell», базы данных «mssqlsystemresource», схемы «sys». *

  4. Создайте учетную запись прокси, под которой будет запускаться xp_cmdshell, используя sp_xp_cmdshell_proxy_account

    Сообщение 15153, уровень 16, состояние 1, процедура xp_cmdshell, строка 1 Информация учетной записи прокси-сервера xp_cmdshell не может быть получена или недействительна. Убедитесь, что учетные данные '## xp_cmdshell_proxy_account ##' существуют и содержат действительную информацию. *

Из вашей ошибки может показаться, что шаг 2 или 3 пропущен. Я не знаком с кластерами, чтобы знать, есть ли что-то особенное для этой установки.

44 голосов
/ 28 ноября 2012

Хочу завершить ответ от ччестера.

(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) для пользователя, не являющегося системным администратором, который имеет открытый доступ к базе данных master

(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
1 голос
/ 17 сентября 2012

Честер сказал:

(2) Создать логин для пользователя, не являющегося системным администратором, который имеет открытый доступ к базе данных master

Я перешел к списку баз данных моего пользователя (сервер / безопасность / соединения / мое имя пользователя / свойства / сопоставление пользователей) и хотел установить флажок для базы данных master. Я получил сообщение об ошибке, сообщающее, что пользователь уже существует в master База данных. Пошла в основную базу данных, удалила пользователя, вернулась к «сопоставлению пользователей» и установила флажок для основного. Установите флажок «общедоступный» ниже.

После этого вам необходимо повторно выдать грант на xp_cmdshell для «моего имени пользователя»

Yves

0 голосов
/ 06 марта 2018

Чтобы расширить возможности автоматического экспорта данных в формате 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) для пользователя, не являющегося системным администратором, который имеет открытый доступ к базе данных master. Сделано через отображение пользователя

(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) Выберите «Владелец» в качестве созданного вами пользователя. Выберите «Шаги», сделайте «тип» = T-SQL. Заполните поле команды, как показано ниже. Установить разделитель как ','

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11) Заполните расписания соответствующим образом.

...