Я разрабатываю кроссплатформенную библиотеку, предназначенную для загрузки файлов конфигурации из домашнего каталога пользователя. Идея состоит в том, чтобы автоматически предоставлять параметры конфигурации без редактирования кода.
Эта библиотека может использоваться в настольных приложениях или в демонах / сервисах. В (я предполагаю) большинстве сред Unix, которые я могу использовать getpwuid()
получить домашний каталог пользователя. В Windows ТАК сказал мне Я мог бы использовать SHGetKnownFolderPath но его документация говорит, что это только для настольных приложений. Есть ли способ получить этот путь в Windows для пользователя, запускающего службу?
Для консольного приложения самый простой метод — это получить 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
Вы можете разрешить% HOMEPATH%, используя ExpandEnvironmentStrings(...)
Как насчет этого:
#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
Итак, вы хотите, чтобы домашний каталог пользователя был в состоянии обслуживания?
— Если вы хотите, чтобы в состоянии обслуживания, вы должны использовать GetUserToken()
чтобы получить токен пользователя, затем продублируйте его для CreateprocessAsUser()
— Еще я думаю, что лучше использовать SHGetSpecialPath()
, SHGetTempPath()
,