繁体   English   中英

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

[英]Connection to SQL Server fails if executed from a Windows Service

我有一个小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

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

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

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

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

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

然后考虑一下您的安全体系结构-您真的要硬编码并将登录名和密码编译到Windows服务中吗?

从连接字符串中删除trusted_connection = true,因为它将覆盖您配置的用户名。 如果是Windows Services,它将使用NT AUTHORITY \\ SYSTEM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM