Узнать имя пользователя по процессу

Иногда нужно узнать имя пользователя , под которым ведется работа в системе. Но ведь программу часто запускают с правами другого пользователя. Тут функция 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)