【发布时间】:2015-01-20 02:23:02
【问题描述】:
我正在使用 CreateProcessAsUser 在用户指定的凭据下创建一个进程。
我希望发布代码的相关部分。如果您想看更多内容,请告诉我。
获取令牌的第一个登录用户:
result = LogonUser(
username,
wcschr(username, '@') ? NULL : (domain ? domain : L"."),
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hrunastoken);
然后我加载配置文件,将 STARTUPINFO 结构的 lpDesktop 值设置为 NULL(这使它使用调用进程的桌面),然后调用 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,我看不到通过我的程序打开的进程与正常打开的进程对windowstation/desktop的值和句柄的权限有任何区别。也许这完全无关紧要。
我也不能使用 CreateProcessWithLogonW 函数,因为它必须在从 SYSTEM 帐户运行时才能工作 - 该函数以及 Windows 附带的“runas”程序在 SYSTEM 下不起作用。
有趣的是,除非我在 SYSTEM 帐户下运行它,否则我无法使用我当前的方法打开进程,因为“客户端没有所需的权限”,所以我无法比较创建的窗口在我的帐户与 SYSTEM 帐户下启动我的程序时...
【问题讨论】:
-
你在通过|envblock|吗?这看起来很像我成功使用的代码。差异是(可能):我总是传递一个使用 CreateEnvironmentBlock() 创建的环境块,而我的用户令牌来自 WTSQueryUserToken()。
-
@NuSkooler 如果对 CreateEnvironmentBlock() 的调用成功,那么我通过环境块。调用成功,如果没有,程序会通知我,我用 Process Explorer 检查了进程环境,并加载了用户的环境。
-
@NuSkooler:WTSQueryUserToken 将为您提供一个令牌,其中包括目标会话的登录 SID,因此您的子进程将已经拥有对窗口站和桌面的所有必要权限。这就是为什么它对你有用,但对 OP 无效。