Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/48: Рейтинг темы: голосов - 48, средняя оценка - 4.52
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161

Список процессов и пользователей

30.07.2015, 17:20. Показов 10767. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,
Я в WinAPI новичок, потому хотел бы попросить помощи в программе у более опытных программистов.

Необходимо выдать список процессов, их id, имя пользователя, запустившего процесс, а также найти свой собственный процесс. Покопавшись в 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// processExplorer.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
 
#define MAX_NAME 256
 
char* getProcessUsername(HANDLE hSnapshot, PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    static char staticName[MAX_NAME];
    char name[MAX_NAME];
    char domain[MAX_NAME];
    char *result;
    int iUse;
 
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processList.th32ProcessID);
    OpenProcessToken( hProcess, TOKEN_QUERY, &hSnapshot );
    pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
    GetTokenInformation(hSnapshot, TokenUser, pUserInfo, dwSize, &dwSize );
    LookupAccountSidA( 0, pUserInfo->User.Sid, name, &dwSize, domain, &dwSize, (PSID_NAME_USE)&iUse );
    strncpy_s(staticName, name, _TRUNCATE);
    //printf( "%s\n", lpDomain, lpName );
    result=staticName;
    return result;
}
 
 
VOID printProcessList(HANDLE CONST hStdOut)
{
    PROCESSENTRY32 processList;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    HANDLE hProcess;
    HANDLE hCurrentProcess;
 
    processList.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &processList);
    while(Process32Next(hSnapshot, &processList))
    {
        wsprintf(szBuff, L"ID: %08X; *.exe file: %s\r\n",
            processList.th32ProcessID, processList.szExeFile);
        WriteConsole(hStdOut, szBuff, lstrlen(szBuff), &dwTemp, 0);
        printf("User: %s \n", getProcessUsername(hSnapshot, processList));
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processList.th32ProcessID);
        hCurrentProcess = GetCurrentProcess();
        if (hProcess == hCurrentProcess)
        {
            printf("  <-- It's my process");
        }
//      getProcessUsername();
//      printf("\n");
    }
    CloseHandle(hSnapshot);
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    printProcessList(hStdOut);
    
    ExitProcess(0);
    return 0;
}
Собственно, пользователя выдаёт, а вот псевдопользователей типа "СИСТЕМА" не пишет, а выдаёт сплошные "???". Ну и мой процесс не находит. Помогите, пожалуйста!

P.S. Сильно по голове не бейте, нуб пока ещё
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2015, 17:20
Ответы с готовыми решениями:

Список процессов.
Здравствуйте. Я вывел на экран список процессов запущенных в системе с помощью ToolHelp32 API. (CreateToolhelp32Snapshot, Process32First и...

Не создается список процессов
Здравствуйте! Подскажите, пожалуйста почему после получения списка потоков нельзя получить список процессов, т.е. после вызова функции с...

Список запущеных процессов
Доброго времени суток. Возникла необходимость получить список запущеных процессов.Суть в том что хочу создать структуру данных которая...

47
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
10.08.2015, 02:41  [ТС]
Студворк — интернет-сервис помощи студентам
Возвращаясь к нашим баранам thelp32.h: поменял функцию получения привилегий на нагло честно стыренную с MSDN. Однако, ошибка 6 в AdjustTokenPriveleges. What's wrong?

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// processExplorer.cpp: определяет точку входа для консольного приложения.
//
 
 
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
 
#define MAX_NAME 256
#pragma comment(lib, "advapi32.lib")
 
// access token handle. name of privilege to enable/disable. to enable or disable privilege
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
// lookup privilege on local system. privilege to lookup. receives LUID of privilege
    if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid ) )        
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
 
    // Enable the privilege or disable all privileges.
 
    if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 
 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
 
    {
          printf("No privelege. No need in. \n");
          return FALSE;
    } 
 
    return TRUE;
}
 
 
char* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    static char staticName[MAX_NAME];
    char name[MAX_NAME];
    char domain[MAX_NAME];
    char *result;
    int iUse;
    
    
 
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processList.th32ProcessID);
    OpenProcessToken (hProcess, TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &hToken);
    SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
    GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize );
    LookupAccountSidA (0, pUserInfo->User.Sid, name, &dwSize, domain, &dwSize, (PSID_NAME_USE)&iUse);
    strncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}
 
 
