2010-01-06 125 views
25

Aparece un mensaje de error al intentar ejecutar xp_cmdshell desde un procedimiento almacenado.Obtención de permiso de ejecución para xp_cmdshell

xp_cmdshell está habilitado en la instancia. Y el permiso de ejecución se otorgó a mi usuario, pero sigo viendo la excepción.

el permiso de ejecución fue negado en el objeto 'xp_cmdshell', base de datos 'mssqlsystemresource', de esquema 'SYS'

Parte del problema es que se trata de un clúster compartido, y tenemos una sola base de datos en la instancia , por lo que no tenemos una gama completa de permisos de administrador. Entonces no puedo entrar y otorgar permisos, y qué no.

+4

¿Por qué está utilizando el procedimiento almacenado más peligroso jamás creado? ('xp_cmdshell') – SLaks

+0

Es código anterior, y no hay tiempo para reescribirlo actualmente. Lo estamos usando para llamar a BCP para que importe un archivo en una tabla temporal para su procesamiento. La tabla temporal es sql dinámica y generamos el archivo .fmt basado en la misma lógica que utiliza el sql dinámico. Sería más de un día para volver a implementar esto. –

+0

¿Se puede publicar el número de versión de SQL Server exacto, incluido el número de compilación? –

Respuesta

51

Para los usuarios que no son miembros de la función sysadmin en la instancia de SQL Server, debe realizar las siguientes acciones para otorgar acceso al procedimiento almacenado extendido de xp_cmdshell. Además, si olvidó uno de los pasos que he enumerado, aparecerá el error.

  1. que el procedimiento xp_cmdshell

    Msg 15281, nivel 16, estado 1, xp_cmdshell procedimiento, línea 1 SQL Server bloqueó el acceso al procedimiento de 'sys.xp_cmdshell' del componente 'xp_cmdshell' 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 'xp_cmdshell' utilizando sp_configure. Para obtener más información sobre cómo activar 'xp_cmdshell', consulte "Configuración de superficie" en SQL Server Books Online. *

  2. Crear un inicio de sesión para el usuario que no sea administrador de sistemas que tiene el acceso público a la base de datos maestra

    Msg 229, nivel 14, estado 5, xp_cmdshell procedimiento, línea 1 el permiso de ejecución fue negado en el objeto 'xp_cmdshell', base de datos 'mssqlsystemresource', esquema 'sys'. *

  3. conceder permiso de Exec en el procedimiento xp_cmdshell almacenados

    Msg 229, nivel 14, estado 5, xp_cmdshell procedimiento, línea 1 el permiso de ejecución fue negado en el objeto 'xp_cmdshell', base de datos 'mssqlsystemresource', esquema 'sys'. *

  4. crear una cuenta de proxy que xp_cmdshell se ejecute bajo el uso de sp_xp_cmdshell_proxy_account

    Msg 15153, nivel 16, estado 1, procedimiento xp_cmdshell, línea 1 La información de la cuenta de proxy xp_cmdshell no se puede recuperar o no es válida. Verifique que la credencial '## xp_cmdshell_proxy_account ##' exista y contenga información válida.*

Parecería de su error que sea el paso 2 o 3 se perdió. No estoy familiarizado con los clusters para saber si hay algo particular en esa configuración.

+0

A partir de hoy, eres mi héroe. ¡Esto realmente me ayudó mucho! – Jens

+0

Gracias, ¿tiene manuales con seguimiento de código? –

+0

@tchester ¿de qué sacaste esta información? Muy útil. Gracias. – Rachael

1

tchester dicho:

(2) Crear un inicio de sesión para el usuario que no sea administrador de sistemas que tiene el acceso público a la base de datos maestra

Fui a la lista de la base de datos de mi usuario (servidor/security/conexiones/mi nombre de usuario/propiedades/mapeo de usuario, y quería marcar la casilla para la base de datos maestra. Recibí un mensaje de error que decía que el usuario ya existía en la base de datos maestra. Fui a la base de datos maestra, abandoné al usuario y volví a la "asignación de usuario" y marcó la casilla para maestro. Marque la casilla "pública" a continuación.

Después de eso, debe volver a emitir el permiso de concesión lindo en xp_cmdshell a "mi nombre de usuario"

Yves

36

Quiero completar la respuesta de tchester.

(1) Activar el procedimiento xp_cmdshell:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Crear un inicio de sesión 'Dominio \ usuarioDePrueba' (usuario de Windows) para el usuario que no sea administrador de sistemas que tiene el acceso público a la base de datos maestra

(3) Conceder permiso Exec en el procedimiento almacenado xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(4) Crear una cuenta de proxy que xp_cmdshell se ejecute bajo el uso de sp_xp_cmdshell_proxy_account

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd' 
-- Note: pwd means windows password for [Domain\TestUser] account id on the box. 
--  Don't include square brackets around Domain\TestUser. 

(5) permiso de servidor de control de subvención para el usuario

USE master; 
GRANT CONTROL SERVER TO [Domain\TestUser] 
GO 
+0

¿NO CONCEDE EL SERVIDOR DE CONTROL A [Domain \ TestUser] efectivamente otorgar derechos sysadmin a ese usuario? Pensé que la idea era minimizar los permisos de ese usuario. – Colin

+2

Cuando leí esto, pensé que el usuario administrador no de sistema tenía que ser una cuenta de Windows y también era la cuenta de proxy. No es verdad. La cuenta de proxy debe ser Windows. Entonces, cualquier usuario administrador que no sea un administrador necesita acceso público para dominar y ejecutar el permiso en xp_cmdshell – Colin

+1

¡En mi caso, el paso 4 fue completamente innecesario! – Johan

0

Para ampliar sobre lo que se ha previsto exportar automáticamente los datos como CSV a un recurso compartido de red a través del Agente SQL Server.

(1) Activar el procedimiento xp_cmdshell:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Crear un inicio de sesión 'Dominio \ usuarioDePrueba' (usuario de Windows) para el usuario que no sea administrador de sistemas que tiene el acceso público a la base de datos maestra. Hecho mediante la asignación de usuarios

(3) Iniciar sesión como trabajo por lotes: vaya a Política de seguridad local -> Políticas locales -> Asignación de derechos de usuario.Añadir usuario a "Inicio de sesión como proceso por lotes"

(4) Dar permisos de lectura/escritura a la carpeta de red para el dominio \ usuario

(5) Conceder permiso Exec en el procedimiento almacenado xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(6) Crear una cuenta de proxy que xp_cmdshell se ejecute bajo el uso de sp_xp_cmdshell_proxy_account

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user' 

(7) Si el comando sp_xp_cmdshell_proxy_account no funciona, m anually create it

create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password' 

(8) Habilite el Agente SQL Server. Abra el Administrador de configuración de SQL Server, vaya a Servicios de SQL Server, habilite el Agente de SQL Server.

(9) Crear trabajo automatizado. Abra SSMS, seleccione Agente SQL Server, luego haga clic derecho en trabajos y haga clic en "Nuevo trabajo".

(10) Seleccione "Propietario" como su usuario creado. Seleccione "Pasos", haga "escriba" = T-SQL. Rellene el campo de comando similar a la siguiente. Establecer el delimitador como ','

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11) Complete los horarios en consecuencia.

Cuestiones relacionadas