本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文


在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色。这些角色包括SQLAgentUserRole、SQLAgentReaderRole和SQLAgentOperatorRole。每个角色授予用户一定的权限来使用SQL Server代理,而不必是sysadmin服务器角色的成员。为完全管理控制SQL Server代理,你仍然需要sysadmin角色的成员。此外,你回顾了SQL Server代理服务帐户的安全影响和选择。在这一篇,你将学习SQL Server代理的代理帐户的概念。代理帐户允许作业步骤来模拟一个特定的Windows安全帐户为作业步骤执行操作。这通常是在作业所有者的安全凭据不适用执行操作时应用。
代理帐户是什么
正如上面提到的,一个代理帐户是一组存储在Windows的安全凭据。这些凭据可以作为作业的安全上下文。代理帐户可由一个或多个符合条件的子系统使用。
可用代理帐户的子系统
并不是所有的子系统都可以使用代理帐户。可以使用代理帐户的子系统包括:
->ActiveX 脚本
->操作系统(CmdExec)
->复制系列任务
->SQL Server Analysis Services 命令(XML/A)
->SQL Server Analysis Services 查询(MDX)
->SQL Server Integration Services 包
->PowerShell
上面没有Transact-SQL脚本(T-SQL)子系统。T-SQL作业步骤通常运行于作业所有者的安全上下文,而且SSMS中不能改变。你可以手动配置作业步骤,使用sp_add_jobstep系统存储过程,通过database_user_name参数来模拟一个数据库用户,当然你需要安全权限来模拟数据库用户这样做。
你也会注意到复制子系统组合为一体,即使有几个不同的子系统处理复制。理论上你可以使用代理帐户,但那超出这系列范围的高级配置。
当你创建一个作业步骤,如图10.1所示(打开作业选择步骤页面,然后点击新建…按钮,选择一个支持代理帐户的子系统如PowerShell。你会看到一个可以模拟支持作业步骤的账户列表。如果你没有创建任何代理帐户凭据,列表看起来应该如图10.1所示,仅有SQL Server代理安全帐户。

图10.1 为作业步骤选择代理帐户
代理帐户的安全考虑

为了一个代理帐户的正确运行,该帐户必须具有“作为批处理作业登录”(seBatchLogonRight)权限,通过Windows管理员分配给它(在本地安全策略->本地策略->用户权限分配)。没有特权的SQL Server代理服务将无法模拟帐户来运行作业步骤。还需要注意的是,代理账户不是自动能访问你的SQL Server。例如,你想使用一个CmdExec或PowerShell的作业步骤重新登录到SQL Server,代理帐户必须被显式授予登录回你的SQL Server(或者继承访问Windows组)。
创建代理帐户
你可以使用Transact-SQL或SSMS创建一个代理帐户。使用Transact-SQL,使用系统存储过程sp_add_proxy

EXEC sp_add_proxy
[ @proxy_name = ] 'proxy_name' ,
[ @enabled = ] is_enabled ,
[ @description = ] 'description' ,
[ @credential_name = ] 'credential_name' ,
[ @credential_id = ] credential_id ,
[ @proxy_id = ] id OUTPUT

保留proxy_name空白,保证代理与凭据相同的名字。凭据名称应该来自安全凭据(使用CREATE CREDENTIAL数据库定义语句创建)。
例如,创建一个[Proxy1]代理帐户,密码“Password1”(即一个帐户在你的本地SQL Server机器创建),你可以运行代码10.1,替换成你的环境中有效的域、身份和密码。

USE MSDB;
GO
CREATE CREDENTIAL [Cred1] WITH IDENTITY = N'USER-67NP5R8LGK\ClearFile', SECRET = N'' Declare @rc int=0;
EXEC sp_add_proxy [Proxy1],1,'This is an example proxy account',[Cred1], NULL,@rc;

代码10.1 创建凭据和代理帐户
值得注意的是,目前你已经创建一个代理帐户,但它不与任何特定的子系统关联。如果你展开代理->未分配的代理,你会看到刚刚创建的代理帐户,如图10.2所示。

图10.2 SSMS下未分配的代理帐户
请注意,这里使用SSMS创建更容易,但仍然有两步过程。你必须先创建一个凭据(安全性->凭据,新建凭据,打开新建凭据对话框)。在这个例子中,使用Cred1作为帐号,用相同的密码,如图10.3所示。

图10.3 SSMS下创建凭据
单击“确定”,然后导航到代理文件夹,并右键单击任何代理子系统(或代理文件夹本身),新建代理。弹出新建代理帐户,键入Proxy1名称,选择相匹配的凭据,输入一个描述,如果需要选择一个作业子系统(如图10.4所示)。如果没有选择子系统,代理帐户将出现在未分配的代理下(类似用语句创建的代理)。

图10.4 SSMS下创建代理帐户
最后一步是将代理帐户和子系统关联,它是通过系统存储过程sp_grant_proxy_to_subsystem实现的。在前面的例子,为了将代理帐户[Proxy1]分配给PowerShell子系统,你可以运行下面代码:

EXEC sp_grant_proxy_to_subsystem @proxy_name=N'Proxy1', @subsystem_id=12

子系统的subsystem_id可以在MSDN文档查到http://msdn.microsoft.com/en-us/library/ms186760.aspx
授权代理凭据
你可能已经注意到,在新建代理帐户对话框有一个主体页签。默认情况下,sysadmin服务器角色的成员有代理资格,但这不适用于其他人。如果你想有一个非管理员用户访问代理凭据(这是很有可能的,否则为什么要创造它们),那么你需要授予明确的访问给每一个你想使用代理的登录。
你可以使用系统存储过程sp_grant_login_to_proxy 来实现,或者SSMS。打开PowerShell代理文件夹下的Proxy1代理帐户,转到主体页签。点击添加(如图10.5),你就可以关联一个或多个安全主体(登录)和你的代理帐户。一旦这样操作后,任何主体拥有的作业可以使用这个代理帐户。注意还有第三个页签,引用,这里会显示出哪个作业步骤使用了这个代理帐户,你可以直接修改或删除代理。

图10.5 关联代理帐户和安全主体(SQL登录)
使用代理帐户

现在就可以修改作业步骤来使用代理帐户。如果你是遵循本系列的文章,你应该有一个叫做ShellOut的作业,它的第二步s2是PowerShell子系统。打开这个作业步骤,更改运行身份为Proxy1(如图10.6所示)。如果你没有这个作业步骤,你应该创建一个这样的步骤。

图10.6 使用代理帐户更新作业步骤
现在再次运行作业,这样就是使用代理帐户而不是SQL Server服务帐户来执行作业步骤的。记住你的代理帐户必须能登录到你的数据库实例,因此确保你已经为代理帐户创建了一个数据库登录名。
修改和删除代理
使用SSMS来修改或删除代理是直观的(打开代理帐户对话框更改),但为了完整对应的Transact-SQL语句是:

exec msdb.dbo.sp_delete_proxy @proxy_name = 'proxy1'

凭据的理解可参考:在SQL Server Agent中应用凭据
下一篇
SQL Server代理的代理帐户允许非sysadmin用户模拟其他Windows安全凭据有特权执行关键任务的能力。当结合子系统如CmdExec和PowerShell,他们允许比sysadmin低特权级被授予SQL代理作业的所有者。
在我们的下一篇,我们将看看维护计划作业,以及他们与你自己创建的作业的区别。

第十篇 SQL Server代理使用代理帐户的更多相关文章

  1. 【译】第十篇 SQL Server代理使用代理帐户

    本篇文章是SQL Server代理系列的第十篇,详细内容请参考原文 在这一系列的上一篇,你查看了msdb库下用于授权访问SQL Server代理的安全角色.这些角色包括SQLAgentUserRole ...

  2. 第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  3. 第八篇 SQL Server代理使用外部程序

    本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...

  4. 第六篇 SQL Server代理深入作业步骤工作流

    本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...

  5. 【译】第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  6. 【译】第八篇 SQL Server代理使用外部程序

    本篇文章是SQL Server代理系列的第八篇,详细内容请参考原文 在这一系列的上一篇,学习了如何用SQL Server代理作业活动监视器监控作业活动和查看作业历史记录.在实时监控和管理SQL Ser ...

  7. 【译】第六篇 SQL Server代理深入作业步骤工作流

    本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...

  8. 第五篇 SQL Server代理理解代理错误日志

    本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到 ...

  9. 【译】第五篇 SQL Server代理理解代理错误日志

    本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到 ...

随机推荐

  1. Revit中如何将视图过滤器传递到其它项目

    在Revit中采用过滤器控制视图显示,利用过滤器给图元着色,利用过滤器控制视图显示或隐藏等,那么,在不同的项目中是否每次都要设置相同的过滤器,其实,Revit提供了这么一种在不同项目传递信息的方式,在 ...

  2. KVM 基础使用(一)

    Host OS:CentOS release 6.3 (Final) x64 安装时选择Virtual Host 1.测试KVM有没有启动 运行 lsmod | grep kvm 和 stat /de ...

  3. 新建一个Activity

    如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.

  4. nodejs 的安全

    1.connect中间件csrf 原理:在express框架中csrf 是通过connect 模块的中间件来解决的.其原理是在前端构造一个隐藏的表单域“_csrf” ,后端生成一个值,作为该表单域,然 ...

  5. [玩转微信平台]XML的格式化- 如何去掉XML 文档头和命名空间

    前言 系统要求能够回复微信用户发过来的文本消息.实现中使用的实体对象进行XML的序列化的方式来实现XML消息.   微信平台的回复例子 http://mp.weixin.qq.com/wiki/14/ ...

  6. Linux查看端口、进程情况及kill进程

    看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat –apn 查看所有的进程和端口使用情况.发现下面的进程列表,其中最后一栏是P ...

  7. 【分享】分享一个压缩 PNG 的网站 TinyPNG

    TinyPNG 能做什么? TinyPNG 采用智能的有损压缩技术来减少你的 PNG 文件的文件大小.通过选择性地减少图像中的颜色数量,更少的字节用于存储数据.效果几乎是看不见的,但它在文件大小方面差 ...

  8. 【python】——小程序之电话薄

    初学python,写一个小程序练习一下.主要功能就是增删改查的一些功能.主要用到的技术:字典的使用,pickle的使用,io文件操作.代码如下: import pickle #studentinfo ...

  9. Java对象创建阶段的代码调用顺序

    在创建阶段系统通过下面的几个步骤来完成对象的创建过程 为对象分配存储空间 开始构造对象 从超类到子类对static成员进行初始化 超类成员变量按顺序初始化,递归调用超类的构造方法 子类成员变量按顺序初 ...

  10. MyEclipse设置编码方式

    1.windows->Preferences……打开"首选项"对话框,左侧导航树,导航到general->Workspace, 右侧Text file encoding ...