我一直致力于让我的应用程序更易于管理员使用。我真正想做的一件事是允许管理员从程序中修改其他用户的设置——同时仍然允许普通用户修改他们自己的设置,因为我的应用程序不一定只用于想要强制用户使用特定设置的管理员。
我想到了两种可能的方法:
1)将用户设置文件路径从现在的位置(CLSID_APPDATA,通常是Documents and Settings\ Username)移动到世界可访问的路径(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公司\我的程序\设置\946-hdc-743-ddd.settings
优点:缺点:
- 这允许管理员查看和直接修改任何用户的设置,因为所有用户的 COMMON_APPDATA 路径都是相同的。这就是我真正想要的样子——这是最直接的——但有一个主要的缺点:
2)不要将设置文件路径移动到全局可访问的路径并直接修改用户的设置文件,而是让我的应用程序在应用程序的 CLSID_COMMON_APPDATA 文件夹中创建并保存一个“覆盖”文件,以允许管理员覆盖用户的设置。
- 权限可能是个问题。要允许普通用户保存他们的设置,您必须允许用户写入程序的 COMMON_APPDATA 设置文件夹。
当然,当保存设置并在磁盘上创建设置文件时,您希望将用户设置文件的写入权限限制为设置所针对的用户和管理员,以便其他受限用户不能修改它们。
但是,可能在用户有机会从程序中编写自己的设置之前,精明的恶意受限用户会在用户不知情的情况下为该特定用户创建设置文件。如果受限用户创建文件,则意味着他们拥有该文件......然后该用户(设置的对象)不能再修改设置,除非管理员更改文件的权限。
这可能是一个不太可能的情况,但它仍然让我担心。
当我的应用程序为该用户(其设置被“覆盖”)加载时,它将检测此文件并加载它而不是位于 CLSID_APPDATA (Documents and Settings\ Username)中的常规设置文件。
优点:缺点:
- 权限很容易处理。
默认情况下,对于Documents and Settings\ Username APPDATA 文件夹,只有管理员和用户名可以从其中访问文件。因此,这本身可以保护用户自己的常规个人设置免受其他受限用户的影响。
为了保护“覆盖”设置,我的应用程序可以简单地拒绝除管理员之外的所有人对 COMMON_APPDATA 文件夹(写入覆盖文件的位置)的写访问权限,然后就是这样。这些覆盖设置只能由管理员修改。
- 这种方法显然比较迂回。如果用户修改了他自己的常规个人设置,管理员将不会看到这些更改——管理员只能看到他用来覆盖用户常规设置的设置(他可以强制用户使用这些设置)。
在某些方面,这可能很好,但是……它是环形交叉路口的事实让我有些反感。
我很想听听你们对此的看法。哪个是我最好的选择?我个人更倾向于#2,因为虽然它不那么简单,但它似乎更安全,并且不会让管理员感到困惑。
但是,我也愿意接受建议。您认为有更好的选择吗?
编辑 7/6/09:我应该注意,对于选项 #2,管理员不仅可以使用单个覆盖文件覆盖所有用户的设置,还可以使用特定于该用户的覆盖文件覆盖单个用户的设置(就像使用选项 #1,该文件名可能是设置被覆盖的用户的 SID)。不确定原始帖子中是否完全清楚。