Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202

Не получается сгруппировать запущенные процессы по ключу SID

03.08.2015, 19:47. Показов 2326. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача простая - разделить запущенные в системе процессы на системные и запущенные пользователем.

Пытаюсь отфильтровать хотя бы процессы с ключом "Local":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    PBOOL isMember = 0;
 
    if (!thSnapShot) {
 
        CloseHandle(thSnapShot);
        return ;
    }
 
    while (Process32Next(thSnapShot, &pe)) {
    
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
 
        OpenProcessToken(hProcess, TOKEN_QUERY, &thSnapShot);
 
        CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize);
 
        CheckTokenMembership(hProcess, TheSID, isMember);
 
        if (isMember) {
 
            p("Local: ", pe.szExeFile, "\n");
        }
    }
}
И тут уже косяк, функция :
C++
1
OpenProcessToken(hProcess, PROCESS_ALL_ACCESS, &thSnapShot);
Возвращает на каждом процессе 0, кроме процесса "sihost.exe", соответственно дальше код работает не корректно, подправьте меня, кстати привилегии дебагера пробовал включать, тоже самое, если нужно функцию кину ниже.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2015, 19:47
Ответы с готовыми решениями:

Qt приложение отображающее запущенные процессы
Как используя инструменты Qt 5.3+ реализовать приложение отображающее запущенные процессы в виде списка. По клику на элементе списка нужно...

Вывести запущенные процессы на удаленном пк в сети
Добрый день. Нашел проект в интернетеhttps://www.codemag.com/article/1309031/Listing-Processes-Running-on-a-Computer, который выводит все...

Как просмотреть все запущенные процессы
Как просмотреть все запущеные процессы через C#? Которые даже скрыты например руткитты

32
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.08.2015, 20:40
C++
1
2
3
4
5
if (!thSnapShot) {
 
        CloseHandle(thSnapShot);
        return ;
    }
Этот кусок невалидный. Если thSnapShot будет равен INVALID_HANDLE_VALUE,
то условие сработает и зачем-то будет вызван CloseHandle.

C++
1
while (Process32Next(thSnapShot, &pe)) {
Любопытно. А где Process32First ?

C++
1
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
Здесь PROCESS_ALL_ACCESS вовсе не нужен. Достаточно PROCESS_QUERY_INFORMATION.
И где, кстати, проверка, что hProcess != NULL ?

C++
1
OpenProcessToken(hProcess, TOKEN_QUERY, &thSnapShot);
Довольно странно сохранять токен в thSnapShot, где хранится адрес другого хэндла.
И снова нет проверки ошибок.

C++
1
CheckTokenMembership(hProcess, TheSID, isMember);
Равносильно тому, что вместо isMember передали бы сразу NULL.
И опять нет проверки ошибок.

Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
И тут уже косяк, функция :
Код C++
Выделить код
1
OpenProcessToken(hProcess, PROCESS_ALL_ACCESS, &thSnapShot);
Возвращает на каждом процессе 0, кроме процесса "sihost.exe"
Чет мне кажется, что ошибка гораздо раньше. И здесь не PROCESS_ALL_ACCESS
нужен, а TOKEN_QUERY.

Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
привилегии дебагера пробовал включать, тоже самое
Да, лучше показать код.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
03.08.2015, 21:03  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Любопытно. А где Process32First ?
А зачем он нужен? Чтение в цикле итак начинается с первого процесса в системе, я проверял или я ошибаюсь?

Добавлено через 52 секунды
Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь PROCESS_ALL_ACCESS вовсе не нужен. Достаточно PROCESS_QUERY_INFORMATION.
Пробнул все ключи доступа! Одно и тоже всегда! Я не знаю с чем это связано...

Добавлено через 34 секунды
Цитата Сообщение от Убежденный Посмотреть сообщение
Довольно странно сохранять токен в thSnapShot, где хранится адрес другого хэндла.
Как сделать грамотно?

Добавлено через 32 секунды
Цитата Сообщение от Убежденный Посмотреть сообщение
Да, лучше показать код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void j() {
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tokenPrivileges;
    LUID luidDebug;
 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE) {
        if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE) {
            tokenPrivileges.PrivilegeCount = 1;
            tokenPrivileges.Privileges[0].Luid = luidDebug;
            tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            if (AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, NULL, NULL) == FALSE) {
                //throw gcnew System::Exception("FAILED TO CHANGE TOKEN PRIVILEGES");
            }
        }
    }
    CloseHandle(hToken);
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.08.2015, 21:09
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
А зачем он нужен?
Так положено. Если не вызывать Process32First, правильная работа не гарантируется.

Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
Пробнул все ключи доступа! Одно и тоже всегда!
Дык чем меньше запрашивается прав, тем выше шанс, что они будут получены.

Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
Как сделать грамотно?
Что-то вроде такого:
C++
1
2
3
4
5
HANDLE hToken;
if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) {
    logError("OpenProcessToken failed (last error = 0x%.8lx).", GetLastError();
    goto ExitFailure;
}
----
C++
1
if (AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, NULL, NULL) == FALSE)
В четвертый аргумент нужно положить 'sizeof (tokenPrivileges)'.
Да, и после успешного вызова этой функции следует проверить,
что GetLastError == 0, только тогда она успешна.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
03.08.2015, 21:28  [ТС]
Чуть переделал код как ты посоветовал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
    
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    PBOOL isMember = 0;
 
    //if (!thSnapShot) {
    //
    //  CloseHandle(thSnapShot);
    //  return ;
    //}
 
    while (Process32Next(thSnapShot, &pe)) {
    
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
        if (hProcess != 0) {
 
            OpenProcessToken(hProcess, TOKEN_QUERY, &thSnapShot);
 
            CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize);
 
            CheckTokenMembership(hProcess, TheSID, isMember);
 
            if (isMember) {
 
                p("Local: ", pe.szExeFile, "\n");
            }
 
        }
    }
}
Это ужас!
C++
1
2
3
4
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
        if (hProcess != 0) {
.....
Проверка на hProcess и все hProcess всегда равен 0;
Че за фигня????Может потому что виндовс 10?

Добавлено через 10 минут
Извиняюсь вот конечный код, не работает на той же функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    PBOOL isMember = 0;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
 
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &thSnapShot)) {
 
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if (CheckTokenMembership(hProcess, TheSID, isMember)) {
 
                            if (isMember) {
 
                                p("Local: ", pe.szExeFile, "\n");
                            }
                        }
                    }
 
                }
            }
 
        }
    }
}
 
