Как заставить систему, отличную от Windows, безопасно запускать задание SQL - PullRequest
1 голос
/ 23 мая 2019

У нас есть устаревшая хост-система AS400, которая работает на нашем складе.Мы хотим, чтобы он безопасно запускал задания на сервере SQL, на котором работает остальная часть бизнеса, чтобы обеспечить автоматический и своевременный обмен данными между двумя системами.

В настоящее время у нас установлено клиентское программное обеспечение IBM iSeries Access для Windows, установленное настарый сервер Windows SQL 2005Это позволяет AS400 запускать удаленные команды в окне Windows.AS400 использует это клиентское программное обеспечение для запуска пакетных файлов, которые выполняют dtexec на сервере SQL 2005, который затем запускает пакеты служб SSIS, которые обмениваются данными между AS400 и производственными серверами SQL.Блок SQL 2005 просто действует как переход между AS400 и производственными серверами SQL.Две проблемы с этой настройкой:

  1. Программное обеспечение клиента AS400 запускается как системный процесс, а не как сетевая учетная запись, поэтому информация для входа в SQL должна быть включена в простой текст в SSISфайлы.

  2. При запуске dtexec он добавляет две записи в журнал событий Windows.У нас есть несколько процессов, которые опрашивают новые данные каждые несколько минут или в некоторых случаях секунды, поэтому журнал событий последовательно удаляет старые записи, что оставляет около 4 часов событий.Сказать, что это затрудняет поиск и устранение ошибок в этом окне, было бы преуменьшением.

Мы выводим из эксплуатации старую коробку сервера SQL 2005, поэтому я должен повторить эту функцию на более новом сервере.Я хочу решить эти два вопроса, прежде чем сделать это.

Я пытался использовать sqlcmd, но, поскольку программное обеспечение клиента AS400 работает в локальном системном процессе, оно не может подключиться к рабочим серверам SQL, которые настроены в режиме аутентификации Windows.Я попытался использовать psexec, который работает, если я оставляю сеанс RDP открытым для пользователя, но ему все равно нужно, чтобы имя пользователя и пароль были в виде простого текста.Я проверял, что пакетный файл записывает пустой каталог в каталог и что задание SQL запускается событием WMI.В тестировании это работает, но ненадежно, когда задание должно быстро запускаться несколько раз подряд, как и в большинстве наших заданий.

Я также изучал использование C # и .NET для храненияпароль с использованием классов безопасности Windows и / или API защиты данных (DPAPI), но я в лучшем случае являюсь промежуточным программистом .NET, поэтому для меня это худший вариант решения.

Это должно быть распространенной проблемой при интеграциистарые хост-системы с SQL Server, поэтому я предполагаю, что должно быть решение, позволяющее хост-системе вызывать SQL-сервер безопасным способом.Если не задание напрямую, запустите хранимую процедуру, которая может запустить задание.Любая альтернатива, которая не требует пароля / имени пользователя, сохраненного где-либо в виде простого текста и не использующего dtexec, будет принята с благодарностью.

1 Ответ

2 голосов
/ 24 мая 2019

Учетная запись LocalSystem"имеет широкие привилегии на локальном компьютере и действует как компьютер в сети."

Это означает, что вы можете предоставить ему доступ к удаленным SQL-серверам, создав логин для «учетной записи компьютера». Если ваш сервер называется MyServer, а домен - MyDomain, тогда:

use msdb
create login [MyDomain\MyServer$] from windows
create user [MyDomain\MyServer$] for login [MyDomain\MyServer$] 
alter role SQLAgentOperatorRole add member [MyDomain\MyServer$] 

И процесс, выполняющийся как LocalSystem на другом сервере, сможет подключаться через встроенную аутентификацию Windows и запускать задания агента SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...