xp_cmdshell (Transact-SQL)
Область применения: SQL Server
Увеличивает число процессов командного ядра Windows в строке для выполнения. Любые выходные данные возвращаются в виде текстовых строк.
Соглашения о синтаксисе Transact-SQL
Синтаксис
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Аргументы
"command_string"
Строка, содержащая команду, передаваемую операционной системе. command_string — varchar(8000) или nvarchar(4000), без значения по умолчанию. command_string не может содержать более одного набора двойных кавычки. Одна пара кавычки требуется, если все пробелы присутствуют в пути к файлам или имена программ, на которые ссылается command_string. Если входящие пробелы вызывают неполадки, то следует присваивать файлам имена в формате FAT 8.3.
выходные данные NO_
Необязательный параметр, указывающий, что выходные данные не должны возвращаться клиенту.
Значения кода возврата
0
(успешно) или 1
(сбой).
Результирующий набор
Выполнение следующей процедуры xp_cmdshell
возвращает листинг текущего каталога.
EXEC xp_cmdshell 'dir *.exe';
GO
Строки возвращаются в столбце nvarchar(255). NO_OUTPUT
Если используется параметр, возвращаются только следующие выходные данные:
The command(s) completed successfully.
Замечания
Процесс Windows, создаваемый с учетом xp_cmdshell
учетных записей службы SQL Server, имеет те же права безопасности, что и учетная запись службы SQL Server.
Внимание
xp_cmdshell
— это мощная функция и отключена по умолчанию. xp_cmdshell
можно включить и отключить с помощью управления на основе политик или выполнения sp_configure
. Дополнительные сведения см. в разделе "Конфигурация области Surface" и xp_cmdshell (параметр конфигурации сервера). Использование xp_cmdshell
может активировать средства аудита безопасности.
xp_cmdshell
работает синхронно. Элемент управления не возвращается вызывающей команде до завершения команды командной оболочки. Если xp_cmdshell
выполняется в пакете и возвращается ошибка, пакет завершится ошибкой.
учетная запись прокси-сервера 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.
Разрешения
Так как злоумышленники иногда пытаются повысить свои привилегии с помощью xp_cmdshell
, xp_cmdshell
по умолчанию отключен. Используйте sp_configure
или управление на основе политик, чтобы включить его. Дополнительные сведения см. в разделе Параметр конфигурации сервера xp_cmdshell.
При первом включении требуется разрешение CONTROL SERVER для выполнения и процесса Windows, созданного с помощью xp_cmdshell
того же контекста безопасности, 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
базы данных выполните следующую инструкцию Transact-SQL, чтобы предоставить определенным пользователям, не системным администраторам , возможность выполненияxp_cmdshell
. Указанныйmaster
пользователь должен существовать в базе данных.GRANT exec ON xp_cmdshell TO N'<some_user>';
Теперь неадминистрированные пользователи могут запускать процессы операционной системы и xp_cmdshell
запускать эти процессы с разрешениями настроенной учетной записи-посредника. Пользователи с разрешением CONTROL SERVER (члены предопределенной роли сервера sysadmin ) продолжают получать разрешения учетной записи службы SQL Server для дочерних процессов, запускаемых с помощью xp_cmdshell
.
Чтобы определить учетную запись Windows, используемую xp_cmdshell
при запуске процессов операционной системы, выполните следующую инструкцию:
EXEC xp_cmdshell 'whoami.exe';
Чтобы определить контекст безопасности для другого имени входа, выполните следующий код Transact-SQL:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Примеры
А. Возврат списка исполняемых файлов
В следующем примере показано, как расширенная хранимая процедура xp_cmdshell
выполняет команду каталога.
EXEC master..xp_cmdshell 'dir *.exe'
B. Возврат выходных данных не
В следующем примере процедура xp_cmdshell
применяется для выполнения командной строки без возвращения данных клиенту.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Использование состояния возврата
В следующем примере расширенная xp_cmdshell
хранимая процедура также предлагает состояние возврата. Значение кода возврата хранится в переменной @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Запись содержимого переменной в файл
В следующем примере содержимое переменной @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;