首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinAPI C- RunAsUser来自REDMON_USER和REDMON_SESSIONID

WinAPI C- RunAsUser来自REDMON_USER和REDMON_SESSIONID
EN

Stack Overflow用户
提问于 2010-05-25 18:45:27
回答 2查看 2K关注 0票数 2

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

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

Q:,在给定用户名和会话and的情况下,启动程序所需的最低WinAPI调用是多少?

C/C++、.NET中的任何代码示例都将非常有用。

编辑:我正在尝试完成的是非常类似于醉酒者(来自红方)的东西。我不想使用“再醉”,因为它会在控制台窗口附近打开片刻。

注: 1)程序由打印机服务作为本地服务帐户调用。2)第一个参数用户名(REDMON_USER)实际上指向当前正在查看屏幕的用户。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-25 19:04:54

看看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版本在一些旧系统上有某种bug。
  6. 不要忘记对各种令牌进行CloseHandle,并对环境进行DestroyEnvironmentBlock。

谢谢你埃夫拉

PS。哦,joy的Windows编程,有很长一段时间没有做了。现在我想起来了为什么。唯一接近甚至更糟的是OpenSSH编程。

票数 2
EN

Stack Overflow用户

发布于 2010-05-26 13:56:46

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

以用户身份运行是为了通过GSview在本地通过RedRun启动GUI程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2907512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档