我在数据库触发器中使用xp_cmdshell来启动exe文件。
启用了xp_cmdshell(它可以执行简单的cmd命令,如'echo')。但是当我尝试通过xp_cmdshell启动exe时,访问被拒绝。
我是数据库管理员。我可以直接通过cmd启动exe。任何人都知道为什么我会被拒绝以及如何解决它?
答案 0 :(得分:9)
使用xp_cmdshell运行“whoami”,然后在exe及其访问的任何资源上检查所述用户的有效权限。 可能的情况是像localsystem这样的帐户被用来通过xp_cmdshell来运行进程。
EXEC xp_cmdshell 'whoami'
答案 1 :(得分:8)
可能NTFS权限不足。确保运行SQL Server的“用户帐户”具有对* .EXE(以及任何相关文件)的权限(读取+执行)
答案 2 :(得分:0)
不确定,但我相信触发器是由运行“触发”触发器的SQL命令的用户运行的。
用户发出SQL命令是Windows用户还是SQL用户?如果是SQL用户,则需要设置“SQL代理”。 SQL代理用于告诉SQL将使用哪个Windows用户来访问文件系统。
希望这有帮助,
伊夫
答案 3 :(得分:0)
我在尝试运行BCP然后COPY时收到了拒绝访问权。
我发现xp_cmdshell在c:\ windows \ system32
中启动我修改了我的CMD文件以更改为我的工作文件夹
L: cd L:\ myworkingfolder
这解决了我的问题,事件虽然我的sqlagent是本地管理员,但我已经完全修改了我的复制命令。
答案 4 :(得分:0)
该做出贡献了。我是sysadmin角色,致力于让两个公共访问用户执行xp_cmdshell。我可以执行xp_cmdshell,但不能执行两个用户。
我执行了以下步骤:
创建新角色:
使用母版 创建角色[CmdShell_Executor]授权[dbo] 将xp_cmdshell授予[CmdShell_Executor]
在主数据库中添加用户:安全->用户。成员资格仅检查刚刚创建的[CmdShell_Executor]
设置代理帐户:
EXEC sp_xp_cmdshell_proxy_account'domain \ user1','users1 Windows password' EXEC sp_xp_cmdshell_proxy_account'domain \ user2','users2 Windows密码'
然后,两个用户都可以执行包含xp_cmdshell的存储过程,并调用R脚本运行。我让用户输入密码,执行一行代码,然后删除密码。全部在我的电脑上。
答案 5 :(得分:0)
如果您没有正确指定可执行文件的路径,您也可以获得=SEARCH($AL$4,INDIRECT("[@"&$AL$5&"]"))
。请注意,如果路径中包含空格,则需要将可执行文件用双引号引起来:
Access is denied.
答案 6 :(得分:0)
我遇到了同样的问题,我是这样解决的: