xp_cmdshell (Transact-SQL)
Aplica-se: 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 é necessário se houver espaços nos caminhos de arquivo ou nomes de programa referenciados em 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
(sucesso) ou 1
(falha).
Conjunto 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 NO_OUTPUT
opção for usada, somente a seguinte saída será retornada:
The command(s) completed successfully.
Comentários
O processo do Windows gerado por 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 desativado por padrão. xp_cmdshell
pode ser ativado e desativado usando o Gerenciamento Baseado em Políticas ou executando sp_configure
o . Para obter mais informações, consulte Configuração e xp_cmdshell da área de superfície (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
o . 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.
Permissões
Como usuários mal-intencionados às vezes tentam elevar seus privilégios usando xp_cmdshell
o , o está xp_cmdshell
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 ser executado e o processo do Windows criado pelo 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 pelo xp_cmdshell
. Para aumentar a segurança, o acesso deve xp_cmdshell
ser restrito a usuários altamente privilegiados.
Para permitir que não administradores usem xp_cmdshell
o e permitir que o SQL Server crie 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
o uso dessa 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 Segurança a seção Conta proxy do servidor.
No Management Studio, usando o
master
banco de dados, execute a seguinte instrução Transact-SQL para dar a usuários específicos que não são administradores de sistema 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 e xp_cmdshell
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 a receber as permissões da conta de serviço do SQL Server para processos filho iniciados pelo xp_cmdshell
.
Para determinar a conta do Windows que está sendo usada ao xp_cmdshell
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
R. 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 retorna 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 procedimento armazenado estendido também sugere o xp_cmdshell
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 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;