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

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

27.12.2021, 16:15. Показов 3557. Ответов 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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru