2015-04-18 3 views
2

Я запускаю Мастер базы данных копирования SQL Server.xp_regread() вернула ошибку 5, «Доступ запрещен».

Следует отметить, что Оператор 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 

Это инструмент, который мы должны использовать, потому что мы не имеем доступа к удаленному серверу, и потому что мастер импорта-экспорта не выполнен.

+1

Параметр 'GRANT заявления EXECUTE' предоставить права выполнения для пользователя в SQL Server, это не означает, что существуют основные права для чтения значения реестра. Не могли бы вы проверить, что логин 'NT AUTHORITY \ System' по-прежнему имеет роль сервера sysadmin? –

+1

Кроме того, из документа Microsoft по [Использование мастера копирования базы данных] (https://msdn.microsoft.com/en-us/library/ms188664%28v=sql.105%29.aspx), необходимо учитывать следующие вопросы: _Вы должны быть членом фиксированной роли сервера sysadmin как на исходном, так и на целевом серверах. Таким образом, логин, указанный вами как для источника, так и для назначения, должен быть членом роли sysadmin. Проверьте, входят ли они в роль sysadmin. –

+0

@TT Как оказалось, я получил ошибку 'xp_regread()', когда у меня было множество инструментов SQL Server, установленных (2005, 2008, 2012, 2014). С этой медлительностью мне не нужно было 'sysadmin 'привилегии на источник. Вместо этого мастер копирования базы данных запустил и сбросил ошибку 'xp_regread()' примерно через 2 минуты. Я обнаружил ошибку в средстве просмотра событий. Когда я удалил все инструменты SQL Server и установил только 2008 R2, Мастер копирования базы данных заблокировал меня после того, как я выбрал источник, жалуясь, что мне не хватает 'sysadmin' в источнике. 'Xp_regread()' может быть от чего-то другого. Мысли? –

ответ

1

Возможно, вам потребуется добавить учетную запись к роли сервера sysadmin, которая позволяет члену выполнять каждое действие.

Для 2008R2, необходимо выполнить следующую команду:

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