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 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 opção for usada, somente a NO_OUTPUT 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 desabilitado por padrão. xp_cmdshell pode ser habilitado e desabilitado usando o Gerenciamento Baseado em Políticas ou executando sp_configureo . 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 dentro de 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_accounto . 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 os usuários mal-intencionados às vezes tentam elevar seus privilégios usando xp_cmdshello , 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 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 do SQL Server geralmente tem mais permissões do que as necessárias 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_cmdshelle permitir que o SQL Server crie processos filho com o token de segurança de uma conta menos privilegiada, execute estas etapas:

  1. 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.

  2. Use o procedimento do sp_xp_cmdshell_proxy_account sistema para configurar xp_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 Segurança a seção Conta proxy do servidor.

  3. No Management Studio, usando o master banco de dados, execute a instrução Transact-SQL a seguir para dar aos usuários específicos não sysadmin a capacidade de executar xp_cmdshell. O usuário especificado deve existir no master banco de dados.

     GRANT exec ON xp_cmdshell TO N'<some_user>';
    

Agora, os não administradores podem iniciar processos do sistema operacional com e esses processos são executados com xp_cmdshell 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 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 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 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 de servidor atual.

DECLARE @cmd SYSNAME,
    @var SYSNAME;

SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';

EXEC master..xp_cmdshell @cmd;