Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,785

Как узнать SID процесса, для того чтобы понять системный процесс или нет и от имени какого пользователя он запущен

27.12.2021, 16:15. Показов 3511. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
The Trick рекомендовал функцию WinStationGetProcessSid. Я не нашёл её описания даже в MSDN.
Попытался объявить её сам:

Visual Basic
1
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ProcessStartTime As Any, pProcessUserSid As Any, dwSidSize As Long) As Long
Но вызов функции через такое объявление вызывает BAD DLL Calling. Не понимаю если честно.

Добавлено через 2 часа 36 минут
Итак, поработав пару часов, я выяснил следующее:

1. Как использовать именно эту функцию WinStationGetProcessSid я понятия не имею вообще, она недокументированная, в примерах, что иногда проскакивают на просторах Интернета, там в этой функции 5 параметров, а чтобы функция успешно экспортировалась надо 6 параметров. Это удивляет, вообще не понимаю как ей пользоваться. Решил от неё отрешиться поэтому.

2. Получить SID процесса можно с помощью GetTokenInformation. Я уже нашёл способ, переделывая чужие примеры, но не получается получить SID процессов для LOCAL SERVICE и NETWORK SERVICE, только для SYSTEM и USER

3. Нашёл абсолютно замечательный пример в Интернете где получается список процессов и список SID'ов с помощью функции WTSEnumerateProcesses. Там с привилегиями можно получить SID'ы для абсолютно всех процессов, я не знаю можно ли прикреплять ссылки на этом форуме, но вот тут я нашёл супер код этот: https://forum.sources.ru/index... ew=showall
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2021, 16:15
Ответы с готовыми решениями:

От имени какого пользователя запущен процесс
Доброе время суток, пытаюсь сделать диспетчер задач сейчас у меня есть th32ProcessID и szExeFile как получить имя пользователя...

Как узнать SID пользователя по имени?
нужен код к которому на вход подаётся имя пользователя, на выход SID этого пользователя

Как узнать, процесс - системный или нет?
Всем привет! Как узнать процесс системный или нет? Если можно пример кода, а то идей пока нету(

25
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,785
30.12.2021, 14:13  [ТС]
Студворк — интернет-сервис помощи студентам
тогда почему этот BOOL всегда представлен в виде разных чисел, вместо 1 или 0 как полагается

Добавлено через 4 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Для VB6 юзай Byte
Всё равно в объявлении может что-то не так.
В любом случае возвращает неправильные значения, а в случае неудачи вообще не возвращает.
Visual Basic
1
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ByVal ProcessStartTime As Currency, pProcessUserSid As Any, dwSidSize As Long) As Byte
As Byte или As Long или As что ещё всё равно неправильно

Добавлено через 5 минут
The trick, по логике функция должна возвращать либо 1 либо 0 и это можно было бы представить в виде As Byte или в виде As Long тоже проходило бы. Но функция абсолютно всегда возвращает разные числа. Это ставит меня в недоумение просто.