void j() {
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tokenPrivileges;
    LUID luidDebug;
 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE) {
        if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE) {
            tokenPrivileges.PrivilegeCount = 1;
            tokenPrivileges.Privileges[0].Luid = luidDebug;
            tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            if (AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(tokenPrivileges), NULL, NULL) == FALSE) {
 
                printProcess();
            }
        }
    }
    CloseHandle(hToken);
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.08.2015, 22:47
Значит, так. Во-первых, OpenProcessToken с сохранением токена в thSnapShot, где у
тебя хранится совсем другой хэндл - неправильно. Во-вторых, CheckTokenMembership
здесь использовать не совсем удачно. Потому что скормить ей токен, полученный через
OpenProcessToken, сразу не получится, придется еще вызывать DuplicateTokenEx, а для
этого нужны еще права TOKEN_DUPLICATE, но не все процессы тебе их дадут.
Более точно действовать так: вызвать GetTokenInformation два раза, первый с кодом
TokenUser, второй с TokenGroups, и среди полученных SID-ов уже искать нужный.
Для этого есть функция EqualSid. Да, и из групп следует перебирать только те, у
которых в атрибутах установлен флаг SE_GROUP_ENABLED.

И еще. Process32Next нужно вызывать в конце цикла, а не в начале.
1
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
03.08.2015, 23:36  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Значит, так. Во-первых, OpenProcessToken с сохранением токена в thSnapShot, где у
тебя хранится совсем другой хэндл - неправильно
Переделал - функция все равно возвращает на всех процессах 0, а далее код не выполняется, в чем ошибка вызова этой функции, почему она 0 возвращает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    PBOOL isMember = 0;
 
    PHANDLE tokenHandle = 0;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, tokenHandle)) {
 
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if (CheckTokenMembership(hProcess, TheSID, isMember)) {
 
                            if (isMember) {
 
                                p("Local: ", pe.szExeFile, "\n");
                            }
                        }
                    }
 
                }
            }
 
        }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.08.2015, 23:42
C++
1
2
3
4
5
PHANDLE tokenHandle = 0;
 
// ...
 
