xp_cmdshell (Transact-SQL)
Aplica-se a:SQL Server
Gera um shell de comando do Windows e passa uma cadeia de caracteres para execução. Qualquer saída é retornada como linhas de texto.
Transact-SQL convenções de sintaxe
Sintaxe
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argumentos
Importante
Os argumentos para procedimentos armazenados estendidos devem ser inseridos na ordem específica, conforme descrito na seção de sintaxe. Se os parâmetros forem inseridos fora de ordem, ocorrerá uma mensagem de erro.
'command_string'
A cadeia de caracteres que contém um comando a ser passado para o sistema operacional. command_string é varchar(8000) ou nvarchar(4000), sem padrão. command_string não pode conter mais de um conjunto de aspas duplas. Um único par de aspas é necessário se houver espaços presentes nos caminhos de arquivo ou nomes de programas referenciados em command_string. Se você tiver problemas com espaços incorporados, considere usar nomes de arquivo FAT 8.3 como uma solução alternativa.
NO_ SAÍDA
Um parâmetro opcional, especificando que nenhuma saída deve ser retornada ao cliente.
Valores de código de retorno
0
(sucesso) ou 1
(fracasso).
Conjunto de resultados
A execução da instrução xp_cmdshell
a seguir retorna uma listagem de diretório do diretório atual.
EXEC xp_cmdshell 'dir *.exe';
GO
As linhas são retornadas em uma coluna nvarchar(255). Se a opção NO_OUTPUT
for usada, somente a seguinte saída será retornada:
The command(s) completed successfully.
Comentários
O processo do Windows gerado pelo xp_cmdshell
tem os mesmos direitos de segurança que a conta de serviço do SQL Server.
Atenção
xp_cmdshell
é um recurso poderoso e desativado por padrão.
xp_cmdshell
pode ser habilitado e desabilitado usando o Gerenciamento Baseado em Políticas ou executando sp_configure
. Para obter mais informações, consulte de configuração da área de superfície e xp_cmdshell (opção de configuração do servidor). O uso do xp_cmdshell
pode acionar ferramentas de auditoria de segurança.
xp_cmdshell
opera de forma síncrona. O controle não é retornado ao chamador até que o comando command-shell seja concluído. Se xp_cmdshell
for executado dentro de um lote e retornar um erro, o lote falhará.
xp_cmdshell conta proxy
Quando é chamado por um usuário que não é membro do sysadmin função de servidor fixa, xp_cmdshell
se conecta ao Windows usando o nome da conta e a senha armazenados na credencial chamada ##xp_cmdshell_proxy_account##. Se essa credencial de proxy não existir, xp_cmdshell
falhará.
A credencial da conta proxy pode ser criada executando sp_xp_cmdshell_proxy_account
. Como argumentos, este procedimento armazenado usa um nome de usuário e senha do Windows. Por exemplo, o comando a seguir cria uma credencial de proxy para SHIPPING\KobeR
de usuário de domínio do Windows que tenha a senha do Windows sdfh%dkc93vcMt0
.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
Para obter mais informações, consulte sp_xp_cmdshell_proxy_account.
Permissões
Como os usuários mal-intencionados às vezes tentam elevar seus privilégios usando xp_cmdshell
, xp_cmdshell
é desabilitado por padrão. Use sp_configure
ou de Gerenciamento Baseado em Políticas para habilitá-lo. Para obter mais informações, consulte xp_cmdshell opção de configuração do servidor.
Quando habilitado pela primeira vez, xp_cmdshell
requer permissão CONTROL SERVER para ser executado e o processo do Windows criado por xp_cmdshell
tem o mesmo contexto de segurança que a conta de serviço do SQL Server. A conta de serviço do SQL Server geralmente tem mais permissões do que o necessário para o trabalho executado pelo processo criado por xp_cmdshell
. Para reforçar a segurança, o acesso aos xp_cmdshell
deve ser restrito a utilizadores altamente privilegiados.
Para permitir que não-administradores usem xp_cmdshell
e permitir que o SQL Server crie processos filho com o token de segurança de uma conta menos privilegiada, siga estas etapas:
Crie e personalize uma conta de usuário local do Windows ou uma conta de domínio com os privilégios menores que seus processos exigem.
Use o procedimento do sistema
sp_xp_cmdshell_proxy_account
para configurarxp_cmdshell
para usar essa conta com privilégios mínimos.Observação
Você também pode configurar essa conta proxy usando o SQL Server Management Studio clicando com o botão direito do mouse em Propriedades no nome do servidor no Pesquisador de Objetos e procurando na guia de Segurança do a seção conta proxy do Servidor.
No Management Studio, usando o banco de dados
master
, execute a seguinte instrução Transact-SQL para dar aos usuários de sysadminnão específicos a capacidade de executarxp_cmdshell
. O usuário especificado deve existir no banco de dadosmaster
.GRANT exec ON xp_cmdshell TO N'<some_user>';
Agora, os não-administradores podem iniciar processos do sistema operacional com xp_cmdshell
e esses processos são executados com as permissões da conta proxy que você configurou. Os usuários com permissão CONTROL SERVER (membros do sysadmin função de servidor fixa) continuam a receber as permissões da conta de serviço do SQL Server para processos filho que são iniciados por xp_cmdshell
.
Para determinar a conta do Windows que está sendo usada por xp_cmdshell
ao iniciar processos do sistema operacional, execute a seguinte instrução:
EXEC xp_cmdshell 'whoami.exe';
Para determinar o contexto de segurança para outro login, execute o seguinte código Transact-SQL:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Exemplos
Um. Retornar uma lista de arquivos executáveis
O exemplo a seguir mostra o xp_cmdshell
procedimento armazenado estendido executando um comando directory.
EXEC master..xp_cmdshell 'dir *.exe'
B. Retorno sem saída
O exemplo a seguir usa xp_cmdshell
para executar uma cadeia de caracteres de comando sem retornar a saída para o cliente.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Status de retorno do uso
No exemplo a seguir, o xp_cmdshell
procedimento armazenado estendido também sugere o status de retorno. O valor do código de retorno é armazenado na variável @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Gravar conteúdo variável em um arquivo
O exemplo a seguir grava o conteúdo da variável @var
em um arquivo chamado var_out.txt
no diretório do servidor atual.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. Capturar o resultado de um comando para um arquivo
O exemplo a seguir grava o conteúdo do diretório atual em um arquivo chamado dir_out.txt
no diretório do servidor atual.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;