如果从Windows服务执行连接到SQL Server失败

本文关键字:SQL Server 失败 连接 执行 Windows 服务 如果 | 更新日期: 2023-09-27 18:02:37

我有一个小小的c#应用程序,它掉落并重新创建了一个数据库,供我的测试运行。此应用程序在NT AUTHORITY'SYSTEM用户下运行的TeamCity中执行。

这是我的申请:

    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登录。

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

如果从Windows服务执行连接到SQL Server失败

您设置Trusted_Connection=True,这意味着使用windows身份验证。如果需要SQL身份验证,则设置Trusted_Connection=False

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

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

然后考虑一下你的安全架构——你真的想在你的windows服务中硬编码和编译登录名和密码吗?

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