web-dev-qa-db-ja.com

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)

ありがとう

4

@Bobからのコメントに基づいて、以下はWindowsで動作し、純粋にPythonですが、_pywin32_をインストールする必要があります( this Recipe に基づいて) :

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

注:最後の例では、最後の行を次のように変更する必要があります...replace("Full Name", "").strip() Python 2.7。の場合

1

これを行うより直接的な方法は、Active Directoryにクエリを実行することです。ユーザーの検索を実行してから、displayName属性を取得します。 (これは、Windowsに表示される_Full Name_にマップされます。)


ここには2つのオプションがあります。

Python ADライブラリ、たとえば pyad を使用する

これは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ライブラリ、たとえば ldap を使用する

これは標準のLDAPプロトコルに準拠しており、純粋なPython実装なので、どのクライアントOSからでも動作するはずです。

生のLDAPクエリの使用は、ADSIの抽象化よりもかなり複雑です。ドキュメント(きちんとしたチュートリアルがあります)を読み、ldap3を介したMicrosoft ADの操作に関するチュートリアルを検索することをお勧めします。


考えられる問題の1つは、ユーザー名(CN)だけで検索すると、間違ったオブジェクトが表示される可能性があることです。複数のOUにわたって同じCNを持つ複数のオブジェクトを持つことが可能です。より正確にしたい場合は、SIDなどの一意の識別子を使用できます。

3
Bob