【发布时间】:2012-04-08 10:08:52
【问题描述】:
我们有一个应用程序,它部分是标准 EXE,部分是 WinService EXE。标准 EXE 由注册表的 Run 部分生成,并在登录时以刚刚登录的用户的凭据生效。WinService EXE 设置为 Auto Run,因此始终运行并以 LocalSystem(本质上是管理员)。
我们需要这两个程序通过将信息写入 XML 文件来共享数据。
当登录的用户有权访问已安装的文件夹 (C:\Program Files\ourApp) 时,该应用程序可以正常工作。标准 EXE 写入数据,WinService EXE 读取数据没有问题,一切正常。
但是,当登录的用户无权写入已安装的文件夹时,数据会被 UAC 虚拟化和数据重定向捕获并最终到达其他地方,WinService 找不到也无法从已安装的文件夹中读取它文件夹。
为了避免这种情况,我们尝试让标准 EXE 和 WinService EXE 写入和读取 %ProgramData%。除了标准用户没有写入 %ProgramData% 的权限之外,这可以正常工作。
我们不能使用 %LocalAppData%,因为登录用户是 C:\Users\LoggedInUser\AppData\Local,而对于 winservice,它是 C:\Users\Administrator\AppData\Local。
在启用了 UAC 虚拟化的 Vista 和 Win7 中是否有任何地方允许仅以用户权限运行的标准 EXE 和作为 LocalSystem 运行的 WinService 相互通信。我们尝试了注册表,但问题更严重。也是最后但并非最不重要的。我们需要它与 XP 一起工作,而代码没有任何差异。这意味着 XP 也有 %ProgramData%、%LocalAppData% 等的环境变量,它可以在两者中工作。
【问题讨论】:
-
无论您想出什么解决方案,都需要应对两个用户同时登录(并运行您的应用程序)的可能性。
-
在安装过程中,您可以编辑
%ProgramData%\YourAppDirectory的权限,以允许每个人都有写权限。那里的默认权限:任何人都可以在那里创建新文件和文件夹,每个人都可以阅读它们,但只有创建者-所有者(和管理员)对这些文件具有写入权限。你可以改变这一点。您也可以在Program Files中更改权限,但不建议这样做;另外你不应该将数据写入Program Files。
标签: windows permissions windows-services uac