8

Python pwd モジュールは、POSIX API へのアクセスを提供しますgetpwnam(3)。これを使用して、特定のユーザーのホーム ディレクトリをユーザー名で取得したり、ユーザー名が有効かどうかを判断したりできます。 pwd.getpwnam存在しないユーザー名で呼び出された場合、例外が発生します。

最初は、を介してクロスプラットフォームの方法で同じ結果を達成できるように見えますos.path.expanduser('~username')。ただし、Windows XP 上の Python 2.6 では、存在しないユーザー名に対して実際にエラーが発生することはないようです。さらに、Windows XP 上の Python 2.5 では、有効なユーザーに対しても失敗するようです。

この情報は Windows で確実に取得できますか? どのように?

4

4 に答える 4

4

2.6のドキュメントを読むと、os.path.expanduser()Windows では壊れていることがわかります。

Windows では、HOME と USERPROFILE が設定されている場合はそれが使用されます。設定されていない場合は、HOMEPATH と HOMEDRIVE の組み合わせが使用されます。最初の~userは、上記で作成されたユーザー パスから最後のディレクトリ コンポーネントを削除することによって処理されます。

何て言うこれは、すべてのユーザー ホームが同じ親ディレクトリの下にある必要があることを前提としています。うーん!

掘り下げるのは少し難しかったですが、これは与えられた名前でローカルユーザーを検索する解決策です:

from win32security import LookupAccountName, ConvertSidToStringSid
from _winreg import OpenKey, QueryValueEx, HKEY_LOCAL_MACHINE

def getUserDir(userName):
    ssid = ConvertSidToStringSid(LookupAccountName(None, userName)[0])
    key = OpenKey(HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\\' + ssid)
    return QueryValueEx(key, 'ProfileImagePath')[0]
于 2010-07-22T06:32:23.867 に答える
0

win32api.GetUserName()(現在のユーザーのみ)またはwin32net.NetUserGetInfo()(任意のサーバー上の任意のユーザー、ローカルホストを含​​む)ルートを使用できます。後者は、OSからこの情報を取得するのに時間がかかる可能性があるため、少し遅くなる可能性があります。

  import win32net

  def userDir(username):
        return win32net.NetUserGetInfo(None, username, 1).get("home_dir")

USERPROFILEまたは、WindowsまたはUNIXで環境変数を展開してHOME、現在ログインしているユーザーに関する情報を取得することもできます。

  def userDir():
      if os.platform.system() == 'Windows':
          return os.environ['USERPROFILE']
      elif os.platform.system() == 'Linux':
          return os.environ['HOME'] 
      else:
          return None
于 2010-07-22T04:46:22.790 に答える
0

これは現在のユーザーにのみ適用されるようですが、私の (winxp) マシンでos.path.expanduser('~')は、ホーム ディレクトリが返されます。

于 2010-07-22T13:07:28.460 に答える