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

Permissões

Como usuários mal-intencionados às vezes tentam elevar seus privilégios usando xp_cmdshello , 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_cmdshello 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:

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

  3. 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 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 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;