5

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

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

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

4

7 回答 7

13

使用 xp_cmdshell 运行“whoami”,然后检查指定用户对 exe 及其访问的任何资源的有效权限。奇怪的是,像 localsystem 这样的帐户被用于通过 xp_cmdshell 运行进程。

EXEC xp_cmdshell 'whoami'
于 2012-05-30T19:36:17.667 回答
9

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

于 2012-05-30T19:01:43.070 回答
0

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

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

希望这可以帮助,

伊夫

于 2012-09-17T17:20:47.283 回答
0

尝试运行 BCP 然后复制时,我被拒绝访问。

我发现 xp_cmdshell 从 c:\windows\system32 开始

我修改了我的 CMD 文件以更改为我的工作文件夹

L: cd L:\myworkingfolder

这解决了我的问题,尽管我的 sqlagent 是本地管理员并且我已经完全路径了我的复制命令。

于 2015-02-09T19:52:30.320 回答
0

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

我做了以下步骤:

  1. 创建新角色:

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

  2. 在 master 数据库中添加用户:安全性 --> 用户。成员资格仅检查刚刚创建的 [CmdShell_Executor]

  3. 设置代理帐户:

    EXEC sp_xp_cmdshell_proxy_account 'domain\user1','users1 Windows 密码' EXEC sp_xp_cmdshell_proxy_account 'domain\user2','users2 Windows 密码'

然后两个用户都可以执行包含 xp_cmdshell 调用 R 脚本运行的存储过程。我让用户输入密码,执行一行代码,然后删除密码。都在我的电脑里。

于 2019-08-23T03:07:21.087 回答
0

我有同样的问题,我是这样解决的:

  1. 打开 SQL Server 配置管理器
  2. 选择您的实例并右键单击 -> 属性
  3. 选择登录选项卡
  4. 并选择授权账户
于 2021-01-04T16:51:08.950 回答
0

Access is denied.当您没有正确指定可执行文件的路径时,您也可以获得。请注意,如果您的路径包含空格,则需要将可执行文件括在双引号中:

EXEC xp_cmdshell '"D:\My path\With spaces\runme.exe"'
于 2020-01-02T22:36:34.233 回答