Узнать имя пользователя по процессу
Иногда нужно узнать имя пользователя , под которым ведется работа в системе. Но ведь программу часто запускают с правами другого пользователя. Тут функция GetUserName не поможет, поскольку она получает имя только текущего процесса. Как же быть? В принципе пользователь запускает Explorer.exe от своего имени, по этому критерию и можно определить.
Платформа: Windows
Пример адаптирован с Delphi Станиславом
Будиновым
#INCLUDE "windows.bi" #INCLUDE "win\tlhelp32.bi" Function FindProcess(st As String) As Integer Dim prcinfo As PROCESSENTRY32,snap As Handle,t As bool snap=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) If snap <> INVALID_HANDLE_VALUE Then prcinfo.dwSize=SizeOf(PROCESSENTRY32) If Process32First (snap,@prcinfo) Then Do If Lcase(prcinfo.szExeFile)=LCase(st) Then FindProcess = prcinfo.th32ProcessID Endif Loop While Process32Next (snap,@prcinfo) End If CloseHandle (snap) End If End Function Function GetProcessUser (dwPID As DWORD) As String Dim As Integer cbBuf, chName =200, chDomain=200 Dim As HANDLE hProcess,hToken Dim ptiUser As PTOKEN_USER Dim As ZString*200 szName, szDomain Dim snu As SID_NAME_USE If dwPID > 0 Then hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, dwPID) If hProcess > 0 Then If OpenProcessToken(hProcess, TOKEN_QUERY, @hToken) Then If Not GetTokenInformation(hToken, TokenUser, 0, 0, @cbBuf) Then If cbBuf = 0 Then CloseHandle(hToken) CloseHandle(hProcess) Return "" Endif ptiUser = Allocate(cbBuf) If GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, @cbBuf) Then If LookupAccountSid(0, ptiUser->User.Sid, Strptr(szName), @chName, Strptr(szDomain), @chDomain, Cast(PSID_NAME_USE,@snu)) Then GetProcessUser = szName Endif Endif Deallocate(ptiUser) CloseHandle(hToken) Endif CloseHandle(hProcess) Endif Endif Endif End Function MessageBox(0,GetProcessUser(FindProcess("explorer.exe")),"",0)