【问题标题】:How to get a Standard EXE and WinService EXE to communicate with each other?如何让 Standard EXE 和 WinService EXE 相互通信?
【发布时间】: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


【解决方案1】:

两个想法:

  1. 让每个应用程序使用命名管道公开一个 WCF 端点 传输,并让他们通过一个简单的界面相互交谈 您的选择。
  2. 使用Memory Mapped Files 进行交流 你在处理磁盘文件。

【讨论】:

  • 太棒了。这么快就回复了,谢谢!我实际上是在为一位同事问这个问题(他没有 stackoverflow 帐户,所以他快速输入了一封电子邮件并让我将其发布在这里)。周一,他将尝试您的建议(以及任何其他建议)。所以谢谢,希望我会为您的答案应用绿色复选标记!现在,我会为这项努力投票。
  • @JustLooking:如果删除磁盘文件不方便,我建议使用用户的本地应用程序数据目录(或更确切地说,子目录)并使用命名管道(或类似的 IPC方法)将目录路径从应用程序发送到服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2012-12-05
  • 2013-05-29
  • 2011-10-12
  • 2013-05-03
  • 2021-11-07
相关资源
最近更新 更多