Fala pessoALL!!
Nesse artigo bem simples e rápido, vou compartilhar com vocês quais as permissões para utilizar OLE Automation, um recurso do SQL Server que permite utilizar DLL’s e API’s do Windows através de chamadas de Stored Procedures para realizar diversas tarefas dentro do banco de dados, como Operações com Arquivos, utilizar expressões regulares (RegExp) e até mesmo, realizar requisições Web.
Introdução
Como eu já havia comentado no post Introdução ao SQL CLR (Common Language Runtime) no SQL Server, o grande problema do OLE Automation, é que ao habilitar esse recurso, qualquer usuário (com permissão) pode criar qualquer coisa com isso, uma vez que os comandos não são gerenciados e são executados dentro do processo do SQL Server. Em caso de falha de vazamento de memória (o que não é tão incomum), a instância pode ser parada, pois o processo do SQL Server é fechado automaticamente pelo sistema operacional (!!!!)
Além disso, é difícil encontrar documentação precisa sobre OLE Automation e é bem complexo criar rotinas utilizando esse recurso. Por este motivo, recomendo a substituição de rotinas OLE Automation por packages do SSIS e, caso não seja possível, rotinas utilizando SQLCLR, conforme já descrevo as vantagens no artigo já citado.
Permissões para utilizar OLE Automation
Caso você realmente tenha alguma necessidade bem específica que exige o uso de OLE Automation (e você não quer utilizar o SQLCLR), você já deve ter lido a documentação da Microsoft e em vários outros blogs brasileiros e americanos, que indicam que, para utilizar as procedures do OLE Automation (sp_OA*), você deve obrigatoriamente pertencer à server role sysadmin, correto? E aí você tem que liberar permissão de sysadmin para o usuário pode criar os objetos ou acaba negando essa solicitação, né ?
Todas as páginas da documentação dessas procedures sp_OA* possuem esse mesmo requisito de permissão (sysadmin). Mas e se eu te falar que isso NÃO é verdade e é muito fácil provar isso? 🙂
O primeiro passo para isso é Habilitar o OLE Automation na instância:
1 2 3 4 5 6 7 8 9 10 11 |
sp_configure 'Advanced Options', 1 GO RECONFIGURE GO sp_configure 'Ole Automation Procedures', 1 GO RECONFIGURE GO |
Caso você não faça isso, irá se deparar com essa mensagem de erro:
Msg 15281, Level 16, State 1, Procedure sp_OACreate, Line 1 [Batch Start Line 0] SQL Server blocked access to procedure ‘sys.sp_OACreate’ of component ‘Ole Automation Procedures’ because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of ‘Ole Automation Procedures’ by using sp_configure. For more information about enabling ‘Ole Automation Procedures’, search for ‘Ole Automation Procedures’ in SQL Server Books Online.
Agora, vamos criar um novo usuário para testar se consigo utilizar o OLE Automation sem estar na server role sysadmin:
1 2 3 4 5 6 7 8 |
USE [master] GO CREATE LOGIN [teste_OA] WITH PASSWORD='123', CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF, DEFAULT_DATABASE=[master] GO CREATE USER [teste_OA] FOR LOGIN [teste_OA] GO |
E agora, conectado com o usuário teste_OA, vamos tentar tentar utilizar o OLE Automation com o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
DECLARE @strArquivo VARCHAR(255) = 'C:\Senha muito importante.txt' DECLARE @hr INT, @objFileSystem INT, @objFile INT, @ErrorObject INT, @ErrorMessage VARCHAR(255), @Path VARCHAR(255),-- @ShortPath VARCHAR(255), @Type VARCHAR(100), @DateCreated DATETIME, @DateLastAccessed DATETIME, @DateLastModified DATETIME, @Attributes INT, @size INT SET NOCOUNT ON SELECT @hr = 0, @ErrorMessage = 'opening the file system object ' EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @objFileSystem OUT IF @hr = 0 SELECT @ErrorMessage = 'accessing the file ''' + @strArquivo + '''', @ErrorObject = @objFileSystem IF @hr = 0 EXEC @hr = sp_OAMethod @objFileSystem, 'GetFile', @objFile OUT, @strArquivo IF @hr = 0 SELECT @ErrorMessage = 'getting the attributes of ''' + @strArquivo + '''', @ErrorObject = @objFile IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'Path', @Path OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'ShortPath', @ShortPath OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'Type', @Type OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'DateCreated', @DateCreated OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'DateLastAccessed', @DateLastAccessed OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'DateLastModified', @DateLastModified OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'Attributes', @Attributes OUT IF @hr = 0 EXEC @hr = sp_OAGetProperty @objFile, 'size', @size OUT IF @hr <> 0 BEGIN DECLARE @Source VARCHAR(255), @Description VARCHAR(255), @Helpfile VARCHAR(255), @HelpID INT EXECUTE sp_OAGetErrorInfo @ErrorObject, @Source OUTPUT, @Description OUTPUT, @Helpfile OUTPUT, @HelpID OUTPUT SELECT @ErrorMessage = 'Error whilst ' + @ErrorMessage + ', ' + @Description RAISERROR (@ErrorMessage,16,1) END EXEC sp_OADestroy @objFileSystem EXEC sp_OADestroy @objFile SELECT [Path] = @Path, [ShortPath] = @ShortPath, [Type] = @Type, [DateCreated] = @DateCreated, [DateLastAccessed] = @DateLastAccessed, [DateLastModified] = @DateLastModified, [Attributes] = @Attributes, [Size] = @size |
E ao tentar executar, recebemos a seguinte mensagem:
Msg 229, Level 14, State 5, Procedure sp_OACreate, Line 1 [Batch Start Line 0] The EXECUTE permission was denied on the object ‘sp_OACreate’, database ‘mssqlsystemresource’, schema ‘sys’.
Pois bem, para resolver esse problema de permissão é MUITO simples e NÃO exije que o usuário esteja na role sysadmin:
1 2 3 4 5 6 7 8 9 10 |
USE [master] GO GRANT EXECUTE ON sys.sp_OACreate TO [teste_OA] GRANT EXECUTE ON sys.sp_OADestroy TO [teste_OA] GRANT EXECUTE ON sys.sp_OAGetErrorInfo TO [teste_OA] GRANT EXECUTE ON sys.sp_OAGetProperty TO [teste_OA] GRANT EXECUTE ON sys.sp_OAMethod TO [teste_OA] GRANT EXECUTE ON sys.sp_OASetProperty TO [teste_OA] GRANT EXECUTE ON sys.sp_OAStop TO [teste_OA] |
E agora, tentando executar novamente o script acima:
SUCESSO! Conseguimos executar o script OLE Automation normalmente, com apenas as permissões necessárias.
Espero que tenham gostado desse artigo e até a próxima.
PS: Podem deixar que vou enviar uma solicitação de correção da documentação 🙂
Perfeito !
Obrigado, Jorge!
Abraço