我一直致力于让我的应用更易于管理员使用。我真正想做的事情之一就是允许管理员从程序中修改其他用户的设置 - 同时仍然可以让常规的用户修改他们自己的设置,因为我的应用程序不一定只是为了想要强制用户使用特定设置的管理员。
我想到了两种可行的方法:
1)将用户设置文件路径从现在的位置(CLSID_APPDATA,通常 Documents and Settings \ 用户名 )移动到一个世界-accessible路径(CLSID_COMMON_APPDATA,通常 Documents and Settings \ All Users )。然后,将每个用户的设置保存到用户的唯一文件中(可能具有与用户文本SID相同的名称),因此该文件夹类似于:
C:\ Documents and Settings \ All Users \ My Company \ My Program \ settings \ 123-abc-456-def.settings
C:\ Documents and Settings \ All Users \ My Company \ My Program \ settings \ 234-bcd-477-xyz.settings
C:\ Documents and Settings \ All Users \ My Company \ My Program \ settings \ 946-hdc-743-ddd.settings
优点:
缺点:
- 这允许管理员查看并直接修改任何用户的设置,因为所有用户的COMMON_APPDATA路径都相同。这就是我真正喜欢它的方式 - 它是最直接的 - 但它有一个重要的概念:
2)不要将设置文件路径移动到全局可访问的路径并直接修改用户的设置文件,而是让我的应用程序在应用程序的CLSID_COMMON_APPDATA文件夹中创建并保存“覆盖”文件,以允许管理员覆盖用户的设置。
- 权限可能是个问题。要允许普通用户保存其设置,您必须允许用户对该程序的COMMON_APPDATA设置文件夹进行写访问。
当然,当保存设置并在磁盘上创建设置文件时,您需要将用户设置文件的写访问权限限制为设置所针对的用户以及管理员,以便其他受限用户不能修改它们。
然而,可能是在用户有机会从程序内编写自己的设置之前,精明的恶意受限用户在不知道用户的情况下为该特定用户创建设置文件。如果受限用户创建文件,则表示他们拥有该文件...然后该用户(设置所针对的用户)无法再修改设置,除非管理员更改了文件的权限。
也许是不太可能的情况,但它仍然让我担心。
当我的应用程序加载该用户(谁的设置被“覆盖”)时,它将检测到该文件并加载它而不是常规设置文件,该文件位于CLSID_APPDATA( Documents and Settings \ 用户名 的)。
优点:
缺点:
- 权限易于处理。
默认情况下,对于 Documents and Settings \ 用户名 APPDATA文件夹,只有管理员和用户名可以从内部访问文件。这样就可以保护用户自己的常规个人设置免受其他有限用户的影响。
为了保护“覆盖”设置,我的应用程序可以简单地拒绝对除管理员之外的所有COMMON_APPDATA文件夹(写入覆盖文件)的写访问权限,然后就是这样。这些覆盖设置只能由管理员修改。
- 这种方法显然更加迂回。如果用户修改了他自己的常规个人设置,管理员将看不到这些更改 - 管理员只能看到他覆盖用户常规设置的设置(他可以强制用户使用)。
在某些方面,这可能会很好,但是......它的回旋处会让我有所不同。
我很想听听你们对此的看法。哪个是我最好的选择?我个人更倾向于#2,因为虽然它不那么简单,但它似乎更安全,并且不是所以环形交叉路口,它会让管理员感到困惑。
但是,我也愿意接受建议。您认为有更好的选择会更好吗?
编辑7/6/09:我应该注意,对于选项#2,管理员不仅可以使用单个覆盖文件覆盖所有用户的设置,还可以覆盖单个用户的设置覆盖特定于该用户的文件(就像使用选项#1一样,该文件名可能是被覆盖设置的用户的SID的文件名)。不确定原帖中是否完全清楚。
答案 0 :(得分:1)
除非每台计算机上有多个用户帐户(即计算机由多人使用),否则选项二是更好的选择。
即使每台计算机上有多个用户帐户,我认为选项二仍然是更好的选择。最糟糕的情况是,管理员必须在同一台计算机上更改少数帐户的设置,而不是一个。
如果您的设施允许任何人随意使用任何计算机,那么选项一是更好的选择,因为选项二会使得在每台计算机上维护许多不同的帐户变得非常困难。
当然,您始终可以将应用程序设置放在服务器上的用户文件夹中。这将使管理员非常方便。
答案 1 :(得分:0)
如果管理员已经拥有存储其设置文件的用户目录的权限,那是否已经解决了您的问题?无论哪种方式,听起来选项2都是最好的,那么你可以有一个文件可以覆盖说一组用户,然后每个用户也有自己的设置。只要你的应用程序足够聪明,可以告诉何时覆盖设置,而不是时候,选项2应该不是那么大的问题。