Мне нужно запустить пакет SSIS2016 из более старого SSIS (другого сервера) из-за расширения устаревшей системы.Пакет нормально работает из агента SQL, но я не могу запустить его с помощью tsql или DTEXEC.Проблема заключается в том, что пакет не может получить доступ к сети, даже если он запущен с повышенными привилегиями (под системным администратором)
- Я могу получить доступ к сетевому диску с учетной записи, на которой запущен пакет (admin)
- Я знаю, что пакет работает нормально, когда запускается из агента Sql под той же учетной записью.
- Пакет работает нормально, когда файл сохраняется в локальной временной папке (как DTEXEC, так и TSQL)
Пакету не удается сохранить файл в сети при запуске с использованием execute SSMS, TSQL или DTEXEC.
DTEXEC /ISSERVER "\SSISDB\XXXX\Exports\package.dtsx" /SERVER "." /Par
"$Package::FilePath(String)";"C:\TEMP"
Из всего, что я прочитал в Интернете, кажется, что единственный способЗапустить пакет SSIS2016 можно с помощью агента SQL и заданий.
Меня удивляет тот факт, что DTEXEC игнорирует контекст безопасности учетной записи, которая выполняет командную строку.Есть ли способ заставить его использовать учетную запись прокси?
Мне трудно поверить, что единственный способ запустить пакет с разрешением на сеть - это использовать агент и задания Sql.
Спасибовы.ps Вот хорошая статья о запущенных пакетах, но она полностью исключает проблему доступа к сети.
РЕДАКТИРОВАТЬ 2019-06-10
Я применил MSSQL2016CU7 и перезапустил сервер.После этого
- Iam может сохранить файл в сеть с помощью команды DTEXEC, запущенной на локальном сервере (зарегистрирован как sysadmin)
- Iam может сохранить файл в сеть с помощью sp, запущенной с локального сервера(зарегистрирован как sysadmin)
- Я не могу сохранить файл на сетевой диск, когда он зарегистрирован как sysadmin на другом компьютере.Ошибка:
Назначение плоского файла не прошло фазу предварительного выполнения и вернул код ошибки 0xC020200E.
Невозможно открыть файл данных ..
есть также предупреждение «Доступ запрещен» в потоке данных, который должен сохранить файл.
Исходный код хранимой процедуры
DECLARE @execution_id BIGINT;
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'package.dtsx',
@execution_id = @execution_id OUTPUT,
@folder_name = N'XXXX',
@project_name = N'Exports',
@use32bitruntime = False,
@reference_id = NULL;
SELECT @execution_id;
DECLARE @var0 SQL_VARIANT = N'\\NETWORK\PATH\Export\test_files';
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id,
@object_type = 30,
@parameter_name = N'FilePath',
@parameter_value = @var0;
DECLARE @var1 SMALLINT = 1;
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id,
@object_type = 50,
@parameter_name = N'LOGGING_LEVEL',
@parameter_value = @var1;
EXEC [SSISDB].[catalog].[start_execution]
@execution_id;
Я также добавил System :: UserName для входа в систему при запускепакета, и я вижу правильный аккаунт.Я предполагаю, что проблема может быть в двойном прыжке, как упоминает @Piotr.Я копаю журналы файлового сервера, чтобы увидеть.
EDIT2 2019-06-10
ОК.После долгих танцев я могу сузить проблему до делегирования выполнения прав пользователя на CIFS.
Что я сделал
- Настройка общего ресурса на компьютере разработчика
- Создание пакета с помощьюscriptask, который пытается создать тестовый файл и получить контекст безопасности вызывающего пользователя WindowsIdentity.GetCurrent (). Name
- Затем я запустил хранимую процедуру с кодом выше в сценарии, который всегда заканчивался отказом в доступе.
Пока я не включил анонимный доступ ( с использованием этой статьи ), пакет не смог сохранить файл.
AFAIK мы включили только делегирование MSSQLSvc kerberos.
Закрытие:
Проблема вызвана поведением каталога SSIS при вызове из TSQL, который получает контекст безопасности пользователя, но для правильной работы при доступе к общим ресурсам netwrok необходимодля настройки делегирования Kerberos для CIFS.
Я не смог сделать это в нашей среде, поэтому вернулся к xp_cmdshell.
ThaВсем спасибо за поддержку.