VOID PrintProcessList (HANDLE CONST hStdOut)
{
    PROCESSENTRY32 processList;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    HANDLE hProcess;
 
    processList.dwSize = sizeof (PROCESSENTRY32);
    Process32First (hSnapshot, &processList);
    while (Process32Next(hSnapshot, &processList))
    {
        wsprintf (szBuff, L"\nID: %08X; *.exe file: %s\r\n",
            processList.th32ProcessID, processList.szExeFile);
        WriteConsole (hStdOut, szBuff, lstrlen(szBuff), &dwTemp, 0);
        cout << "User: " << GetProcessUsername(processList);
        hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, processList.th32ProcessID);
        if (GetProcessId(hProcess) == GetCurrentProcessId())
        {
            printf ("  <-- It's my process \n");
        }
        cout << endl;
    }
    CloseHandle (hProcess);
    CloseHandle (hSnapshot);
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE CONST hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);
    cout << "OK, press a button to print processes" << endl;
    system("pause");
    PrintProcessList (hStdOut);
    system ("pause");
    ExitProcess (0);
    return 0;
}
Добавлено через 1 час 13 минут
По моей логике OpenProcessToken и SetPrivilege надо бы местами поменять, но тогда ругается на неинициализированную переменную hToken.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.08.2015, 09:14
Вы тут что-то странное делаете. Включать привилегию нужно для своего процесса.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
10.08.2015, 12:18  [ТС]
C++
1
OpenProcessToken (hProcess, TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &hToken);
Если взять GetCurrentProcess, то тогда он проигнорирует процессы, запущенные не от моего имени, разве не так?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.08.2015, 13:57
Не, это какая-то каша.
Вашему процессу (и только вашему) нужна привилегия SE_DEBUG_NAME,
чтобы иметь возможность нормально работать с OpenProcess.
OpenProcessToken здесь вообще не при чем.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
11.08.2015, 00:24  [ТС]
Что-то туплю. OpenProcess возвращает хендл процесса. GetCurrentProcess - его частный случай для собственного процесса. Однако, в параметрах SetPrivelege только хендл токена. Как всё связать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.08.2015, 08:47
Вот:

Enabling and Disabling Privileges in C++
https://msdn.microsoft.com/en-... 85%29.aspx

включаете привилегию отладки для своего процесса и потом уже делаете все, что нужно.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
12.08.2015, 01:45  [ТС]
Как раз эта функция и инициализируется. Вопрос в том, где её верно вызывать и с какими параметрами.
Точнее, параметр; два других очевидны: SE_DEBUG_NAME и TRUE.

Корректного вызова функции SetPrivelege только и не хватает для полноценной работы.

Добавлено через 29 минут
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// processExplorer.cpp: определяет точку входа для консольного приложения.
//
 
 
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
 
#define MAX_NAME 256
#pragma comment(lib, "advapi32.lib")
 
// access token handle. name of privilege to enable/disable. to enable or disable privilege
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
// lookup privilege on local system. privilege to lookup. receives LUID of privilege
    if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid ) )        
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
 
    // Enable the privilege or disable all privileges.
 
    if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 
 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
 
    {
          printf("The token does not have the specified privilege. \n \n");
          return FALSE;
    } 
 
    return TRUE;
}
 
 
char* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    static char staticName[MAX_NAME];
    char name[MAX_NAME];
    char domain[MAX_NAME];
    char *result;
    int iUse;
    
    
 
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processList.th32ProcessID);
    OpenProcessToken (hProcess, TOKEN_QUERY, &hToken);
    pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
    GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize );
    LookupAccountSidA (0, pUserInfo->User.Sid, name, &dwSize, domain, &dwSize, (PSID_NAME_USE)&iUse);
    strncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}
 
 
int PrintProcessList (HANDLE CONST hStdOut)
{
    PROCESSENTRY32 processList;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    //HANDLE hProcess;
    HANDLE hToken;
    LPCTSTR lpszPrivilege = SE_DEBUG_NAME;
// Change this BOOL value to set/unset the SE_PRIVILEGE_ENABLED attribute
    BOOL bEnablePrivilege = TRUE;
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
    printf("OpenProcessToken() error %u\n", GetLastError());
    return FALSE;
}
    else
