WinAPI C-来自REDMON_用户和REDMON_会话ID的RunAsUser

WinAPI C-来自REDMON_用户和REDMON_会话ID的RunAsUser,c,winapi,runas,redmon,C,Winapi,Runas,Redmon,我安装了PostScript打印机驱动程序,并设置了REDMON(redmonnt.dll),用于将PostScript输出重定向到我的程序。在我相当简单的c程序中,我从STDIN中捕获数据,并成功地将其保存到一个.ps文件中。文件看起来没问题 但是,我想启动gsview.exe以查看文件。如果我调用ShellExecute,由于权限问题,它在Windows 7中会失败。我的程序似乎是在另一个用户帐户(本地服务)下调用的。因此,我正在寻找一种在特定用户名(启动打印作业的用户)下运行gsview.

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

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

Q:给定用户名和会话ID,启动程序所需的最小WinAPI调用是多少

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

编辑:我试图完成的是与redrunee(来自redmonee)非常相似的东西。我不想使用redrunee,因为它会在控制台窗口打开一小段时间

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

另请查看
CreateProcessWithLogonW
CreateProcess

它们从CreateProcessAsUser链接

编辑回复OP的评论

听从这个人的建议

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

同样的代码在Vista上也适用于我们 在XP等上。该服务以 本地系统

  • 使用WTSGetActiveConsoleSessionId获取当前活动会话的ID 控制台上的Windows会话(即。 机器键盘和显示器,如图所示 与WTS会话相反)

  • 使用WTSQueryUserToken获取该会话的令牌

  • 使用DuplicateTokenEx(hToken,允许的最大值,NULL,SecurityIdentification,TokenPrimary, &hTokenDup)复制该令牌

  • 使用CreateEnvironmentBlock创建您将要创建的环境 传递到进程

  • 将CreateProcessAsUser与复制的令牌和创建的 环境实际上,我们使用 CreateProcessAsUserW,因为 这个版本在某些方面有一些bug 旧系统

  • 别忘了关闭各种令牌等的句柄,并 破坏环境阻止 环境

  • 多谢各位

    顺便说一句,Windows编程的乐趣,好久没做了。现在我想起来了。只有OpenSSH编程非常接近,甚至更糟。

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

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


    CreateProcessWithLogonW和LogonUser都需要密码。打印机监视器只向我发送两个参数,username和sessionid=(REDMON文档说明可以使用打印机服务发送的这两个参数来启动CreateProcessAsUser。那么,我如何仅从[username]和[sessionid]获取hToken所以我可以将它传递给CreateProcessAsUser?从我上次看到的,redrun.exe在其源代码中使用CreateProcess()。另外,一个恼人的控制台窗口会打开大约1-3秒。我还看到redrunee.exe,它也有控制台窗口弹出问题。所以我决定编写自己的redrun。