Такой вопрос, указан в принципе в теме. (как сервис не устраивает).
Здесь где-то приводились способы но ни одним не получалось...
Открывают токен системного процесса (в XP — 0x04) получаю токен, устанавливаю привилегии (AdjustTokenPrivilegies и т.д.).
Затем пытаюсь открыть токен с вновь полученными привиллегиями и ничего выпадает с ошибками...
res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
В итоге res = 0, а должно быть какое-то значение ...
Все указанные выше привилегии были даны.
Здравствуйте, Diablo239, Вы писали:
D>Такой вопрос, указан в принципе в теме. (как сервис не устраивает).
D>Здесь где-то приводились способы но ни одним не получалось...
D>Открывают токен системного процесса (в XP — 0x04) получаю токен, устанавливаю привилегии (AdjustTokenPrivilegies и т.д.).
D>Затем пытаюсь открыть токен с вновь полученными привиллегиями и ничего выпадает с ошибками...
D>D>res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
D>
D>В итоге res = 0, а должно быть какое-то значение ...
D>Все указанные выше привилегии были даны.
Что-то я не могу понять, что вы пытаетесь сделать. Покажите весь код запуска процесса.
Здравствуйте, Alex Fedotov
Где-то здесь был уже этот код:
bool rrt;
PCTSTR privs = {_T("SeDebugPrivilege")};
rrt = EnablePrivileges(&privs,1);
PCTSTR privs2 = {_T("SeIncreaseQuotaPrivilege")};
rrt = EnablePrivileges(&privs2,1);
PCTSTR privs3 = {_T("SeAssignPrimaryTokenPrivilege")};
rrt = EnablePrivileges(&privs3,1);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,0x04);
if (hProcess != NULL){
HANDLE hTok;
if (OpenProcessToken(hProcess, READ_CONTROL|WRITE_DAC,&hTok)){
PACL pDacl = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
if (GetSecurityInfo(hTok,SE_KERNEL_OBJECT,
DACL_SECURITY_INFORMATION,
NULL,NULL,&pDacl,NULL,&pSD) != ERROR_SUCCESS) goto l1;
PACL dacl;
BOOL b;
if (!GetSecurityDescriptorDacl(pSD,&b,&dacl,&b)) goto l1;
TCHAR UserName[1024];
DWORD dwLen = sizeof UserName/sizeof UserName[0];
if (!GetUserName(UserName, &dwLen)) goto l1;
EXPLICIT_ACCESS ea;
BuildExplicitAccessWithName(&ea, UserName,
TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY, GRANT_ACCESS, 0);
ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
ea.grfAccessPermissions = TOKEN_DUPLICATE;
PACL newpAcl = NULL;
if (SetEntriesInAcl(1, &ea, dacl,&newpAcl) != ERROR_SUCCESS) goto l1;
if (SetSecurityInfo(hTok,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,
NULL,NULL,newpAcl,NULL) == ERROR_SUCCESS)
{
BOOL res;
res = 1;
CloseHandle(hTok);
hTok = NULL;
res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
DWORD aaa = GetLastError();
if (res){
STARTUPINFO si = {sizeof(STARTUPINFO)};
GetStartupInfo(&si);
PROCESS_INFORMATION pi = {0};
res = CreateProcessAsUser(hTok,NULL,_T("notepad.exe"),NULL,NULL,FALSE,
0,NULL,NULL,&si,&pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
if (newpAcl) LocalFree(newpAcl);
l1:
if (pSD) LocalFree(pSD);
if (hTok) CloseHandle(hTok);
}
CloseHandle(hProcess);
}
return 0;
И еще я считывал DAC, до внесения изменений и после и он выдавал все время одинаковые значения, значит уровень доступа не изменился???
Попробовал я этот код, только вот он вылетает с ошибкой "Отказано в доступе" на строке:
res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
В чём может быть причина? Какие ещё привелегии нужно установить?
Здравствуйте, Аноним, Вы писали:
[skip]
здесьАвтор: Злость
Дата: 28.04.05
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, idiMAN, Вы писали:
MAN>Попробовал я этот код, только вот он вылетает с ошибкой "Отказано в доступе" на строке:
MAN>MAN> res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);
MAN>
MAN>В чём может быть причина? Какие ещё привелегии нужно установить?
Отвечаю себе сам. У меня прокатило, когда я изменил строку кода так:
ea.grfAccessPermissions := TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY;
В принципе её наверняка можно не писать, и непонятно, зачем вообще было понижать права доступа, т.к. изначально при вызове BuildExplicitAccessWithName использовалось
BuildExplicitAccessWithName(&ea, UserName,
TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY, GRANT_ACCESS, 0);