【问题标题】:How Can I Store Program Settings?如何存储程序设置?
【发布时间】:2009-12-04 19:32:27
【问题描述】:

我正在创建一个桌面应用程序,它将位于 PC 上,并偶尔检查网络服务器以获取各种设置的更新。

程序会经常使用这些设置,所以我想将设置缓存在 PC 上的文件中,这样它就不必经常访问服务器。有很多设置。我正在考虑将它们存储在 XML 文件中,但我需要 PC 用户无法读取该文件。

我应该如何将程序可以读写但用户无法读取的设置存储在PC上?

编辑:对不起,伙计们。该应用程序是使用 .NET 2.0 用 C# 编写的。该应用程序将仅在 Windows 上运行。它是一个控制台应用程序,将作为 Windows 服务运行。

【问题讨论】:

  • 编程语言?操作系统?来吧,给我们一个机会! :)
  • 范围是多少?您需要设置为每台机器还是每用户?
  • 为什么要阻止用户查看或更改设置?
  • 我不想听到“因为设置包含服务器的超级机密密码!”
  • 这是雇主的申请。用户将是员工。雇主将能够通过基于 Web 的界面更改设置,该界面将管理机器网络中的所有设置。 PC 上的文件将只是该 PC 的本地缓存。

标签: c# windows configuration storage


【解决方案1】:

假设您的目标是 Windows 平台,您可以

  • 使用注册表
  • 使用配置文件
  • 或使用数据库

如果需要,可以在所有 3 种情况下对数据进行加密。如果你真的有很多设置,注册表可能不是最简单的方法。如果您有一个 .net 应用程序,请查看 SQL Server Compact Edition,它非常轻量级,易于与您的应用程序一起部署,并且不需要运行时环境。

【讨论】:

    【解决方案2】:

    如果应用是服务,那么它可以在不属于用户的帐户下运行;那么很容易让他隐藏文件。

    作为 Windows 应用程序,您可以选择注册表、文件或本地数据库。对于文件,您可以选择简单的属性文件或 XML 文件。

    对于其中任何一个,您可以选择是否加密(以防万一)。

    【讨论】:

      【解决方案3】:

      如果它在最终用户的机器上,他们迟早可以阅读它。如果程序在他们的本地机器上运行,那么他们可以让它做任何他们想做的事情。如果这是某种客户端-服务器程序,您根本无法相信客户端所说的话。

      在 .Net 中存储设置的最简单方法之一是创建一个包含您要跟踪的所有内容的类,然后将其序列化到磁盘或从磁盘序列化。由于此文件仅用作缓存,因此您可能只使用二进制格式化程序,这将使文件只有知道自己在做什么的人才能读取。

      确保将设置保存在对 UAC 友好的目录中,例如 ApplicationData

      【讨论】:

      • 克里斯,我喜欢你的想法,但我可能仍会加密数据。谢谢。
      【解决方案4】:

      您可以像这样在 xml 中编写应用程序配置

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
          <appSettings>
              <add key="Test1" value="My value 1" />
              <add key="Test2" value="Another value 2" />
          </appSettings>
      </configuration>
      

      【讨论】:

        【解决方案5】:

        无论您是否将这些设置存储在本地,如果您将它们加载到内存中,用户就可以读取它们。如果您通过网络传输它们,扫描网络数据包非常简单,即使通过加密连接,也有很多工具可以为您管理您自己的网络连接(我已经使用 OpenSTA ,即使它并非完全适合它)。如果您在他们的计算机上运行某些东西,那么真正非常想查看您用于设置的内容的人将能够看到它们。

        现在,话虽如此,将它们保存在 XML 中并仅加密文件可能是最简单的解决方案。即使只是压缩文件并更改扩展名,也会让那些只是好奇你有什么设置的人望而却步。

        【讨论】:

          【解决方案6】:

          在 C#.net 中设置非常简单。可以通过项目的属性页(设置选项卡)来创建设置文件。然后如果你真的想,你可以拿起设置文件和encrypt the root xml element either with symmetric or asymmetric keys

          然后,正如其他人所提到的,让用于编辑设置的键和例程不在用户手中是另一个问题。您可以将设置发送到存在私钥的服务器,只保留客户端上的公钥进行解密,让服务器进行加密/签名。任何篡改客户端上的设置,您都会知道,因为签名会失败。因此,如果您将设置保存在本地,那么用户没有一点代码就无法读取它们,您只能解密它们才能使用它们;写入/创建将由服务器完成。

          【讨论】:

            【解决方案7】:

            您对 xml 配置的想法是一个好的开始(XML DOM 易于导航、广为人知、记录在案等)。

            如果您不希望用户能够读取/编辑设置,您可以将其保存在内存中,但您会丢失运行中的数据。您似乎没有表明该应用程序将重新启动,因此这可能对您有用。还可以选择检测应用程序何时关闭,然后您可以将缓存转储到磁盘。

            【讨论】:

              【解决方案8】:

              您担心用户阅读或修改文件?

              无论如何 - 您可以使用随机密钥对其进行加密并将密钥埋在注册表中的某个位置

              【讨论】:

                猜你喜欢
                • 2011-07-05
                • 1970-01-01
                • 2021-07-26
                • 2016-09-13
                • 1970-01-01
                • 1970-01-01
                • 2016-08-07
                • 2012-02-01
                • 1970-01-01
                相关资源
                最近更新 更多