Python kullanarak Windows kullanıcı adının tam adı (Domain'de)


2

Python'da bir Windows bilgisayar kullanıcısının tam adını almak istiyorum.

Eşdeğer toplu komutunu buldum:

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

tam adı döndürür (örneğin Full Name John Doe).

Kullanarak aşağıdaki yolu yaptım subprocessama bazı Python modülleriyle yapmanın daha doğal bir yolu olup olmadığını merak ediyorum.

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)

Teşekkürler

Yanıtlar:


2

Bunu yapmanın daha doğrudan yolu, Active Directory'yi sorgulamaktır. Kullanıcı üzerinde bir arama yaparsınız ve ardından displayNameözniteliği alırsınız . (Bu Full Name, Windows'ta görüntülenenle eşleşir.)


Burada iki seçeneğiniz var:

Python AD kütüphanesi kullanma, örneğin pyad

Bu çok Windows'a özgüdür ve pywin32kütüphaneyi gerektirir . ADSI API'lerine dayanmaktadır, bu nedenle yalnızca Windows'ta çalışacaktır.

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

Kullanıcı adını nasıl elde edeceğiniz size kalmış. Sen kullanabilirsiniz getpass.getuser(), os.environ["USERNAME"](Windows için), vs.

Bir Python LDAP kütüphanesi kullanmak, örneğin ldap3

Bu, saf bir Python uygulamasıyla standart LDAP protokolünü izler, bu nedenle herhangi bir istemci işletim sisteminden çalışmalıdır.

Ham LDAP sorgularını kullanmak, ADSI soyutlamalarından çok daha fazla söz konusudur. Dokümanları okumanızı (iyi dersler içeren) ve ldap3 üzerinden Microsoft AD ile etkileşime girme konusunda daha fazla ders aramanızı öneririm.


Olası bir sorunun, kullanıcı adıyla (CN) tek başına arama yapmanın yanlış nesneyi alabileceğine dikkat et. Birden fazla OU'da aynı CN ile birden fazla nesneye sahip olmak mümkündür. Daha kesin olmak istiyorsanız, SID gibi benzersiz bir tanımlayıcı kullanmak isteyebilirsiniz.


Windows '"Net * ()" işlevlerini kullanan bir yöntem var mı? (Ya da, pekala, benzer.) O zaman her türlü hesap için işe
yarar

1
@grawity Hm, bunu bile düşünmedim. İle pywin32Kullanabileceğin import win32netve kullanımı win32net.NetUserGetInfo(), hangi çağırır NetUserGetInfo(). 2 veya daha yüksek bir seviye a içerir full_name. Bununla birlikte, bir miktar testle, bir etki alanı yanıtı almak için sunucuyu belirtmeniz gerekiyor - etki alanı kullanıcısını (şu anda bir oturum açmış olanı bile) sorgulayarak None/ localhostbaşarısız oluyor.
Bob

İlginç cevap, yaparken pyad ile çalışırken bir hata var olsa aduser.ADUser.from_cn: The specified query resturned 0 results. getSingleResults only functions with a single result.. Çirkin çözümüme bağlı kalacağımı düşünüyorum :)
Jean-Francois T.

@ Jean-FrancoisT. Hm, bu ilginç - test ettiğimde işe yaradı. Çalıştırdığınız makinenin etki alanına katılmış olduğunu ve doğru kullandığınızı varsayıyorum username? Bu olmalıdır içine geçmesi aynı şey çalışmak net user /domain. Bunu başaramazsanız, NetUserGetInfoyöntemi deneyebilirsiniz . Ya da çirkinliği kabul ederseniz alt işlem yönteminiz;)
Bob

0

@Bob'un yorumlarına göre, aşağıdakiler Windows üzerinde çalışıyor ve saf Python'dur ancak yüklenmesi gerekiyor pywin32( bu Tarif'e göre ):

import win32api
import win32net

user_info = win32net.NetUserGetInfo(win32net.NetGetAnyDCName(), win32api.GetUserName(), 2)
full_name = user_info["full_name"]

Sadece kullanarak komut dosyasında betiğin başka bir kısa versiyonu subprocessşudur:

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()

NOT: Son örnekte, Python 2.7 için son satırı değiştirmeniz gerekecektir ...replace("Full Name", "").strip() .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.