【问题标题】:SHGetFolderPath returns path to admin user account when used in an installerSHGetFolderPath 在安装程序中使用时返回管理员用户帐户的路径
【发布时间】:2014-07-18 10:23:22
【问题描述】:

我正在使用 SHGetFolderPath CSIDL_APPDATA 来获取当前用户帐户下的应用程序数据文件夹的路径。它工作正常,但如果从安装程序调用它,Windows 会将其更改为管理员文件夹!如何从安装程序中获取当前用户的数据文件夹?

【问题讨论】:

  • 我们对您的安装程序一无所知。所以,很难知道为什么会这样。您可能想问自己为什么要在安装时写入当前用户的配置文件。如果管理员为用户安装软件怎么办?
  • 您应该在用户第一次运行应用程序时编写每个用户的数据,而不是在安装时。否则该应用程序只会对安装它的用户正常工作,这是错误的。

标签: winapi installation special-folders


【解决方案1】:

SHGetFolderPath() 有一个 hToken 参数用于这种确切的情况。如果hToken 为NULL,则函数使用与调用线程关联的访问令牌。否则,它可以设置为另一个用户帐户的访问令牌。

如果安装程序以管理员身份运行,则安装程序必须:

  1. 在调用SHGetFolderPath()之前模拟所需的用户帐户。

  2. 获取所需用户帐户的访问令牌并将其传递给hToken

【讨论】:

  • 好的,谢谢,但是如何获取“当前用户”的令牌。显然 NULL 在这种情况下是管理员,-1 是“默认用户”,但没有使用其他特殊值。
  • 传递NULL 使用的是管理员帐户,因为管理员正在运行安装程序,而不是当前登录的用户(假设管理员和登录的用户不同)。您可以尝试的一件事是使用 WTSQuerySessionInformation() 获取安装程序正在运行的会话 ID,然后使用 WTSQueryUserToken() 获取登录到该会话的用户的访问令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多