WinAPI C - 来自REDMON_USER和REDMON_SESSIONID的RunAsUser

时间:2010-05-25 18:45:28

标签: c winapi runas redmon

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

2 个答案:

答案 0 :(得分:2)

请看CreateProcessAsUser

另请查看CreateProcessWithLogonWCreateProcess

它们是从CreateProcessAsUser

链接的

编辑回复OP的评论。

遵循此thread的建议。

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

  

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

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

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

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

  6.   
  7. 使用CreateEnvironmentBlock创建您将成为的环境   传递给过程。

  8.   
  9. 将CreateProcessAsUser与重复的令牌和创建的令牌一起使用   环境。实际上,我们使用   CreateProcessAsUserW,自A   版本在某些方面存在某种错误   旧系统。

  10.   
  11. 不要忘记关于各种令牌等的CloseHandle,以及   DestroyEnvironmentBlock了   环境。

  12.   

谢谢efratian

PS。哦,Windows编程的喜悦,相当长一段时间没有这样做。现在我记得为什么。唯一接近或甚至更糟的文件是OpenSSH编程。

答案 1 :(得分:0)

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

  

Run as User用于通过RedRun在本地启动GUI程序,如GSview。