【问题标题】:xp_regread() returned error 5, 'Access is denied.'xp_regread() 返回错误 5,“访问被拒绝。”
【发布时间】:2015-06-25 01:50:41
【问题描述】:

我正在运行 SQL Server 复制数据库向导。

值得注意的是,Operator 是NT AUTHORITY\SYSTEM,我认为它应该有权运行它想要的任何东西。

我们如何才能为NT AUTHORITY\SYSTEM 授予足够的权限?我已经试过了:

GRANT EXECUTE ON xp_regread TO public
GRANT EXECUTE ON xp_regread TO [NT AUTHORITY\SYSTEM]

并运行以下程序表明它有效。

SELECT
grantee_principal.name AS [Grantee]
, prmssn.permission_name
FROM
sys.all_objects AS xproc
INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=xproc.object_id AND prmssn.minor_id=0 AND prmssn.class=1
INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
WHERE
(xproc.type='X')and(xproc.name=N'xp_regread' and SCHEMA_NAME(xproc.schema_id)=N'sys')

输出:

Grantee                     permission_name
public                      EXECUTE
NT AUTHORITY\SYSTEM         EXECUTE

出现以下错误:

  Event Name: OnError
 Message: An exception occurred while executing a Transact-SQL statement or batch.
StackTrace:    at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReader(String sqlCommand, SqlCommand& command)
   at Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataReader(String query, SqlCommand& command)
   at Microsoft.SqlServer.Management.Smo.DataProvider.SetConnectionAndQuery(ExecuteSql execSql, String query)
   at Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataProvider(StringCollection query, Object con, StatementBuilder sb, RetriveMode rm)
   at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(ResultType resultType, StringCollection sql, Object connectionInfo, StatementBuilder sb)
   at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(SqlEnumResult sqlresult, ResultType resultType)
   at Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(EnumResult result)
   at Microsoft.SqlServer.Management.Smo.SqlServer.GetData(EnumResult erParent)
   at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData()
   at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData(Request req, Object ci)
   at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(Object connectionInfo, Request request)
   at Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(Request req)
   at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetInitDataReader(String[] fields, OrderBy[] orderby)
   at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby)
   at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties)
   at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue)
   at Microsoft.SqlServer.Management.Smo.PropertyCollection.RetrieveProperty(Int32 index, Boolean useDefaultOnMissingValue)
   at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName, Boolean throwOnNullValue, Boolean useDefaultOnMissingValue)
   at Microsoft.SqlServer.Management.Smo.Server.get_InstanceName()
   at Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.MappedLogin.RefreshData()
   at Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.MappedLogin.CheckDirty()
   at Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.TransferObjectsTask.GetDatabaseLogins()
   at Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.TransferObjectsTask.UpdateObjectsToCopy()
InnerException-->xp_regread() returned error 5, 'Access is denied.'
xp_regread() returned error 5, 'Access is denied.'
xp_regread() returned error 5, 'Access is denied.'
StackTrace:    at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteReader(String sqlCommand, SqlCommand& command)
 Operator: NT AUTHORITY\SYSTEM
 Source Name: SQLSERVER2008R2_Transfer Objects Task
 Source ID: {9D0562F4-FCC9-498D-A2A9-FC9E5F3B681B}
 Execution ID: {23FF505D-00D3-4F84-8B9D-D9EC962C78D2}
 Start Time: 2015-04-17 7:23:24 PM
 End Time: 2015-04-17 7:23:24 PM
 Data Code: 0

这是我们需要使用的工具,因为我们无权访问远程服务器,而且导入导出向导失败。

【问题讨论】:

  • GRANT EXECUTE 语句向 SQL Server 中的用户授予执行权限,这并不意味着存在读取注册表值的基础权限。您能否验证NT AUTHORITY\System 登录仍然具有sysadmin 服务器角色?
  • 另外,来自Using the Copy Database Wizard 上的 Microsoft 文档,需要考虑的问题:您必须是源服务器和目标服务器上的 sysadmin 固定服务器角色的成员。。因此,您在源和目标上指定的登录名必须是 sysadmin 角色的成员。请验证他们是否是系统管理员角色的成员。
  • @TT 事实证明,当我安装了一系列 SQL Server 工具(2005、2008、2012、2014)时,我收到了 xp_regread() 错误。需要对源具有sysadmin 权限。相反,复制数据库向导运行并在大约 2 分钟后引发了 xp_regread() 错误。我在事件查看器中发现了错误。当我删除所有 SQL Server 工具并仅安装 2008 R2 时,在我选择源后复制数据库向导阻止了我,抱怨我在源上缺少 sysadminxp_regread() 可能来自其他地方。想法?

标签: sql-server sql-server-2008-r2 ssms


【解决方案1】:

您可能需要将该帐户添加到 sysadmin 服务器角色,以便成员执行每项活动。

对于 2008r2,执行以下命令:

EXEC sp_addsrvrolemember 'NT AUTHORITY\SYSTEM', 'sysadmin';

【讨论】:

  • 有没有办法检查前后?
【解决方案2】:

这是尝试从 SQL Server 更新注册表时遇到的常见错误,并且在 SQL Server 2017 等较新版本中存在一些奇怪且不明显的路径问题。

该错误不是由于 SQL Server 中的安全问题,而是与注册表项权限相关的 Windows 安全问题,因为与运行特定 SQL Server 进程的用户有关。

例如,要从 SQL Server 执行 MSSQL 相关的注册表命令,系统组 NETWORKSERVICE 需要完全控制相关的注册表路径。这是因为 SQL 代理(默认情况下)以该系统组中的用户身份运行。

对于 SQL Server 设置,注册表路径为: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

例如,SQL Server 中设置日志文件大小限制为 1024 KB 的命令如下:

USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
 N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer', 
 N'ErrorLogSizeInKb', REG_DWORD, 1024
GO

还要注意上面截断的路径。实际完整的注册表路径(SQL2017)如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQLServer

xp_instance_regwrite SQL Server 命令自动将版本密钥注入路径。对于 SQL Server 2017,该键是 MSSQL14.MSSQLSERVER

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2017-02-24
    • 2013-06-06
    • 2011-03-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多