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

Представьте себе следующий сценарий: мне нужно выполнить хранимую процедуру, которая, помимо прочего, должна выполнить EXECUTE 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), но не получили ответов - в надежде на лучший результат здесь

2 ответа

Решение

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

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

Другие вопросы по тегам