如何让非 Windows 系统安全地触发 SQL 作业

How to get non-Windows system to trigger SQL Job securely

我们有一个遗留的 AS400 主机系统,运行 是我们的仓库。我们希望它能够安全地触发 SQL 服务器上的作业,该服务器 运行 是业务的其余部分,以便在两个系统之间实现自动和及时的数据交换。

目前,我们在旧 Windows SQL 2005 服务器上安装了 IBM iSeries Access for Windows 客户端软件。这允许 AS400 在 Windows 盒子上 运行 远程命令。 AS400 使用此客户端软件 运行 在 SQL 2005 服务器盒上执行 dtexec 的批处理文件,然后 运行s 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 安全 类 and/or 数据保护 API (DPAPI) 但我充其量只是一名中级 .NET 程序员,所以这对我来说是一个更糟糕的解决方案。

这一定是将旧主机系统与 SQL 服务器集成的常见问题,所以我假设必须有一个解决方案,允许主机系统调用 SQL 服务器安全的方法。如果不是直接一个Job,运行一个可以触发Job的存储过程。任何不需要在某处以纯文本形式保存的 password/user 名称且不使用 dtexec 的替代方案将不胜感激。

LocalSystem Account "has extensive privileges on the local computer, and acts as the computer on the network."

这意味着您可以通过为 "computer account" 创建登录名来授予它访问远程 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 代理作业进行连接。