Rou*_*und 4 sql-server-2008 sql-server permissions sql-server-agent jobs
我在 SQL 2008 服务器(服务器 A)上有一份工作(我知道这并不理想……正在解决这个问题)。代理在 NT AUTHORITY\NETWORK SERVICE 下运行。
我想添加一个运行位于另一台 SQL 2014 服务器(服务器 B)上的作业的步骤。
我会用:
EXEC [Server B].msdb..sp_start_job N'JobName'
Run Code Online (Sandbox Code Playgroud)
从服务器 A 手动运行它按预期在服务器 B 上执行作业。
如果我将任务添加到服务器 A 上的作业,它会失败并显示以下消息:
以用户身份执行:NT AUTHORITY\NETWORK SERVICE。对象“sp_start_job”、数据库“msdb”、架构“dbo”上的 EXECUTE 权限被拒绝。[SQLSTATE 42000](错误 229)。步骤失败。
我已将服务器 B 上的 NT AUTHORITY\NETWORK SERVICE 分配给 msdb 中的“TargetServerRole”,然后授予有关用户 SP_Start_Job 和 SP_Stop_Job 的执行权限。
服务器 A 将服务器 B 作为链接服务器,我尝试设置“本地服务器登录到远程服务器登录映射”本地登录 NT AUTHORITY\NETWORK SERVICE 来模拟。
作业仍然失败并出现相同的错误。
我需要做什么?
谢谢
你可能不希望授予直接访问sp_start_job或者sp_stop_job,或者通过甚至授予访问范围的SQL代理功能SQLAgentOperatorRole,要么NT AUTHORITY\NETWORK SERVICE或MyDomain\ServerA$。执行这些组合中的任何一个至少会允许NT AUTHORITY\NETWORK SERVICE在 ServerA 上运行的任何进程能够启动和/或停止 ServerB 上的任何作业。
使用Module Signing,您可以设置非常精细的权限,以便MyDomain\ServerA$(或任何登录名或角色,或这些的任何组合)只能启动和停止该特定作业。
USE [msdb];
GO
CREATE PROCEDURE dbo.StartStopJobX
(
@Operation VARCHAR(10) = 'start'
)
AS
IF (@Operation = 'start')
BEGIN
EXEC dbo.sp_start_job N'{job_name}';
END
ELSE
BEGIN
EXEC dbo.sp_stop_job N'{job_name}';
END;
GO
CREATE CERTIFICATE [SqlAgentPermissions]
ENCRYPTION BY PASSWORD = 'change_me'
WITH SUBJECT = 'Allow low-priviledged accounts to start/stop certain jobs',
EXPIRY_DATE = '2099-12-31';
ADD SIGNATURE
TO dbo.StartStopJobX
BY CERTIFICATE [SqlAgentPermissions]
WITH PASSWORD = 'change_me';
CREATE USER [SqlAgentPermissions] FROM CERTIFICATE [SqlAgentPermissions];
ALTER ROLE [SQLAgentOperatorRole] ADD MEMBER [SqlAgentPermissions];
Run Code Online (Sandbox Code Playgroud)
现在你需要做的就是:
GRANT EXECUTE ON dbo.[StartStopJobX] TO [MyDomain\ServerA$];
Run Code Online (Sandbox Code Playgroud)
NT AUTHORITY\NETWORK SERVICE, 是本地帐户,但它可以使用服务器的计算机帐户在网络上进行身份验证(假设服务器已加入域)。
您需要在服务器 B 上为服务器 A 的计算机帐户创建一个登录名。
例如,如果服务器 A 的计算机名称为“ServerA”,则其计算机帐户名为“ServerA$”,例如:
use msdb
create login [MyDomain\ServerA$] from Windows
create user [MyDomain\ServerA$] for login [MyDomain\ServerA$]
alter role SQLAgentOperatorRole add member [MyDomain\ServerA$]
Run Code Online (Sandbox Code Playgroud)