2

Я хочу получить полное имя пользователя компьютера с Windows в Python.

Я нашел эквивалентную пакетную команду:

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 ответ1

2

Более прямой способ сделать это - запросить Active Directory. Вы выполняете поиск пользователя, а затем получаете атрибут displayName . (Это соответствует Full Name отображаемому в Windows.)


У вас есть два варианта здесь:

Использование библиотеки Python AD, например, pyad

Это очень специфично для Windows и требует библиотеки pywin32 . Он опирается на API-интерфейсы ADSI, поэтому будет работать только на 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) может привести к неправильному объекту. Можно иметь несколько объектов с одним и тем же CN в нескольких подразделениях. Если вы хотите быть более точным, вы можете использовать уникальный идентификатор, такой как SID.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .