我使用CreateProcessAsUser在用户指定的凭据下创建一个进程。CreateProcessAsUser创建空白/黑色窗口
我发布了希望代码的相关部分。让我知道你是否想看更多。
首先LogonUser的获得令牌:
result = LogonUser(
username,
wcschr(username, '@') ? NULL : (domain ? domain : L"."),
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hrunastoken);
我然后加载配置文件,设置STARTUPINFO结构为NULL(这使得它使用调用进程的桌面)的lpDesktop值,并调用CreateProcessAsUser :
result = CreateProcessAsUser(
hrunastoken,
NULL,
apptorun,
NULL,
NULL,
FALSE,
CREATE_UNICODE_ENVIRONMENT,
envblock ? envblock : NULL,
NULL,
&si,
&pi);
这工作正常 - 它登录并成功创建过程,并且过程“工作”。问题是,它创建的窗户是黑色的,因为在这个截图记事本进行的与我的计划启动:
可能相关的方面:
我的帐户是在Windows的本地帐户7机器具有完整的管理权限,并且我使用该帐户登录。我使用psexec(Sysinternals实用程序)打开在本地系统帐户下交互式运行的命令提示符。我从该命令提示符启动我的程序。我传给它的凭据来自我的帐户。
我还没有做任何与windowstations/desktops的权限;我假设我创建的流程应该拥有这些权限,因为流程是在我的会话中创建的,并使用我已经登录的同一帐户 - 尽管首先要通过SYSTEM帐户。使用Process Explorer,我没有看到通过我的程序打开的进程vs正常打开的对windowstation/desktop的值和句柄的权限的任何区别。也许这完全不相关。
我也不能使用CreateProcessWithLogonW函数,因为它从SYSTEM帐户运行时必须工作 - 该函数以及随Windows附带的“runas”程序在SYSTEM下无效。有趣的是,我不能使用我当前的方法来打开进程,除非我在SYSTEM帐户下运行它,因为“所需的特权不是由客户端持有的”,所以我无法比较这些窗口在我的帐户下启动我的程序vs SYSTEM帐户时创建...
您是否传递| envblock |?这看起来很像我成功使用的代码。不同之处在于(可能):我总是传递一个使用CreateEnvironmentBlock()创建的环境块,而我的情况下的用户令牌来自WTSQueryUserToken()。 – NuSkooler 2014-11-21 23:14:50
@NuSkooler如果对CreateEnvironmentBlock()的调用成功,那么我会传递该环境块。如果程序没有通知我,调用就会成功,我使用Process Explorer检查了进程环境,并且加载了用户的环境。 – eurotrash 2014-11-22 07:50:27
@NuSkooler:WTSQueryUserToken会为您提供一个令牌,其中包含目标会话的登录SID,因此您的子进程已拥有对窗口站和桌面的所有必要权限。这就是为什么它为你工作,但不是为了OP。 – 2014-11-22 22:22:01