【问题标题】:How to have a program option set by an admistrator that the user can't change?如何让管理员设置用户无法更改的程序选项?
【发布时间】:2016-02-13 23:38:20
【问题描述】:

我的应用程序需要在启动时读取一个选项,以检查它是否应该以只读模式启动。不应允许用户更改该选项。

我现在通常使用系统注册表的 HKLM\Software 部分中设置的值来执行此操作。管理员设置该值,用户不能更改它(他们无权修改 HKLM 中的条目)。

问题在于,在终端服务器(或 Citrix)机器上,这会影响所有用户。我想找出一种针对每个用户执行此操作的方法。其他人如何处理这个问题?系统注册表中是否有用户无法更改的这种按用户设置的部分?

感谢任何建议或cmets!

【问题讨论】:

    标签: delphi registry settings


    【解决方案1】:

    这本质上就是 HKEY_CURRENT_USER\Software\Policies 键的用途,即注册表中用户特定部分中的键,默认情况下对用户本人是只读的。

    按照惯例,密钥层次结构应该补充您在HKEY_CURRENT_USER\Software 下已有的层次结构,例如如果您的常规用户首选项存储在 HKEY_CURRENT_USER\Software\MyCompany\MyProgram 下,则受保护的用户首选项(或 MS 术语中的“策略”)应存储在 HKEY_CURRENT_USER\Software\Policies\MyCompany\MyProgram

    请注意,建议仅通过组策略对象在此键下设置值,而不是通过直接注册表访问。

    【讨论】:

    • 谢谢奥利弗!除了关于仅由组策略对象编辑的条目的建议之外,这看起来就像我正在寻找的内容。我想我需要确切地研究它是如何“不推荐”的,因为它似乎符合我的需求!我想我可以让管理员为我的特殊设置创建一个新的只读密钥,但如果已经存在一个,他们可能更倾向于同意添加。
    • 据我了解,该建议主要基于以下事实:如果您稍后确实选择使用 GPO,那么您写入该密钥的任何内容都可能被覆盖由 GPO 在没有警告的情况下进行。我目前正在评估对 GPO 控制我们自己的应用程序的支持,但我还没有达到实际阶段,所以目前无法向您提供更多详细信息。
    【解决方案2】:

    用户无法更改的每用户设置区域的概念实际上没有意义 - 如果它们是用户设置,“您”(用户)希望能够更改它们。

    我可以想到两种选择:

    • 在 HKLM 中写入您的设置,但有 为每个用户设置不同的设置,为未设置设置的用户设置全局后备设置
    • 在 HKCU 中编写它们,但使用 注册表安全 API 以防止 他们写信给它。你可能需要 比他们更大的权限 防止他们撤消权限 变化。我真的不喜欢这个 选项,但如果你想遵循它 你可能想从 RegGetKeySecurityRegSetKeySecurity API。 This article 可能很有趣 好吧。

    我个人认为第一个选项是最简单的,并且在用户的注册表树中涉及的东西也更少。希望对您有所帮助!

    【讨论】:

    • 为什么没有意义?我什至举了一个示例,说明您不希望用户能够更改的那种设置(只读)......此选项最初由管理员设置,而不是由用户设置。仅仅因为设置是每个用户的,并不意味着该用户应该能够更改它。文件限制、数据库权限和磁盘配额都是针对每个用户但用户不能更改的设置示例。
    • 这很好。你知道这些东西存放在哪里吗?如果它们存储在具有权限的 HKCU 树中,因此用户无法修改它们,那么在用户树中具有每个用户的设置(任何安全权限)将是非常有效的。即我认为你是对的。所以也许选择选项#2。
    • 谢谢大卫。我确实认为我最终可能会在 HKCU 中使用只读设置(在 Oliver 提到的策略领域,或者你建议使用自制的只读密钥)。感谢您的建议!
    【解决方案3】:

    两个设置怎么样?

    1) 在 HKLM 中设置一个标志,指定只读是这台机器上的默认行为。

    2) 对于任何需要完全访问权限的用户,请在 HKCU 中设置一个启用完全访问权限的令牌。

    令牌可能是一些盐加上用户名的加密哈希,因此无法复制它以向其他用户授予权限。

    【讨论】:

    • 谢谢,我同意这是个好建议。如果只读注册表无法解决,这可能是一个不错的选择。
    【解决方案4】:

    为什么不将选项存储在自己的数据库中?这似乎合理且方便(至少对我来说是 8))制作产品的“便携式”版本没有问题。没有用户打扰您不希望他们打扰的任何设置。

    【讨论】:

    • 我们就是这样处理的。事实上,我们的“权利”值是 0-9。这些在用户无法访问的表中。
    • 实际上我在某些情况下会这样做。然而,一些客户端不想创建权限表和/或按名称管理用户。在某些情况下,用户共享相同的用户名,但需要不同的权限(不是我会做的,但我无法控制客户端的策略......)他们希望使用脚本(或直接注册表编辑也许)。
    • 如果不是太混乱,您可以将一些非标准用户设置私下存储(数据库),而将其他设置公开。当您使用单独的对象来检索选项时,这种复杂性将被“包装”在其中。当然,在很多情况下,这条建议并不适用。
    【解决方案5】:

    HKCU 而不是 HKLM 有什么问题?这将是每个用户。不幸的是,如果用户知道如何编辑注册表并找到密钥,则用户可能会更改它。

    【讨论】:

    • 我使用 HKCU 进行普通用户设置。但在这种情况下,这是用户不应该更改的设置。
    【解决方案6】:
    • 获取程序附带的文件之一,不应更改(至少不受限制的用户)。如果没有这样的文件,请为此目的创建一个。
    • 让管理员为那些受限用户设置对该文件的只读权限。
    • 在程序中检查您是否具有对该文件的写入权限。

    【讨论】:

    • 谢谢。我过去做过类似的事情,但在我看来,精明的用户可以将我的 exe 复制到他们机器上的不同目录(或将其完全重新安装到不同的目录。)这真的取决于如何我猜是“锁定”了他们的机器!
    • 如果您为此访问选项使用新文件,您可以将其存储在您喜欢的任何地方,尤其是默认情况下用户没有权限的地方。您可以从应用程序内部创建它,以防在以管理员身份运行时它丢失,否则假定它是只读的。使用该文件的专用位置,您的应用程序位于何处并不重要。为文件设置用户权限是每个管理员都应该知道的事情,而且很简单。任何其他方案都必须向他解释。
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 2012-10-10
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多