5

我有一个在 LocalSystem 帐户下运行的 Windows 服务,我正在尝试访问一些特定于用户的环境变量。当我调用 ExpandEnvironmentStrings("%AppData%") 时,我得到“C:\windows\system32\config\systemprofile\AppData\Roaming”。

我认为模拟和加载用户配置文件应该可以解决这个问题,所以我打电话给:

  • 登录用户()
  • 加载用户配置文件()
  • 创建环境块()
  • ImpersonateLoggedOnUser()

而且,ExpandEnvironmentStrings("%AppData%") 返回系统文件夹,而不是像“C:\Users\Username\AppData\Roaming”这样的文件夹。

然后我又搜索了一些,发现了 SHGetFolderPath(CSIDL_LOCAL_APPDATA),它就像一个魅力后模仿。

我的问题不是我应该做什么(即 SHGetFolderPath),而是更多关于环境变量如何在服务中工作的问题。我在想我的问题是:

  1. 我的 LoadUserProfile() 代码仍然缺少一些东西,即使一切都返回成功。我无知的一面想让我相信,理论上,加载用户配置文件应该使 ExpandEnvironmentStrings() 返回加载的用户的值。

  2. 根据一些读数,服务中的环境变量似乎在系统启动时只读取一次(http://support.microsoft.com/kb/887693),所以我的服务只知道系统环境变量。

我倾向于 2。但我只需要有人来确认这一点,所以我不认为有什么可能是错误的。

4

1 回答 1

7

环境变量的文档表明#2 是正确的。引用,重点补充:

每个进程都有一个环境块,其中包含一组环境变量及其值。

MSDN 指向ExpandEnvironmentStringForUser()解决您原来的问题。

于 2013-02-19T22:27:42.830 回答