SHGetFolderPath () для конкретного пользователя - PullRequest
4 голосов
/ 29 июня 2009

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

SHGetFolderPath () может принять токен доступа для любого пользователя, для которого я хочу получить локальную папку appdata, но для получения токена доступа вы должны предоставить пароль пользователя. Кроме того, согласно документам это не поддерживается в <= Windows 2000. </p>

Раздел реестра HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folder содержит значение AppData, которое содержит местоположение локальной папки appdata для текущего пользователя ... так что я мог бы технически смонтировать куст HKCU для конкретного пользователя и получить доступ к этому значению; однако Microsoft, похоже, категорически не рекомендует использовать этот ключ, и я слышал, что иногда он также может быть неточным.

По иронии судьбы, в Windows учетная запись администратора может легко получить доступ и изменить все данные в папке appdata любого пользователя, если они просто откроют Проводник и перейдут в правильное местоположение ... но там, похоже, нет простой способ программно получить местоположение папки appdata для конкретного пользователя.

Так у меня есть другие варианты? Прямо сейчас доступ к реестру (вздох) кажется лучшим вариантом, но я бы хотел использовать что-то официальное и не обескураженное Microsoft, если это возможно.

Любые предложения будут оценены.

1 Ответ

4 голосов
/ 03 июля 2009

Нет задокументированного способа сделать это без токена AFAIK, но лучше всего:

  1. Найдите профиль: HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList (% windir% \ Profiles on Win9x)
  2. AdjustTokenPrivileges для SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT (USER.DAT на 9x)
  4. Запрос ... \ CurrentVersion \ Explorer \ Папки оболочки пользователя

Обратите внимание, что правильный ключ реестра, который нужно проверить, - это пользовательские папки оболочки, а не папки оболочки (и вам, возможно, придется расширить путь), см. Длинная и печальная история о ключе папки папки для получения подробной информации

Я также хочу указать, что, если возможно, вы должны хранить данные в программных файлах или общих папках, а затем копировать в профиль при первом запуске программы для каждого пользователя

...