Нужен безопасный способ предоставления доступа к 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?