printf("OpenProcessToken() is OK\n");
 
// Call the user defined SetPrivilege() function to enable and set the needed privilege
BOOL test = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
 
 
/*  processList.dwSize = sizeof (PROCESSENTRY32);
    Process32First (hSnapshot, &processList);
    while (Process32Next(hSnapshot, &processList))
    {
        wsprintf (szBuff, L"\nID: %08X; *.exe file: %s\r\n",
            processList.th32ProcessID, processList.szExeFile);
        WriteConsole (hStdOut, szBuff, lstrlen(szBuff), &dwTemp, 0);
        cout << "User: " << GetProcessUsername(processList);
        hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, processList.th32ProcessID);
        if (GetProcessId(hProcess) == GetCurrentProcessId())
        {
            printf ("  <-- It's my process \n");
        }
        cout << endl;
    }*/
    printf("The SetPrivilege() return value: %d\n\n", test);
    //CloseHandle (hProcess);
    CloseHandle (hSnapshot);
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE CONST hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);
//  cout << "I'm sorry, but was quite busy, so this app is like a beta and 'govnokod'. Don't beat me, please :)" << endl;
//  cout << "Would you like to add this application on boot? Y/N ";
//  char* choiceFirstStep = new char;
//  char choiceNextStep = 0;
//  cin >> *choiceFirstStep;
//  choiceNextStep = *choiceFirstStep;
//  if (choiceNextStep == 'Y' || choiceNextStep == 'y')
//  {
//      SetAutorun();
//  }
    cout << "OK, press a button to print processes" << endl;
    system("pause");
    PrintProcessList (hStdOut);
    system ("pause");
    ExitProcess (0);
    return 0;
}
Оставил только собственно получение привилегии. Вызов для моего собственного процесса. Затем по идее с OpenProcess проблем быть не должно, но SetPrivelege выдаёт ERROR_NOT_ALL_ASSIGNED (The token does not have the specified privilege).
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.08.2015, 08:51
Процесс должен быть запущен от имени администратора.
1
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
12.08.2015, 12:36  [ТС]
Спасибо, заработало!

Под кракозябрами СИСТЕМА, вероятно, кодировка не та.
А вот почему 2 (на скриншоте только 1 такая) строчки всё равно заполнены мусором? Один из них СИСТЕМА, другой - LOCAL SERVICE
Миниатюры
Список процессов и пользователей  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.08.2015, 12:42
Цитата Сообщение от rusack007 Посмотреть сообщение
А вот почему 2 (на скриншоте только 1 такая) строчки всё равно заполнены мусором?
Потому что в коде выше нету нормальной обработки ошибок.
Например, на Windows 8.1 и выше "смешная" попытка открыть процесс csrss.exe с
правами PROCESS_ALL_ACCESS всегда будет заканчиваться неудачей, даже если у
вас включена привилегия отладки и есть права администратора или системы
(из-за "Protected Processes Light", инфа есть в блоге Alex Ionescu).

Вместо PROCESS_ALL_ACCESS ставьте PROCESS_QUERY_LIMITED_INFORMATION
(Vista+) или PROCESS_QUERY_INFORMATION (XP, Server 2003).
1
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
12.08.2015, 13:05  [ТС]
Огромное спасибо! Осталось только красоту навести.
Первый опыт с WinAPI, потом, надеюсь, будет меньше вопросов.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 12:25  [ТС]
Всё-таки вопрос есть.
В попытке избавиться от кракозябр, решил реализовать чтение имени пользователя в Unicode.

Версия ANSI (рабочая, но с кракозябрами):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    static char staticName[MAX_NAME];
    char name[MAX_NAME];
    char *result;
    int iUse;
    
    
 
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processList.th32ProcessID);
    OpenProcessToken (hProcess, TOKEN_QUERY, &hToken);
    pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize);
    GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize);
    if(!LookupAccountSidA (NULL, pUserInfo->User.Sid, name, &dwSize, NULL, &dwSize, (PSID_NAME_USE)&iUse))
        cout << "LookupAccountSid() error" << GetLastError();
    strncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}
