我有这样的 C# (.NET 4.5) 代码(为演示而简化)用于连接到 SQL Server 2012 数据库:
public static void Test(WindowsIdentity ident)
{
using (WindowsImpersonationContext ctx = ident.Impersonate())
{
using (SqlConnection con = new SqlConnection("Data Source=MyServer;Initial Catalog=MyDatabase;Persist Security Info=False;Integrated Security=SSPI;Network Library=dbmssocn"))
{
con.Open();
}
ctx.Undo();
}
}
该Open()
方法每次都会抛出以下异常:
System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:TCP 提供者,错误:0 - 由于目标机器主动拒绝,无法建立连接。)
模拟是成功的,因为如果我像这样添加跟踪:
public static void Test(WindowsIdentity ident)
{
using (TextWriterTraceListener listener = new TextWriterTraceListener(@"C:\temp\trace.log"))
{
using (WindowsImpersonationContext ctx = ident.Impersonate())
{
listener.WriteLine("Impersonated");
using (SqlConnection con = new SqlConnection("Data Source=MyServer,MyPort;Initial Catalog=MyDatabase;Persist Security Info=False;Integrated Security=SSPI;Network Library=dbmssocn"))
{
listener.WriteLine("About to open connection; WindowsIdentity.GetCurrent().Name = " + WindowsIdentity.GetCurrent().Name);
con.Open();
}
ctx.Undo();
listener.WriteLine("Impersonation undone");
}
}
}
我明白了:
Impersonated
About to open connection; WindowsIdentity.GetCurrent().Name = MyDomain\MyUser
如果我将完全相同的连接字符串放在 .udl 文件中,在同一台机器上的相同“MyDomain\MyUser”帐户下运行它,然后单击测试连接,它会成功。既然是这种情况,我只是不明白问题可能是防火墙或任何类似性质的东西。有谁知道可能出了什么问题?我无权登录数据库服务器本身,因此此时我无法检查其事件日志(等)。