HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>\ProfileImagePath у менять есть только sid, как попасть сюда красиво(не через Reg*) через винапю типа GetUserProfileDirectory?
Можно. Надо поставить хук на NtQueryInformationToken и следить за тем, что если токен левый и выдавать SID'ы какие нужно на выходе, но метод ппц хоть и работает. Пожалуй, действительно Reg* будет самым официальным способом.
>нельзя ли создать какой нить псевдо токен из сида? На самом деле можно создать полноценный токен – "NtCreateToken()". Однако, во-первых, в данной ситуации это определённо оверкилл, а во-вторых, для успешного вызова этой апи нужна привилегия SeCreateToken, которой по умолчанию нет даже у админов.
Что за ProfilePath? Код (Text): // <ntseapi.h>, ntdll.dll extern "C" NTSYSCALLAPI NTSTATUS NTAPI NtCreateToken( __out PHANDLE TokenHandle, __in ACCESS_MASK DesiredAccess, __in_opt struct OBJECT_ATTRIBUTES* ObjectAttributes, __in TOKEN_TYPE TokenType, __in PLUID AuthenticationId, __in PLARGE_INTEGER ExpirationTime, __in PTOKEN_USER User, __in PTOKEN_GROUPS Groups, __in PTOKEN_PRIVILEGES Privileges, __in_opt PTOKEN_OWNER Owner, __in PTOKEN_PRIMARY_GROUP PrimaryGroup, __in_opt PTOKEN_DEFAULT_DACL DefaultDacl, __in CONST TOKEN_SOURCE* TokenSource ); Кстати, скорее всего "GetUserProfileDirectory()" извлекает из токена sid, а дальше находит путь через реестр. (Исключительно наше предположение).
NetUserEnum()-ом перечислить SID-ы имеющихся пользователей, сравнивая с нужным, далее с помощью LookupAccountName() получить имя пользователя, с помощью GetProfilesDirectory() - путь к директории с домашними каталогами, искомый путь найти просто сложив две строки. /thread
Cr4sh GetProfilesDirectory() допустим может вернуть C:\Users а профиль пользователя может болтаться в совершенно другом каталоге, например в D:\Profiles и второе: имя папки профиля не обязательно соответствует имени пользователя. Может и быть типа User.DOMAIN, User.000 и т.д.