windows-System權限獲取任意用戶權限目錄-舉例GetTempPath


一丶簡介

在System權限啟動我們的程序之后.如果程序內部使用了GetTempPath()函數.或者使用了其它跟用戶權限有關的函數.則獲取的路徑不是你想要的.
比如 你在System權限下使用了GetTempPath() 那么獲取的temp路徑有可能就是 "C:\Windows\Temp" 而我們想要獲取的路徑則是 "C:\user\xxx\Appdata\local\temp"
這里貼出代碼. 原理就是 使用用戶權限的Token 配合函數ExpandEnvironmentStringsForUserW 函數來獲取.

二丶代碼

#include <TlHelp32.h>
#include <userenv.h>
#pragma comment(lib, "Userenv.lib")

BOOL ExpandSysEnvsByName(const WCHAR* envsName, std::wstring& envsPath)
{
    HANDLE hToken = nullptr;
    HANDLE hProcessSnap = nullptr;
    PROCESSENTRY32 pe32 = { 0 };
    pe32.dwSize = sizeof(PROCESSENTRY32);

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hProcessSnap)
        return FALSE;
    if (!Process32First(hProcessSnap, &pe32))
        return FALSE;
    do
    {
        if (_wcsicmp(pe32.szExeFile, L"explorer.exe") == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
            if (NULL == hProcess)
                return FALSE;
            if (!OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken))
                return FALSE;
            CloseHandle(hProcessSnap);
            break;
        }
    } while (Process32Next(hProcessSnap, &pe32));

    WCHAR szEnvsPath[MAX_PATH] = { 0 };
    if (!ExpandEnvironmentStringsForUserW(hToken, envsName, szEnvsPath, MAX_PATH))
        return FALSE;

    envsPath = szEnvsPath;
    return TRUE;
}
int main()
{

    wstring Ret;
    ExpandSysEnvsByName(TEXT("%Appdata%"), Ret);
}

上方代碼以appdata舉例 %%這種環境變量大家可以多搜一下. 這里不整理了.
使用函數獲取來的路徑如下:
Ret = "C:\Users\ibinary\AppData\Roaming""
通過你自己的拼接路徑就可以拼接處Temp路徑了.
也可以直接輸入%temp%來獲取.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM