首页 > 解决方案 > 从提升的权限中获取 SHGetFolderPath 的当前登录安全令牌

问题描述

我需要通过 SHGetFolderPath 获取当前用户的系统文件夹,但在安装程序应用程序中,系统将其提升为管理员帐户,而是返回管理员帐户文件夹。如何获取当前用户的安全令牌?我试过这个:

HANDLE token = NULL;
PWTS_SESSION_INFO sessions;
DWORD cnt = 0;
WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &cnt);
for (DWORD i=0; i<cnt; i++)
{
    if (WTSActive == sessions->State)
    {
        WTSQueryUserToken(sessions->SessionId, &token);
        break;
    };
    sessions++;
};

但它并没有真正起作用。有任何想法吗?

标签: winapi

解决方案


可能获取 shell 进程 ID(资源管理器),从中获取令牌并在查询中使用此令牌。

if (HWND hwnd = GetShellWindow())
{
    ULONG dwProcessId;
    if (GetWindowThreadProcessId(hwnd, &dwProcessId))
    {
        HANDLE hToken;
        if (HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId))
        {
            BOOL b = OpenProcessToken(hProcess, TOKEN_QUERY|TOKEN_IMPERSONATE, &hToken);
            CloseHandle(hProcess);
            if (b)
            {
                if (0 <= SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, hToken, &pszPath))
                {
                    DbgPrint("<%S>\n", pszPath);
                    CoTaskMemFree(pszPath);
                }
                CloseHandle(hToken);
            }
        }
    }
}

推荐阅读