我试图让SQL Server代理以带参数的方式运行程序(作为操作系统CmdExec作业步骤),但每次运行作业时,我都会收到以下错误信息:作业的第1步无法创建进程,原因是:拒绝访问。据我在网上查到的研究表明,这可能是权限问题。我在Windows中设置了一个新的用户帐户,并为我想要运行的程序授予了完全权限,然后将此用户配置文件映射到MS SQL中的SQLSERVERAGENT配置文件,但我仍然收到此错误。感谢任何对此有所帮助的支持。
Enable XP_cmdshell
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
CREATE CREDENTIAL cmdshell_agent WITH IDENTITY = 'account_name', SECRET = 'password';
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_add_proxy @proxy_name=N'tst_Proxy',@credential_name=N'cmdshell_agent', @enabled=1
GO
EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name=N'tst_Proxy', @subsystem_id=3
GO
我曾经遇到过同样的问题,解决方法令人尴尬地简单:我的.exe文件路径有误。这种情况出现“拒绝访问”的错误信息有点令人困惑(因为代理帐户并不知道该文件不存在,只是无法访问该文件)。
在故障排除时,您可以采取一种简单的步骤,即在命令窗口中运行完全相同的命令。它是否按预期工作?如果使用代理帐户登录会怎样呢?
首先,您需要确保允许XP_CMDSHELL。
exec sp_configure 'xp_cmdshell',1
go
reconfigure
遇到了相同的错误信息。原来是 SQL Agent 帐户没有权限访问 sqlcmd.exe 所在的 Tools 目录。将读取和执行权限授予 SQL Agent 帐户,问题解决了。
如果您在使用SQL 2014维护计划时遇到问题,即使RunAs帐户和服务帐户已经确认过了(通过执行AS测试),请尝试以下操作:
检查维护计划中的本地连接身份验证。
没有任何记录可以捕获这个问题。我只是在想身份验证可能涉及到哪些其他方面,因为失败都是围绕着这个问题,但是其他地方都已经正确设置了....
就像奶奶说的:“总是在你最后找的地方。”
我们需要确保执行作业的帐户对作业步骤涉及的文件夹/文档具有完全访问权限。
这应该可以解决问题,而无需添加代理。
%USERNAME%
到一个日志文件中,以验证该作业是否在新用户账户下运行:ECHO %USERNAME% > C:\Temp.log
。 - Dave Mason