Nome completo do nome de usuário do Windows (no domínio) usando Python

1

Eu quero recuperar o nome completo de um usuário de computador com Windows no Python.

Encontrei o comando em lote equivalente:

net user "%USERNAME%" /domain | FIND /I "Full Name"

que retorna o nome completo (por exemplo, Full Name John Doe ).

Eu fiz o seguinte caminho usando subprocess , mas estou querendo saber se existe uma maneira mais nativa de fazer isso com alguns módulos 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)

Obrigado

    
por Jean-Francois T. 11.08.2017 / 04:27

1 resposta

1

A maneira mais direta de fazer isso é consultar o Active Directory. Você faria uma pesquisa no usuário, seguido do atributo displayName . (Isso mapeia para o Full Name exibido no Windows.)

Você tem duas opções aqui:

Usando uma biblioteca do AD do Python, por exemplo pyad

Isso é muito específico do Windows e requer a biblioteca pywin32 . Ele depende de APIs ADSI, portanto, funcionará somente no Windows.

from pyad import aduser
user = aduser.ADUser.from_cn(username)
print user.get_attribute("displayName")

Como você obtém o nome de usuário é com você. Você pode usar getpass.getuser() , os.environ["USERNAME"] (somente para Windows), etc.

Usando uma biblioteca LDAP do Python, por exemplo ldap3

Isso segue o protocolo LDAP padrão, com uma implementação pura do Python, portanto, deve funcionar em qualquer sistema operacional cliente.

O uso de consultas LDAP brutas é um pouco mais complicado que as abstrações ADSI. Eu sugiro que você leia a documentação (que tem tutoriais decentes) e procure por mais tutoriais sobre como interagir com o Microsoft AD via ldap3.

Observe que um possível problema é que a pesquisa pelo nome de usuário (CN) sozinho pode gerar o objeto errado. É possível ter vários objetos com o mesmo CN em várias UOs. Se você quer ser mais preciso, você pode querer usar um identificador único como o SID.

    
por 11.08.2017 / 05:05