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

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

27.12.2021, 16:15. Показов 3361. Ответов 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 12:29
Цитата Сообщение от HackerVlad Посмотреть сообщение
Попытался объявить её сам:
3-й параметр неверный. Там передается 64 битное целое, либо ByVal Currency либо 2 Long'а.

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

Цитата Сообщение от HackerVlad Посмотреть сообщение
Нашёл абсолютно замечательный пример в Интернете где получается список процессов и список SID'ов с помощью функции WTSEnumerateProcesses. Там с привилегиями можно получить SID'ы для абсолютно всех процессов, я не знаю можно ли прикреплять ссылки на этом форуме, но вот тут я нашёл супер код этот:
WTSEnumerateProcesses - по сути обертка над этими функциями (а точнее над Nt функциями). Запрашивается список процессов через NtQuerySystemInformation, потом для каждого процесса запрашивается токен через NtQueryInformationToken. Т.е. способ аналогичен способу через GetTokenInformation.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 15:49  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
3-й параметр неверный. Там передается 64 битное целое
Ну я пытался передавать структуру FILETIME она же вроде состоит из двух Long'ов как раз 64 бита должно быть, ну я попробую ещё раз для интереса.

Цитата Сообщение от The trick Посмотреть сообщение
Каким образом?
Я выложу код сегодня, я уже разобрался каким образом и для всех процессов определять SID. Но только с привилегиями, к сожалению, в отличии от WTSEnumerateProcesses. Она для 90% процессов определяет SID и без привилегий даже.

Добавлено через 50 минут
Пробую ещё раз. Передаю в объявлении структуру FILETIME как и изначально делал (чем не 64 бита) и всё равно не хочет работать, попробуйте сами:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ProcessStartTime As FILETIME, pProcessUserSid As Long, dwSidSize As Long) As Long
Private Declare Function GetProcessTimes Lib "kernel32" (ByVal hProcess As Long, lpCreationTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME, lpUserTime As FILETIME) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
 
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
 
Private Sub Form_Load()
    Dim MyPid As Long
    Dim FT As FILETIME
    Dim FT0 As FILETIME
    Dim sid As Long
    Dim ret As Long
    
    MyPid = GetCurrentProcessId
    GetProcessTimes -1, FT, FT0, FT0, FT0 ' Получить FILETIME текущего процесса
    
    WinStationGetProcessSid 0&, MyPid, FT, sid, ret
End Sub
Добавлено через 3 минуты
Точно так же не хочет работать и ProcessStartTime As Currency и даже если pProcessUserSid As Currency тоже не хочет.

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
либо ByVal Currency либо 2 Long'а.
Неужели прям ByVal? Может ByRef всё-таки. Ведь в эту функцию нужно скармливать структуру FILETIME процесса предварительно узнав время запуска интересуемого процесса. Или я не прав?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 15:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но только с привилегиями, к сожалению, в отличии от WTSEnumerateProcesses.
Еще раз повторю - WTSEnumerateProcesses основана на тех же самых функциях.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Visual Basic
1
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ProcessStartTime As FILETIME, pProcessUserSid As Long, dwSidSize As Long) As Long
Нужно ByVal ProcessStartTime As Currency, либо ByVal ProcessStartTimeL As Long, ByVal ProcessStartTimeH As Long.

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Неужели прям ByVal? Может ByRef всё-таки. Ведь в эту функцию нужно скармливать структуру FILETIME процесса предварительно узнав время запуска интересуемого процесса. Или я не прав?
Именно ByVal, в прототипе же указано FILETIME, а не FILETIME*.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 15:54  [ТС]
Я правильно понимаю логику работы функции? Ей передаются два параметра PID и FILETIME интересуемого процесса!? И она определяет SID по этим двум параметрам.

Добавлено через 57 секунд
Цитата Сообщение от The trick Посмотреть сообщение
Именно ByVal
Именно ByVal компилятор не пропускает даже на запуск, странно
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 15:59
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я правильно понимаю логику работы функции? Ей передаются два параметра PID и FILETIME интересуемого процесса!? И она определяет SID по этим двум параметрам.
Ну и плюс хендл сервера, который необязателен (NULL - для локального). В остальном верно. FILETIME можно узнать через GetProcessTimes к примеру. Процесс с заданным PID может завершится, а какой-нибудь новый процесс может взять этот PID. FILETIME как раз и определяет время запуска процесса.

