Windows下pwd.getpwnam(username).pw_dir的等效项是什么?


问题内容

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

首先,似乎可以通过跨平台方式获得相同的结果os.path.expanduser('~username')。但是,似乎在Windows
XP上使用Python 2.6时,对于不存在的用户名实际上不会产生故障。此外,在Windows XP上的Python
2.5上,即使对于有效用户,它似乎也会失败。

是否可以在Windows上可靠地获取此信息?怎么样?


问题答案:

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

在Windows上,如果已设置,则将使用HOME和USERPROFILE,否则将使用HOMEPATH和HOMEDRIVE的组合。通过从上面派生的创建的用户路径中删除最后一个目录组件来处理初始
用户

wh ?假设所有用户主目录必须位于同一父目录下。h!

挖掘起来有点困难,但是这里有一个解决方案,可以通过给定名称查找本地用户:

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]