xp_cmdshell (Transact-SQL)
Применимо к:SQL Server
Увеличивает число процессов командного ядра Windows в строке для выполнения. Любые выходные данные возвращаются в виде текстовых строк.
Соглашения о синтаксисе Transact-SQL
Синтаксис
xp_cmdshell { 'command_string' } [ , no_output ]
Аргументы
"command_string"
Строка, содержащая команду для передачи операционной системе. command_stringvarchar(8000) или nvarchar(4000) без значения по умолчанию. command_string не может содержать более одного набора двойных кавычек. Если в путях к файлам или именах программ, на которые ссылается command_string, требуется одна пара кавычек. Если входящие пробелы вызывают неполадки, то следует присваивать файлам имена в формате FAT 8.3.
no_output
Необязательный параметр, указывающий, что клиенту не следует возвращать выходные данные.
Значения кода возврата
0 (успешное завершение) или 1 (неуспешное завершение)
Результирующие наборы
Выполнение следующей процедуры xp_cmdshell
возвращает листинг текущего каталога.
EXEC xp_cmdshell 'dir *.exe';
GO
Строки возвращаются в столбце nvarchar(255). Если используется параметр no_output , возвращается только следующее:
The command(s) completed successfully.
Комментарии
Процесс Windows, порожденный xp_cmdshell, имеет те же права безопасности, что и учетная запись службы SQL Server.
Важно!
xp_cmdshell — это очень мощная функция, которая отключена по умолчанию. xp_cmdshell можно включить и отключить с помощью управления на основе политик или выполнения sp_configure. Дополнительные сведения см. в разделе Конфигурация контактной зоны и параметр конфигурации сервера xp_cmdshell.
xp_cmdshell работает синхронно. Управление не возвращается участнику до завершения команды ядра.
Важно!
Если xp_cmdshell выполняется в пакете и возвращает ошибку, пакет завершится ошибкой. Это изменение поведения. В более ранних версиях Microsoft SQL Server пакет будет продолжать выполняться.
Учетная запись-посредник для процедуры xp_cmdshell
При вызове пользователя, не являющегося членом предопределенной роли сервера sysadmin , xp_cmdshell подключается к Windows с помощью имени учетной записи и пароля, хранящихся в учетных данных с именем ##xp_cmdshell_proxy_account##. Если эти учетные данные прокси-сервера не существуют, xp_cmdshell завершится ошибкой.
Учетные данные учетной записи-посредника можно создать, выполнив sp_xp_cmdshell_proxy_account. В качестве аргумента эта хранимая процедура обрабатывает имя пользователя Windows и пароль. Например, следующая команда создает посреднические учетные записи-посредники для пользователя домена Windows SHIPPING\KobeR
с паролем Windows sdfh%dkc93vcMt0
.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0';
Дополнительные сведения см. в разделе sp_xp_cmdshell_proxy_account (Transact-SQL).
Разрешения
Так как злоумышленники иногда пытаются повысить свои привилегии с помощью xp_cmdshell, xp_cmdshell по умолчанию отключен. Используйте sp_configure или управление на основе политик , чтобы включить его. Дополнительные сведения см. в разделе Параметр конфигурации сервера xp_cmdshell.
При первом включении xp_cmdshell требуется разрешение CONTROL SERVER для выполнения, а процесс Windows, созданный xp_cmdshell, имеет тот же контекст безопасности, что и учетная запись службы SQL Server. Учетная запись службы SQL Server часто имеет больше разрешений, чем требуется для работы, выполняемой процессом, созданным xp_cmdshell. Для повышения безопасности доступ к xp_cmdshell должен быть ограничен пользователями с высоким уровнем привилегий.
Чтобы разрешить неадминистраторам использовать xp_cmdshell и разрешить SQL Server создавать дочерние процессы с маркером безопасности менее привилегированной учетной записи, выполните следующие действия.
Создайте и настройте локальную учетную запись Windows или учетную запись домена с меньшими правами доступа, чем требуется процессу.
Используйте системную процедуру sp_xp_cmdshell_proxy_account, чтобы настроить xp_cmdshell для использования этой учетной записи с минимальными привилегиями.
Примечание
Вы также можете настроить эту учетную запись-посредник с помощью SQL Server Management Studio, щелкнув правой кнопкой мыши свойства имени сервера в обозреватель объектов и выбрав вкладку Безопасность в разделе Учетная запись-посредник сервера.
В Management Studio, используя базу данных master, выполните инструкцию
GRANT exec ON xp_cmdshell TO N'<some_user>';
, чтобы предоставить определенным пользователям, не являющихся администраторами , возможность выполнять xp_cmdshell. Указанный пользователь должен существовать в базе данных master.
Теперь пользователи, не являющиеся администраторами, могут запускать процессы операционной системы с xp_cmdshell и выполнять эти процессы с разрешениями настроенной учетной записи-посредника. Пользователи с разрешением CONTROL SERVER (члены предопределенной роли сервера sysadmin) будут продолжать получать разрешения учетной записи службы SQL Server для дочерних процессов, запускаемых xp_cmdshell.
Чтобы определить учетную запись Windows, используемую xp_cmdshell при запуске процессов операционной системы, выполните следующую инструкцию:
xp_cmdshell 'whoami.exe'
Чтобы определить контекст безопасности для другого имени входа, выполните следующее:
EXECUTE AS LOGIN = '<other_login>' ;
GO
xp_cmdshell 'whoami.exe' ;
REVERT ;
Примеры
A. Возвращение списка исполняемых файлов
В следующем примере показано, как расширенная хранимая процедура xp_cmdshell
выполняет команду каталога.
EXEC master..xp_cmdshell 'dir *.exe'
Б. Применение без возврата данных
В следующем примере процедура xp_cmdshell
применяется для выполнения командной строки без возвращения данных клиенту.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
В. Применение возвращаемого состояния
В следующем примере расширенная хранимая xp_cmdshell
процедура также предлагает состояние возврата. Значение кода возврата хранится в переменной @result
.
DECLARE @result int;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
Г. Запись содержимого переменной в файл
В следующем примере содержимое переменной @var
записывается в файл с именем var_out.txt
в текущем каталоге сервера.
DECLARE @cmd sysname, @var sysname;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
Д. Ввод результата команды в файл
В следующем примере содержимое текущего каталога записывается в файл с именем dir_out.txt
в текущем каталоге сервера.
DECLARE @cmd sysname, @var sysname;
SET @var = 'dir/p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;
См. также:
Основные расширенные хранимые процедуры (Transact-SQL)
Параметр конфигурации сервера xp_cmdshell
Настройка контактной зоны
sp_xp_cmdshell_proxy_account (Transact-SQL)