Visual Basic
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
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ByVal ProcessStartTime As Currency, pProcessUserSid As Any, dwSidSize As Long) As Long
Private Declare Function GetProcessTimes Lib "kernel32" (ByVal hProcess As Long, lpCreationTime As Currency, lpExitTime As Currency, lpKernelTime As Currency, lpUserTime As Currency) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function LookupAccountSidA Lib "advapi32.dll" (ByVal lpSystemName As Any, ByVal sid As Long, ByVal name As String, cbName As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long
 
Private Sub Form_Load()
    Dim MyPid As Long
    Dim timZero As Currency ' Не интересуемые нами времена, но обязательные к заполнению в функции GetProcessTimes
    Dim tim As Currency
    Dim sid() As Byte
    Dim ret As Long
    Dim lpszDomain As String, lpszUsername As String, cbDomain As Long, cbUsername As Long
    Dim k As Long
    Dim ReturnValue As Long
    Dim lpSid As Long
    
    MyPid = GetCurrentProcessId
    GetProcessTimes -1, tim, timZero, timZero, timZero ' Получить время запуска текущего процесса
    
    ReDim Preserve sid(0)
    ReturnValue = WinStationGetProcessSid(ByVal 0&, MyPid, tim, sid(0), ret)
    ' Почему-то у меня функция WinStationGetProcessSid возвращает всё время разные числа
    
    Print "ReturnValue: " & ReturnValue
    
    If ret > 0 Then
        ReDim Preserve sid(ret - 1)
        WinStationGetProcessSid ByVal 0&, MyPid, tim, sid(0), ret
        
        lpSid = VarPtr(sid(0))
        
        cbDomain = 260: cbUsername = 260: lpszDomain = String(cbDomain, 0): lpszUsername = String(cbUsername, 0)
        If LookupAccountSidA(0&, lpSid, lpszUsername, cbUsername, lpszDomain, cbDomain, k) <> 0 Then
            lpszDomain = Left(lpszDomain, cbDomain)
            lpszUsername = Left(lpszUsername, cbUsername)
        Else
            lpszDomain = "<Unknown>"
            lpszUsername = "<Unknown>"
        End If
        
        Print Chr(34) & lpszDomain & "\" & lpszUsername & Chr(34)
        Print ReturnValue ' Почему-то у меня функция WinStationGetProcessSid возвращает всё время разные числа
    End If
End Sub
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.12.2021, 14:24
HackerVlad, вот что возвращает этот код:
Visual Basic
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
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ByVal ProcessStartTime As Currency, pProcessUserSid As Any, dwSidSize As Long) As Byte
Private Declare Function GetProcessTimes Lib "kernel32" (ByVal hProcess As Long, lpCreationTime As Currency, lpExitTime As Currency, lpKernelTime As Currency, lpUserTime As Currency) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function LookupAccountSidA Lib "advapi32.dll" (ByVal lpSystemName As Any, ByVal sid As Long, ByVal name As String, cbName As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long
 
Private Sub Form_Load()
    Dim MyPid As Long
    Dim tim As Currency
    Dim sid() As Byte
    Dim ret As Long
    Dim lpszDomain As String, lpszUsername As String, cbDomain As Long, cbUsername As Long
    Dim k As Long
    Dim ReturnValue As Long
    Dim lpSid As Long
    
    MyPid = GetCurrentProcessId
    GetProcessTimes -1, tim, 0, 0, 0
    
    ReDim Preserve sid(0)
    ReturnValue = WinStationGetProcessSid(ByVal 0&, MyPid, tim, sid(0), ret)
    Print "ReturnValue1: " & ReturnValue
    
    If ret > 0 Then
    
        ReDim Preserve sid(ret - 1)
        ReturnValue = WinStationGetProcessSid(ByVal 0&, MyPid, tim, sid(0), ret)
        Print "ReturnValue2: " & ReturnValue
        
        lpSid = VarPtr(sid(0))
        
        cbDomain = 260: cbUsername = 260: lpszDomain = String(cbDomain, 0): lpszUsername = String(cbUsername, 0)
        
        If LookupAccountSidA(0&, lpSid, lpszUsername, cbUsername, lpszDomain, cbDomain, k) <> 0 Then
            lpszDomain = Left(lpszDomain, cbDomain)
            lpszUsername = Left(lpszUsername, cbUsername)
        Else
            lpszDomain = "<Unknown>"
            lpszUsername = "<Unknown>"
        End If
        
        Print Chr(34) & lpszDomain & "\" & lpszUsername & Chr(34)
 
    End If
End Sub
1
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,785
30.12.2021, 17:51  [ТС]
Первый - ноль, второй - один

Добавлено через 7 минут
Спасибо за помощь, теперь всё как надо.
Видимо если As Long, то оно копирует следующие участки памяти, которые всё время меняются, 3 байта лишних цепляет наверное... Число пляшет только если As Long. As Byte работает нормально, сразу не разобрался просто почему-то.

Добавлено через 11 минут
Цитата Сообщение от The trick Посмотреть сообщение
хотя нет, там BOOLEAN
А чем BOOL отличается от BOOLEAN. Хотя я на си вообще не люблю программировать.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.12.2021, 19:13
Цитата Сообщение от HackerVlad Посмотреть сообщение
А чем BOOL отличается от BOOLEAN. Хотя я на си вообще не люблю программировать.
BOOL - это int (Long в VB), BOOLEAN - это unsigned char (Byte в VB).
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,785
30.12.2021, 21:40  [ТС]
А вот Вам и новогодний подарок от меня, то о чём я так мечтал и ради чего я так старался - функция, которая определяет является ли процесс системным, как при включённых SeDebug привилегиях, так и без!

Пример привожу только для одно процесса (своего), но лучше всего это будет видно если пройтись по списку процессов конечно.

Visual Basic
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
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByRef dstValue As Long) As Long
Private Declare Function ConvertSidToStringSid Lib "advapi32.dll" Alias "ConvertSidToStringSidW" (ByVal lpSid As Long, lpString As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
 
Private Const PROCESS_ALL_ACCESS = 2035711
Private Const TOKEN_QUERY = &H8
Private Const MAX_PATH As Long = 260
 
' Узнать системный ли это процесс (работает как с админ прававми, так и без)
Public Function IsSystemProcess(pid As Long) As Boolean
    Dim hProc As Long
    Dim hToken As Long
    Dim lNeeded As Long
    Dim buffer() As Byte
    Dim lpSid As Long
    Dim lpString As Long
    Dim sBuffer As String
    
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
    
    If hProc > 0 Then
        If OpenProcessToken(hProc, TOKEN_QUERY, hToken) > 0 Then
            GetTokenInformation hToken, 1, ByVal 0&, ByVal 0&, lNeeded
            ReDim Preserve buffer(lNeeded - 1)
            
            If GetTokenInformation(hToken, 1, buffer(0), lNeeded, lNeeded) > 0 Then
                GetMem4 VarPtr(buffer(0)), lpSid
                
                If ConvertSidToStringSid(lpSid, lpString) Then
                    sBuffer = Space$(lstrlen(lpString))
                    lstrcpy StrPtr(sBuffer), lpString
                    LocalFree lpString
                End If
                
                If Len(sBuffer) > 0 Then
                    If Mid$(sBuffer, 7, 2) = "21" Then ' Если это обычный пользователь
                        IsSystemProcess = False
                    Else
                        IsSystemProcess = True
                    End If
                End If
            End If
            
            CloseHandle hToken
        Else
            IsSystemProcess = True
        End If
        
        CloseHandle hProc
    Else ' Если процесс не открылся на полный доступ, то наверняка он системный
        IsSystemProcess = True
    End If
End Function
 
Private Sub Form_Load()
    Me.AutoRedraw = True
    Print Chr(34) & IsSystemProcess(GetCurrentProcessId) & Chr(34)
End Sub
0
Вернулся
 Аватар для HackerVlad
1747 / 643 / 45
Регистрация: 10.09.2021
Сообщений: 2,785
02.10.2023, 13:32  [ТС]
Апну тему так как написал новый код с использованием функции WTSEnumerateProcesses здесь в готовых решениях Готовые решения и полезные коды на Visual Basic 6.0
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2023, 13:32
Помогаю со студенческими работами здесь

Узнать системный процесс или нет
Всем привет! Нашел такую функцию: static string GetProcessOwner(int processId) { string query =...

Процесс svchost.exe запущен от имени пользователя
Заметил, что 6 процессов svchost.exe запущены от имени пользователя. Это вирус (но я только сегодня виндовс переустановил), или же...

Как узнать запущен ли процесс или программа?
Добрый день всем. Подскажите пожалуйста, как программно в VB узнать запущен ли в данный момент тот или иной процесс или программа? ...

Как узнать, запущен ли тот или иной процесс?
Всем доброго времени суток! Возникла следующая проблема: как можно программно узнать запущен тот или иной процесс: например проводник, и...

Как при закрытие какого либо процесса узнать процесс который его убил
Как при закрытие какого либо процесса узнать процесс который его закрыл?Например процесс &quot;хищник&quot; закрыл процесс...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru