0

我有一个有点复杂的部署场景要处理。我有两个域,生产和测试,它们彼此不信任。我正在实现从生产域到测试域的自动化部署,并且测试域中的数据库仅使用 windows 授权。

我们使用 sqlcmd.exe 来部署实际的脚本。我们尝试使用 Invoke-SqlCmd,但它不适合在当前状态下使用,我们不再考虑它。

最初的想法只是使用 powershell 远程连接到测试域中的服务器,使用 Get-Credential 使用凭据进行身份验证。然后我们调用 sqlcmd.exe(使用远程会话的测试域凭据)来执行脚本。但是,我们很快就遇到了这类场景常见的“双跳”场景:不允许远程会话通过 sqlcmd 将凭据传递给 SQL Server。

Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'..

下一个想法是配置我们的数据库服务器以支持 CredSSP,以便远程会话可以通过 sqlcmd 传递其凭据。但是,似乎 sqlcmd.exe 能够检测到 CredSSP 会话并在信任问题时终止。

Sqlcmd: Error: Microsoft SQL Server Native Client 11.0 : Login failed. The login is from an untrusted domain and cannot be used with Windows authentication..

所以最后,我们使用的解决方案是使用 CredSSP 远程访问测试域中的服务器(明确不是数据库服务器),然后使用 sqlcmd 对数据库服务器执行脚本。只要 sqlcmd 不在它连接到的同一台机器上调用,它似乎就可以工作。

不知怎的,我不禁认为我做错了什么,这不应该这么复杂。但是,我似乎无法找到有关此类情况的太多信息。有任何想法吗?

4

2 回答 2

2

Windows 身份验证仅适用于 localhost 或域环境。从不受信任的位置运行 sqlcmd 时,在命令行中使用 SQL 登录名和密码。

于 2014-03-28T20:47:05.150 回答
1

我们终于想通了。答案仍然是使用 Get-Credential 为不信任域收集凭据,然后我们使用 New-PSSession -Authentication CredSSP 打开到 sql server 机器的会话。问题是,因为我们知道我们在目标 sql 服务器上本地执行 sqlcmd.exe,所以我们在命令行中省略了服务器名称,这样我们就可以避免在远程会话中显然调用的安全检查。

于 2014-04-22T17:31:05.823 回答