Доброго времени суток! Есть проблема с созданием токена пользователя при входе в систему. Используется функция ZwCreateToken Код (Text): PVOID GetFromToken(HANDLE hToken, TOKEN_INFORMATION_CLASS tic) { DWORD n; BOOL rv = GetTokenInformation(hToken, tic, 0, 0, &n); if (rv == FALSE && GetLastError() != ERROR_INSUFFICIENT_BUFFER) return 0; PBYTE p = new BYTE[n]; return GetTokenInformation(hToken, tic, p, n, &n) == FALSE ? 0 : p; } BOOL EnablePrivilege(PCSTR name) { TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}}; LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid); HANDLE hToken; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0); DWORD dwLastError = GetLastError(); BOOL rv = dwLastError == ERROR_SUCCESS; CloseHandle(hToken); return rv; } //clear HANDLE GetHtoken(wchar_t * usranama) { EnablePrivilege(SE_CREATE_TOKEN_NAME); DWORD size=256; HANDLE hToken; OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_QUERY_SOURCE, &hToken); SID_IDENTIFIER_AUTHORITY nt = SECURITY_NT_AUTHORITY; PSID system; system=lookupaccntname(usranama); TOKEN_USER user = {{system, 0}}; LUID luid; AllocateLocallyUniqueId(&luid); TOKEN_SOURCE source = {{'*', '*', 'A', 'N', 'O', 'N', '*', '*'}, {luid.LowPart, luid.HighPart}}; PTOKEN_STATISTICS stats = PTOKEN_STATISTICS(GetFromToken(hToken, TokenStatistics)); LUID authid = SYSTEM_LUID; SECURITY_QUALITY_OF_SERVICE sqos = {sizeof sqos, SecurityAnonymous, SECURITY_STATIC_TRACKING, FALSE}; OBJECT_ATTRIBUTES oa = {sizeof oa, 0, 0, 0, 0, &sqos}; HANDLE hToken2 = 0; NTSTATUS status=ZwCreateToken(&hToken2, TOKEN_ALL_ACCESS, &oa, TokenPrimary, PLUID(&authid), PLARGE_INTEGER(&stats->ExpirationTime), &user, PTOKEN_GROUPS(GetFromToken(hToken, TokenGroups)), PTOKEN_PRIVILEGES(GetFromToken(hToken, TokenPrivileges)), PTOKEN_OWNER(GetFromToken(hToken, TokenOwner)), PTOKEN_PRIMARY_GROUP(GetFromToken(hToken, TokenPrimaryGroup)), PTOKEN_DEFAULT_DACL(GetFromToken(hToken, TokenDefaultDacl)), &source); CloseHandle(hToken); return hToken2; } Но так токен создается какой-то кривой, система часто падает. Подскажите, пожалуйста, что пофиксить?
В исходниках Неббета (Native API Reference) пример этого. И да, это точно работать будет. 1171835132__Example8.1.txt
Спасибо за пример! Но этот пример, очевидно, создает пользователя Local System. А хотелось бы создавать пользовательский токен идентичный оригинальному. Кто знает как, пожалуйста, поделитесь опытом. Thanks in advance, Merovingian.