if (OpenProcessToken(hProcess, TOKEN_QUERY, tokenHandle))
В таком виде это не будет работать. Никак. Третий параметр OpenProcessToken -
это указатель на переменную HANDLE, куда будет записан полученный хэндл.
Здесь указатель равен NULL. Скорее всего, GetLastError здесь будет 0x57
(invalid parameter).
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
03.08.2015, 23:54  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
В таком виде это не будет работать. Никак.
Отлично, исправил, код продвинулся до функции:
C++
1
if (CheckTokenMembership(hProcess, TheSID, isMember))
И там застрял, какие мои теперь действия?
Текущий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    BOOL isMember = 0;
 
    HANDLE tokenHandle = 0;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &tokenHandle)) {
    
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if (CheckTokenMembership(hProcess, TheSID, &isMember)) {
 
                            if (isMember) {
 
                                p("Local: ", pe.szExeFile, "\n");
                            }
                        }
                    }
 
                }
            }
 
        }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.08.2015, 00:01
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
И там застрял
В каком смысле застрял ?
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
04.08.2015, 08:46  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
В каком смысле застрял ?
функция 0 возвращает на всех процессах

Добавлено через 1 минуту
C++
1
2
3
4
Return value
 
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Добавлено через 50 секунд
Типа она не может чекнуть принадлежность процесса к группе "Local"
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.08.2015, 09:23
Потому что для работы CheckTokenMembership нужен impersonation token, а
OpenProcessToken возвращает primary token. Писал ведь выше - использовать
для данной задачи CheckTokenMembership не стоит, лучше написать свою
реализацию через GetTokenInformation с TokenUser и TokenGroup и искать
нужный SID среди тех, которые были получены этими функциями.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
04.08.2015, 21:38  [ТС]
Начал делать как ты все посоветовал, и первым делом GetTokenInformation возвращает 0 на всех процессах, в чем ошибся?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    BOOL isMember = 0;
 
    HANDLE tokenHandle = 0;
 
    DWORD cb = sizeof(TOKEN_USER);
 
    TOKEN_USER pUserInfo;
 
    DWORD dw_TokenLength;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &tokenHandle)) {
    
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if(GetTokenInformation(thSnapShot, TokenUser, &pUserInfo, cb, &dw_TokenLength)){
                        //if (CheckTokenMembership(tokenHandle, TheSID, &isMember)) {
                                p("Local: ", pe.szExeFile, "\n");
                            //if (isMember) {
 
                            //}
                        }
                    }
 
                }
            }
 
        }
    }
}
Добавлено через 3 минуты
Не это ли мне нужно?
https://msdn.microsoft.com/ru-... s.85).aspx
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.08.2015, 21:44
Цитата Сообщение от ДЕСАНТУРА Посмотреть сообщение
в чем ошибся?
В аргументах, которые ты передаешь в функции. См., например, GetTokenInformation - там вообще каша.
Зайди на MSDN сюда

GetTokenInformation function
https://msdn.microsoft.com/ru-... 85%29.aspx

а потом посмотри на свой код и подумай, что и зачем ты передаешь в эту функцию.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
04.08.2015, 21:56  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
В аргументах, которые ты передаешь в функции. См., например, GetTokenInformation - там вообще каша.
Зайди на MSDN сюда
Сделал так тоже не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    BOOL isMember = 0;
 
    HANDLE tokenHandle = 0;
 
    DWORD dwSize = 256;
 
    TOKEN_USER *pUserInfo;
    pUserInfo = (PTOKEN_USER)GlobalAlloc(GPTR, dwSize);
    DWORD dw_TokenLength;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &tokenHandle)) {
    
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if(GetTokenInformation(&tokenHandle, TokenUser, pUserInfo, dwSize, &dwSize)){
                        //if (CheckTokenMembership(tokenHandle, TheSID, &isMember)) {
                                p("Local: ", pe.szExeFile, "\n");
                            //if (isMember) {
 
                            //}
                        }
                    }
 
                }
            }
 
        }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.08.2015, 22:04
