2

我安装了 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),实际上指向当前正在看屏幕的用户

4

2 回答 2

2

看看CreateProcessAsUser

还要看CreateProcessWithLogonWCreateProcess

它们是从 CreateProcessAsUser 链接的

编辑回复 OP 的评论。

遵循此线程的建议。

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

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

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

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

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

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

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

  6. 不要忘记关闭各种令牌等,并销毁环境。

谢谢

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

于 2010-05-25T19:04:54.667 回答
0

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

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

于 2010-05-26T13:56:46.630 回答