Есть ли какой-либо API Win32 / MFC для получения CSIDL_LOCAL_APPDATA для пользователя Любые, которого я хочу (не только текущего пользователя)? Допустим, у меня есть список пользователей в форме «домен \ пользователь», и я хочу получить список их путей - возможно ли это?





Вы можете получить SID для пользователя, а затем найти его в HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList и получить значение ProfileImagePath.
Получив этот путь, вы можете получить CLSID_LOCAL_APPDATA для своего пользователя, преобразовать абсолютный путь в относительный путь к вашему профилю, а затем добавить этот относительный путь к другому пути профиля пользователя.
Однако имейте в виду, что это связано с недокументированным ключом реестра и может выйти из строя в будущих версиях ОС. (Или, как сказал бы Рэймонд Чан: «Теперь, когда вы знаете, как это сделать, позвольте мне сказать вам, почему вы не должны делать это таким образом ...» :-))
Если у вас есть токен, представляющий пользователя, вы можете использовать SHGetFolderPath или SHGetKnownFolderPath (в Vista и выше). Однако существуют определенные ограничения безопасности, и вы должны прочитать подробности в MSDN.
SHGetFolderPath - http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx SHGetKnownFolderPath - http://msdn.microsoft.com/en-us/library/bb762188(VS.85).aspx
SHGetFolderPath () должен помочь - это приложение будет запускаться от имени администратора, так что все будет в порядке. Спасибо.
Если я не могу получить токен для SHGetFolderPath (), есть ли другой способ сделать это? Спасибо.
Нет, по соображениям безопасности у вас не должно быть доступа к папкам других пользователей (включая их пути), если у вас нет права олицетворения и действительного токена пользователя (т.е. вам были предоставлены права каким-либо образом делать что-то от его имени)
Я предполагаю, что это работает до тех пор, пока текущий пользователь не переместит свою папку LOCAL_APPDATA или пока пользователь, который вас интересует, не переместит свою папку LOCAL_APPDATA. Один интересный тестовый пример - это ПК, обновленный с XP до Vista, с пользователями до и после обновления.
Да, произойдет сбой, если пользователь переместит свои локальные данные приложения. Это сработает в 99% случаев и совершенно не сработает для босса вашего босса :-)). Вот почему я упомянул, что это неправильный способ делать это. SHGetFolderPath с олицетворением - правильный путь, но вам нужен действующий токен пользователя.
Если есть другой способ, с радостью воспользуюсь :)