Вопрос:
У меня есть прокси-пользователь, которого я пытаюсь добавить к роли, которая может выполнять все хранимые процедуры. Используя другие сообщения StackOverflow, мне удалось собрать этот script
USE abc Create ROLE db_exec go GRANT EXECUTE TO db_exec go EXEC sp_addrolemember ‘db_exec’, ‘abc_user’ go
Когда я пытаюсь запустить мои хранимые процедуры, я все равно получаю эту ошибку за мою обработку ошибок.
Разрешение EXECUTE было отклонено для объекта ‘sp_OACreate’, базы данных ‘mssqlsystemresource’, schema ‘sys’.
Что я могу сделать, чтобы abc_user выполнить sp_OACreate?
Лучший ответ:
Помимо роли sysadmin, вам также необходимо предоставить разрешение на выполнение в основной базе данных, где эти процедуры фактически находятся
use master go grant exec on sp_OACreate to abc_user GO
После запуска вы можете подтвердить следующее: у вас есть разрешение на выполнение процедуры
SELECT * FROM master.sys.database_permissions [dp] JOIN master.sys.system_objects [so] ON dp.major_id = so.object_id JOIN master.sys.sysusers [usr] ON usr.uid = dp.grantee_principal_id AND usr.name = ‘abc_user’ WHERE permission_name = ‘EXECUTE’ AND so.name = ‘sp_OACreate’ Ответ №1
В приведенных ниже ответах мы, как правило, стараемся не предоставлять разрешение sysadmin любому пользователю, когда это возможно. В этом случае я обнаружил, что для запуска sp_OACreate вам действительно не нужна роль sysadmin.
Я запустил следующее:
use master grant exec on sp_OACreate to yourSecObject grant exec on sp_OADestroy to yourSecObject —Optional grant exec on sp_OAMethod to yourSecObject
В моих целях мне понадобился шаг очистки, поэтому пользователю потребовались создание и уничтожение.
Я надеюсь, что это поможет всем, кто хочет дать возможность запускать эти процедуры, но не хочет, чтобы у пользователя был полный доступ к БД ко всем другим базам данных на сервере.
-Скотт
Ответ №2
В случае следующих ошибок:
The EXECUTE permission was denied on the object ‘xp_cmdshell’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OACreate’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OAMethod’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OAMethod’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OAMethod’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OAGetProperty’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OAGetProperty’, database ‘mssqlsystemresource’, schema ‘sys’. The EXECUTE permission was denied on the object ‘sp_OADestroy’, database ‘mssqlsystemresource’, schema ‘sys’. Содержание
- Включить процедуру xp_cmdshell
- Разрешить пользователю выполнять хранимые процедуры
- Проверьте, установлены ли права на выполнение
Включить процедуру xp_cmdshell
это, вероятно, уже было выполнено в этот момент, так что это только для справки:
EXEC sp_configure ‘show advanced options’, 1 GO RECONFIGURE GO EXEC sp_configure ‘xp_cmdshell’, 1 GO EXEC sp_configure ‘show advanced options’, 0 GO RECONFIGURE GO
Разрешить пользователю выполнять хранимые процедуры
use [master] GO GRANT EXECUTE ON [sys].[xp_cmdshell] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OACreate] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OADestroy] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OAGetErrorInfo] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OAGetProperty] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OAMethod] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OAStop] TO [DOMAINusername]; GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [DOMAINusername]; GO
Проверьте, установлены ли права на выполнение
SELECT * FROM master.sys.database_permissions [dp] JOIN master.sys.system_objects [so] ON dp.major_id = so.object_id JOIN master.sys.sysusers [usr] ON usr.uid = dp.grantee_principal_id AND usr.name = ‘DOMAINusername’ WHERE permission_name = ‘EXECUTE’ AND (so.name = ‘xp_cmdshell’ OR so.name = ‘sp_OACreate’ OR so.name = ‘sp_OADestroy’ OR so.name = ‘sp_OAGetErrorInfo’ OR so.name = ‘sp_OAGetProperty’ OR so.name = ‘sp_OAMethod’ OR so.name = ‘sp_OAStop’ OR so.name = ‘sp_OASetProperty’)