Добавлено через 49 секунд
Цитата Сообщение от HackerVlad Посмотреть сообщение
Именно ByVal компилятор не пропускает даже на запуск, странно
ByVal Currency не пропускает? Не может такого быть, покажи скрин.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 16:08  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
ByVal Currency не пропускает? Не может такого быть, покажи скрин.
ByVal ProcessStartTime As Currency заработало! но не работает ByVal ProcessStartTime As FILETIME. Почему интересно... только ByRef

Добавлено через 2 минуты
Вот такое объявление функции прошло на ура
Visual Basic
1
Private Declare Function WinStationGetProcessSid Lib "winsta.dll" (ByVal hServer As Long, ByVal ProcessId As Long, ByVal ProcessStartTime As Currency, pProcessUserSid As Long, dwSidSize As Long) As Long
Один вопрос, pProcessUserSid это будет Long надеюсь?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 16:13
Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему интересно... только ByRef
Потому что в VB6 UDT можно передавать только по ссылке.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Один вопрос, pProcessUserSid это будет Long надеюсь?
Это буфер в который копируется SID, размер задается в dwSidSize, там же возвращается результирующий размер. Правильнее объявить этот параметр как Any, и передавать туда байтовый массив.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 16:32  [ТС]
Вот правильный код который получает SID но в байтовом массиве
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
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 Sub Form_Load()
    Dim MyPid As Long
    Dim timZero As Currency ' Íå èíòåðåñóåìûå íàìè âðåìåíà, íî îáÿçàòåëüíûå ê çàïîëíåíèþ â ôóíêöèè GetProcessTimes
    Dim tim As Currency
    Dim sid() As Byte
    Dim ret As Long
    
    MyPid = GetCurrentProcessId
    GetProcessTimes -1, tim, timZero, timZero, timZero ' Ïîëó÷èòü âðåìÿ çàïóñêà òåêóùåãî ïðîöåññà
    
    ReDim Preserve sid(0)
    WinStationGetProcessSid ByVal 0&, MyPid, tim, sid(0), ret
    
    ReDim Preserve sid(ret - 1)
    WinStationGetProcessSid ByVal 0&, MyPid, tim, sid(0), ret
    
    Print sid
    Print ret
End Sub
sid это число? не строка же? дальше просто этот сид превратить в имя, так?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 16:46
Цитата Сообщение от HackerVlad Посмотреть сообщение
sid это число? не строка же? дальше просто этот сид превратить в имя, так?
Нужно только возвращаемое значение проверять, а так да. SID - это структура переменной длины. SID можно потом превратить в имя, а можно просто сравнить SID с well-known-sid.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 17:49  [ТС]
Кстати я разобрался с GetTokenInformation. Написал функцию которая определяет имя пользователя процесса, через полученный SID.

Я там писал, что только с привилегиями у меня работало. Теперь и без, почти все процессы определяет. Главное было поменять PROCESS_ALL_ACCESS на PROCESS_QUERY_LIMITED_INFORMATION.

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
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 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 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
 
Private Const PROCESS_QUERY_LIMITED_INFORMATION As Long = &H1000
Private Const TOKEN_QUERY = &H8
 
Public Function GetProcessUserName(pid As Long) As String
    Dim hProcess As Long
    Dim hToken As Long
    Dim lNeeded As Long
    Dim baBuffer() As Byte
    Dim sBuffer As String
    Dim lpSid As Long
    Dim lpString As Long
    Dim lpszDomain As String, lpszUsername As String, cbDomain As Long, cbUsername As Long
    Dim k As Long
    
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid)
    
    If hProcess <> 0 Then
        If OpenProcessToken(hProcess, TOKEN_QUERY, hToken) = 1 Then
            Call GetTokenInformation(hToken, 1, ByVal 0, 0, lNeeded)
            ReDim baBuffer(0 To lNeeded)
            
            If GetTokenInformation(hToken, 1, baBuffer(0), UBound(baBuffer), lNeeded) = 1 Then
                Call CopyMemory(lpSid, baBuffer(0), 4)
                
                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
                
                GetProcessUserName = lpszDomain & "\" & lpszUsername
            End If
            Call CloseHandle(hToken)
        End If
        Call CloseHandle(hProcess)
    End If
