Узнать путь профиля юзера по sid?

Тема в разделе "WASM.WIN32", создана пользователем djmans, 16 янв 2010.

  1. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>\ProfileImagePath
    у менять есть только sid, как попасть сюда красиво(не через Reg*) через винапю типа GetUserProfileDirectory?
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Если юзер с даным сидом не залогинен, то через регистр самый кошерный способ.
     
  3. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    Наверное это, нет?
     
  4. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    точнее не то =)
     
  5. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    нельзя ли создать какой нить псевдо токен из сида? Чтобы хватило это апишки...
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нельзя. Токен создается когда юзер логинится.
     
  7. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    Можно. Надо поставить хук на NtQueryInformationToken и следить за тем, что если токен левый и выдавать SID'ы какие нужно на выходе, но метод ппц хоть и работает. Пожалуй, действительно Reg* будет самым официальным способом.
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >нельзя ли создать какой нить псевдо токен из сида?
    На самом деле можно создать полноценный токен – "NtCreateToken()". Однако, во-первых, в данной ситуации это определённо оверкилл, а во-вторых, для успешного вызова этой апи нужна привилегия SeCreateToken, которой по умолчанию нет даже у админов.
     
  9. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    А что будешь передавать в качестве ProfilePath ?
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Что за ProfilePath? :)

    Код (Text):
    1. // <ntseapi.h>, ntdll.dll
    2. extern "C"
    3. NTSYSCALLAPI
    4. NTSTATUS
    5. NTAPI
    6. NtCreateToken(
    7.     __out PHANDLE TokenHandle,
    8.     __in ACCESS_MASK DesiredAccess,
    9.     __in_opt struct OBJECT_ATTRIBUTES* ObjectAttributes,
    10.     __in TOKEN_TYPE TokenType,
    11.     __in PLUID AuthenticationId,
    12.     __in PLARGE_INTEGER ExpirationTime,
    13.     __in PTOKEN_USER User,
    14.     __in PTOKEN_GROUPS Groups,
    15.     __in PTOKEN_PRIVILEGES Privileges,
    16.     __in_opt PTOKEN_OWNER Owner,
    17.     __in PTOKEN_PRIMARY_GROUP PrimaryGroup,
    18.     __in_opt PTOKEN_DEFAULT_DACL DefaultDacl,
    19.     __in CONST TOKEN_SOURCE* TokenSource
    20.     );
    Кстати, скорее всего "GetUserProfileDirectory()" извлекает из токена sid, а дальше находит путь через реестр. (Исключительно наше предположение).
     
  11. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    Так и есть. Вчера глядел.
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Упс, перепутал с CreateToken.
     
  13. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    NetUserEnum()-ом перечислить SID-ы имеющихся пользователей, сравнивая с нужным, далее с помощью LookupAccountName() получить имя пользователя, с помощью GetProfilesDirectory() - путь к директории с домашними каталогами, искомый путь найти просто сложив две строки.
    /thread
     
  14. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    Cr4sh
    GetProfilesDirectory() допустим может вернуть C:\Users а профиль пользователя может болтаться в совершенно другом каталоге, например в D:\Profiles и второе: имя папки профиля не обязательно соответствует имени пользователя. Может и быть типа User.DOMAIN, User.000 и т.д.