gpt4 book ai didi

c++ - CreateProcessAsUser 创建空白/黑色窗口

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:16 27 4
gpt4 key购买 nike

我正在使用 CreateProcessAsUser 在用户指定的凭据下创建一个进程。

我希望发布的是代码的相关部分。如果您想查看更多内容,请告诉我。

获取 token 的第一个 LogonUser:

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);

这工作正常 - 它登录并成功创建进程,并且进程“工作”。问题是它创建的窗口是黑色的,如我的程序启动的记事本进程的屏幕截图所示:

notepad screenshot

可能相关的上下文:

我的帐户是具有完全管理员权限的 Windows 7 机器上的本地帐户,我使用该帐户登录。我使用 psexec(Sysinternals 实用程序)打开在本地系统帐户下以交互方式运行的命令提示符。我从那个命令提示符启动我的程序。我传递给它的凭据来 self 的帐户。

我没有对 windowsstations/desktops 的权限做任何事情;我假设我创建的流程应该拥有这些权限,因为该流程是在我的 session 中创建的,并且使用我已经登录的相同帐户——尽管首先通过 SYSTEM 帐户。使用 Process Explorer,我没有看到通过我的程序打开的进程与正常打开的进程对窗口站/桌面的值和句柄的权限有任何区别。也许这完全无关紧要。

我也不能使用 CreateProcessWithLogonW 函数,因为它必须在从 SYSTEM 帐户运行时才能工作 - 该函数以及 Windows 附带的“runas”程序在 SYSTEM 下不能工作。

有趣的是,我无法使用我当前的方法打开进程,除非我在 SYSTEM 帐户下运行它,因为“客户端不持有所需的权限”,所以我无法比较创建的窗口在我的帐户下启动我的程序时与 SYSTEM 帐户...

最佳答案

窗口站和桌面的默认 DACL 授予对登录 SID(对于当前 logon session 是唯一的)而不是用户 SID 的完全访问权限。 (用户的 SID 也出现在窗口站的 DACL 中,但只有有限的权限。它不会出现在桌面 DACL 中。)

LogonUser 的调用会生成一个新 session (和关联的登录 SID),而不是重复使用现有的 session ,因此您的进程无权访问桌面,对窗口的访问权限也很小车站。 (实际上,我对进程如何设法运行感到有些困惑;当我尝试重现您的结果时,进程立即退出,退出代码为 0xC0000142,正如预期的那样。)

this answer中的第二段代码显示如何更改窗口站和桌面上的 DACL 以允许进程正常运行。 (但是,这可能不是最佳解决方案,具体取决于您的具体目标。)

关于c++ - CreateProcessAsUser 创建空白/黑色窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27069838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com