从另一个 SQL 服务器实例启动作业

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 来模拟。

作业仍然失败并出现相同的错误。

我需要做什么?

谢谢

Sol*_*zky 6

你可能不希望授予直接访问sp_start_job或者sp_stop_job,或者通过甚至授予访问范围的SQL代理功能SQLAgentOperatorRole,要么NT AUTHORITY\NETWORK SERVICEMyDomain\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)


Dav*_*oft 5

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)