【问题标题】:Connect to SQL Server on a different domain via JDBC通过 JDBC 连接到不同域上的 SQL Server
【发布时间】:2016-07-18 22:49:03
【问题描述】:

从使用 SQL Server Management Studio (SSMS) 的 Windows 中,我只能连接到不同域中的 SQL Server,如下所示:

C:\> runas /netonly /user:differentDomainName\aUserName "C:\Program Files (x86 )\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Ssms.exe -S anIpAddress"

如何通过 JDBC 完成此连接?我尝试在 Microsoft 的 sqljdbc 4.2 驱动程序中使用以下连接字符串:

jdbc:sqlserver://anIpAddress:1433;database=MAIN;user=differentDomainName\\aUserName;password=pass

我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'differentDomainName\aUserName'

如果我在不使用 runas 的情况下启动 SSMS 并在 SSMS 2012 的“连接到服务器”对话框中为登录名键入了 differentDomainName\aUserName,这与我收到的错误相同。

附加信息:JDBC 连接将在 Linux 上运行的应用程序中建立。因此,不幸的是,使用runas 运行应用程序不是一种选择。

另一个尝试: 我还尝试使用带有以下连接字符串的 jTDS 1.3.1:

jdbc:jtds:sqlserver://anIpAddress:1433;databaseName=MAIN;domain=differentDomainName;user=aUserName;password=pass

因为 aUserName 仅用于 Windows 身份验证。不幸的是,这会产生以下异常:

o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool. 其次是 java.sql.SQLException: I/O Error: DB server closed connection.

权限信息:我无法修改 SQL Server 机器上的任何内容,包括 SQL Server 中的任何配置。 “aUserName”帐户映射到 SQL Server 只读 Windows 身份验证用户。

【问题讨论】:

  • 前段时间我为this answer做了类似的事情。也许它会给你一些想法来尝试其他的事情。
  • 谢谢。我无法修改 SQL Server 机器上的任何内容,包括 SQL Server 中的任何配置。用户被设置为只读用户。我尝试使用您提供的代码 sn-p(替换为我的环境的 IP 地址、用户名和密码),但仍然收到 OP 中记录的相同 SQL 异常。
  • 请参考这个SO post 描述windows 身份验证以及所需的.jar/.dll 文件。另外,考虑将用户名和密码作为参数传递(不在连接字符串中):DriverManager.getConnection(connectionStr, user, password)
  • @Parfait - 谢谢,但请在 OP 中注意,您引用的帖子中提供的解决方案将不起作用,原因有两个 1) 应用程序需要在 Linux 中运行。 2) 即使应用程序在 Windows 中运行(但不是),应用程序也需要使用与运行应用程序的用户不同的用户进行 DB 身份验证。
  • 也许您可以在 Microsoft SQL Server JDBC 驱动程序中使用 Kerberos 身份验证?

标签: sql-server jdbc network-programming


【解决方案1】:

当您使用 MS JDBC 驱动程序连接时,您不指定用户的密码(至少不在您提供的连接字符串中)。如果您打算使用集成安全性,您应该在连接字符串中指出这一点,但是您的进程必须已经针对不同的DomainName\aUserName

进行了身份验证

集成安全性和 JDBC: https://msdn.microsoft.com/en-us/library/ms378428%28v=sql.110%29.aspx?f=255&MSPPError=-2147217396#Connectingintegrated

由于您的计划是从 linux 访问 SQL 服务器,我怀疑您是否可以为该场景使用集成安全性,因此您应该计划在连接字符串中提供密码。我不确定您是否可以在连接字符串中为域用户提供用户名/密码(我认为可以),但是如果您切换到具有 SQL Server 身份验证的用户,它肯定会起作用。这应该是一个备用选项,因为 SQL Server 身份验证不太安全。

【讨论】:

  • 你是对的,因为我正在尝试从 Linux 进行身份验证。因此,我不想使用集成安全性。我需要按照您的建议提供密码。我用 jTDS 和 MS 驱动程序做到了这一点,但作为一个参数。我已经更新了 OP 以表明这一点。我知道 SQL Server 身份验证会起作用,但我没有那个选项。
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多