您好我在使用SMO时注意到一些奇怪的行为,并且想知道是否有人可以对此提供一些见解;当我第一次调用Server.JobServer属性时(在这种情况下,只是调用.ToString(),这可能是懒惰在后台初始化它)我发现它影响了我的SQL连接字符串 - 特别是密码已经消失!
以下是我用来产生此行为的代码:
SqlConnection conn = new SqlConnection(@"Data Source=myserver;Initial Catalog=Stage;user=myuser;password=abc;");
ServerConnection serverConn = new ServerConnection(conn);
Server server = new Server(serverConn);
Console.WriteLine(conn.ConnectionString);
server.JobServer.ToString();
Console.WriteLine(conn.ConnectionString);
这个的输出是 Data Source = myserver; Initial Catalog = Stage; user = myuser; password = abc; Data Source = myserver; Initial Catalog = Stage; user = myuser;
帐户myuser配置了public和sysadmin SQL Server角色,并且在master和msdb上有dbo。任何人都可以提供任何有关为何发生这种情况的见解或线索吗?
答案 0 :(得分:0)
这是设计的。与OLE DB或ADO不同,SqlConnection.ConnectionString返回的连接字符串与用户设置的ConnectionString相同,如果Persist Security Info值设置为false(默认值),则减去安全信息。除非将Persist Security Info设置为true,否则SQL Server的.NET Framework数据提供程序不会在连接字符串中保留或返回密码。
Microsoft strongly recommends将Persist Security Info保留为false。如果在建立连接时提供用户标识和密码,则在使用该信息打开连接然后丢弃时,您将受到最大程度的保护。如果要向不受信任的源提供打开的连接或将连接信息持久保存到磁盘,则这一点尤为重要。将Persist Security Info保持为false有助于确保不受信任的源无法访问连接的安全敏感信息,还有助于确保没有安全敏感信息通过连接字符串信息持久保存到磁盘。