以特定用户身份执行xp_cmdshell命令

时间:2009-07-07 12:55:28

标签: sql-server windows tsql shell

我想运行 xp_cmdshell (TSQL程序)以安装网络驱动器,然后访问远程mdb文件。

我是MS SQL服务器的管理员,因此我允许 xp_cmdshell 执行。

然而,仍有问题:

  • 当我调用xp_cmdshell时,执行该命令的用户是SQL SysAdmin ,即运行SQL Server进程的帐户。

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

这两个帐户都在管理员组,SQLAdmin组中,并被授予CONTROL SERVER。两个用户都属于同一个域。所有这些都在同一台机器上运行。

由于这种冲突,我无法使用网络驱动器,因为它是为 SysAdmin 而不是为管理员安装的 我尝试使用 sp_ xp_ cmdshell_ proxy_ account 来指定我想要运行的帐户 xp_cmdshell ,但 SysAdmin 仍然是已使用的帐户。

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

显示:
    Administrator Administrator
    SysAdmin

有人知道如何充分冒充 xp_cmdshell 命令吗?是否有(重新)配置?

感谢您的帮助。

7 个答案:

答案 0 :(得分:8)

因为您将SQL连接到sysadmin组中的登录名,所以xp_cmdshell将作为服务帐户运行。

如果您以低权限登录方式连接,则会使用xp_cmdshell_proxy_account代替。因此,首先尝试EXECUTE AS LOGIN='lowprivaccount',看看是否有帮助。

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

答案 1 :(得分:3)

我实际上不得不在网络共享上使用这种方法来尝试这个...

  

- 映射您的驱动器并使其持久。

     

xp_cmdshell“net use t:\\< server> \< share>< password> / user:< username> / persistent:yes”

     

- 使用t驱动器的t-sql代码

     

- 删除驱动器映射xp_cmdshell“net use t:/ delete”

您实际上可以设置一个在sql服务启动时执行的作业,并使其映射此驱动器,这样只要sql正在运行,您就可以始终访问该共享。您需要做的就是设置一个映射驱动器的sproc并让它执行驱动器的初始映射并使用sp_procoption(http://msdn.microsoft.com/en-us/library/ms181720.aspx

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

您可以在xp_cmdshell中使用用户名和密码尝试“net use”。这将建立与UNC连接的凭据。

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

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

答案 4 :(得分:0)

我发现此页面有助于填补实际添加域帐户并将其链接的过程中的空白。

http://sqlblog.com/blogs/tibor_karaszi/archive/2007/08/23/xp-cmdshell-and-permissions.aspx

答案 5 :(得分:-1)

重启后服务器必须执行命令plase solution save命令...

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

答案 6 :(得分:-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