Here is another thing in C that would be worth a translation, if somebody wants to take that challenge.
char *get_owner_username_from_pid ( DWORD pid)
{
HANDLE hToken = NULL;
LPBYTE lpBytes = NULL;
LPTSTR lpszAccountName = NULL;
PTOKEN_USER lpTokenUser = NULL;
DWORD dwSize = 0;
BOOL bSuccess = FALSE;
HANDLE hProcess = NULL;
DWORD
dwSize01 = 0;
DWORD
dwSize02 = 0;
SID_NAME_USE
sid_name_use = {0};
hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess)
{
if (OpenProcessToken ( hProcess, TOKEN_QUERY, &hToken ) && hToken )
{
GetTokenInformation (hToken, TokenUser, (LPVOID)NULL, 0, &dwSize);
if (dwSize > 0)
{
lpBytes = allocmem (dwSize, 1);
lpTokenUser = (PTOKEN_USER)lpBytes;
bSuccess = GetTokenInformation (hToken, TokenUser, (LPVOID)lpTokenUser, dwSize, &dwSize);
if (bSuccess)
{
LookupAccountSid (NULL, (PSID)((lpTokenUser -> User).Sid), NULL,
(LPDWORD)&dwSize01, NULL,(LPDWORD)&dwSize02,
(PSID_NAME_USE)&sid_name_use);
if (dwSize01 > 0)
{
lpszAccountName = allocmem (dwSize01, 1);
bSuccess = LookupAccountSid (NULL, (PSID)(lpTokenUser->User.Sid), lpszAccountName,
(LPDWORD)&dwSize01, NULL,(LPDWORD)&dwSize02,
(PSID_NAME_USE)&sid_name_use);
}
}
freemem (lpBytes);
if (bSuccess && lpszAccountName)
{
return (char*) lpszAccountName;
}
}
}
}
return NULL;
}