Я новичок в безопасности Windows ... но, читая MSDN и некоторые блоги, мне кажется, что MS хочет, чтобы мы обрабатывали данные других пользователей, путем получения токена пользователя.
будьте хорошей вики из Руководства для разработчиков по безопасности Windows Keith Brown .Net ... вы все равно можете найти его в кэше Google для "pluralsight keith.guidebook"
Случай 1: если у вас нетпароль пользователя:
Для локальных учетных записей вы можете попробовать прочитать реестр Windows, как уже предложил Нас Банов, и есть несколько других рецептов на SO или в Интернете.
Я не уверенкак ведут себя различные версии Windows для только что созданных пользователей ... тех, которые никогда не выполняли интерактивную регистрацию в сеансе ... автоматически ли он создает реестр, домашнюю папку и данные профиля?Я провел несколько тестов на Windows XP, и эти разделы реестра отсутствовали после создания локальной учетной записи ... но в этом случае вы можете попытаться угадать его на основе значений реестра All Users ... или просто не сработать :)
Для настольных приложений, когда приложение работает как зарегистрированный пользователь, я использую что-то вроде этого, чтобы получить домашнюю папку .... и получить эквивалент ~ / .local. Я использую CSIDL_APPDATA для роуминга.профили или просто CSIDL_LOCAL_APPDATA.
from win32com.shell import shell, shellcon
# See microsoft references for further CSIDL constants
# http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
Чтение статьи Кейта Брауна " Как получить токен для пользователя " .. Вы можете найти другие способы получения токена пользователя безпароль ...
Случай 2: Если у вас есть пароль пользователя:
При чтении MSDN у меня сложилось впечатление, что если у меня есть токен пользователя, я могуполучить его папки, вызвав что-то вроде кода ниже ... но это не сработало для меня.(не знаю почему)
token = win32security.LogonUser(
username,
None, # we uses UPN format for username
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT,
)
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, token, 0)
Вот почему я получил этот код ... который далек от совершенства из-за того, что для него требуются имя пользователя и пароль.
token = win32security.LogonUser(
username,
None, # Here should be the domain ... or just go with default values
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT,
)
win32security.ImpersonateLoggedOnUser(token)
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
win32security.RevertToSelf()
Этот вопрос как-то связан: Как найти домашний каталог реального пользователя с помощью python?