Как я могу получить путь к «специальной папке» Windows для конкретного пользователя? - PullRequest
10 голосов
/ 13 октября 2008

Каков наилучший способ определения пути к специальной папке (например, «Мои документы») для конкретного пользователя внутри службы? SHGetFolderPath позволяет вам передавать токен, поэтому я предполагаю, что есть какой-то способ выдать себя за пользователя, папка которого вас интересует.

Есть ли способ сделать это, основываясь только на имени пользователя? Если нет, какой минимальный объем информации вам необходим для учетной записи пользователя? Я бы предпочел не требовать пароль пользователя.

(Вот вопрос .)

Ответы [ 4 ]

12 голосов
/ 13 октября 2008

Пожалуйста, не заходите в реестр, чтобы найти эту информацию. Это местоположение может измениться в будущих версиях Windows. Вместо этого используйте SHGetFolderPath.

http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx

Edit: похоже, что LogonUser предоставит токен для другого пользователя, который вам нужен.

3 голосов
/ 13 октября 2008

Вы можете попробовать вызвать ImpersonateLoggedOnUser () , чтобы изменить токен пользователя для другого пользователя, а затем передать его в SHGetFolderPath (). Основываясь на документе для ImpersonateLoggedOnUser (), похоже, что вы можете вызвать LogonUser (), чтобы получить токен для конкретного пользователя.

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

2 голосов
/ 14 октября 2008

Я бы смонтировал куст реестра пользователя и искал значение пути. Да, это неоптимальное решение по всем упомянутым причинам (плохая прямая совместимость и т. Д.). Однако, как и многие другие вещи в Windows, MS не предоставила API-способ делать то, что вы хотите, поэтому это лучший доступный вариант.

Вы можете получить SID (не GUID) пользователя, используя LookupAccountName . Вы можете загрузить куст реестра пользователя, используя LoadUserProfile , но, к сожалению, для этого также требуется токен пользователя, для которого потребуется пароль. К счастью, вы можете вручную загрузить улей, используя RegLoadKey , в произвольное место, прочитать данные и выгрузить их (я думаю).

Да, это боль, и да, она, вероятно, сломается в будущих версиях Windows. Возможно, к тому времени MS предоставит API для этого, перенесет его обратно в более старые версии Windows и автоматически распространит через обновление Windows ... но я не задерживаю дыхание.

P.S. Эта информация предназначена для дополнения информации, представленной в вашем связанном вопросе, включая отказ от ответственности.

0 голосов
/ 13 октября 2008

Эта информация хранится в реестре в разделе "HKEY_USERS \ S-1-5-21-616815238-485949776-2992451252-3228 \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки пользовательских оболочек".

"S-1-5-21-616815238-485949776-2992451252-3218" - это GUID пользователя. Вам нужно получить этот GUID, чтобы найти соответствующий ключ и прочитать его.

В этом примере они используют функцию SHGetFolderPath, о которой вы упомянули, и есть список со всеми специальными папками, которые могут быть полезны.

ПРИМЕЧАНИЕ: Microsoft не рекомендует использовать раздел реестра, поскольку он все еще существует только для обратной совместимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...