Partilhar via


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_cmdshelle permitir que o SQL Server crie processos filho com o token de segurança de uma conta menos privilegiada, 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 menores que seus processos exigem.

  2. Use o procedimento do sistema sp_xp_cmdshell_proxy_account 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 de Segurança do a seção conta proxy do Servidor.

  3. 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 executar xp_cmdshell. O usuário especificado deve existir no banco de dados master.

     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;