Версия Unicode (теоретически без кракозябр)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TCHAR* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    TCHAR staticName[MAX_NAME];
    TCHAR name[MAX_NAME];
    TCHAR *result;
    int iUse;
    
    
 
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processList.th32ProcessID);
    OpenProcessToken (hProcess, TOKEN_QUERY, &hToken);
    pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize);
    GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize);
    if(!LookupAccountSid (NULL, pUserInfo->User.Sid, name, &dwSize, NULL, &dwSize, (PSID_NAME_USE)&iUse))
        cout << "LookupAccountSid() error" << GetLastError();
    wcsncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}
Насколько я понял, проблема с буфером, но пока что-то не соображу.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 13:27
Проблема не в буфере, а в том, что вызов КАЖДОЙ функции, без исключения,
нужно проверять на успешность/неуспешность. Только тогда будет гарантия,
что поток исполнения доходит до определенной точки без побочных эффектов.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 20:04  [ТС]
Хм, а вот это интересно:

OpenProcessToken error 5
GetTokenInformation error 6
LookupAccountSid error 87

Однако, работе ANSI-функции это не мешает (что в ANSI-, что в Unicode- функции соответствующие значения GetLastError одинаковые)

Проверку реализовал:
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
TCHAR* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    TCHAR staticName[MAX_NAME];
    TCHAR name[MAX_NAME];
    TCHAR *result;
    int iUse;
    
    
 
    if(!(hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processList.th32ProcessID)))
        cout << "OpenProcess error " << GetLastError() << endl;
    if(!OpenProcessToken (hProcess, TOKEN_QUERY, &hToken))
        cout << "OpenProcessToken error " << GetLastError() << endl;
    if(!(pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize)))
        cout << "GlobalAlloc error " << GetLastError() << endl;
    if(!GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize))
        cout << "GetTokenInformation error " << GetLastError() << endl;
    if(!LookupAccountSid (NULL, pUserInfo->User.Sid, name, &dwSize, NULL, &dwSize, (PSID_NAME_USE)&iUse))
        cout << "LookupAccountSid error" << GetLastError() << endl;
    wcsncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 20:18
Ну попробуйте OpenProcess вызывать с PROCESS_QUERY_INFORMATION.
В документации сказано, что эти права требуются для того, чтобы потом
успешно вызвать OpenProcessToken.
Хотя у меня работало и с PROCESS_QUERY_LIMITED_INFORMATION.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 20:33  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
попробуйте OpenProcess вызывать с PROCESS_QUERY_INFORMATION
Нет, так только хуже:

OpenProcess error 5
OpenProcessToken error 6
GetTokenInformation error 6
LookupAccountSid error 87

Добавлено через 6 минут
Но ANSI-функция по-прежнему выполняется даже с ошибкой OpenProcess.
Короче, ноль реакции.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 20:38
А привилегия отладки у процесса есть ?
В этом случае OpenProcess должен выполняться успешно в большинстве случаев.

Я недавно выкладывал код, решающий аналогичную задачу:
Не получается сгруппировать запущенные процессы по ключу SID
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 21:46  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
А привилегия отладки у процесса есть
Да, там без проблем, до этого решали этот вопрос.

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// processExplorer.cpp: определяет точку входа для консольного приложения.
//
 
 
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
 
#define MAX_NAME 256
#pragma comment(lib, "advapi32.lib")
 
 
BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
// lookup privilege on local system. privilege to lookup. receives LUID of privilege
    if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid ) )        
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
 
    // Enable the privilege or disable all privileges.
 
    if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 
 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
 
    {
          printf("The token does not have the specified privilege. \n \n");
          return FALSE;
    } 
 
    return TRUE;
}
 
///*
TCHAR* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    TCHAR staticName[MAX_NAME];
    TCHAR name[MAX_NAME];
    TCHAR *result;
    int iUse;
    
    
 
    if(!(hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processList.th32ProcessID)))
        cout << "OpenProcess error " << GetLastError() << endl;
    if(!OpenProcessToken (hProcess, TOKEN_QUERY, &hToken))
        cout << "OpenProcessToken error " << GetLastError() << endl;
    if(!(pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize)))
        cout << "GlobalAlloc error " << GetLastError() << endl;
    if(!GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize))
        cout << "GetTokenInformation error " << GetLastError() << endl;
    if(!LookupAccountSid (NULL, pUserInfo->User.Sid, name, &dwSize, NULL, &dwSize, (PSID_NAME_USE)&iUse))
        cout << "LookupAccountSid error" << GetLastError() << endl;
    wcsncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}//*/
