如果从Windows服务执行,则与SQL Server的连接失败

时间:2015-07-14 22:41:43

标签: c# sql-server teamcity

我有一个小的C#应用​​程序,它会删除并重新创建一个数据库供我的测试运行。此应用在TeamCity中执行,在NT AUTHORITY\SYSTEM用户。

下运行

这是我的申请:

    public void SetupDatabase()
    {
        var childConnectionString = "Server=.\sqlexpress;Database=MyDatabase;Uid=Tester;Pwd=Tester;Trusted_Connection=True;MultipleActiveResultSets=True;";

        var masterConnectionString = "Server=.\sqlexpress;Database=master;Uid=Tester;Pwd=Tester;Trusted_Connection=True;MultipleActiveResultSets=True;";

        Console.WriteLine("Using child connectionString: {0}", childConnectionString);
        Console.WriteLine("Using Master connectionString: {0}", masterConnectionString);

        Console.WriteLine("Connection for master using this user: {0}", GetUser(masterConnectionString)); // <- this one shows NT AUTHORITY\SYSTEM

        Console.WriteLine("Connection for child using this user: {0}", GetUser(childConnectionString)); // <- this one fails saying 
        // Cannot open database "MyDatabase" requested by the login. The login failed.
        // Login failed for user 'NT AUTHORITY\SYSTEM'.
    }

    private string GetUser(string connectionString)
    {
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();

            var command = new SqlCommand("select SYSTEM_USER", connection);

            var reader = command.ExecuteReader();

            while (reader.Read())
            {
                var user = reader.GetString(0);
                return user;
            }
        }
        return "";
    }

我在连接字符串中指定了SQL Server用户名/密码,为什么Login failed for user 'NT AUTHORITY\SYSTEM'?我没有使用Windows身份验证。

足够公平,System帐户无法登录MyDatabase,因为该帐户未在该数据库上设置。

有趣的是 - 当我自己执行相同的应用程序时,我没有例外,我的用户名被打印

Connection for master using this user: MACHINENAME\trailmax
Connection for child using this user: MACHINENAME\trailmax

为什么 - 哦 - 为什么连接字符串中的用户名/密码被忽略并尝试以Windows-Auth身份登录。

P.S。用户Tester已设置在MyDatabase上,当我转到SSMS并使用连接字符串中的凭据时,我可以登录并执行我需要的所有命令。当我从TeamCity运行相同的可执行文件时,会出现问题。

3 个答案:

答案 0 :(得分:3)

从连接字符串中删除trusted_connection=true

答案 1 :(得分:2)

从您的连接字符串中取出Trusted_Connection=True;。这将覆盖任何用户名或密码。

然后考虑一下您的安全架构 - 您真的想要在Windows服务器上进行硬编码和编译登录名和密码吗?

答案 2 :(得分:2)

从连接字符串中删除trusted_connection = true,因为它将覆盖您已配置的用户名。对于Windows服务,它将使用NT AUTHORITY \ SYSTEM。