我有一个复杂的部署方案需要处理。我有两个域,生产和测试,彼此之间没有信任。我实现了从生产域到测试域的自动部署,测试域中的数据库仅使用Windows授权。
我们使用sqlcmd.exe来部署实际的脚本。我们尝试过使用Invoke-SqlCmd,但它不适合在当前状态下使用,我们不再考虑它了。
最初的想法是使用PowerShell远程连接来连接到测试域中的服务器,使用Get-Credential通过凭据进行身份验证。然后我们调用sqlcmd.exe(使用远程会话的测试域凭据)来执行脚本。但是,我们很快就遇到了“双跳”#34;这些类型的方案通用的方案:不允许远程会话通过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没有在它连接的同一台机器上调用,它似乎可以工作。
不知怎的,我可以帮助但是认为我做错了什么,而且这不应该那么复杂。但是,我似乎无法找到有关这些情况的大量信息。有什么想法吗?
答案 0 :(得分:2)
Windows身份验证仅适用于localhost或域环境。从不受信任的位置运行sqlcmd时,在命令行中使用SQL登录名和密码。
答案 1 :(得分:1)
我们终于弄明白了。答案仍然是使用Get-Credential收集不信任域的凭据,然后我们使用New-PSSession -Authentication CredSSP打开与sql server机器的会话。问题在于,因为我们知道我们在目标sql服务器上本地执行sqlcmd.exe,所以我们从命令行中省略了服务器名称,以便我们避免在远程会话中显然调用的安全检查。 / p>