【问题标题】:Execute xp_cmdshell command as specific user以特定用户身份执行 xp_cmdshell 命令
【发布时间】:2010-11-08 16:40:39
【问题描述】:

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

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

但是,还有一个问题:

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

  • 我希望 xp_cmdshell 以我连接到 SQL 服务器的帐户身份执行,即 Administrator

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

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

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

显示:
Administrator Administrator
SysAdmin

有人知道如何很好地模拟 xp_cmdshell 命令吗?有什么需要(重新)配置的吗?

感谢您的帮助。

【问题讨论】:

  • 代理账号只在非sysadmin用户执行xp_cmdshell时使用
  • 那我怎样才能强制一个特定的系统管理员用户?
  • 澄清一下——你已经用sp_xp_cmd_shell_proxy_account设置了你要使用的账号,然后用xp_cmdshell执行了命令,使用的账号还是服务账号?我只是想确保我理解你的步骤。

标签: sql-server windows tsql shell


【解决方案1】:

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

如果您以低权限登录方式连接,那么它将使用 xp_cmdshell_proxy_account 代替。所以先试试EXECUTE AS LOGIN='lowprivaccount',看看有没有帮助。

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

【讨论】:

  • 那么...您真的需要在 sysadmin 服务器角色中使用安全上下文来运行它吗?理想情况下,您应该只在需要执行系统管理员操作时使用 sysadmin 角色。
【解决方案2】:

实际上我过去曾在网络共享上使用这种方法来处理类似的事情,试试这个...

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

xp_cmdshell"net use t:\\\ /user: /persistent:yes"

-- 使用t盘的t-sql代码

--删除驱动映射xp_cmdshell"net use t:/delete"

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

【讨论】:

  • 我很好奇您为什么要映射驱动器而不是直接引用 UNC 路径?
  • @Pondlife 有时,当您使用备用凭据连接到 UNC(不在您的域中)时,它会有所帮助。
【解决方案3】:

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

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

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

【讨论】:

  • 这可能是一个解决方案,但它意味着用纯文本编写密码,这很棘手。我正在寻找一种纯 TSQL 方式...
  • 您好,感谢您的更新,但是当我尝试使用以下命令“exec xp_cmdshell 'C:\Adhoc\PSTools\psexec -u domain\id -p password dir \\sharelocation'”时,这是一直运行没有任何结果,请建议
【解决方案4】:

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

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

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

【讨论】:

  • 我几乎羞于承认这一点,但这很有效。从安全的角度来看,这很糟糕,但我是出于绝望才这样做的。但是 - 您是直接从网络磁盘打开 MDB 文件吗?那会让我彻夜难眠。我所做的是在没有域的环境中进行本地日志传送(即仅文件复制操作)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    重启服务器后必须执行命令解决保存命令...

    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
    

    【讨论】:

      【解决方案7】:

      您必须创建一个存储过程,将 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
      

      【讨论】:

      • “使用管理员帐户运行存储过程”:这是not correct
      • 使用当前分配的 SQL 服务帐户运行存储过程(就操作系统而言),并且 SP 只能在 SQL 权限(在安全中设置)允许的情况下运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多