/*
char* GetProcessUsername (PROCESSENTRY32 processList)
{
    DWORD dwSize = 256;
    HANDLE hToken;
    HANDLE hProcess;
    TOKEN_USER *pUserInfo;
    static char staticName[MAX_NAME];
    char name[MAX_NAME];
    char *result;
    int iUse;
    
    
 
    if(!(hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processList.th32ProcessID)))
        cout << "OpenProcess error " << GetLastError() << endl;
    if(!OpenProcessToken (hProcess, TOKEN_QUERY, &hToken))
        cout << "OpenProcessToken error " << GetLastError() << endl;
    if(!(pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize)))
        cout << "GlobalAlloc error " << GetLastError() << endl;
    if(!GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize))
        cout << "GetTokenInformation error " << GetLastError() << endl;
    if(!LookupAccountSidA (NULL, pUserInfo->User.Sid, name, &dwSize, NULL, &dwSize, (PSID_NAME_USE)&iUse))
        cout << "LookupAccountSid error" << GetLastError() << endl;
    strncpy_s(staticName, name, _TRUNCATE);
    result = staticName;
    return result;
}*/
 
 
int PrintProcessList (HANDLE CONST hStdOut)
{
    PROCESSENTRY32 processList;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    HANDLE hProcess;
    HANDLE hToken;
    LPCTSTR lpszPrivilege = SE_DEBUG_NAME;
    BOOL bEnablePrivilege = TRUE;
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        cout << "OpenProcessToken() error " << GetLastError();
        return FALSE;
    }
    else cout << "OpenProcessToken() is OK";
    BOOL test = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
    processList.dwSize = sizeof (PROCESSENTRY32);
    Process32First (hSnapshot, &processList);
    while (Process32Next(hSnapshot, &processList))
    {
        wsprintf (szBuff, L"\nID: %08X; *.exe file: %s\r\n",
            processList.th32ProcessID, processList.szExeFile);
        WriteConsole (hStdOut, szBuff, lstrlen(szBuff), &dwTemp, 0);
        cout << "User: " << GetProcessUsername(processList);
        hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, processList.th32ProcessID);
        if (GetProcessId(hProcess) == GetCurrentProcessId())
        {
            cout << "  <-- It's my process";
        }
        cout << endl;
    }
    cout << "The SetPrivilege() return value: %d\n\n" << test;
    CloseHandle (hProcess);
    CloseHandle (hSnapshot);
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE CONST hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);
    cout << "I'm sorry, but was quite busy, so this app is like a beta and 'govnokod'. Don't beat me, please :)" << endl;
//  BOOL isBoot = IsBoot();
//  DoUndoBoot(isBoot);
    cout << "OK, press a button to print processes" << endl;
    system("pause");
    PrintProcessList (hStdOut);
    system ("pause");
    ExitProcess (0);
    return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 22:20
А что за ID процесса, который не дает себя открыть ?
Часом, не 0 или 4 ?
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 22:43  [ТС]
Ага, 4
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2015, 22:43

Командный файл, выводящий список пользователей в системе и их процессов
Доброго времени суток! Есть такое задание: создать командный файл, осуществляющий вывод на экран список пользователей, зарегистрированных...

Вывести список пользователей, запустивших указанное (либо большее) количество процессов
Здравствуйте, нужно написать команду которая выведет список пользователей, запустивших указанное (либо большее) количество процессов. ...

Получить список пользователей, относящихся к группе с наибольшим числом пользователей
Дали задание: &quot;Получить список пользователей относящихся к группе с наибольшим числом пользователей&quot; программа для Линукса, никогда не...

Процедура Shell / подсчет количества процессов пользователей.
Написать процедуру Shell,которая: Вводит с терминала некоторое число Всем пользователям,работающим в данный момент в системе,...

Разработка программного обеспечения для автоматизации процессов учета и регистрации заявок пользователей
Здравствуйте! есть такая задача как &quot;Разработка программного обеспечения для автоматизации процессов учета и регистрации заявок...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru