Что Windows эквивалентен из pwd.getpwnam (имя пользователя) .pw_dir?

Python pwd модуль обеспечивает доступ к getpwnam(3) API POSIX, который может использоваться для получения корневого каталога для конкретного пользователя именем пользователя, также определяя, допустимо ли имя пользователя вообще. pwd.getpwnam повысит исключение, если названо с несуществующим именем пользователя.

Сначала кажется, что тот же результат может быть достигнут межплатформенным способом через os.path.expanduser('~username'). Однако кажется, что с Python 2.6 на Windows XP это на самом деле не произведет отказ для несуществующего имени пользователя. Кроме того, на Python 2.5 на Windows XP, это, кажется, перестало работать даже для действительных пользователей.

Эта информация может быть получена надежно в Windows? Как?

8
задан Gerald Schneider 10 July 2014 в 13:35
поделиться

3 ответа

Чтение документации 2.6 показывает, что os.path.expanduser() не работает в Windows:

В Windows HOME и USERPROFILE будут использоваться, если они установлены, в противном случае комбинация HOMEPATH и HOMEDRIVE будет использоваться. Начальный ~пользователь обрабатывается путем удаления последнего компонент каталога из созданного пользовательского пути, полученного выше.

Say whaat? Это предполагает, что все дома пользователей должны находиться в одном и том же родительском каталоге. Не-е-ет!

Было немного трудно копаться, но вот решение, которое будет искать локального пользователя по заданному имени:

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]
4
ответ дан 5 December 2019 в 21:15
поделиться

вы можете использовать win32api.GetUserName () (только текущий пользователь) или win32net.NetUserGetInfo () (любой пользователь на любом сервере, localhost в комплекте) маршрут. последнее может быть немного медленным, так как получение этой информации из ОС может занять некоторое время.

  import win32net

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

в качестве альтернативы вы можете расширить переменную среды USERPROFILE в Windows или HOME в unix, чтобы получить информацию о текущем авторизованном пользователе:

  def userDir():
      if os.platform.system() == 'Windows':
          return os.environ['USERPROFILE']
      elif os.platform.system() == 'Linux':
          return os.environ['HOME'] 
      else:
          return None
0
ответ дан 5 December 2019 в 21:15
поделиться

Похоже, это относится только к текущему пользователю, но на моей машине (winxp) os.path.expanduser('~') возвращает мой домашний каталог.

0
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: