通过JDBC连接到不同域上的SQL Server

3
从Windows使用SQL Server Management Studio(SSMS),我只能按照以下方式连接到不同域上的SQL Server:
C:\> runas /netonly /user:不同域名\a用户名 "C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Ssms.exe -S 一个IP地址"
如何通过JDBC实现此连接?我已经尝试使用Microsoft的sqljdbc 4.2驱动程序和以下连接字符串:
jdbc:sqlserver://一个IP地址:1433;database=MAIN;user=不同域名\\a用户名;password=密码
但是,我收到了以下错误:
com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user '不同域名\a用户名'
这与在SSMS 2012的“连接到服务器”对话框中输入differentDomainName\aUserName作为登录名而没有使用runas启动SSMS时收到的错误相同。
其他信息:JDBC连接将在运行Linux上的应用程序内建立。因此,不幸的是,不能使用runas运行该应用程序。
另一种尝试: 我还尝试使用jTDS 1.3.1和以下连接字符串:
jdbc:jtds:sqlserver://一个IP地址:1433;databaseName=MAIN;domain=不同域名;user=a用户名;password=密码
因为a用户名仅设置为Windows身份验证。不幸的是,这会产生以下异常:
o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool. Followed by java.sql.SQLException: I/O Error: DB server closed connection.
权限信息:我无法修改SQL Server计算机上的任何内容,包括SQL Server内的任何配置。 "a用户名"帐户映射到一个仅具有SQL Server只读Windows身份验证用户的用户。

前一段时间,我在这个答案中用jTDS做了类似的事情。也许它能给你一些尝试其他事情的想法。 - Gord Thompson
谢谢。我无法修改 SQL Server 机器上的任何内容,包括 SQL Server 中的任何配置。该用户被设置为只读用户。我尝试使用您提供的代码片段(将 IP 地址、用户名和密码替换为我的环境),但仍然收到 OP 中指出的相同 SQL 异常。 - James
请参考此SO帖子,其中描述了Windows身份验证以及所需的.jar/.dll文件。此外,考虑将用户名和密码作为参数传递(而不是在连接字符串中):DriverManager.getConnection(connectionStr, user, password) - Parfait
@Parfait - 谢谢,但请注意在原帖中注明你所引用的帖子中提供的解决方案由于两个原因不适用:1)该应用程序需要在Linux上运行。2)即使该应用程序正在Windows上运行(实际并非如此),该应用程序也需要使用与运行应用程序的用户不同的用户进行DB身份验证。 - James
也许您可以在Microsoft SQL Server JDBC驱动程序中使用Kerberos身份验证? - Mark Rotteveel
我尝试使用Kerberos身份验证,使用https://msdn.microsoft.com/en-us/library/gg558122(v=sql.110).aspx#Anchor_5。但好像无法正常工作。该链接提到运行查询。当我尝试时,收到错误消息“用户没有执行此操作的权限”。我有另一个具备更多权限的用户运行了它并收到了NTLM作为`auth_scheme`。您能否提供更多细节(作为答案)以说明如何使用它,以及根据运行该查询是否知道我的用户是否可以使用它? - James
1个回答

0

当您连接MS JDBC驱动程序时,您不需要为用户指定密码(至少不在您提供的连接字符串中)。如果您打算使用集成安全性,则应在连接字符串中指示此选项,但是您的进程必须已经通过验证,例如differentDomainName\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驱动程序都试过了,但作为参数。我已经更新了原始帖子来说明这一点。我知道SQL Server身份验证可以工作,但我没有那个选项。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接