C++ 如何从Windows服务获取指定用户的环境变量?

C++ 如何从Windows服务获取指定用户的环境变量?,c++,windows,visual-studio,C++,Windows,Visual Studio,我写了一个Windows服务。它在系统级运行。我使用以下代码获取登录用户的用户名。但我想为该用户会话获取一个环境变量。我该怎么做 DWORD sessionId = WTSGetActiveConsoleSessionId(); qInfo() << "session id = " << sessionId; wchar_t* ppBuffer[100]; DWORD bufferSize; WTSQuerySessionInformation(WTS_CURRENT_

我写了一个Windows服务。它在系统级运行。我使用以下代码获取登录用户的用户名。但我想为该用户会话获取一个环境变量。我该怎么做

DWORD sessionId = WTSGetActiveConsoleSessionId();
qInfo() << "session id = " << sessionId;

wchar_t* ppBuffer[100];
DWORD bufferSize;
WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, ppBuffer, &bufferSize);
qInfo() << "Windows User Name = " << QString::fromWCharArray(*ppBuffer);
DWORD sessionId=WTSGetActiveConsoleSessionId();
qInfo()用于获取所需会话ID的登录用户令牌,然后将该令牌传递给以获取该用户的环境变量

然后,您可以根据需要解析这些字符串,或者将它们(和令牌)传递给
以用户会话中的用户身份启动程序。

登录用户的好处是加载了用户配置文件。这意味着您可以在HKEY_用户下找到它们(显然不是HKEY_当前用户,因为您的服务可能不在该用户名下运行)。除此之外,see无法确定HKEY_USERS下的哪个子项代表指定的用户。此外,某些环境变量包含“%USERPROFILE%”,但要为HKEY_USERS下的一个子项计算%USERPROFILE%的值似乎并不容易。如果未加载该变量,则您的服务将使用配置为运行的任何帐户运行。你必须知道用户的SID,这样你才能进入HKEY_用户的内部。这仍然只为您提供了初始化用户会话的环境,而没有告诉您有关用户可能已应用的环境重写的任何信息。您还必须处理没有用户登录或多个用户登录的情况。在服务中处理用户会话是一个非常糟糕的主意。使用一个普通的程序,从运行注册表项或启动文件夹中的快捷方式开始。@HansPassant我认为你是对的。我面临的问题是,系统服务将在某些条件下触发以启动特定程序。但是,目标程序是按用户安装的。因此,它们的安装路径不同。我希望服务启动活动用户的程序。我不清楚这是否可行。我甚至不知道如果两个用户分别远程登录以触发启动,会发生什么。我要做一些测试。我有一种机制让服务监视器登录和注销事件。不确定这是否有帮助。假设目标程序需要以登录用户的身份运行,那么从您的服务(以登录用户的身份)启动代理可执行文件并让该可执行文件定位并运行目标程序可能会更简单。