我是Windows安全方面的新手...但是阅读MSDN和一些博客后,我觉得微软希望我们处理其他用户特定数据的方式是通过获取用户令牌来完成。
曾经有一个很好的维基页面:Keith Brown的.Net开发人员指南Windows安全性...你仍然可以在Google缓存中找到它,搜索“pluralsight keith.guidebook”。
情况1:如果您没有用户密码:
对于本地账户,您可以尝试像Nas Banov建议的那样读取Windows注册表,并且在SO或互联网上还有其他一些方法。
我不确定各种Windows版本对于新创建的用户的行为方式...那些从未执行过交互式会话登录的用户...是否会自动创建他们的注册表、主目录和配置文件数据?
我在Windows XP上进行了一些测试,在创建本地账户后这些注册表键不存在...但在这种情况下,您可以根据所有用户注册表值猜测它们的位置...或者只是失败:)
对于桌面应用程序,当应用程序作为已登录用户运行时,我使用类似于以下内容来获取主目录....并使用CSIDL_APPDATA来获取等效的~/.local,用于漫游配置文件,或者只是CSIDL_LOCAL_APPDATA。
from win32com.shell import shell, shellcon
folder_name = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, 0, 0)
阅读Keith Brown的文章“如何为用户获取令牌”..您可以寻找其他获取用户令牌的方法,而无需密码...
情况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找到真实的用户主目录?