当进程以pipe理员身份运行时,获取用户名()

我有一个简单的C ++程序提示用户名

#include <windows.h> #include <Lmcons.h> #include <winbase.h> int _tmain(int argc, _TCHAR* argv[]) { wchar_t username[UNLEN + 1]; DWORD username_len = UNLEN + 1; ::GetUserName(username, &username_len); MessageBox(NULL, username, NULL, 1); return 1; } 

GetUserName()按照预期在pipe理员帐户中执行,意味着打印真正的用户名。

但是,当以非pipe理员帐户的pipe理员身份运行时 ,我将获得pipe理员名称,而不是真实的login用户。

我相信这是行为,因为它在GetUserName()中有logging :
如果当前线程正在模拟另一个客户端,则GetUserName函数将返回该线程正在模拟的客户端的用户名。

有没有办法获得真正的login用户(非pipe理员),即使stream程以pipe理员身份运行?

我相信你想问Windows的问题是“哪个用户login到当前会话”。

为此,请使用您自己的进程标识调用ProcessIdToSessionId()以确定当前的会话标识。

然后使用WTSUserName选项调用WTSQuerySessionInformation()来获取用户名。

问题不在于模仿的线程。 您正在pipe理员login下运行整个应用程序。 这就是为什么Windows要求您使用pipe理员帐户login时,从非pipe理员帐户启动它的原因。

因此,你从GetUserName()得到的结果是正确的。 该名称是应用程序的真正login用户。

如果您需要其他名称,则标准解决scheme将以普通用户身份启动,并具有“提升”button,以提升的权限重新启动您的应用程序。 看起来像任务pipe理器,如果你想看到所有正在运行的进程,就这样做。 在这一点上,你当然可以通过任何你想要的新进程,包括用户名。