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

C# 如果从Windows服务执行,与SQL Server的连接将失败,c#,sql-server,teamcity,C#,Sql Server,Teamcity,我有一个小小的C#应用程序,可以删除并重新创建一个数据库,让我的测试运行。此应用程序在TeamCity中执行,在NT AUTHORITY\SYSTEMuser下运行 这是我的申请表: public void SetupDatabase() { var childConnectionString = "Server=.\sqlexpress;Database=MyDatabase;Uid=Tester;Pwd=Tester;Trusted_Connection=Tr

我有一个小小的C#应用程序,可以删除并重新创建一个数据库,让我的测试运行。此应用程序在TeamCity中执行,在
NT AUTHORITY\SYSTEM
user下运行

这是我的申请表:

    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 "";
    }
Why oh Why是忽略连接字符串中的用户名/密码,并尝试以Windows身份登录


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

从连接字符串中删除
受信任的\u连接=true

从连接字符串中删除
受信任的\u连接=true
获取
受信任的\u连接=true超出您的连接字符串。这将覆盖任何用户名或密码


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

Take
Trusted\u Connection=True超出您的连接字符串。这将覆盖任何用户名或密码



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

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

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

您设置了
Trusted\u Connection=True
,这意味着使用Windows身份验证。如果需要SQL身份验证,请设置
Trusted\u Connection=False

您设置的
Trusted\u Connection=True
,这意味着使用windows身份验证。如果您想要SQL身份验证,那么将
可信连接设置为False

真不敢相信这就这么简单!调试花了我几个小时。非常感谢。还要注意MultipleActiveResultSets=True。您应该只在真正打开多个嵌套读卡器时使用。从未考虑过这一点,只是从其他项目复制了连接字符串并更改了凭据。我会换的。谢谢有4个正确且非常相似的答案。所以我接受了第一个提交的。我会全部接受的,但这是不允许的-(真不敢相信这么简单!调试花了我几个小时。谢谢!还要小心MultipleActiveResultSets=True。您应该只在真正打开多个嵌套读卡器时使用。从未考虑过这一点,只是从其他项目复制了连接字符串并更改了凭据。我会更改它。谢谢!有4个正确且非常相似的lar答案。所以我接受了第一个提交的答案。我会接受所有答案,但这不允许-(成功了!真不敢相信我没有玩过这个!关于架构-实际的代码更复杂。这里只显示了一个最小的可复制片段。有4个正确且非常相似的答案。因此我接受了第一个提交的答案。我会全部接受,但这不允许-(这很好,没问题……我很好奇为什么你不想使用服务帐户凭据进行连接,但显然这比我看到的要复杂。你是说在SQL Server中使用Windows Auth?主要是出于安全原因-这是在生成服务器上执行的,我不想意外删除错误的数据库-每个项目都有自己的数据库wi他们自己的SQL-user。因此,您可能有100个项目数据库和100个SQL用户,将这些用户创建为windows用户是不现实的。这很管用!真不敢相信我没有玩过这个!关于体系结构-实际代码更复杂。这里只显示一个最小的可复制片段。有4个正确且非常相似的答案.所以我已经接受了第一个提交的。我会接受所有的,但这是不允许的-(这很好,没问题……我很好奇为什么你不想使用服务帐户凭据进行连接,但显然这比我看到的要复杂。你是说在SQL Server中使用Windows Auth?主要是出于安全原因-这是在生成服务器上执行的,我不想意外删除错误的数据库-每个项目都有自己的数据库wi他们自己的SQL-user。因此,您可能有100个项目数据库和100个SQL用户,将这些用户创建为windows用户是不现实的。真不敢相信这这么简单!我花了几个小时进行调试。谢谢!有4个正确且非常相似的答案。因此我接受了第一个提交的答案。谢谢!真不敢相信这是那么简单e!我花了几个小时调试。谢谢!有4个正确且非常相似的答案。所以我已经接受了第一个提交的答案。谢谢!真不敢相信这这么简单!我花了几个小时调试。谢谢!有4个正确且非常相似的答案。所以我已经接受了第一个提交的答案。我本来会接受所有答案的,但如此不允许这样-(不敢相信这是如此简单!我花了数小时调试。谢谢!有4个正确且非常相似的答案。因此我接受了第一个提交的答案。我会接受所有答案,但不允许这样做-(
Connection for master using this user: MACHINENAME\trailmax
Connection for child using this user: MACHINENAME\trailmax