在运行SQL Server代理作业时出现“访问被拒绝”错误。

5
我试图让SQL Server代理以带参数的方式运行程序(作为操作系统CmdExec作业步骤),但每次运行作业时,我都会收到以下错误信息:作业的第1步无法创建进程,原因是:拒绝访问。据我在网上查到的研究表明,这可能是权限问题。我在Windows中设置了一个新的用户帐户,并为我想要运行的程序授予了完全权限,然后将此用户配置文件映射到MS SQL中的SQLSERVERAGENT配置文件,但我仍然收到此错误。感谢任何对此有所帮助的支持。

你是如何“运行”程序的?使用xp_cmdshell吗?作业步骤(操作系统CmdExec、PowerShell等)?还是其他方法? - Dave Mason
是的,我做了,但仍然出现错误。 - Him_Jalpert
工作的所有者是谁?SA? - Dave Mason
我没有更简单的想法了。你尝试过使用“runas”以你创建的用户账户来启动应用程序(例如,从批处理文件中使用适当的参数)吗?这样行得通吗?你也可以尝试从你的 SQL 作业运行一个测试批处理文件--让它输出 %USERNAME% 到一个日志文件中,以验证该作业是否在新用户账户下运行:ECHO %USERNAME% > C:\Temp.log - Dave Mason
我可以试一下。我已经尝试在Windows命令提示符中运行应用程序,而且没有任何问题,只是在SQL Server Agent中运行它有问题。 - Him_Jalpert
显示剩余2条评论
6个回答

5
以上步骤对我有用。
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

在此之后,使用“tst_proxy”在SQL代理作业中运行该作业。作业成功运行。

3

我曾经遇到过同样的问题,解决方法令人尴尬地简单:我的.exe文件路径有误。这种情况出现“拒绝访问”的错误信息有点令人困惑(因为代理帐户并不知道该文件不存在,只是无法访问该文件)。

在故障排除时,您可以采取一种简单的步骤,即在命令窗口中运行完全相同的命令。它是否按预期工作?如果使用代理帐户登录会怎样呢?


1

首先,您需要确保允许XP_CMDSHELL。

exec sp_configure 'xp_cmdshell',1
go
reconfigure
  1. 您需要使用您创建的用户创建凭据。
  2. 创建代理并引用您创建的凭据。将此代理授权访问“操作系统(CmdExec)”子系统。
  3. 在作业步骤本身中,确保它作为此代理执行(Run as:)。

0

遇到了相同的错误信息。原来是 SQL Agent 帐户没有权限访问 sqlcmd.exe 所在的 Tools 目录。将读取和执行权限授予 SQL Agent 帐户,问题解决了。


0

如果您在使用SQL 2014维护计划时遇到问题,即使RunAs帐户和服务帐户已经确认过了(通过执行AS测试),请尝试以下操作:

检查维护计划中的本地连接身份验证。

  • 如果它设置为一个帐户并且适当,那么切换到Windows NT身份验证,保存计划
  • 如果已经在WinNT上,请切换到一个帐户,保存计划,然后再次进入,切换到Windows NT身份验证,再次保存计划。

没有任何记录可以捕获这个问题。我只是在想身份验证可能涉及到哪些其他方面,因为失败都是围绕着这个问题,但是其他地方都已经正确设置了....

就像奶奶说的:“总是在你最后找的地方。”


-2

我们需要确保执行作业的帐户对作业步骤涉及的文件夹/文档具有完全访问权限。

这应该可以解决问题,而无需添加代理。


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