SHGetFolderPath() для конкретного пользователя

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

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

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

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

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

Мы ценим любые предложения.


person beepboopbopbop    schedule 29.06.2009    source источник


Ответы (1)


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

  1. Найдите профиль: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList (%windir%\Profiles в Win9x)
  2. КорректироватьTokenPrivileges для SE_RESTORE_NAME
  3. RegLoadKey NTUSER.DAT (USER.DAT на 9x)
  4. Запрос ...\CurrentVersion\Explorer\Папки пользовательской оболочки

Обратите внимание, что правильным разделом реестра для проверки являются папки оболочки пользователя, а не папки оболочки (и вам, возможно, придется расширить путь), см. Долгая и грустная история ключа Shell Folders подробнее

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

person Anders    schedule 03.07.2009
comment
Потрясающий. Я видел функцию RegLoadKey() и рассматривал возможность ее использования... но в то время я не был уверен, что она сможет делать то, что я хочу, не будучи смехотворно медленной и ненадежной. Тем не менее, ваш ответ вдохновил меня на то, чтобы попробовать. Похоже, я могу сделать эту работу... она не такая медленная, как я думал. Надеюсь, это будет работать без сучка и задоринки для клиента, который хочет эту функцию. У них много компьютеров, использующих AD/терминальные службы, а также, вероятно, перемещаемые профили пользователей. RegConnectRegistry() может пригодиться позже. - person beepboopbopbop; 06.07.2009
comment
Если скорость RegLoadKey является проблемой, вы, вероятно, могли бы поискать SID пользователя в HKEY_USERS, что избавило бы вас от вызова RegLoadKey, но это работает только для профилей, которые уже загружены. - person Anders; 07.07.2009