2009-07-07 83 views
15

Me gustaría ejecutar xp_cmdshell (procedimiento TSQL) para montar una unidad de red y luego acceder a los archivos mdb remotos.Ejecutar comando xp_cmdshell como usuario específico

Soy administrador en el servidor MS SQL y he permitido xp_cmdshell ejecución en consecuencia.

Sin embargo, todavía hay un problema:

  • Cuando llamo xp_cmdshell, el usuario que ejecuta el comando es el SQL SysAdmin , es decir, la cuenta que dirigen proceso de SQL Server.

  • Deseo Xp_cmdshell ejecuta como la cuenta con la que estoy conectado con el servidor SQL, es decir administrador

Ambas tesis cuenta están en el grupo administrador, grupo SQLAdmin, y se les concede para CONTROLAR EL SERVIDOR. Ambos usuarios pertenecen al mismo dominio. Todo esto se ejecuta en la misma máquina.

Debido a este conflicto, no puedo utilizar una unidad de red, ya que está montado para SysAdmin y no para administrador
He intentado utilizar sp_ xp_ cmdshell_ PROXY_ cuenta para especificar la cuenta con la que quiero ejecutar xp_cmdshell, pero SysAdmin sigue siendo la cuenta utilizada.

Por lo tanto, este código:
select user_name(), suser_name;
exec xp_cmdshell 'echo %username%';

muestra:
Administrator Administrator
SysAdmin

¿Alguien sabe cómo hacerse pasar así la xp_cmdshell de comandos? ¿Hay algo para (re) configurar?

Gracias por su ayuda.

+0

la cuenta de proxy sólo se utiliza cuando los usuarios no sysadmin ejecutar xp_cmdshell –

+0

Entonces, ¿cómo puedo forzar a un usuario específico administrador de sistemas? – Antwan

+0

Solo para aclarar: ¿ha utilizado sp_xp_cmd_shell_proxy_account para configurar la cuenta que desea usar y luego ha ejecutado el comando utilizando xp_cmdshell, y la cuenta utilizada sigue siendo la cuenta de servicio? Solo quiero asegurarme de que entiendo tus pasos. – SqlRyan

Respuesta

1

¿Tal vez podría probar PsExec? Descargue el archivo en esta URL y cópielo en un miembro de la carpeta de la variable de entorno% Path%.

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

exec xp_cmdshell 'psexec -u Administrator -p password net use ...' 
+1

Esto puede ser una solución, pero implica escribir la contraseña en texto sin formato, lo que es complicado. Estoy buscando una forma pura de TSQL ... – Antwan

+0

Hola, gracias por tu actualización, pero cuando intenté lo mismo con el siguiente comando "exec xp_cmdshell" C: \ Adhoc \ PSTools \ psexec -u dominio \ id -p contraseña dir \\ sharelocation '"Esto se ejecuta para siempre sin ningún resultado, por favor sugerir –

0

Usted podría tratar de "uso neto" con un nombre de usuario y contraseña en el interior xp_cmdshell. Esto establece las credenciales para la conexión con la UNC.

Sin embargo, no estoy seguro de cuánto tiempo esto persistiría. Si persiste indefinidamente (p. Ej., Hasta el reinicio del servidor), puede tener un procedimiento almacenado de inicio que hace "uso neto" y asegura que esté disponible para su uso posterior.

Una xp_cmdshell posterior (para acceder a los archivos MDB) no requeriría la autenticación porque las credenciales ya están establecidas dentro del sistema operativo.

+0

estoy casi avergonzado de admitirlo, pero esto funciona. Es terrible desde el punto de vista de la seguridad, pero lo hice por desesperación. PERO, ¿está abriendo archivos MDB directamente desde un disco de red? Eso me mantendría despierto las noches. Lo que estaba haciendo era un envío de registros local en un entorno sin dominio (es decir, solo operaciones de copia de archivos) – onupdatecascade

7

Como se conecta a SQL como inicio de sesión en el grupo sysadmin, xp_cmdshell se ejecuta como la cuenta de servicio.

Si se conecta como un inicio de sesión de bajo privilegio, entonces usará el xp_cmdshell_proxy_account en su lugar. Intenta hacer EXECUTE AS LOGIN='lowprivaccount' primero, para ver si eso ayuda.

Por supuesto, lo que realmente está preguntando no es el uso esperado. El uso previsto es que las cuentas con privilegios altos pueden permitir que xp_cmdshell use la Cuenta de servicio, mientras que todos los demás tienen que soportar la cuenta de proxy con privilegios más bajos.

+0

Entonces ... ¿realmente necesita ejecutar esto usando un contexto de seguridad en el rol del servidor sysadmin? Lo ideal es que solo use la función sysadmin cuando necesite hacer cosas de administrador del sistema. –

3

De hecho, me he tenido que usar este método en el pasado por cosas similares en redes compartidas, probar este ...

- correlacionar su unidad y que sea persistente.

Xp_cmdshell "uso neto t: \\ servidor < > \ < cuota de > < contraseña >/usuario: nombre de usuario < >/persistent: yes"

- código T-SQL haciendo uso de la unidad t

- borrar la asignación de unidades xp_cmdshell "uso neto t:/delete"

en realidad se puede configurar una tarea que se ejecuta cuando sql el servicio se inicia y lo hace asignar este disco para que siempre tenga acceso al recurso compartido mientras se esté ejecutando sql. Todo lo que tendría que hacer es configurar un sproc que mapee la unidad y haga que realice la asignación inicial de la unidad y haga uso de sp_procoption (http://msdn.microsoft.com/en-us/library/ms181720.aspx)

+1

Tengo curiosidad por saber por qué asignaría un disco en lugar de simplemente hacer referencia a una ruta UNC directamente? – Pondlife

+0

@Pondlife A veces, cuando usa credenciales alternativas para conectarse a UNC (No en su dominio), ayuda. –

-2

Debe crear un procedimiento almacenado al que colocará su script xp_cmdshell en eso.

Un procedimiento almacenado se ejecuta utilizando la cuenta de administrador, por lo tanto su xp_cmdshell se ejecutará correctamente cuando se ejecuta el procedimiento almacenado

create procedure RunShellIndirectly 

as 

declare @tawandachinaka as varchar(50) 

set @tawandachinaka='DIR "c:\scrap measurement\"*.csv /B' 

EXEC xp_cmdshell @tawandachinaka 
+3

"Un procedimiento almacenado se ejecuta con la cuenta de administrador": esto es [no es correcto] (http://msdn.microsoft.com/en-us/library/ms188354 (v = sql.100) .aspx). – Pondlife

+0

Se ejecuta un procedimiento almacenado (en lo que respecta al sistema operativo) utilizando la cuenta de servicio SQL actualmente asignada y el SP solo se puede ejecutar si los permisos de SQL (establecidos en seguridad) lo permiten. –

-1

Después de reiniciar el servidor debe ejecutar comandos solución plase guardar comandos ...

Use Master GO 

EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH 
OVERRIDE GO 

EXEC master.dbo.sp_configure 'xp_cmdshell', 1 RECONFIGURE WITH OVERRIDE GO 

exec xp_cmdshell 'net use \ip\xxx pass /user:xxx /persistent:no' 

Use Master GO 

EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE WITH 
OVERRIDE GO 

EXEC master.dbo.sp_configure 'xp_cmdshell', 0 RECONFIGURE WITH OVERRIDE 
Cuestiones relacionadas