End Function
 
Private Sub Form_Load()
    Me.AutoRedraw = True
    Print Chr(34) & GetProcessUserName(GetCurrentProcessId) & Chr(34)
End Sub
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 18:12
Цитата Сообщение от HackerVlad Посмотреть сообщение
Теперь и без, почти все процессы определяет. Главное было поменять PROCESS_ALL_ACCESS на PROCESS_QUERY_LIMITED_INFORMATION.
Для XP нужно PROCESS_QUERY_INFORMATION.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.12.2021, 21:51  [ТС]
А почему нельзя объявлять As Any в своих пользовательских функциях (меня это сильно удивило)

Добавлено через 2 минуты
А WinStationGetProcessSid это не оболочка функции GetTockenInformation??? Я ещё так и не закончил с этой функцией кстати...
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
28.12.2021, 22:09
Цитата Сообщение от HackerVlad Посмотреть сообщение
А почему нельзя объявлять As Any в своих пользовательских функциях (меня это сильно удивило)
По той же причине по которой нельзя работать с сырыми указателями напрямую - это противоречит концепции безопасного программирования.

Цитата Сообщение от HackerVlad Посмотреть сообщение
А WinStationGetProcessSid это не оболочка функции GetTockenInformation??? Я ещё так и не закончил с этой функцией кстати...
GetTokenInformation сама по себе оболочка над NtQueryInformationToken, а WinStationGetProcessSid в свою очередь использует NtQueryInformationToken TokenUser для получения информации. Просто тут ты одним вызовом ограничиваешься.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.12.2021, 00:30  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Просто тут ты одним вызовом ограничиваешься
Ну посмотрим, будет ли там меньше кода, учитывая, что нужно узнавать ещё и время то уже больше кода.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
29.12.2021, 01:08
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ну посмотрим, будет ли там меньше кода, учитывая, что нужно узнавать ещё и время то уже больше кода.
Для пакетного режима все процессы извлекаются 1 функцией NtQuerySystemInformation.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.12.2021, 01:27  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
1 функцией NtQuerySystemInformation
Обожаю эту функцию. Ей и пользуюсь для получения списка процессов с временами. Только она даёт времена запуска для всех системных процессов вне зависимости от прав доступа, а ну ещё и Restart Manager API громоздкий конечно...
Если бы NtQuerySystemInformation ещё бы и SID'ы выковыривал...

Добавлено через 11 минут
Я доделал наконец-таки свой пример для этой функции, там всего лишь надо было передать в качестве сида указатель на байтовый массив. Единственное что волнует это возвращаемое значение функции WinStationGetProcessSid всё время разное у меня. А что должно возвращаться для проверок Boolean? У меня всё время разные числа, то положительные, то отрицательные, не понимаю.

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
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
    
    MyPid = GetCurrentProcessId
    GetProcessTimes -1, tim, timZero, timZero, timZero ' Получить время запуска текущего процесса
    
    ReDim Preserve sid(0)
    ReturnValue = WinStationGetProcessSid(ByVal 0&, MyPid, tim, sid(0), ret)
    ' Почему-то у меня функция WinStationGetProcessSid возвращает всё время разные числа
    
    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
Посмотрите, если не лень, пожалуйста, что там с возвращаемыми значениями. Или плюнуть на них...

Добавлено через 2 минуты
Dim lpSid As Long забыл объявить там добавить надо, но у меня итак сработало само почему-то объявление этой переменной
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.12.2021, 22:49  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Для XP нужно PROCESS_QUERY_INFORMATION
Представляю Вашему вниманию новую улучшенную функцию, для получения имени пользователя процесса.

