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

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

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

2

Решение

Для консольного приложения самый простой метод — это получить 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
1

Другие решения

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

0

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

#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

0

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

0
По вопросам рекламы [email protected]