Назад | Перейти на главную страницу

Нужен безопасный способ предоставления доступа к xp_cmdshell

Представьте себе следующий сценарий: мне нужно выполнить хранимую процедуру, которая, помимо прочего, должна ВЫПОЛНИТЬ xp_cmdshell для запуска сценария командной строки, который выполняет команду массовой вставки (bcp) для помещения данных в другую базу данных.

У меня на сервере три учетных записи пользователя Windows: MyAdmin, MyProxy и MyUser.

MyAdmin - это db_owner базы данных и роль сервера bulkadmin. MyProxy - это учетная запись, связанная с xp_cmdshell через sp_xpcmdshell_proxy_account. MyUser имеет разрешение EXECUTE для хранимой процедуры и ничего больше.

Если я вхожу в систему как SERVER \ MyUser и выполняю хранимую процедуру, происходит сбой с ошибкой «В разрешении EXECUTE было отказано для объекта« xp_cmdshell », базы данных« mssqlsystemresource », схемы« sys ».

Итак, я подумал, что ответ - предоставить EXECUTE на xp_cmdshell в MyProxy, но это тоже не сработало. Затем я предоставил EXECUTE на xp_cmdshell на MyAdmin и изменил определение хранимой процедуры на WITH EXECUTE AS 'MyAdmin' и хотя xp_cmdshell выполняется нормально, массовая вставка не выполняется.

Что мне нужно сделать, чтобы этот сценарий заработал?

Обновление: был задан на StackOverflow.com (1440332), но не получил ответов - надеемся на лучший результат здесь

Я бы сделал это комментарием вместо «ответа», если бы у меня было на это разрешение, но почему бы не использовать команду BULK INSERT T-SQL вместо xp_cmdshell для bcp?

Кажется, я помню шаг BCP в SSIS. Не могли бы вы создать пакет SSIS и запустить его? Вы можете запускать пакеты SSIS из .net.