Как получить путь к файлу профиля пользователя, используя Python? - PullRequest
0 голосов
/ 27 января 2020

Я хочу получить путь к файлу профиля пользователя в Windows, используя Python.

Я нашел следующий подход в VB6 :

Option Explicit
'KERNEL32
Private Declare Function GetVersion Lib "KERNEL32" () As Long
'SHELL32
Private Declare Function SHGetUserPicturePath Lib "SHELL32" Alias "#261" (ByVal pUserOrPicName As Long, ByVal sguppFlags As Long, ByVal pwszPicPath As Long, ByVal picPathLen As Long) As Long
Private Declare Function xp_SHGetUserPicturePath Lib "SHELL32" Alias "#233" (ByVal pUserOrPicName As Long, ByVal sguppFlags As Long, ByVal pwszPicPath As Long) As Long

Private Const SGUPP_CREATEPICTURESDIR = &H80000000

Public Function LoadUserTile() As IPictureDisp
    Dim sPath   As String

    sPath = String$(256, vbNullChar)

    Select Case (GetVersion() And &HFF)
        Case 5
            Call xp_SHGetUserPicturePath(0, SGUPP_CREATEPICTURESDIR, StrPtr(sPath))
        Case 6
            Call SHGetUserPicturePath(0, SGUPP_CREATEPICTURESDIR, StrPtr(sPath), 256)
    End Select

    sPath = Left$(sPath, InStr(1, sPath, vbNullChar) - 1)

    Set LoadUserTile = LoadPicture(sPath)
End Function

Но я не знаю, как перевести его на Python, используя ctypes, так как используемые функции не задокументированы MSDN. Я нашел этот альтернативный ресурс , однако.

Я также пытался получить доступ к этой папке :

%ProgramData%\Microsoft\User Account Pictures\Guest.bmp
%ProgramData%\Microsoft\User Account Pictures\User.bmp

Но есть сохраненные изображения профиля по умолчанию, а не текущие.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Листинг [Python 3.Docs]: ctypes - библиотека сторонних функций для Python.

[Airesoft.UnDoc]: SHGetUserPicturePath ( и ссылка SHGetUserPicturePathEx ) содержит точную необходимую информацию:

Копирует изображение учетной записи пользователя во временный каталог и возвращает путь или возвращает различные пути, относящиеся к изображениям пользователя

Синтаксис

HRESULT WINAPI SHGetUserPicturePath (
    LPCWSTR pwszPicOrUserName,
    DWORD sguppFlags,
    LPWSTR pwszPicPath,
    UINT picPathLen
)

Хотя таблица в конце страницы содержит Win 8.1 как новейшую версию, она также работает на Win 10 .

Примечания :

  • Само собой разумеется, что не являясь частью Publi c API , it не следует полагаться на (за исключением, может быть, для демонстрации / обучения), так как поведение может измениться или полностью исчезнуть. Не используйте этот код в производстве!

code00.py :

#!/usr/bin/env python

import sys
import ctypes as ct
from ctypes import wintypes as wt


SGUPP_DIRECTORY = 0x01
SGUPP_DEFAULTDIRECTORY = 0x02
SGUPP_CREATEPICTURESDIR = 0x80000000


def main(*argv):
    shell32_dll = ct.WinDLL("shell32.dll")
    SHGetUserPicturePathW = shell32_dll[261]
    SHGetUserPicturePathW.argtypes = [wt.LPWSTR, wt.DWORD, wt.LPWSTR, wt.UINT]
    SHGetUserPicturePathW.restype = ct.c_long

    buf_len = 0xFF
    buf = ct.create_unicode_buffer(buf_len)
    flags = SGUPP_CREATEPICTURESDIR
    res = SHGetUserPicturePathW(None, flags, buf, buf_len)
    print("    SHGetUserPicturePathW returned {0:016X}\n    Path set to: [{1:s}]".format(res, buf.value))


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main(*sys.argv[1:])
    print("\nDone.")

Вывод :

e:\Work\Dev\StackOverflow\q059927534>"e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32

    SHGetUserPicturePathW returned 0000000000000000
    Path set to: [C:\Users\cfati\AppData\Local\Temp\cfati.bmp]

Done.

Похожие: [SO]: получить изображение пользователя .

1 голос
/ 27 января 2020

Используйте это :

import glob
import os
# Please change the <username> to your username
search_dir = "C:\\Users\\<username>\\AppData\\Roaming\\Microsoft\\Windows\\AccountPictures\\"
files = list(filter(os.path.isfile, glob.glob(search_dir + "*")))
files.sort(key=lambda x: os.path.getmtime(x))

Итак, у вас будет python список files, который будет содержать список файлов, отсортированных по ' дате создание 'заказа. Вы можете получить доступ к последнему изображению учетной записи, используя files[0]

Я взял некоторые ссылки из этой статьи

...