Что то я малям понять не могу как можно установить привилегию SE_CREATE_TOKEN_NAME; делаю так Код (Text): LUID ss; LookupPrivilegeValue(NULL,SE_CREATE_TOKEN_NAME,&ss); if (_RtlAdjustPrivilege(ss.LowPart,TRUE,FALSE,&en)==STATUS_PRIVILEGE_NOT_HELD) { MessageBoxA(NULL,"Касячок","ds",0); } _RtlAdjustPrivilege получаю динамически; Другие привелегии типа SE_DEBUG_NAME нормально получаю а вот SE_CREATE_TOKEN_NAME не могу _RtlAdjustPrivilege возврашает C0000061 ОС win2k Пользователь Администратор Объясните пожалуйста.
Попытался переписать что то типа такого Код (Text): *(FARPROC *)&_NtOpenProcessToken=GetProcAddress(GetModuleHandle("ntdll"), "NtOpenProcessToken"); *(FARPROC *)&_NtAdjustPrivilegesToken=GetProcAddress(GetModuleHandle("ntdll"), "NtAdjustPrivilegesToken"); TOKEN_PRIVILEGES NewState; TOKEN_PRIVILEGES OldState; ULONG ReturnLength; HANDLE TokenHandle; NTSTATUS Status; LUID Privilege; Status=_NtOpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&TokenHandle); if (!NT_SUCCESS(Status)) { MessageBoxA(0,"NtOpenProcessToken","",0); } LookupPrivilegeValue(NULL,SE_CREATE_TOKEN_NAME, &Privilege); OldState.PrivilegeCount = 1; NewState.PrivilegeCount = 1; NewState.Privileges[0].Luid=Privilege; NewState.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED; Status = _NtAdjustPrivilegesToken(TokenHandle,FALSE,&NewState,sizeof(TOKEN_PRIVILEGES),&OldState,&ReturnLength); if (Status == STATUS_NOT_ALL_ASSIGNED) { MessageBoxA(0,"STATUS_NOT_ALL_ASSIGNED","",0); } Теперь валится _NtAdjustPrivilegesToken в 106 ошибку
yurza Не правильно функциию вызываешь LookupPrivilegeValue,там надо строкой передавать привилегию... BOOL LookupPrivilegeValue( LPCTSTR lpSystemName, // address of string specifying the system LPCTSTR lpName, // address of string specifying the privilege PLUID lpLuid // address of locally unique identifier ); вот такого вида она должна быть LookupPrivilegeValueA(0,"SeDebugPrivilege",&luid); а вообще вот код: int ChangePriv() { HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tkp; DWORD rb; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken); LookupPrivilegeValueA(0,"SeDebugPrivilege",&luid); tkp.PrivilegeCount=1; tkp.Privileges->Luid.HighPart=luid.HighPart; tkp.Privileges->Luid.LowPart=luid.LowPart; tkp.Privileges->Attributes=SE_PRIVILEGE_ENABLED; return AdjustTokenPrivileges(hToken,0,&tkp,sizeof(tkp),&tkp,&rb); }
а разве в winnt.h они не определены как #define SE_DEBUG_NAME TEXT("SeDebugPrivilege") #define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege") SeDebugPrivilege у меня нормально вызывается а вот SeCreateTokenPrivilege нет
угу проверил,ошибка NOT_ALL_ASSIGNED...Ну так как Adjust тока включает или выключает привилегии,а не добавляет новые,выходит что данный токен не обладает такой привилегией...Или я не прав?
Да я вот тоже к этому скланяюсь смотрю Sysinternals Process Explorer только сервисы имеют SeCreateTokenPrivilege привилегию и то не все будем копать в сторону добавления привелегий если это возможно.
yurza смотрел в поиске пишут вроде как не возможно...Если есть то они есть а если нет то их нет...Но если у тебя что получится то отпишись...
Если каму интересно Ну вообшем чтобы получить привилегию SeCreateTokenPrivilege покавырял я тут и пришол к выводу что нужно влючить в "gpedit.msc" Груповая палитика->Назначение прав пользователей->Создание маркерного объекта ну к примеру Администратору разрешение и рестарт тогда данная привелегия появится на процессах от админа ну а потом Enable её программно.
Ну это пользовательски а не программно делается...Поэтому может поковыряешься и программно намутишь?=)