我正在使用数据库触发器中的xp_cmdshell来启动一个exe文件。
xp_cmdshell已启用(它可以执行简单的cmd命令,比如“echo”)。但是当我尝试通过xp_cmdshell启动exe时,访问被拒绝。
我是数据库管理员。我可以通过cmd直接启动exe。有人知道为什么我会被拒绝并如何解决吗?
我正在使用数据库触发器中的xp_cmdshell来启动一个exe文件。
xp_cmdshell已启用(它可以执行简单的cmd命令,比如“echo”)。但是当我尝试通过xp_cmdshell启动exe时,访问被拒绝。
我是数据库管理员。我可以通过cmd直接启动exe。有人知道为什么我会被拒绝并如何解决吗?
使用xp_cmdshell运行“whoami”,然后检查所述用户对exe及其访问的任何资源的有效权限。很可能会使用诸如localsystem之类的帐户通过xp_cmdshell运行进程。
EXEC xp_cmdshell 'whoami'
很可能是NTFS权限不足。确保 SQL Server 运行的“用户帐户”具有对*.EXE(以及任何依赖文件)的权限(读取+执行)。
当您没有正确指定可执行文件的路径时,也会出现访问被拒绝
的情况。请注意,如果您的路径包含空格,则需要将可执行文件用双引号括起来:
EXEC xp_cmdshell '"D:\My path\With spaces\runme.exe"'
在尝试运行BCP和COPY时,我一直收到ACCESS DENIED的错误提示。
后来我发现xp_cmdshell在c:\windows\system32目录下启动
然后我修改了我的CMD文件并将其更改为我的工作目录
L: cd L:\myworkingfolder
这样就解决了我的问题,虽然我的sqlagent是本地管理员,并且我已经完整路径指定了复制命令。
是时候贡献代码了。我现在是系统管理员角色,致力于让两个公共访问用户执行 xp_cmdshell。我能够执行 xp_cmdshell,但不是这两个用户。
我按照以下步骤进行:
创建新角色:
use master CREATE ROLE [CmdShell_Executor] AUTHORIZATION [dbo] GRANT EXEC ON xp_cmdshell TO [CmdShell_Executor]
在主数据库中添加用户:Security --> Users。仅检查成员身份 [CmdShell_Executor],这是刚刚创建的角色
设置代理帐户:
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 脚本运行的存储过程。我让用户输入密码,执行一行代码,然后删除密码。所有这些操作均在我的电脑上完成。
我曾经遇到过同样的问题,我是这样解决的:
我不确定,但我相信触发器是由运行“触发”触发器的SQL命令的用户触发的。
发出SQL命令的用户是Windows用户还是SQL用户? 如果是SQL用户,则需要设置“SQL代理”。 SQL代理用于告诉SQL将使用哪个Windows用户访问文件系统。
希望有所帮助,
Yves