2009-06-29 3 views
3

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

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

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

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

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

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

ответ

4

Там нет документированных способов сделать это без маркеров AFAIK, но ваш лучший выбор заключается в следующем:

  1. Найти профиль: HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList (% WINDIR% \ Profiles на Win9x)
  2. AdjustTokenPrivileges для SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT (User.Dat на 9х)
  4. запросов ... \ CurrentVersion \ Explorer \ User Shell Folders

Обратите внимание, что правильный ключ реестра, чтобы проверить это User Shell Folders и не Shell Folders (И вы, возможно, придется расширить путь), см The long and sad story of the Shell Folders key подробности

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

+0

Awesome. Я видел функцию RegLoadKey() и считал, что использую ее ... но в то время я не был уверен, что сможет сделать то, что я хотел, не будучи смехотворно медленным и ненадежным. Тем не менее, ваш ответ дал мне вдохновение, чтобы попробовать. Похоже, я могу сделать эту работу ... это не так медленно, как я думал. Надеемся, что это будет работать без заминки для клиента, который хочет эту функцию. У них много компьютеров, использующих службы AD/Terminal и, вероятно, перемещающиеся профили пользователей. RegConnectRegistry() может пригодиться позже. – beepboopbopbop

+0

Если скорость RegLoadKey является проблемой, возможно, вы можете посмотреть в HKEY_USERS для SID пользователя, что спасет вас вызов RegLoadKey, но он работает только для уже загруженных профилей. – Anders