Hablame TODOS!!
En este artículo muy simple y rápido, compartiré contigo los permisos para usar Automatización OLE, una característica de SQL Server que le permite usar DLL y API de Windows a través de llamadas a procedimientos almacenados para realizar diversas tareas dentro de la base de datos, como Operaciones de archivos, utilizar expresiones regulares (RegExp) e incluso, hacer solicitudes web.

Introducción

Como ya mencioné en el post. Introducción a SQL CLR (Common Language Runtime) en SQL Server, el gran problema de OLE Automation, es que al habilitar esta característica, cualquier usuario (con permiso) puede crear cualquier cosa con ella, ya que los comandos no se administran y se ejecutan dentro del proceso de SQL Server. En caso de una falla de pérdida de memoria (lo cual no es tan infrecuente), la instancia puede detenerse, ya que el sistema operativo cierra automáticamente el proceso de SQL Server (!!!!)

Además, es difícil encontrar documentación precisa sobre la automatización OLE y es muy complejo crear rutinas utilizando esta función. Por este motivo, recomiendo sustituir las rutinas de OLE Automation por paquetes SSIS y, si esto no es posible, rutinas que utilicen SQLCLR, cuyas ventajas ya os describo en el artículo ya mencionado.

Permisos para utilizar la automatización OLE

Si realmente tienes una necesidad muy específica que requiere el uso de OLE Automation (y no quieres usar SQLCLR), ya debes haber leído el documentación de microsoft y en varios otros blogs brasileños y americanos, que indican que, para utilizar los procedimientos de Automatización OLE (sp_OA*), es necesario pertenecer al rol de servidor sysadmin, ¿correcto? Y luego tienes que liberar el permiso del administrador del sistema para que el usuario pueda crear los objetos o terminarás negando esta solicitud, ¿verdad?

Versión en inglés:

Versión portuguesa:

Todas las páginas de documentación para estos procedimientos sp_OA* tienen el mismo requisito de permiso (sysadmin). Pero ¿y si te dijera que esto? NO ¿Es cierto y es muy fácil demostrarlo? 🙂

El primer paso hacia esto es Habilite la automatización OLE en la instancia:

sp_configure 'Advanced Options', 1
GO

RECONFIGURE
GO

sp_configure 'Ole Automation Procedures', 1
GO

RECONFIGURE
GO

Si no hace esto, encontrará este mensaje de error:

Mensaje 15281, Nivel 16, Estado 1, Procedimiento sp_OACreate, Línea 1 [Línea de inicio de lote 0] SQL Server bloqueó el acceso al procedimiento 'sys.sp_OACreate' del componente 'Procedimientos de automatización Ole' porque este componente está desactivado como parte de la configuración de seguridad para este servidor. Un administrador del sistema puede habilitar el uso de "Procedimientos de automatización Ole" mediante sp_configure. Para obtener más información sobre cómo habilitar los "Procedimientos de automatización Ole", busque "Procedimientos de automatización Ole" en los Libros en pantalla de SQL Server.

Ahora, creemos un nuevo usuario para probar si puedo usar OLE Automation sin tener el rol de servidor sysadmin:

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

Y ahora, conectado con el usuario test_OA, intentemos usar OLE Automation con el siguiente código:

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

Y al intentar ejecutar, recibimos el siguiente mensaje:

Mensaje 229, Nivel 14, Estado 5, Procedimiento sp_OACreate, Línea 1 [Línea de inicio de lote 0] Se denegó el permiso EJECUTAR en el objeto "sp_OACreate", base de datos "mssqlsystemresource", esquema "sys".

Bueno, solucionar este problema de permisos es MUY sencillo y NO requiere que el usuario tenga el rol de administrador de sistemas:

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]

Y ahora, intentando ejecutar el script anterior nuevamente:

¡ÉXITO! Pudimos ejecutar el script OLE Automation normalmente, con solo los permisos necesarios.

Espero que hayas disfrutado de este artículo y hasta la próxima.
PD: Déjame enviarte una solicitud para corregir la documentación 🙂

Documentación corregida – “¡Mamá, estoy en Globo!”