Помоему достаточно пихнуть программку в виде службы.
А её в любом случае пихать в виде службы. Под аккаунтом обычного пользователя какая-то из функций работы с токенами, насколько я помню, обламывается из-за недостатка привилегий. Служба должна будет работать под учёткой (LOCAL)SYSTEM.
Если каждый пользователь заходит под своим логином-паролем, то их спокойно можно изъять посредством переменной среды %username%. Записывать в виде непрерывного журнала для всех.
Переменная USERNAME имеет разные значения под разными аккаунтами. Соответственно, программа всегда будет видеть только имя пользователя, под которым запущена сама. Кроме того, это не решает проблему определения
что эту программу запустил один пользователь, другую другой.
Моя идея в том, чтобы мониторить процессы и при появлении нового таким образом определять пользователя.
PS Serr500 - зачем такие сложности?
Просили идею... Пришло в голову именно это. Метод получения пользователя, запустившего процесс. Да и, вроде, не так уж сложно. Для WinAPI это вообще считается элементарным вариантом. Там "простыня" на 200 строк - вполне нормальное явление.