Да опять неправильно. Вместо HANDLE токена в GetTokenInformation первым
агрументом ты зачем-то передаешь указатель на HANDLE. Дальше, pUserInfo у
тебя указывает в никуда, а должен указывать на буфер размером в dwSize.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
05.08.2015, 07:18  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Да опять неправильно. Вместо HANDLE токена в GetTokenInformation первым
агрументом ты зачем-то передаешь указатель на HANDLE. Дальше, pUserInfo у
тебя указывает в никуда, а должен указывать на буфер размером в dwSize.
Исправил, заработало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    BOOL isMember = 0;
 
    HANDLE tokenHandle = 0;
 
    DWORD dwSize = 256;
 
    TOKEN_USER *pUserInfo;
    pUserInfo = (PTOKEN_USER)GlobalAlloc(GPTR, dwSize);
    DWORD dw_TokenLength;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &tokenHandle)) {
    
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if(GetTokenInformation(tokenHandle, TokenUser, pUserInfo, dwSize, &dwSize)){
                        //if (CheckTokenMembership(tokenHandle, TheSID, &isMember)) {
                                p("Local: ", pe.szExeFile, "\n");
                            //if (isMember) {
 
                            //}
                        }
                    }
 
                }
            }
 
        }
    }
}
Далее мне нужны "LookupAccountSidA" и "CheckTokenMembershipEx"???
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.08.2015, 09:31
Далее тебе нужно заглянуть в pUserInfo->User.Sid и сравнить его с SID-ом,
который был создан CreateWellKnownSid (для сравнения используется функция
EqualSid). Если SID-ы разные, тогда снова вызываешь GetTokenInformation,
только уже с кодом TokenGroups, и в массиве Groups снова ищешь свой SID,
пропуская те группы, у которых в Attributes не установлен флаг SE_GROUP_ENABLED.
0
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 202
05.08.2015, 19:03  [ТС]
EqualSid во всех случаях возвращает 0, как быть, где ошибся?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
void printProcess() {
 
    HANDLE hProcess = 0;
 
    DWORD SidSize = SECURITY_MAX_SID_SIZE;
    PSID TheSID = { 0 };
    TheSID = LocalAlloc(LMEM_FIXED, SidSize);
 
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    BOOL isMember = 0;
 
    HANDLE tokenHandle = 0;
 
    DWORD dwSize = 256;
 
    TOKEN_USER *pUserInfo;
    pUserInfo = (PTOKEN_USER)GlobalAlloc(GPTR, dwSize);
    DWORD dw_TokenLength;
 
    if (Process32First(thSnapShot, &pe)) {
 
        while (Process32Next(thSnapShot, &pe)) {
 
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
 
            if (hProcess != 0) {
                
                if (OpenProcessToken(hProcess, TOKEN_QUERY, &tokenHandle)) {
    
                    if (CreateWellKnownSid(WinLocalSid, NULL, TheSID, &SidSize)) {
 
                        if(GetTokenInformation(tokenHandle, TokenUser, pUserInfo, dwSize, &dwSize)){
 
                            if (EqualSid(pUserInfo->User.Sid, TheSID)) {
 
                                p("Local: ", pe.szExeFile, "\n");
                            }
                            else if (GetTokenInformation(tokenHandle, TokenGroups, pUserInfo, dwSize, &dwSize)) {
 
                                if (EqualSid(pUserInfo->User.Sid, TheSID)) {
 
                                    p("Local: ", pe.szExeFile, "\n");
                                }
                            }
                        }
                    }
 
                }
            }
 
        }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.08.2015, 19:43
Ошибка в вызове GetTokenInformation с TokenGroups.
См. внимательно параметры функции, она должна заполнить
структуру TOKEN_GROUPS, в ней массив SID-ов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2015, 19:43
Помогаю со студенческими работами здесь

Процессы запущенные вчера или ранее
Хочу написать скрипт который выводит список пользователей (их логины, и ничего более), чьи процессы запущены вчера или ранее. Думаю...

Завершить все процессы, запущенные из указанной папки
Подскажите пожалуйсто! Нужно завершить все процессы звпущенные из указанной папки прим c:/temp Как завершить указанный процесс понял...

В диспетчере задач висят процессы запущенные пользователем
Calc.exe*32 mspaint.exe*32 svchost.exe*32 Также заменяются все значки на ярлыки на съемных носителях. Интернет на компьютере отключен!

Как в разные label записать запущенные активные процессы?
Делая, одну программу и мне надо вывести все активные процессы на форму. Вот код private void button7_Click(object sender, EventArgs e) ...

Можно ли вместо поиска окон (FindWindow) искать запущенные процессы?
Как это делает, например tasklist или taskkill в командной строке винды


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru