我是 Windows 安全新手……但阅读 MSDN 和一些博客,在我看来,MS 希望我们处理其他用户特定数据的方式是获取用户令牌。
Keith Brown .Net Developers Guide to Windows Security 曾经有一个不错的 wiki……您仍然可以在 Google 缓存中找到它的“pluralsight keith.guidebook”
案例1:如果您没有用户密码:
对于本地帐户,您可以尝试按照 Nas Banov 的建议阅读 Windows 注册表,并且在 SO 或 Internet 上还有其他一些方法。
我不确定各种 Windows 版本对于新创建的用户的表现如何......那些从未执行过交互式会话登录的用户......它会自动创建他们的注册表、主文件夹和配置文件数据吗?我在 Windows XP 上做了一些测试,创建本地帐户后这些注册表项不存在...但在这种情况下,您可以尝试根据所有用户注册表值猜测它...或者只是失败:)
对于桌面应用程序,当应用程序以登录用户身份运行时,我正在使用类似的东西来获取主文件夹....并获得 ~/.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)
阅读 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()
这个问题有点相关:How to find the real user home directory using python?