Получение имени пользователя процесса
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Правила раздела Visual Basic: Общие вопросы
FAQ Сайта
FAQ Раздела
Кладовка
Наши Исходники
API-Guide
Поиск по Разделу
MSDN Library Online
Google
Получение имени пользователя процесса
|
Сообщ.
#1
,
|
|
|
|
Или как получить имя пользователя, который запустил определенный процесс. Сий код выводит все запущенные процессы и имена пользователей, их запустивших.
![]() ![]() Option Explicit Private Declare Function WTSEnumerateProcessesA Lib "wtsapi32.dll" (ByVal hServer As Long, ByVal Reserved As Long, _ ByVal Version As Long, ppProcessInfo As Long, pCount As Long) As Long Private Declare Function WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Long) As Long Private Declare Function lstrlenA Lib "kernel32.dll" (ByVal lpszString As Any) As Long Private Declare Function CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (CopyTO As Any, CopyFROM As Any, _ ByVal dwBytes 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 Integer) As Long Private Type WTS_PROCESS_INFO SessionId As Long ProcessId As Long pProcessName As Long pUserSid As Long End Type Sub OutProcList() Dim w As WTS_PROCESS_INFO, pCount As Long, pVoid As Long, pVoid0, s As String, k As Integer, i As Long If WTSEnumerateProcessesA(0, 0, 1, pVoid0, pCount) <> 0 Then Dim lpszDomain As String, lpszUsername As String, cbDomain As Long, cbUsername As Long pVoid = pVoid0 For i = 0 To pCount - 1 CopyMemory w, ByVal pVoid, Len(w) cbDomain = 260: cbUsername = 260: lpszDomain = String(cbDomain, 0): lpszUsername = String(cbUsername, 0) If LookupAccountSidA(0&, w.pUserSid, lpszUsername, cbUsername, lpszDomain, cbDomain, k) <> 0 Then lpszDomain = Left(lpszDomain, cbDomain) lpszUsername = Left(lpszUsername, cbUsername) Else lpszDomain = "<Unknown>" lpszUsername = "<Unknown>" End If s = String(lstrlenA(w.pProcessName), 0) If Len(s) > 0 Then CopyMemory ByVal s, ByVal w.pProcessName, Len(s) Debug.Print s; " - "; lpszDomain & "\" & lpszUsername pVoid = pVoid + Len(w) Next WTSFreeMemory pVoid0 Else MsgBox "Failed with error: " & CStr(Err.LastDllError), vbCritical End If Unload Me End Sub В FAQ предлагаю. |
|
Сообщ.
#2
,
|
|
|
|
хм... в debug window вроде чтото выводит, а потом вылетает назад в IDE...
вешал вызов процедуры на Command1_Click() |
|
Сообщ.
#3
,
|
|
|
|
В debug и делается вывод.
Убери в конце Unload me, чтобы не завершалось. ![]() Вообще, рекомендуется к прочтению. Вот эта функция еще интересна. |
|
Сообщ.
#4
,
|
|
|
|
Цитата ALXR @ В FAQ предлагаю. Меня смущает использование lstrlenA. Зачем? |
|
Сообщ.
#5
,
|
|
|
|
![]() ![]() 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 Integer) As Long Цитата 'peUse '[out] Pointer to a variable that receives a SID_NAME_USE value that indicates the type of the account. раз это поинтер то имхо надо переправлять на peUse As Long И спасибо, - приятное решение. P.S. И еще, вы накручиваете поинтер pVoid для извлечения WTS-структур, следовательно WTSFreeMemory будет чистить только последний кусок(структуру последнего процесса выделенного буфера. Имхо надо сохранять первоначальное значения для WTSFreeMemory, а цикле накручивать копию pVoid. |
|
Сообщ.
#6
,
|
|
|
|
Цитата AlexJ @ Вы состоите в секте змия?раз это поинтер то имхо надо переправлять на peUse As Long ALXR WTS API? Хм, а как поводет себя твоя прога если её запустить на удаленном сеансе? |
|
Сообщ.
#7
,
|
|
|
|
Цитата ANDLL @ Цитата AlexJ @ Вы состоите в секте змия?раз это поинтер то имхо надо переправлять на peUse As Long А по русски? Не догнал смысла |
|
Сообщ.
#8
,
|
|
|
|
Цитата B.V. @ Меня смущает использование lstrlenA. Зачем? Как это зачем? Я же не знаю длину строки, на которую имею поинтер. Цитата ANDLL @ ALXR WTS API? Хм, а как поводет себя твоя прога если её запустить на удаленном сеансе? Понятия не имею. Эту же технологию использует обычный виндововский таск-менеджер. Добавлено Цитата AlexJ @ P.S. И еще, вы накручиваете поинтер pVoid для извлечения WTS-структур, Прав! Fixed. |
|
Сообщ.
#9
,
|
|
|
|
Цитата ALXR @ Откуда такая инфа? обычный виндововский таск-менеджер Добавлено Вот, кусок исходников. ![]() ![]() HRESULT CProcPage::GetProcessInfo() { HRESULT hr = S_OK; NTSTATUS status; while(hr == S_OK) { if (m_pvBuffer) { status = NtQuerySystemInformation(SystemProcessInformation, m_pvBuffer, m_cbBuffer, NULL); // // If we succeeded, great, get outta here. If not, any error other // than "buffer too small" is fatal, in which case we bail // if (NT_SUCCESS(status)) { break; } if (status != STATUS_INFO_LENGTH_MISMATCH) { hr = E_FAIL; break; } } // // Buffer wasn't large enough to hold the process info table, so resize it // to be larger, then retry. // if (m_pvBuffer) { VirtualFree(m_pvBuffer, 0, MEM_RELEASE); m_pvBuffer = NULL; } m_cbBuffer += PROCBUF_GROWSIZE; m_pvBuffer = VirtualAlloc (NULL, m_cbBuffer, MEM_COMMIT, PAGE_READWRITE); if (m_pvBuffer == NULL) { hr = E_OUTOFMEMORY; break; } } return hr; } |
|
Сообщ.
#10
,
|
|
|
|
ANDLL,
Может все таки проясните по поводу секты змия и скольки байтам равняется любой поинтер в 32 - разрядной системе ? |
|
Сообщ.
#11
,
|
|
|
|
Цитата ANDLL @ Откуда такая инфа? У тебя есть исходник таск-манагера из Windows XP ? Насколько я помню, в WinNT4.0 и Win2k нету возможности просмотра имени пользователя, от которого запущен процесс. Ага? И инфа сия из дизасма ХРшного таск-манагера исходит. AlexJ, поинтер, конечно, имеет размер 32 бита, но этот поинтер может указывать на что угодно, включая переменную типа Integer. |
|
Сообщ.
#12
,
|
|
|
|
Цитата ALXR @ Нет, но есть исходники 2k'шного, их я и привел.У тебя есть исходник таск-манагера из Windows XP ? В XP, говоришь по другому? Проверять не буду, поверю на слово. |
|
Сообщ.
#13
,
|
|
|
|
Цитата ANDLL @ Нет, но есть исходники 2k'шного, их я и привел. В XP, говоришь по другому? Проверять не буду, поверю на слово. Ну ты бы хоть посмотрел бы, извлекает он там где-нибудь имя пользователя или нет, а то привел совершенно посторонний по отношению к теме кусок кода из программы совершенно другой версии и еще возмущаешься, что автор не прав! За что боролося, на то и напоролся. ![]() PS: В ХР, кстати, тоже HRESULT CProcPage::GetProcessInfo так выглядит (ну или почти так). |
|
Сообщ.
#14
,
|
|
|
|
Цитата ALXR @ В общем то меня это не смущает За что боролося, на то и напоролся |
|
Сообщ.
#15
,
|
|
|
|
Переменная i не объявлена, код не работает - возвращает "Failed with error: 1151".
|
|
Сообщ.
#16
,
|
|
|
|
Цитата B.V. @ Переменная i не объявлена, код не работает - возвращает "Failed with error: 1151". Теперь объявлена. Вообще, странная ошибка: Цитата Указанная программа не является программой для Windows или MS-DOS. Цитата MSDN Requirements Client Requires Windows Vista, Windows XP, or Windows 2000 Professional. Server Requires Windows Server "Longhorn", Windows Server 2003, or Windows 2000 Server. Т.к. в XP работает, то и в Win2k должно работать (и, кстати, работает!). |
|
Сообщ.
#17
,
|
|
|
|
Цитата ALXR @ и, кстати, работает! Рад за тебя. Для справки: у меня Win2k SP4 EN, версия Wtsapi32.dll - 5.0.2134.1, вирусов нет. |
|
Сообщ.
#18
,
|
|
|
|
Таки я опять был не прав, через удаленный стол то же работает
|
|
Сообщ.
#19
,
|
|
|
|
BV: Может, какая библиотека убита? Судя по ошибке, не может подгрузить какую-то длл из импорта, поскольку она "Не Виндовс и не МС-ДОС формата" (могу и ошибаться). К примеру: WINSTA.dll.
|
|
Сообщ.
#20
,
|
|
|
|
Цитата ALXR @ Может, какая библиотека убита? Все на месте, все работают. |
|
Сообщ.
#21
,
|
|
|
|
Цитата B.V. @ Все на месте, все работают. Попробуйте скомпилиный вариант на ПБшке Прикреплённый файл GetUsersNamesOfProcesses.zip (5.7 Кбайт, скачиваний: 4200)
|
|
Сообщ.
#22
,
|
|
|
|
Цитата AlexJ @ Попробуйте скомпилиный вариант на ПБшке Цитата --------------------------- AlexJ@src --------------------------- Failed with error: 1151 --------------------------- OK --------------------------- |
|
Сообщ.
#23
,
|
|
|
|
B.V.: Ссылка. Видимо, "повезло" тебе с ОС...
Проблема, как выяснилось в бажной(?) winsta.dll.Там везде примерно такой код: ![]() ![]() :655F2FEB A124A05F65 mov eax, dword ptr [655FA024] :655F2FF0 83F8FD cmp eax, FFFFFFFD :655F2FF3 750F jne 655F3004 :655F2FF5 687F040000 push 0000047F * Reference To: KERNEL32.SetLastError, Ord:02A0h | :655F2FFA FF1528105F65 Call dword ptr [655F1028] Что там по адресу [655FA024] выяснить не удалось... |
|
Сообщ.
#24
,
|
|
|
|
может попробовать просто WTS библиотеки с хрюшки подкинуть взамен w2k-шных?
Я помнится так комон контролы лечил...успешно на w2k |