我正在使用CreateProcessAsUser在用户指定的凭据下创建进程.
我发布了希望代码的相关部分.如果您想再看到更多内容,请与我们联系.
第一个登录用户获取令牌:
result = LogonUser(
username,
wcschr(username, '@') ? NULL : (domain ? domain : L"."),
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hrunastoken);
Run Code Online (Sandbox Code Playgroud)
然后我加载配置文件,将STARTUPINFO结构的lpDesktop值设置为NULL(这使得它使用调用进程的桌面),并调用CreateProcessAsUser:
result = CreateProcessAsUser(
hrunastoken,
NULL,
apptorun,
NULL,
NULL,
FALSE,
CREATE_UNICODE_ENVIRONMENT,
envblock ? envblock : NULL,
NULL,
&si,
&pi);
Run Code Online (Sandbox Code Playgroud)
这很好 - 它登录并成功创建过程,并且该过程"有效".问题是它创建的窗口是黑色的,就像在我的程序启动的记事本进程的屏幕截图中一样:
可能相关的背景:
我的帐户是具有完全管理员权限的Windows 7计算机上的本地帐户,我使用该帐户登录.我使用psexec(Sysinternals实用程序)打开在本地系统帐户下以交互方式运行的命令提示符.我从该命令提示符启动我的程序.我传递给它的凭据来自我的帐户.
我没有对windowstations/desktops的权限做过任何事情; 我假设我创建的进程应该拥有权限,因为正在我的会话中创建进程并使用我已经登录的相同帐户 - 尽管首先通过SYSTEM帐户.使用Process Explorer,我看不到通过我的程序正常打开的进程对windowstation/desktop的值和句柄的权限有任何差异.也许这完全无关紧要.
我也不能使用CreateProcessWithLogonW函数,因为它必须在从SYSTEM帐户运行时工作 - 该函数以及Windows附带的"runas"程序在SYSTEM下不起作用.
有趣的是,我不能使用我当前的方法打开进程,除非我在SYSTEM帐户下运行它,因为"客户端没有保留所需的权限",所以我无法比较启动时创建的窗口我帐户下的程序与SYSTEM帐户...