Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在客户端控制台应用程序中,在何处保存SQL Server连接字符串?_C#_Sql_Sql Server_Console Application - Fatal编程技术网

C# 在客户端控制台应用程序中,在何处保存SQL Server连接字符串?

C# 在客户端控制台应用程序中,在何处保存SQL Server连接字符串?,c#,sql,sql-server,console-application,C#,Sql,Sql Server,Console Application,我正在创建一个windows控制台应用程序来监视用户的出席情况。 当用户登录到其计算机(连接到网络)时,应在SQL Server数据库中更新windows登录时间 所有客户端计算机都使用网络连接 问题是我将在哪里将数据库连接字符串保存到服务器?如果我将连接字符串(加密)保存在客户端应用程序中运行的控制台应用程序中,那么如果几个月后服务器名称/用户名/密码发生更改,就会产生问题 请建议解决此问题的最佳方法。您应该将app.config文件添加到项目中,并在其中存储连接字符串 Project--&g

我正在创建一个windows控制台应用程序来监视用户的出席情况。 当用户登录到其计算机(连接到网络)时,应在SQL Server数据库中更新windows登录时间

所有客户端计算机都使用网络连接

问题是我将在哪里将数据库连接字符串保存到服务器?如果我将连接字符串(加密)保存在客户端应用程序中运行的控制台应用程序中,那么如果几个月后服务器名称/用户名/密码发生更改,就会产生问题


请建议解决此问题的最佳方法。

您应该将app.config文件添加到项目中,并在其中存储连接字符串

Project-->Add->New Item-->Application Configuration File
将连接字符串添加为

<connectionStrings>
  <add connectionString="test" name="test"/>
</connectionStrings>
但是,密码存储在连接字符串中呢?事实上,您的整个连接字符串都应该加密,并且考虑到MS也提供了一个内置的解决方案。你需要仔细看看这个


注意:您必须在项目中添加对
系统配置的引用
您确实可以将其存储在应用程序配置文件中(有关详细信息,请参阅@NoOne's)。但是,请注意,您可能不应该将用户名和密码存储在那里

您有以下选项:

(a)
连接字符串
配置部分。正如您所发现的,这有一些管理“问题”

(b) 不存储用户名和密码,而是在运行时向用户查询;可以选择允许将它们指定为命令行参数——尽管这有其自身的问题:使用任务管理器或process Explorer等process viewer工具可以看到这些参数(以及用户名/密码)

(c) 查看是否可以将连接凭据从用户名/密码更改为集成安全性(因此不需要将用户名/密码放在连接字符串中,因此不需要放在配置文件中)

方案(c)是最好的。它完全消除了用户名(更重要的是)密码的必要性。但是,您的应用程序(和环境)必须为此做好准备(更多)

如果选择选项(b),则可以在配置中指定连接字符串,而无需使用
User
Password
键。您可以让用户指定它们,然后利用(或
DbConnectionStringBuilder
)类构建一个真正的连接字符串以供进一步使用:


让客户端控制台应用程序将数据发送到服务器上运行的某个对象。让服务器应用程序与数据库对话。这样,只需在该服务器上进行维护,而不是在每个客户端上进行维护。@DanBracuk是正确的,但基本问题仍然存在:客户端应该有一些“身份”,需要在实际执行任何请求之前由服务器验证。@Christian.K,可以使用客户端的windows用户名验证客户端身份。原则上是的,请参阅我回答中的“集成安全”选项。但是,如果您想采用不同的体系结构方法(如@DanBracuk所暗示的那样),您应该问一个新问题。@Dan Bracuk,您能就“服务器上运行的东西”提出建议吗?正如您所说,选项(c)是最好的。但在我的场景中,我的客户端计算机不少于3000台。我认为,为所有用户提供对我的表的读取权限不是一个好的选择。你可以将他们放入Windows组并授予这些访问权限。至少这会使它更易于管理。但是,正如已经对问题本身所作的评论,您可能需要考虑一种完全不同的方法:简而言之,提供一个代表实际数据库工作的应用程序服务。然后,您将使用(3000)个用户帐户对此服务进行身份验证。服务本身将使用(单个)技术用户对SQL Server实例进行身份验证。
string connectionString = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
 var builder = new SqlConnectionStringBuilder(
    ConnectionManager.ConnectionStrings["test"].ConnectionString);
 builder.UserID = /* Username specified by user */
 builder.Password = /* Password specified by user */

 string realConnectionString = builder.ConnectionString;