本篇文章是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. 【Android】Android 移动应用数据到SD

    [Android]Android 移动应用数据到SD 在应用的menifest文件中指定就可以了,在 <manifest> 元素中包含android:installLocation 属性, ...

  2. 学习Swift,一定不能错过的10大开源项目!

    如果你是位iOS开发者,或者你正想进入该行业,那么Swift为你提供了一个绝佳的机会.Swift的设计非常优雅,较Obj-C更易于学习,当然也非常强大. 为了指导开发者使用Swift进行开发,苹果发布 ...

  3. Lotus Domino中使用Xpage技术打造通讯录

    我们来完成一个类似通讯录的功能,我们可以添加人员,查看和修改,删除人员,我们假设我们的通讯录中只记录人员的名字和年龄字段.先看看完成后的效果吧 点击New可以到新增人员页面,如下图: 编辑按钮后进入编 ...

  4. Spark使用总结与分享

    背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...

  5. 解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题(l转)

    同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...

  6. JS表单设置值

    //表单设置值 $.fn.setForm = function(jsonValue) { var obj = this; $.each(jsonValue, function (name, ival) ...

  7. 【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】

    TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 ...

  8. Spring4 MVC Hibernate4集成

      Spring4 MVC Hibernate4集成 一.    本文所用环境 Spring4.0.3.RELEASE Hibernate4.3.5.Final Mysql 二.    工程目录 三. ...

  9. Jdbc如何从PostgreSql读取海量数据?PostgreSql源代码分析纪录

    前言: 最近做数据同步,需要从PostgreSql获取数据,发现一旦数据比较多,那么读取的速度非常慢,并且内存占用特别多&GC不掉. 代码样例: 为了方便讲解,下面写了事例代码,从b2c_or ...

  10. WebDriver基本API使用(基于Java)V1.0

    WebDriver基本API使用(基于Java)V1.0http://www.docin.com/p-803032877.html