我有一个在 LocalSystem 帐户下运行的 Windows 服务,我正在尝试访问一些特定于用户的环境变量。当我调用 ExpandEnvironmentStrings("%AppData%") 时,我得到“C:\windows\system32\config\systemprofile\AppData\Roaming”。
我认为模拟和加载用户配置文件应该可以解决这个问题,所以我打电话给:
- 登录用户()
- 加载用户配置文件()
- 创建环境块()
- ImpersonateLoggedOnUser()
而且,ExpandEnvironmentStrings("%AppData%") 返回系统文件夹,而不是像“C:\Users\Username\AppData\Roaming”这样的文件夹。
然后我又搜索了一些,发现了 SHGetFolderPath(CSIDL_LOCAL_APPDATA),它就像一个魅力后模仿。
我的问题不是我应该做什么(即 SHGetFolderPath),而是更多关于环境变量如何在服务中工作的问题。我在想我的问题是:
我的 LoadUserProfile() 代码仍然缺少一些东西,即使一切都返回成功。我无知的一面想让我相信,理论上,加载用户配置文件应该使 ExpandEnvironmentStrings() 返回加载的用户的值。
根据一些读数,服务中的环境变量似乎在系统启动时只读取一次(http://support.microsoft.com/kb/887693),所以我的服务只知道系统环境变量。
我倾向于 2。但我只需要有人来确认这一点,所以我不认为有什么可能是错误的。