【问题标题】:LocalApplicationData is different in service programs than in console apps服务程序中的 LocalApplicationData 与控制台应用程序中的不同
【发布时间】:2020-03-12 22:31:17
【问题描述】:

我正在创建一个访问文件夹路径的服务:

string localAppDataFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

很遗憾,返回的文件夹不是:

C:\Users\mainuser\AppData\Local

...但是:

C:\Windows\system32\config\systemprofile\AppData\Local

...相反。

mainuser 是当前登录的用户。服务是否可以启动放置在当前用户AppData\Local 中的程序?我知道您可以转到Services-> Right click Properties-> Log on 并输入密码和帐户名,但我正在寻找一种编程解决方案,最好使用sc create command

或者,我可以将所有感兴趣的文件夹移动到 C:\ProgramData 并完全避开当前用户。有没有办法将文件保存在用户AppData\Local 中并使用无密码的编程解决方案?

【问题讨论】:

  • 您的 Windows 服务可能能够通过在 ProcessStartInfo 中指定 Username/Password 来启动在不同帐户中运行的子进程
  • 对于 Windows 服务,没有“当前用户”的概念。当您的 Windows 服务正在运行时,可能有多个用户登录到系统 (RDP),或者根本没有登录。您的服务是否假定存在登录用户?
  • @OguzOzgul 是的,它应该只在特定用户登录时运行。
  • @MickyD 我不知道用户名/密码。我依靠windoes来找到正确的用户。
  • 拥有一个 Windows 服务来执行包含在其安装程序中的可执行文件(因此知道在哪里可以找到)可能是一个更好的设计。您不应该尝试访问任何可能受操作系统限制的用户(私有)AppData 文件夹。

标签: c# sc.exe


【解决方案1】:

简而言之,服务不会(也不应该)为用户启动程序或访问一般用户信息(除非它们以指定用户身份运行)。他们不知道用户及其个人资料,他们的用例是作为系统的一部分运行

如果您想在用户登录时运行应用程序,请使用组策略,或将其添加到用户设置以在启动时运行。如果需要,请在安装程序中进行设置

这是每个服务的工作方式,也是长期以来windows的常态(驱动程序除外)

【讨论】:

  • 如果我使用“登录”时设置的任务计划程序,则为时已晚。我试图在用户域程序(Discord、Chrome 等)自动启动之前触发程序。你能给我一些关于组策略的谷歌搜索词以及如何设置用户设置以在启动时运行。我正在从 mac 转移到 windows,所以我很难找到要搜索的正确术语。目前我通过使用 'sc create name binpath="" start="auto" ' 运行 exec 命令的变体来使用 nsis 安装程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2019-07-10
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多