我安装了一个PostScript打印机驱动程序,并设置了REDMON(redmonnt.dll),用于将postscript输出重定向到我的程序。在我相当简单的c程序中,我从STDIN捕获数据,并且我能够将其成功保存到.ps文件中。该文件看起来没问题。
但是,我想启动gsview.exe来查看该文件。如果我调用ShellExecute,由于权限问题,它在Windows 7中失败。似乎我的程序是在不同的用户帐户(LOCAL SERVICE)下调用的。所以我正在寻找一种在特定用户名(启动打印作业的用户)下运行gsview.exe的方法,该用户可以在一个名为REDMON_USER的变量中使用该程序以及SESSIONID。
问:给定用户名和会话ID,启动程序所需的最低WinAPI调用是多少?
C / C ++,.NET中的任何代码示例都非常有用。
编辑:我正在努力完成的事情与redrunee(来自redmonee)非常相似。我不想使用redrunee,因为它会在短时间内打开一个控制台窗口。注意: 1)程序由打印机服务调用为[LOCAL SERVICE]帐户。 2)第一个参数Username(REDMON_USER)实际上指向当前正在查看屏幕的用户
答案 0 :(得分:2)
另请查看CreateProcessWithLogonW
和CreateProcess
。
它们是从CreateProcessAsUser
链接的编辑回复OP的评论。
遵循此thread的建议。
我在这里逐字复制,以防原始链接停止工作:
相同的代码在Vista上适用于我们 在XP等上。该服务正在运行 本地系统。
使用WTSGetActiveConsoleSessionId获取当前活动的ID 控制台上的Windows会话(即 机器键盘和显示器,如 反对WTS会议。)
使用WTSQueryUserToken获取该会话的令牌。
使用DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary, & hTokenDup)复制该令牌。
使用CreateEnvironmentBlock创建您将成为的环境 传递给过程。
将CreateProcessAsUser与重复的令牌和创建的令牌一起使用 环境。实际上,我们使用 CreateProcessAsUserW,自A 版本在某些方面存在某种错误 旧系统。
- 醇>
不要忘记关于各种令牌等的CloseHandle,以及 DestroyEnvironmentBlock了 环境。
谢谢efratian。
PS。哦,Windows编程的喜悦,相当长一段时间没有这样做。现在我记得为什么。唯一接近或甚至更糟的文件是OpenSSH编程。
答案 1 :(得分:0)
documentation描述了“以用户身份运行”功能,这似乎正是您想要的:
Run as User用于通过RedRun在本地启动GUI程序,如GSview。