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

Jea*_*one 8 python windows home-directory

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

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

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

Nas*_*nov 4

阅读2.6 文档表明它os.path.expanduser()在 Windows 上被破坏:

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

什么?这假设所有用户主目录必须位于同一父目录下。呃呃!

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

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]
Run Code Online (Sandbox Code Playgroud)