Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: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 возвращает листинг текущего каталога.
EXECUTE 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 и пароль. Например, следующая команда создает учетные данные прокси-сервера для пользователя SHIPPING\KobeRдомена Windows. Замените <password> строгим паролем.
EXECUTE sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', '<password>';
Дополнительные сведения см. в 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 при запуске процессов операционной системы, выполните следующую инструкцию:
EXECUTE xp_cmdshell 'whoami.exe';
Чтобы определить контекст безопасности для другого имени входа, выполните следующий код Transact-SQL:
EXECUTE AS LOGIN = '<other_login>';
GO
EXECUTE xp_cmdshell 'whoami.exe';
REVERT;
Примеры
А. Возврат списка исполняемых файлов
В следующем примере показано, как расширенная хранимая процедура xp_cmdshell выполняет команду каталога.
EXECUTE master..xp_cmdshell 'dir *.exe';
В. Возврат выходных данных не
В следующем примере процедура xp_cmdshell применяется для выполнения командной строки без возвращения данных клиенту.
USE master;
EXECUTE xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
В. Использование состояния возврата
В следующем примере расширенная xp_cmdshell хранимая процедура также предлагает состояние возврата. Значение кода возврата хранится в переменной @result.
DECLARE @result AS INT;
EXECUTE @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success';
ELSE
PRINT 'Failure';
Д. Запись содержимого переменной в файл
В следующем примере содержимое переменной @var записывается в файл с именем var_out.txt в текущем каталоге сервера.
DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXECUTE master..xp_cmdshell @cmd;
Е. Захват результата команды в файл
В следующем примере содержимое текущего каталога записывается в файл с именем dir_out.txt в текущем каталоге сервера.
DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXECUTE master..xp_cmdshell @cmd;