2009-07-07 105 views
15

我想运行xp_cmdshell(TSQL过程)以便装入网络驱动器,然后访问远程mdb文件。以特定用户身份执行xp_cmdshell命令

我是MS SQL服务器上的管理员,我允许xp_cmdshell相应地执行。

然而,仍然有一个问题:

  • 当我打电话xp_cmdshell的,执行命令的用户是SQL 系统管理员,即谁运行SQL Server进程的帐户。

  • 我希望的xp_cmdshell执行作为与我连接到SQL Server的帐户,即管理员

论文的两个账户都在管理员组,SQLAdmin组,并授予控制服务器。两个用户都属于同一个域。所有这些都在同一台机器上运行。

因为这个矛盾的,我不能,因为它被安装用于系统管理员而不是管理员
使用的网络驱动器,我试图用以sp_ xp_ cmdshell_ proxy_占指定与我想要的帐户运行xp_cmdshell,但系统管理员仍然是使用的帐户。

因此,此代码:
select user_name(), suser_name;
exec xp_cmdshell 'echo %username%';

显示:
Administrator Administrator
SysAdmin

有谁知道如何来冒充好了xp_cmdshell的命令?有什么(重新)配置?

感谢您的帮助。

+0

代理帐户时,非系统管理员用户执行xp_cmdshell – 2009-07-07 14:01:26

+0

那么我怎么能强迫一个特定的系统管理员用户只使用? – Antwan 2009-07-07 14:19:15

+0

只是为了澄清 - 您已使用sp_xp_cmd_shell_proxy_account设置要使用的帐户,然后使用xp_cmdshell执行该命令,并且使用的帐户仍是服务帐户?我只是想确保我理解你的步骤。 – SqlRyan 2009-07-28 03:19:29

回答

1

也许你可以试试PsExec?在此URL下载文件并将其复制到%Path%环境变量的文件夹成员中。

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

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

这可能是一个解决方案,但它意味着以纯文本编写密码,这很棘手。 我正在寻找一种纯粹的TSQL方式... – Antwan 2009-07-08 08:15:27

+0

你好,谢谢你的更新,但是当我用下面的命令“exec xp_cmdshell'C:\ Adhoc \ PSTools \ psexec -u domain \ id -p password dir \\ sharelocation'”时,它会一直运行,没有任何结果建议 – 2015-05-29 14:51:58

0

你可以尝试 “网络使用” 里面xp_cmdshell的用户名和密码。这将建立与UNC连接的凭证。

但是,我不确定这会持续多久。如果它无限期地持续下去(例如,直到服务器重新启动),你可以有一个启动存储过程,它可以“净使用”并确保它可以在以后使用。

随后的xp_cmdshell(用于访问MDB文件)不需要身份验证,因为凭据已在操作系统中建立。

+0

我几乎惭愧地承认它,但这是有效的。从安全的角度来看这很糟糕,但是我是在绝望中完成的。但是 - 你是直接从网络磁盘打开MDB文件吗?那会让我连夜不停。我正在做的是在没有域名的环境下自行开发日志传送(即只是文件复制操作) – onupdatecascade 2009-07-23 02:08:34

7

由于您在sysadmin组中以登录方式连接到SQL,因此xp_cmdshell作为服务帐户运行。

如果您作为低特权登录进行连接,则它将使用xp_cmdshell_proxy_account来代替。所以先尝试做EXECUTE AS LOGIN='lowprivaccount',看看是否有帮助。

当然,你实际要求的不是预期的用途。预期的用途是高权限帐户可以允许xp_cmdshell使用服务帐户,而其他人必须忍受低权限代理帐户。

3

其实我不得不在过去在网络共享使用此方法类似的事情,试试这个...

- 映射驱动器,并使其持续。

xp_cmdshell的 “净使用T:\\ <服务器> \ <份额> <密码> /用户:<名> /持久:是”

- T-SQL代码利用的T驱动

- 删除驱动器映射xp_cmdshell的“净使用T:/删除”

实际上你可以设置执行SQL时的作业服务启动并使其映射此驱动器,所以只要sql正在运行,您将始终可以访问该共享。您只需要设置一个存储过程并映射驱动器,并使用sp_procoption(http://msdn.microsoft.com/en-us/library/ms181720.aspx

-2

您必须创建一个存储过程,将xp_cmdshell脚本在里面。

存储过程运行使用管理员帐户,因此您的xp_cmdshell将成功,当你执行存储过程

create procedure RunShellIndirectly 

as 

declare @tawandachinaka as varchar(50) 

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

EXEC xp_cmdshell @tawandachinaka 
-1

重启服务器后必须执行的命令plase解决方案保存命令运行...

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 
相关问题