C# 如果从Windows服务执行,与SQL Server的连接将失败
我有一个小小的C#应用程序,可以删除并重新创建一个数据库,让我的测试运行。此应用程序在TeamCity中执行,在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
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服务中吗?TakeTrusted\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