Soy nuevo en la seguridad de Windows ... pero leyendo MSDN y algunos blogs me parece que la forma en que MS quiere que manejemos datos específicos de otros usuarios es obteniendo un token de usuario.
No solía ser un buen wiki de Keith Brown Guía de desarrolladores de .NET para seguridad de Windows ... todavía se puede encontrar en Google caché para "Pluralsight keith.guidebook"
Caso 1: Si Don No tiene la contraseña de usuario:
Para las cuentas locales puede intentar leer el registro de Windows como ya sugirió Nas Banov y hay algunas otras recetas en SO o en Internet.
No estoy seguro de cómo se comportan varias versiones de Windows para usuarios recién creados ... aquellos que nunca han realizado un inicio de sesión de sesión interactivo ... ¿crea automáticamente su registro, carpeta de inicio y datos de perfil? He hecho algunas pruebas en Windows XP y esas claves de registro no estaban presentes después de crear una cuenta local ... pero en este caso puede intentar adivinarlo en base a los valores de registro de todos los usuarios ... o simplemente fallar :)
Para aplicaciones de escritorio, cuando la aplicación se ejecuta como un usuario conectado, estoy usando algo como esto para obtener la carpeta de inicio ... y para obtener el equivalente de ~/.local estoy usando CSIDL_APPDATA, para perfiles móviles , o solo 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)
artículo de lectura Keith Brown "How To Get A Token For A User" .. se puede buscar algunas otras maneras de conseguir un token de usuario sin una contraseña ...
Caso 2: Si usted tiene la contraseña de usuario:
Lectura de MSDN Obtuve la impresión de que si tengo un token de usuario, puedo obtener sus carpetas llamando al código siguiente ... pero no funcionó. (No estoy seguro por qué)
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)
Es por esto que terminó con el código ... que está lejos de ser perfecta debido al hecho de que requiere nombre de usuario y contraseña.
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()
Esta pregunta tiene cierta relación: How to find the real user home directory using python?
amor siempre una buena pregunta "Python en Windows". Cuanto antes traigamos la iluminación a esa plataforma (si es posible), mejor para todos. –
'~ user' no debe funcionar en 2.5, está implementado en 2.6+ pero de una manera _broken_, vea mi respuesta a continuación para la implementación en funcionamiento. Sí, tuve que mirar en el registro, me temo. –