管理员用户启用了xp_cmdshell,但访问被拒绝。

6

我正在使用数据库触发器中的xp_cmdshell来启动一个exe文件。

xp_cmdshell已启用(它可以执行简单的cmd命令,比如“echo”)。但是当我尝试通过xp_cmdshell启动exe时,访问被拒绝。

我是数据库管理员。我可以通过cmd直接启动exe。有人知道为什么我会被拒绝并如何解决吗?


你收到了什么精确的错误信息? - Martin Smith
这个消息没有更多的细节了吗?它没有指明是在谈论访问存储过程还是文件系统? - Martin Smith
仅此而已。存储过程运行并输出文件系统错误消息,我想。 - Joshua H.
7个回答

14

使用xp_cmdshell运行“whoami”,然后检查所述用户对exe及其访问的任何资源的有效权限。很可能会使用诸如localsystem之类的帐户通过xp_cmdshell运行进程。

EXEC xp_cmdshell 'whoami'

我遇到了这个错误:"whoami" 不被识别为内部或外部命令,可执行程序或批处理文件。 - Joshua H.
1
抱歉,您可能需要先安装它,链接在这里:http://serverfault.com/a/9984 - Peter Wishart
我已经安装了这个工具。当我在命令提示符中执行“whoami”时,它可以正常工作。但是在xp_cmdshell中失败了('whoami'不被识别为内部或外部命令)。你知道为什么会发生这种情况吗? - Joshua H.
奇怪..你可以尝试比较cmd和xp_cmdshell之间的"set comspec"和"set path"的结果,并确保你连接到本地服务器(关闭本地服务器并尝试连接,应该会失败)。 - Peter Wishart
它告诉我它是nt服务\mssqlserver。它应该是谁?这就是那个不让我做任何事情的东西。 - soulblazer
显示剩余2条评论

10

很可能是NTFS权限不足。确保 SQL Server 运行的“用户帐户”具有对*.EXE(以及任何依赖文件)的权限(读取+执行)。


我正在测试我的自己的数据库。而且这个可执行文件是我自己创建的。我有读取和执行的权限。 - Joshua H.
@JoshuaH。你有,但运行SQL Server的用户有吗?(例如LocalSystem或NetworkService)? - Christian.K
3
+1 JMC。我同意这听起来像是MSSQLServer服务正在运行的服务帐户没有权限的问题。打开服务并检查SQL Server服务帐户的登录属性。 - brian
登录属性:服务器类型:数据引擎,身份验证:Windows身份验证。我如何检查用户帐户是否具有对exe的权限? - Joshua H.
我也有一个问题,我的SQL Server正在以本地系统身份运行,但仍然无法解决这个错误。 - Johnny_D

0

当您没有正确指定可执行文件的路径时,也会出现访问被拒绝的情况。请注意,如果您的路径包含空格,则需要将可执行文件用双引号括起来:

EXEC xp_cmdshell '"D:\My path\With spaces\runme.exe"'

0
在编程方面,将以下英文内容翻译成中文:

在尝试运行BCP和COPY时,我一直收到ACCESS DENIED的错误提示。

后来我发现xp_cmdshell在c:\windows\system32目录下启动

然后我修改了我的CMD文件并将其更改为我的工作目录

L: cd L:\myworkingfolder

这样就解决了我的问题,虽然我的sqlagent是本地管理员,并且我已经完整路径指定了复制命令。


0

是时候贡献代码了。我现在是系统管理员角色,致力于让两个公共访问用户执行 xp_cmdshell。我能够执行 xp_cmdshell,但不是这两个用户。

我按照以下步骤进行:

  1. 创建新角色:

    use master CREATE ROLE [CmdShell_Executor] AUTHORIZATION [dbo] GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]

  2. 在主数据库中添加用户:Security --> Users。仅检查成员身份 [CmdShell_Executor],这是刚刚创建的角色

  3. 设置代理帐户:

    EXEC sp_xp_cmdshell_proxy_account 'domain\user1','users1 Windows password' EXEC sp_xp_cmdshell_proxy_account 'domain\user2','users2 Windows password'

然后,两个用户都可以执行包含 xp_cmdshell 调用 R 脚本运行的存储过程。我让用户输入密码,执行一行代码,然后删除密码。所有这些操作均在我的电脑上完成。


0

我曾经遇到过同样的问题,我是这样解决的:

  1. 打开SQL Server配置管理器
  2. 选择您的实例并右键单击 -> 属性
  3. 选择登录选项卡
  4. 选择授权帐户

0

我不确定,但我相信触发器是由运行“触发”触发器的SQL命令的用户触发的。

发出SQL命令的用户是Windows用户还是SQL用户? 如果是SQL用户,则需要设置“SQL代理”。 SQL代理用于告诉SQL将使用哪个Windows用户访问文件系统。

希望有所帮助,

Yves


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接