什么是pwd.getpwnam(用户名).pw_dir的Windows等价物?

Python pwd模块提供对getpwnam(3) POSIX API的访问,可以通过用户名来获取特定用户的主目录,以及确定用户名是否有效。 如果使用不存在的用户名进行调用, pwd.getpwnam将引发exception。

起初,似乎可以通过os.path.expanduser('~username')以跨平台的方式实现相同的结果。 但是,在Windows XP上使用Python 2.6似乎不会为不存在的用户名生成失败。 而且,在Windows XP上的Python 2.5上,即使对于有效的用户来说也似乎失败了。

可以在Windows上可靠地获取这些信息吗? 怎么样?

Solutions Collecting From Web of "什么是pwd.getpwnam(用户名).pw_dir的Windows等价物?"

阅读2.6文档显示os.path.expanduser()在Windows上被破坏:

在Windows上,如果设置了HOME和USERPROFILE,将会使用HOMEPATH和HOMEDRIVE的组合。 初始用户通过从上面导出的创建的用户路径中剥离最后一个目录组件来处理。

whaat ? 这假设所有的用户家庭都必须在同一个父目录下。 新加坡国立大学医院,唉!

这是一个有点难以挖掘,但这是一个解决方案,将按给定的名称查找本地用户:

 from win32security import LookupAccountName, ConvertSidToStringSid from _winreg import OpenKey, QueryValueEx, HKEY_LOCAL_MACHINE def getUserDir(userName): ssid = ConvertSidToStringSid(LookupAccountName(None, userName)[0]) key = OpenKey(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\\' + ssid) return QueryValueEx(key, 'ProfileImagePath')[0] 

我是新来的Windows安全…但阅读MSDN和一些博客在我看来,MS希望我们处理其他用户的具体数据的方式是通过获取用户令牌。

曾经有一个很好的基思布朗.Net开发者指南的Windows安全维基…你仍然可以在Google缓存中找到它“pluralsight keith.guidebook”

案例1:如果您没有用户密码:

对于本地帐户,你可以尝试阅读Windows注册表作为Nas Banov已经建议,并在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) 

阅读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找到真正的用户主目录?

你可以去win32api.GetUserName() (仅限当前用户)或win32net.NetUserGetInfo() (任何服务器上的任何用户,包括localhost)路由。 后者可能会有点慢,因为从操作系统获取这些信息需要一些时间。

  import win32net def userDir(username): return win32net.NetUserGetInfo(None, username, 1).get("home_dir") 

或者,您可以在UNIX或Windows上扩展环境变量USERPROFILE以获取有关当前登录用户的信息:

  def userDir(): if os.platform.system() == 'Windows': return os.environ['USERPROFILE'] elif os.platform.system() == 'Linux': return os.environ['HOME'] else: return None 

这似乎只适用于当前用户,但在我的(winxp)机器上, os.path.expanduser('~')返回我的主目录。