如何在 SQL Server 2000 中启用非 sysadmin 帐户以执行 "xp_cmdshell" 扩展存储过程


摘要


本文介绍如何配置 Microsoft Windows 级别的 SQL Server 代理帐户,以供不是 sysadmin 固定服务器角色成员的 SQL 登录使用。 此外,本文还包含对详细信息的参考,可帮助你解决尝试设置代理帐户时可能出现的问题。

简介


Xp_cmdshell扩展存储过程从 Microsoft SQL Server 2000 中调用 Windows 命令外壳程序。 当 xp_cmdshell 扩展存储过程由 sysadmin 固定服务器角色的成员执行时,命令外壳的 WINDOWS 进程将使用 SQL server 的 windows 服务帐户的安全上下文运行。 例如,如果 SQL Server 在具有计算机管理员权限的 Windows 登录下运行,则打开带有 xp_cmdshell 扩展存储过程的命令提示符的用户将以本地管理员的身份收到对 Windows 的访问权限。 默认情况下,仅向sysadmin固定服务器角色的成员授予执行xp_cmdshell扩展存储过程的权限。 此权限有助于阻止权限的提升。当你想要使用降低的权限级别启动新的 Windows 进程时,可以使用 SQL Server 代理的代理帐户来配置具有相应权限级别的 Windows 帐户。

更多信息


当你尝试从不是sysadmin服务器角色成员的 sql server 登录中执行xp_cmdshell扩展存储过程,并且未正确设置 sql server 代理的代理帐户时,你可能会收到类似以下内容的错误消息:
消息50001,级别1,状态 50001 xpsql:错误997来自 GetProxyAccount 的行499
消息50001,级别1,状态 50001 xpsql:错误317来自 GetProxyAccount 的行499
消息50001,级别1,状态 50001 xpsql:来自 GetProxyAccount 的错误0的行499
消息50001,级别1,状态 50001 xpsql:错误87来自 GetProxyAccount 的行499
如果必须让非 sysadmin 用户在 SQL Server 2000 中运行 xp_cmdshell 的扩展存储过程,则必须将代理帐户和 SQL Server 启动帐户配置为本地管理员组的成员。 当 SQL Server 为不是 sysadmin 固定服务器角色成员的用户执行作业或命令时,SQL Server 代理和 xp_cmdshell 扩展存储过程将使用代理帐户。 代理帐户的 Windows 安全凭据存储在本地安全机构(LSA)机密数据库中。 只有 Windows 管理员才能访问此信息。 因此,如果 SQL Server 启动帐户不是本地管理员组的成员,则用户无法存储或检索 Windows 安全凭据以代理帐户的形式登录,并且 xp_cmdshell 扩展存储过程将失败。 为了使非 sysadmin 用户能够运行 xp_cmdshell 的扩展存储过程,SQL Server 启动帐户必须是本地管理员组的成员。若要为不是 sysadmin 固定服务器角色成员的 SQL Server 登录配置代理帐户,请使用以下方法之一。

方法1:使用 SQL Server 企业管理器

配置 Windows 帐户

若要将 Windows 帐户设置为使非 sysadmin 用户能够执行 xp_cmdshell 的扩展存储过程,请按照下列步骤操作:
  1. 启动 SQL Server 企业管理器。
  2. 在 SQL Server 企业管理器中,展开 " MICROSOFT SQL server",然后展开 " SQL server 组"。
  3. 展开要为其设置代理帐户的 SQL Server 实例。
  4. 展开 " 管理",右键单击 " SQL Server 代理",然后单击 " 属性"。
  5. 在 " SQL Server 代理属性 " 对话框中,单击 " 作业系统 " 选项卡。
  6. 在 " 非 SysAdmin 作业步骤代理帐户" 下,单击以清除 " 仅具有 SysAdmin 权限的用户可以执行 CmdExec 和 ActiveScripting 作业步骤 " 复选框。
  7. 在 " SQL Server 代理的代理帐户" 对话框中,在 " 用户名" 框中键入 Windows 帐户名称。
  8. 在 " 密码 " 框中,键入 Windows 密码。
  9. 在 " " 框中,键入 Windows 帐户所属的域,然后单击 "确定" 两次。

添加 SQL Server 登录帐户

若要添加 SQL Server 登录帐户以授予执行 xp_cmdshell 扩展存储过程的权限,请按照下列步骤操作:
  1. 在 SQL Server 企业版管理器中,展开 "安全性"。
  2. 在 " 登录 " 窗格中,右键单击要向其授予权限的 SQL Server 登录帐户,然后单击 "属性"。注意 如果尚未添加帐户,可以创建一个 Windows 代理帐户作为登录帐户。
  3. 在 " SQL Server 登录属性 " 对话框中,单击 " 数据库访问 " 选项卡。
  4. 在 "指定可由此登录访问的数据库" 列表中,单击以选中master数据库的 "允许" 复选框,然后单击"确定"
  5. 展开 " 数据库",展开 "主控形状",然后单击 " 扩展存储过程"。
  6. 找到并右键单击xp_cmdshell 扩展存储过程,然后单击 "属性"。
  7. 在 " 扩展存储过程属性 " 对话框中,单击 " 权限"。
  8. 单击以选中要为其授予 "执行" 权限的 SQL Server 登录帐户的 EXEC 复选框,然后单击 "确定" 两次。

方法2:运行 Transact-sql 脚本

运行以下 Transact-sql 脚本以使 Windows 帐户能够执行 xp_cmdshell 的扩展存储过程:
-- Set database to master.USE masterGO-- Add a valid Windows account as proxy account.EXECUTE xp_sqlagent_proxy_account N'SET'                        , N'<DomainName>'                        , N'<WindowsAccount>'                        , N'<WindowsPassword>'GO-- Get the proxy account to determine whether it is set up correctly. EXECUTE xp_sqlagent_proxy_account N'GET'GO-- Enable non-system administrators to run the job and to execute xp_cmdshell.EXECUTE msdb..sp_set_sqlagent_properties @sysadmin_only = 0GO
注意 在此脚本中, <DomainName> 是 Windows 帐户所属的域。 <WindowsAccount> 是 Windows 帐户名。 <WindowsPassword> 是 Windows 帐户的密码。 若要添加要授予其执行 xp_cmdshell 扩展存储过程权限的 SQL Server 登录帐户,请运行以下 transact-sql 脚本:
USE masterGO-- Grant database access to the SQL Server login account that you want to provide access.EXEC sp_grantdbaccess '<SQLLogin>'GO-- Grant execute permission on xp_cmdshell to the SQL Server login account.GRANT exec ON xp_cmdshell TO <SQLLogin>GO
注意 在此脚本中, <SQLLogin> 是你希望授予其执行 xp_cmdshell 扩展存储过程的权限的 SQL Server 登录。注意 代理帐户是在其安全上下文中运行 SQL Server 代理作业或命令行命令的 Windows 帐户。 为 SQL Server 代理帐户设置 Windows 帐户时,您必须为该帐户提供 Windows 级别的 "作为批处理作业登录" 用户权限。

参考


有关 xp_cmdshell 扩展存储过程的详细信息,请参阅 SQL Server 联机丛书中的 "transact-sql 参考" 主题。 有关 SQL Server 代理的代理帐户的详细信息,请访问以下 Microsoft 开发人员网络(MSDN)网站:有关如何在代理帐户上设置相应权限的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
283811 2005在 sql server 2000 或 sql server 配置管理器的 sql server 配置管理器中,如何在不使用 SQL 企业管理器的情况下更改 SQL Server 或 SQL Server 代理服务帐户