我想用 Python 检索 Windows 计算机用户的全名。
我找到了等效的批处理命令:
net user "%USERNAME%" /domain | FIND /I "Full Name"
返回全名(例如Full Name John Doe
)。
我已经使用以下方式完成了工作subprocess
,但我想知道是否有更原生的方式使用一些 Python 模块来完成它。
import getpass
import subprocess
import re
username = getpass.getuser()
p = subprocess.Popen(
'net user %s /domain' % username,
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
info, err = p.stdout.read(), p.stderr.read()
full_name = re.findall(r'Full Name\s+(.*\S)', info)
print(full_name)
谢谢
答案1
根据@Bob的评论,以下内容适用于Windows并且是纯Python,但需要安装pywin32
(基于这个食谱):
import win32api
import win32net
user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]
问题中仅使用的另一个较短版本的脚本subprocess
是:
import subprocess
name = subprocess.check_output(
'net user "%USERNAME%" /domain | FIND /I "Full Name"', shell=True
)
full_name = name.replace(b"Full Name", b"").strip()
注意:对于 Python 2.7,在最后一个示例中,您需要将最后一行更改为 ...replace("Full Name", "").strip()
答案2
更直接的方法是查询 Active Directory。您需要对用户执行查找,然后获取属性displayName
。(这映射到Full Name
Windows 中显示的。)
您有两个选择:
使用 Python AD 库,例如皮亚德
这是 Windows 独有的,需要pywin32
库。它依赖于 ADSI API,因此只能在 Windows 上运行。
from pyad import aduser
user = aduser.ADUser.from_cn(username)
print(user.get_attribute("displayName"))
如何获取用户名由您决定。您可以使用getpass.getuser()
、os.environ["USERNAME"]
(仅限 Windows)等。
使用 Python LDAP 库,例如ldap3
它遵循标准 LDAP 协议,采用纯 Python 实现,因此可以在任何客户端操作系统上运行。
使用原始 LDAP 查询比 ADSI 抽象更复杂。我建议您阅读文档(其中包含不错的教程)并搜索有关通过 与 Microsoft AD 交互的更多教程ldap3
。
请注意,一个可能的问题是,仅通过用户名 (CN) 搜索可能会得到错误的对象。多个 OU 中可能存在具有相同 CN 的多个对象。如果想要更精确,您可能需要使用像 SID 这样的唯一标识符。