我安装了 PostScript 打印机驱动程序并设置了 REDMON (redmonnt.dll),用于将 postscript 输出重定向到我的程序。在我相当简单的 c 程序中,我从 STDIN 捕获数据,并且能够成功地将其保存到 .ps 文件中。该文件看起来不错。
但是,我想启动 gsview.exe 来查看该文件。如果我调用 ShellExecute,它在 Windows 7 中会因权限问题而失败。看来我的程序是在不同的用户帐户(LOCAL SERVICE)下调用的。因此,我正在寻找一种在特定用户名(启动打印作业的用户)下运行 gsview.exe 的方法,该用户名也可以在名为 REDMON_USER 的变量以及 SESSIONID 中供程序使用。
Q:在给定用户名和会话 ID 的情况下,启动程序所需的最少 WinAPI 调用是多少?
任何 C/C++、.NET 代码示例都会非常有帮助。
编辑:我想要完成的事情与 redrunee (来自 redmonee)非常相似。我不想使用 redrunee,因为它会打开一个控制台窗口一小会儿。
笔记:
1) 该程序由打印机服务以[LOCAL SERVICE]帐户调用。
2)第一个参数Username(REDMON_USER),实际上指向当前正在查看屏幕的用户
Look at 创建进程为用户 http://msdn.microsoft.com/en-us/library/ms682429%28v=VS.85%29.aspx.
还看CreateProcessWithLogonW
and CreateProcess
.
它们是从 CreateProcessAsUser 链接的
EDIT回复OP的评论。
遵循此建议thread http://social.msdn.microsoft.com/Forums/en/windowssecurity/thread/31bfa13d-982b-4b1a-bff3-2761ade5214f.
我在这里逐字复制此内容,以防原始链接停止工作:
相同的代码在 Vista 上适用于我们
在 XP 等上。该服务运行为
本地系统。
使用 WTSGetActiveConsoleSessionId 获取当前活动的 ID
控制台上的 Windows 会话(即
机器键盘和显示器,如
反对 WTS 会议)。
使用 WTSQueryUserToken 获取该会话的令牌。
使用 DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary,
&hTokenDup) 来复制该令牌。
使用 CreateEnvironmentBlock 创建一个您将身处的环境
传递给进程。
将 CreateProcessAsUser 与复制的令牌和创建的令牌一起使用
环境。实际上,我们使用
CreateProcessAsUserW,因为 A
版本有一些错误
较旧的系统。
不要忘记 CloseHandle 各种令牌等,并且
破坏环境阻止
环境。
谢谢efratian http://social.msdn.microsoft.com/Profile/en-US/?user=efratian.
附言。呵呵,Windows编程的乐趣,好久没做了。现在我记得为什么了。唯一接近甚至更差的记录是 OpenSSH 编程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)