Desde a introdução dos Serviços de Terminal, o "usuário atual" pode ser plural. Até o XP suporta troca rápida de usuário.
O mais próximo que você pode obter é "usuário conectado à sessão do console". Para isso, use WTSGetActiveConsoleSessionId () + WTSQueryUserToken () + CreateEnvironmentBlock () + CreateProcessAsUser () .
Eu escrevi isto: link - Compile, execute com o caminho completo para o seu arquivo de lote como argumentos.
Sim, isso requer o .NET Runtime, mas é provável que seus sistemas já o tenham. A parte do compilador do Runtime também: %SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe
(qualquer versão que comece com v2.*
funcionará).
Nota: WTSQueryUserToken () requer que o programa esteja sendo executado como LocalSystem . (De acordo com os documentos , SeTcbPrivilege não é suficiente, mas eu não verifiquei.