簡體   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