使用 Python 获取 Windows 用户名的全名(在域中)

使用 Python 获取 Windows 用户名的全名(在域中)

我想用 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 NameWindows 中显示的。)


您有两个选择:

使用 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 这样的唯一标识符。

相关内容