SHGetFolderPath() для конкретного пользователя
-
21-08-2019 - |
Вопрос
Я ищу хороший способ получить локальную папку данных приложения для конкретного пользователя - без необходимости вводить данные для входа для этого пользователя.
SHGetFolderPath() Путь к папке() могу принять токен доступа для любого пользователя, для которого я хочу получить локальную папку appdata, но чтобы получить токен доступа, вы должны предоставить пароль пользователя.Кроме того, согласно Документы это не поддерживается на <= Windows 2000.
Раздел реестра HKCU\Программное обеспечение\Microsoft\ Windows\CurrentVersion\Проводник\ Папка оболочки содержит значение AppData, которое содержит местоположение локальной папки appdata для текущего пользователя...таким образом, я мог бы технически смонтировать HKCU hive для конкретного пользователя и получить доступ к этому значению;однако Microsoft, похоже, настоятельно не рекомендует использовать этот ключ, и я слышал, что иногда он также может быть неточным.
По иронии судьбы, в Windows учетная запись администратора может легко получить доступ ко всем данным в папке appdata любого пользователя и изменять их, если он просто откроет Проводник и перейдет в нужное место...но, похоже, не существует простого способа программно получить местоположение папки appdata для конкретного пользователя.
Итак, есть ли у меня какие-либо другие варианты?Прямо сейчас доступ к реестру (gasp) кажется лучшим вариантом, но я бы хотел использовать что-нибудь официальное, не запрещенное Microsoft, если это возможно.
Будем признательны за любые предложения.
Решение
Не существует документированного способа сделать это без токена AFAIK, но лучше всего сделать это:
- Найдите профиль:HKLM\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\ Windows NT\CurrentVersion\Список профилей (%windir%\Profiles на Win9x)
- Настройте привилегии для
SE_RESTORE_NAME
- RegLoadKey NTUSER.DAT (ПОЛЬЗОВАТЕЛЬ.DAT в 9x)
- Запрос ...\CurrentVersion\Explorer\Папки оболочки пользователя
Обратите внимание, что правильный раздел реестра для проверки - это Пользовательские папки оболочки, а не папки оболочки (и вам, возможно, придется расширить путь), см. Долгая и печальная история ключа Shell Folders для получения подробной информации
Я также хочу отметить, что, если возможно, вам следует хранить данные в programfiles или общих папках, а затем копировать в профиль при первом запуске вашей программы для каждого пользователя