Look up online found that RDP to session 1 and psexec to session 1 may have different environment and different available system resources (handles). So that's probably why my psexec script doesn't work.
Não, isso não faz sentido. Embora seja verdade que algumas alças podem ser compartilhadas (herdadas, na verdade) entre processos, não faz sentido algum fora do escopo da programação.
There are some people say run psexec under WoW64 or let psexec launch the application under WoW64 can be a work-around on 64-bit machines. I am guessing psexec on console session does similar. Can anyone confirm?
WoW64 significa "Windows no Windows 64". Basicamente, é o ambiente de 32 bits dentro de um sistema operacional Windows 64. Cada executável do win32 estará rodando "sob" o WoW64: não há outra maneira de executar porque eles não podem usar a versão de 64 bits das funções do SO: eles precisam passar pela camada de tradução fornecida pelo WoW64.
My question: my application has GUI, so I still need it running in user session. Is there any way to do this? Please advise, thanks.
Essa é provavelmente a razão pela qual seu aplicativo está falhando (não PSexec, mas seu aplicativo): ele está tentando obter um identificador para uma janela e, como não está sendo executado em um ambiente interativo, essa chamada falha (suponho está tentando pegar um identificador para o explorador ou algo assim).
(ao lado disso, tente adicionar a opção -i como Rupasri Somavarapu sugeriu: deve funcionar)