3

我们编写了一个在 XP 中运行良好的应用程序,但在向 Vista 和 Windows 7 迁移时遇到了严重的问题,这可能是由于写入用户数据的位置。

用例是这样的:个人用户需要登录机器并使用它来获取数据。主管用户需要能够超越个别用户的视线,并验证他们是否正确地执行了他们的工作。这些主管还需要检查系统日志以确保系统正常运行。

我们在 XP 中完成这些任务的方法是直接写入 C:\ 驱动器上的文件夹。也许这是不好的做法,也许不是,但基本上系统的所有用户都需要能够以共享数据的形式访问这些数据。在该程序的某些安装中,IT 环境根本不安全,计算机只有一个用户,然后每个人分别登录到我们的程序。在该程序的其他安装中,IT人员是胜任的,并且对于不同的用户有不同的登录,但是每个用户仍然可以访问C:并且每个用户仍然可以根据需要检查其他用户。

在 Vista/Windows 7 中,这一切都发生了变化。如果 IT 人员将所有内容锁定为单个用户,这些用户仍然需要共享这些公共数据,并且不允许将特定于应用程序的配置参数和用户列表写入应用程序的目录。如果系统位于具有域的位置,则用户没有本地管理员权限,甚至安装也可能出现问题。

解决方案是让安装程序创建一个每个用户都可以写入的目录,然后将所有用户特定的数据放在该目录中吗?如果是这样,是否可以让安装程序以这种方式运行(即使必须授予管理员权限)?或者有没有办法让 Vista/7 以更自由的 XP 方式运行?

4

5 回答 5

1

最权威的资源是 MSDN 中每个 Windows 版本的应用程序规范中的“数据和设置管理”。阅读本文以了解 Windows 上存在的各种特殊文件夹背后的基本原理,以及如何选择将数据写入哪个文件夹。

接下来,您的应用程序将需要使用SHGetSpecialFolderLocation API 来检索到特殊位置的路径。

最可能满足您需求的文件夹 - 由一个用户写入,由管理员读取,将是CSIDL_APPDATA- 在 Windows 6.X 上,对应于C:\ProgramData\

默认情况下,在此位置创建的文件夹的权限由管理员和所有者(即创建它的用户)完全控制,并且对用户组的成员具有只读访问权限。

一个完全独立的练习是编写修改目录上的访问控制列表 (ACL) 所需的代码。如果您选择的位置的默认权限不足以满足您的目的,这将是必要的。

于 2009-07-03T15:15:15.760 回答
1

您的应用程序的一部分可能作为系统服务及其自己的用户运行。这样,它也可以拥有自己的安全存储,远离您的人类用户。这也将消除让用户运行具有超出其常规范围的权限的程序的总体需求。

您的应用程序的实际用户空间部分可以连接到服务并执行简单的存储/检索操作。

于 2009-07-14T00:37:35.437 回答
0

我们在 XP 中完成这些任务的方法是直接写入 C:\ 驱动器上的文件夹。也许这是不好的做法,也许不是

绝对是。'C:\Users\Public\Public Documents' 是合适的。使用 NTFS ACL 控制谁可以读取和写入文件。

于 2009-07-01T00:33:33.930 回答
0

默认情况下,没有所有用户都具有写入权限的目录(可能除了系统范围的 TEMP 目录,但我不会在那里写入日志信息)。

如果您的安装程序以管理权限运行,它可以创建这样一个目录并授予每个人写权限。最合乎逻辑的地方是ALLUSERSPROFILEC:\Documents and Settings\All Users在 XP 上,C:\Users\Public在 Vista/7 上)。

另一个相当简单的解决方案是让每个用户只登录到他或她的个人资料中的目录,例如,登录到Application Data\Your App. 然后,管理应用程序仍然可以相当轻松地汇总所有日志记录信息,如果读取权限未锁定,用户甚至可以在需要时读取彼此的数据。

于 2009-07-03T18:50:31.847 回答
0

将数据存储在网络上的某个地方不是更好吗?这样,您只需设置一次安全性,并且更易于维护。主管可以轻松读取多台 pc 的数据,而不必访问单个 pc...

于 2009-07-24T07:33:47.233 回答