我有一个小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
关于c# - 如果从Windows服务执行,则与SQL Server的连接失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31418645/