【问题标题】:WinAPI C - RunAsUser from REDMON_USER and REDMON_SESSIONIDWinAPI C - 来自 REDMON_USER 和 REDMON_SESSIONID 的 RunAsUser
【发布时间】:2010-05-25 18:45:27
【问题描述】:

我安装了 PostScript 打印机驱动程序并设置了 REDMON (redmonnt.dll) 用于将 postscript 输出重定向到我的程序。在我相当简单的 c 程序中,我从 STDIN 捕获数据,并且能够成功地将其保存到 .ps 文件中。文件看起来没问题。

但是,我想启动 gsview.exe 来查看文件。如果我调用 ShellExecute 它在 Windows 7 中由于权限问题而失败。似乎我的程序是在不同的用户帐户(本地服务)下调用的。因此,我正在寻找一种在特定用户名(启动打印作业的用户)下运行 gsview.exe 的方法,该用户名在名为 REDMON_USER 的变量以及 SESSIONID 中可供程序使用。

问:在给定用户名和 sessionid 的情况下启动程序所需的最少 WinAPI 调用是多少?

任何 C/C++、.NET 中的代码示例都会非常有帮助。

编辑:我正在尝试完成的事情与 redrunee(来自 redmonee)非常相似。我不想使用 redrunee,因为它会在短时间内打开一个控制台窗口。

注意: 1) 该程序被打印机服务调用为 [LOCAL SERVICE] 帐户。 2)第一个参数用户名(REDMON_USER),实际上指向当前正在看屏幕的用户

【问题讨论】:

    标签: c winapi runas redmon


    【解决方案1】:

    CreateProcessAsUser

    同时查看CreateProcessWithLogonWCreateProcess

    它们是从 CreateProcessAsUser 链接的

    EDIT OP 回复 cmets。

    听从这个thread的建议。

    我在这里逐字复制,以防原始链接停止工作:

    同样的代码在 Vista 上适用于我们 在 XP 等上。该服务运行为 本地系统。

    1. 使用 WTSGetActiveConsoleSessionId 获取当前活动的 ID 控制台上的 Windows 会话(即 机器键盘和显示器,如 反对 WTS 会议)。

    2. 使用 WTSQueryUserToken 获取该会话的令牌。

    3. 使用 DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary, &hTokenDup) 复制该令牌。

    4. 使用 CreateEnvironmentBlock 创建一个您将成为的环境 传递给进程。

    5. 将 CreateProcessAsUser 与复制的令牌和创建的 环境。实际上,我们使用 CreateProcessAsUserW,因为 A 版本有一些错误 旧系统。

    6. 不要忘记关闭各种令牌等,并 破坏环境阻止 环境。

    谢谢efratian

    PS。哦 Windows 编程的乐趣,有一段时间没有这样做了。现在我记得为什么了。唯一接近甚至更糟糕的是 OpenSSH 编程。

    【讨论】:

    • CreateProcessWithLogonW 和 LogonUser 都需要密码。打印机监视器只向我发送两个参数,用户名和 sessionid =(
    • REDMON 文档说,只需使用打印机服务发送的这两个参数,就可以使用 CreateProcessAsUser 启动。那么,如何仅从 [Username] 和 [SessionID] 获取 hToken,以便将其传递给 CreateProcessAsUser?
    【解决方案2】:

    documentation 描述了“以用户身份运行”功能,这似乎正是您想要的:

    以用户身份运行旨在通过 RedRun 在本地启动 GUI 程序,例如 GSview。

    【讨论】:

    • 从我上次看到的情况来看,redrun.exe 在其源代码中使用了 CreateProcess()。另外,一个恼人的控制台窗口会打开大约 1-3 秒。
    • 我还看到了 redrunee.exe,它也有控制台窗口弹出问题。所以我决定写我自己的重跑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2014-01-31
    • 2013-03-22
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多