xp_cmdshell (Transact-SQL)
Aplica-se a:SQL Server
Gera um shell de comando do Windows e passa em uma cadeia de caracteres para execução. Qualquer saída é retornada como linhas de texto.
Convenções de sintaxe de Transact-SQL
Sintaxe
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argumentos
'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 será necessário se houver espaços nos caminhos de arquivo ou nomes de programas referenciados no command_string. Se você tiver dificuldade com espaços inseridos, considere o uso de 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 do código de retorno
0
(êxito) ou 1
(falha).
Conjuntos de resultados
A execução da seguinte instrução xp_cmdshell
retorna uma lista 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.
Cuidado
xp_cmdshell
é um recurso poderoso e desabilitado 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 Configuração da área do Surface e xp_cmdshell (opção de configuração do servidor). Usar xp_cmdshell
pode disparar 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 em um lote e retornar um erro, o lote falhará.
xp_cmdshell conta proxy
Quando ele é chamado por um usuário que não é membro da função de servidor fixa sysadmin , xp_cmdshell
conecta-se 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, esse procedimento armazenado possui um nome de usuário e uma senha do Windows. Por exemplo, o comando a seguir cria uma credencial de proxy para o usuário de domínio do Windows SHIPPING\KobeR
que possui 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 (Transact-SQL).
Permissões
Como usuários mal-intencionados às vezes tentam elevar seus privilégios usando xp_cmdshell
, xp_cmdshell
o é desabilitado por padrão. Use sp_configure
ou Gerenciamento Baseado em Políticas para habilitá-lo. Para obter mais informações, veja Opção de configuração de servidor xp_cmdshell.
Quando habilitado pela primeira vez, xp_cmdshell
requer a permissão CONTROL SERVER para executar 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 SQL Server geralmente tem mais permissões do que o necessário para o trabalho executado pelo processo criado pelo xp_cmdshell
. Para aumentar a segurança, o acesso a xp_cmdshell
deve ser restrito a usuários altamente privilegiados.
Para permitir que não administradores usem xp_cmdshell
e permitir que SQL Server criem processos filho com o token de segurança de uma conta com menos privilégios, siga estas etapas:
Crie e personalize uma conta de usuário local do Windows ou uma conta de domínio com os privilégios mínimos que seus processos exigeem.
Use o procedimento do
sp_xp_cmdshell_proxy_account
sistema para configurarxp_cmdshell
para usar essa conta com privilégios mínimos.Observação
Você também pode configurar essa conta proxy usando 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 Segurança da seção Conta proxy do servidor.
No Management Studio, usando o
master
banco de dados, execute a seguinte instrução Transact-SQL para fornecer a usuários não sysadmin específicos a capacidade de executarxp_cmdshell
. O usuário especificado deve existir nomaster
banco de dados.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 da função de servidor fixa sysadmin) continuam recebendo as permissões da conta de serviço SQL Server para processos filho iniciados pelo xp_cmdshell
.
Para determinar a conta do Windows que está sendo usada pelo 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 logon, execute o seguinte código Transact-SQL:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Exemplos
a. Retornar uma lista de arquivos executáveis
O exemplo a seguir mostra o procedimento armazenado estendido xp_cmdshell
executando um comando de diretório.
EXEC master..xp_cmdshell 'dir *.exe'
B. Não retornar nenhuma saída
O exemplo a seguir usa xp_cmdshell
para executar uma cadeia de caracteres de comando sem retornar a saída ao cliente.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Usar status de retorno
No exemplo a seguir, o xp_cmdshell
procedimento armazenado estendido também sugere status de retorno. O valor de 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 de 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 de 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 em um arquivo
O exemplo a seguir grava o conteúdo do diretório atual em um arquivo chamado dir_out.txt
no diretório de servidor atual.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;