Como Executar um Comando do Sistema Operacional no SQL Server
Em alguns cenários bem específicos, como automatizar uma tarefa de manutenção ou chamar um utilitário externo, pode ser necessário executar um comando do sistema operacional diretamente a partir de uma query no SQL Server. Isso é possível através da stored procedure xp_cmdshell, presente no banco master.
Antes de usar, vale entender também os riscos envolvidos e as alternativas mais seguras disponíveis hoje.
Habilitando o xp_cmdshell
Desde o SQL Server 2005, o xp_cmdshell vem desabilitado por padrão por motivos de segurança. Antes de poder usá-lo, é preciso habilitá-lo explicitamente:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
Executando um comando
Com o recurso habilitado, basta chamar a procedure informando o comando do sistema operacional que deseja executar:
EXEC master..xp_cmdshell 'dir c:\';
O resultado é devolvido como um conjunto de linhas de texto, uma para cada linha da saída do comando:
output
--------------------------------------------------------------
Volume in drive C is Sistema
Volume Serial Number is 28C4-ET4
Directory of c:\
06/14/2024 05:57 AM 0 AUTOEXEC.BAT
11/01/2024 03:18 PM <DIR> WebMundi
02/06/2025 08:19 AM <DIR> Windows
1 File(s) 279.971.630 bytes
2 Dir(s) 638.599.168.000 bytes free
Por que ter cuidado com o xp_cmdshell
O xp_cmdshell executa comandos com os privilégios da conta de serviço do SQL Server. Isso significa que qualquer usuário com permissão para executá-lo pode, na prática, rodar comandos no sistema operacional do servidor, não só dentro do banco de dados. Por esse motivo:
- Ele vem desabilitado por padrão desde o SQL Server 2005, justamente para evitar esse tipo de exposição
- É um dos primeiros alvos em testes de invasão e auditorias de segurança, já que permite escalar de um acesso ao banco para um acesso ao servidor inteiro
- Deve ser habilitado apenas quando estritamente necessário, e restrito a um grupo bem pequeno de usuários
Se você habilitou o xp_cmdshell só para uma tarefa pontual, é uma boa prática desabilitá-lo novamente depois:
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;
Também é possível restringir quem pode executar a procedure, mesmo com o recurso habilitado, usando permissões específicas em vez de depender apenas do cargo de sysadmin:
GRANT EXECUTE ON xp_cmdshell TO [usuario_especifico];
Alternativas mais seguras
Para boa parte dos cenários em que se pensa em usar xp_cmdshell, existem alternativas que reduzem a superfície de risco:
-
PowerShell dentro de um SQL Server Agent Job: permite automatizar tarefas do sistema operacional a partir de um job agendado, com controle de permissões próprio do Agent, sem depender do
xp_cmdshellna sessão de query. - SSIS (SQL Server Integration Services): para rotinas mais elaboradas de automação e integração com o sistema de arquivos ou outros sistemas.
- Procedures CLR (SQL Server 2005 em diante): permitem estender o SQL Server com código .NET de forma mais controlada, quando a necessidade é mais específica do que simplesmente rodar um comando de shell.
Conclusão
O xp_cmdshell é um recurso legítimo e útil em cenários pontuais de automação, mas carrega um risco de segurança real, por isso vem desabilitado por padrão. Se optar por usá-lo, habilite apenas quando necessário, restrinja o acesso a poucos usuários e desabilite novamente depois. Para automações recorrentes, vale considerar alternativas como PowerShell em um Job do SQL Server Agent, que oferecem mais controle sobre permissões e execução.