Улучшения в новой версии моей функции:

1. В зависимости от того XP или нет выставляется PROCESS_QUERY_INFORMATION либо PROCESS_QUERY_LIMITED_INFORMATION для семёрки.
2. Используется уникодная функция LookupAccountSidW на случай если у кого-то будут китайские имена пользователей например.
3. Используется функция GetMem4 вместо старой CopyMemory для убыстрения копирования памяти в 4 байта (хотя на современных компьютерах мы не почувствуем разницы в скорости, но тем ни менее).

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
67
68
69
70
71
72
Option Explicit
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExW" (lpVersionInformation As Any) As Long
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 LookupAccountSid Lib "advapi32.dll" Alias "LookupAccountSidW" (ByVal lpSystemName As Long, ByVal sid As Long, ByVal name As Long, cbName As Long, ByVal ReferencedDomainName As Long, cbReferencedDomainName As Long, peUse 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 Const PROCESS_QUERY_LIMITED_INFORMATION As Long = &H1000
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const TOKEN_QUERY = &H8
Private Const MAX_PATH As Long = 260
 
' Получить имя пользователя процесса
Public Function GetProcessUserName(pid As Long) As String
    Dim hProc As Long
    Dim hToken As Long
    Dim lNeeded As Long
    Dim buffer() As Byte
    Dim lpSid As Long
    Dim lpszDomain As String, lpszUsername As String
    Dim cbDomain As Long, cbUsername As Long
    Dim peUse As Long
    Dim inf(68) As Long
    Dim IsVistaAndLater As Boolean
    
    ' Вычислить версию Windows
    inf(0) = 276: GetVersionEx inf(0): IsVistaAndLater = inf(1) >= 6
    
    hProc = OpenProcess(IIf(IsVistaAndLater, PROCESS_QUERY_LIMITED_INFORMATION, PROCESS_QUERY_INFORMATION), 0, pid)
    
    If hProc > 0 Then
        If OpenProcessToken(hProc, TOKEN_QUERY, hToken) = 1 Then
            GetTokenInformation hToken, 1, ByVal 0&, ByVal 0&, lNeeded
            ReDim Preserve buffer(lNeeded - 1)
            
            If GetTokenInformation(hToken, 1, buffer(0), lNeeded, lNeeded) = 1 Then
                GetMem4 VarPtr(buffer(0)), lpSid
                
                cbDomain = 260
                cbUsername = 260
                lpszDomain = Space$(MAX_PATH)
                lpszUsername = Space$(MAX_PATH)
                
                If LookupAccountSid(ByVal 0&, lpSid, StrPtr(lpszUsername), cbUsername, StrPtr(lpszDomain), cbDomain, peUse) > 0 Then
                    lpszDomain = Left$(lpszDomain, cbDomain)
                    lpszUsername = Left$(lpszUsername, cbUsername)
                Else
                    lpszDomain = "<Unknown>"
                    lpszUsername = "<Unknown>"
                End If
                
                GetProcessUserName = lpszDomain & "\" & lpszUsername
            End If
            
            CloseHandle hToken
        Else
            GetProcessUserName = "<Unknown>\<Unknown>"
        End If
        
        CloseHandle hProc
    Else
        GetProcessUserName = "<Unknown>\<Unknown>"
    End If
End Function
 
Private Sub Form_Load()
    Me.AutoRedraw = True
    Print Chr(34) & GetProcessUserName(GetCurrentProcessId) & Chr(34)
End Sub
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.12.2021, 13:41  [ТС]
The trick, The trick, так почему WinStationGetProcessSid возвращает всё время разные числа? просто интересно, хотя я ей уже решил и не пользоваться
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
30.12.2021, 14:03
HackerVlad,возвращаемое значение BOOL:
C
1
BOOLEAN __stdcall WinStationGetProcessSid(HANDLE hServer, DWORD dwPID, FILETIME a2, PSID DestinationSid, DWORD *dwSIDSize);
Добавлено через 3 минуты
хотя нет, там BOOLEAN. Для VB6 юзай Byte.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2021, 14:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru