Запуск процесса от имени LocalSystem (Win XP и Win 2000)
От: Diablo239  
Дата: 21.05.05 10:02
Оценка:
Такой вопрос, указан в принципе в теме. (как сервис не устраивает).
Здесь где-то приводились способы но ни одним не получалось...
Открывают токен системного процесса (в XP — 0x04) получаю токен, устанавливаю привилегии (AdjustTokenPrivilegies и т.д.).
Затем пытаюсь открыть токен с вновь полученными привиллегиями и ничего выпадает с ошибками...
res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);

В итоге res = 0, а должно быть какое-то значение ...
Все указанные выше привилегии были даны.
Re: Запуск процесса от имени LocalSystem (Win XP и Win 2000)
От: Alex Fedotov США  
Дата: 21.05.05 22:06
Оценка:
Здравствуйте, 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
Re[2]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: Аноним  
Дата: 22.05.05 06:33
Оценка:
Здравствуйте, 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;
Re[3]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: Diablo239  
Дата: 22.05.05 06:35
Оценка:
Аноним это Diablo239/
Re[2]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: Diablo239  
Дата: 22.05.05 17:04
Оценка:
И еще я считывал DAC, до внесения изменений и после и он выдавал все время одинаковые значения, значит уровень доступа не изменился???
Re[3]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: idiMAN  
Дата: 23.05.05 12:38
Оценка:
Попробовал я этот код, только вот он вылетает с ошибкой "Отказано в доступе" на строке:
                res = OpenProcessToken(hProcess,TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_QUERY,&hTok);

В чём может быть причина? Какие ещё привелегии нужно установить?
Re[3]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: Злость Россия  
Дата: 23.05.05 13:33
Оценка:
Здравствуйте, Аноним, Вы писали:

[skip]

здесь
Автор: Злость
Дата: 28.04.05
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[4]: Запуск процесса от имени LocalSystem (Win XP и Win 20
От: idiMAN  
Дата: 24.05.05 04:54
Оценка:
Здравствуйте, 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.