【问题标题】:CSIDL constant for user folder for Windows XPWindows XP 用户文件夹的 CSIDL 常量
【发布时间】:2012-12-29 23:41:15
【问题描述】:

我似乎找不到 Windows XP 的“C:\Documents and Settings\username”文件夹的 CSIDL 常量是什么?

编辑:我正在使用以下代码检索此路径:

HANDLE hUserToken = NULL;
if(WTSQueryUserToken(dwUserSessionID, &hUserToken))
{
    PIDLIST_ABSOLUTE pIdl = NULL;
    if(SHGetFolderLocation(NULL, nCSIDL, hUserToken, NULL, &pIdl) == S_OK)
    {
        SHGetPathFromIDList(pIdl, path_buf);

        ILFree(pIdl);
    }

    CloseHandle(hUserToken);
}

问题在于,当我期待 C:\Documents and Settings\Administrator 时,代码会为管理帐户返回 C:\WINDOWS\system32\config\systemprofile

【问题讨论】:

  • @K-ballo:好的。我自己发现了。但是我应该使用哪个常量?
  • 另一个函数是GetUserProfileDirectory,但我希望它返回相同的结果。
  • @Luke:啊哈!你有我的朋友!谢谢。您想将其发布为答案吗?它实际上返回了预期的结果。显然这就是他们引入该 API 的原因。

标签: c++ winapi windows-xp windows-shell


【解决方案1】:

查看此参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx

您要查找的常量是CSIDL_PROFILE

【讨论】:

  • 不,它不会工作。我在 XP 上尝试过,当它应该是“C:\Documents and Settings\Administrator”时得到“C:\WINDOWS\system32\config\systemprofile”
  • 我通过使用从WTSQueryUserToken 获得的用户令牌调用SHGetFolderLocation 来获取它,该用户令牌是从用户的会话ID 获得的。在 Windows XP 中没有会话隔离,因此会话 ID 为 0,与服务会话相同。也许这就是为什么它返回这样的结果......但这对我原来的问题没有帮助。
  • @user843732:您最初的问题是 CSIDL profile 问题是什么,而您的 actual 问题似乎是如何获得管理员资料
  • 好吧,我需要它适用于任何用户帐户,而不仅仅是管理员。
  • 由于 XP 中不存在 Session 0 Isolation,因此运行 Session 0 的用户帐户是系统帐户,而不是用户帐户。因此,当dwUserSessionId 为 0 时,您正在检索错误的令牌。仅对于会话 0,您需要枚举在会话 0 中运行的用户进程,例如 explorer.exe,而不是使用 WTSQueryUserToken(),直到找到一个以您感兴趣的用户身份运行,然后从该进程中提取用户令牌。
【解决方案2】:

你要的那个:

Windows version 5.1, Build 2600

CSIDL paths: 
[...] 
CSIDL_PROFILE: C:\Documents and Settings\John Doe

【讨论】:

  • 正如我在与@K-ballo CSIDL_PROFILE 的对话中指出的那样,Windows XP 上的管理员帐户可能会返回意外结果。事实证明,调用GetUserProfileDirectory 可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多