【问题标题】:How to use sqlcmd.exe in windows-auth no-trust cross-domain scenario?windows-auth不信任跨域场景下如何使用sqlcmd.exe?
【发布时间】:2014-05-08 11:46:26
【问题描述】:

我有一个有点复杂的部署场景需要处理。我有两个域,生产和测试,它们彼此不信任。我正在实现从生产域到测试域的自动化部署,并且测试域中的数据库仅使用 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 不在它连接到的同一台机器上调用,它似乎就可以工作。

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

【问题讨论】:

    标签: sql-server powershell sqlcmd credssp


    【解决方案1】:

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

    【讨论】:

    • 虽然它是一个域环境。只是我们有两个不同的域环境,它们之间没有信任关系。
    • 几乎是一样的。 SQL 登录是必经之路。
    • 由于域没有信任关系,您的域凭据在从一个域跨越到另一个域时毫无意义。这相当于在警察要求您的许可证时因超速和交出您的社会保障卡而被拦下。当然,这是合法身份证件,但不是他可以接受的任何凭据来验证您的身份。
    • 您可以使用 New-PSSession 和来自提供者(例如 Get-Credential)的凭据建立与非信任域的远程会话。我已经编辑了原始帖子以使其更清晰。
    【解决方案2】:

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

    【讨论】:

    • 从 sqlcmd 中省略 -S 使这一切最终对我有用。我花了几个小时试图在计算机 A 上的 Invoke-Command 中执行 sqlcmd -E,目标是计算机 B,这两个计算机不在域中。在我的情况下没有双跳,所以 -Authentication Default 工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2012-03-30
    • 2020-09-30
    • 2023-03-12
    相关资源
    最近更新 更多