Как получить домашний каталог пользователя в Windows?

Я разрабатываю кроссплатформенную библиотеку, предназначенную для загрузки файлов конфигурации из домашнего каталога пользователя. Идея состоит в том, чтобы автоматически предоставлять параметры конфигурации без редактирования кода.

Эта библиотека может использоваться в настольных приложениях или в демонах / сервисах. В (я предполагаю) большинстве сред Unix, которые я могу использовать getpwuid() получить домашний каталог пользователя. В Windows SO мне сказали, что я могу использовать SHGetKnownFolderPath, но в документации сказано, что он предназначен только для настольных приложений. Есть ли способ получить этот путь в Windows для пользователя, запускающего службу?

4 ответа

Для консольного приложения самый простой метод - это получить USERPROFILE переменная окружения или объединить значения HOMEDRIVE а также HOMEPATH переменные среды

Использовать getenv() функция в стандартной библиотеке: https://msdn.microsoft.com/en-us/library/tehxacec.aspx

Пример программы:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv) {
    printf("USERPROFILE = %s\n", getenv("USERPROFILE"));
    printf("HOMEDRIVE   = %s\n", getenv("HOMEDRIVE"));
    printf("HOMEPATH    = %s\n", getenv("HOMEPATH"));
    return 0;
}

Выход:

USERPROFILE = C:\Users\myuser
HOMEDRIVE   = C:
HOMEPATH    = \Users\myuser

Как насчет этого:

#include <shlobj.h> 

WCHAR profilePath[MAX_PATH];
HRESULT result = SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, profilePath);
if (SUCCEEDED(result)) {
    // Do whatever you want with it
    // For example:
    // QString::fromWCharArray(profilePath)
}

Я не проверял это, все же.

Обратите внимание, что вы получаете массив wchar (необходимый для обработки путей со специальными символами).

Я думаю, что также можно запрашивать специальные папки других пользователей, кроме текущего, используя hToken параметр.

Также обратитесь к документации: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx

Я использовал этот код в другом случае, когда я хотел получить расположение меню "Пуск". Смотрите этот ответ: C++: Как создать ярлык в меню "Пуск" в Windows

Вы можете разрешить%HOMEPATH%, используя ExpandEnvironmentStrings(...)

Итак, вы хотите, чтобы домашний каталог пользователя был в состоянии обслуживания? - Если вы хотите, чтобы в состоянии обслуживания, вы должны использовать GetUserToken() чтобы получить токен пользователя, затем продублируйте его для CreateprocessAsUser() - Еще я думаю, что лучше использовать SHGetSpecialPath(), SHGetTempPath(),

Другие вопросы по тегам