С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

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

27.12.2021, 16:15. Показов 3365. Ответов 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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.12.2021, 17:51  [ТС]
Первый - ноль, второй - один

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

Добавлено через 11 минут
Цитата Сообщение от The trick Посмотреть сообщение
хотя нет, там BOOLEAN
А чем BOOL отличается от BOOLEAN. Хотя я на си вообще не люблю программировать.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
30.12.2021, 19:13
Цитата Сообщение от HackerVlad Посмотреть сообщение
А чем BOOL отличается от BOOLEAN. Хотя я на си вообще не люблю программировать.
BOOL - это int (Long в VB), BOOLEAN - это unsigned char (Byte в VB).
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru