- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我安装了 PostScript 打印机驱动程序并设置了 REDMON (redmonnt.dll) 以将 postscript 输出重定向到我的程序。在我相当简单的 c 程序中,我从 STDIN 捕获数据,并且能够成功地将其保存到 .ps 文件中。文件看起来没问题。
但是,我想启动 gsview.exe 来查看文件。如果我调用 ShellExecute,它会因为权限问题在 Windows 7 中失败。似乎我的程序是在不同的用户帐户(本地服务)下调用的。因此,我正在寻找一种在特定用户名(启动打印作业的用户)下运行 gsview.exe 的方法,该用户名也可用于名为 REDMON_USER 的变量中的程序以及 SESSIONID。
问:在给定用户名和 session ID 的情况下,启动程序所需的最少 WinAPI 调用次数是多少?
C/C++、.NET 中的任何代码示例都会非常有帮助。
编辑:我正在尝试完成的事情与 redrunee(来自 redmonee)非常相似。我不想使用 redrunee,因为它会短暂打开一个控制台窗口。
注意:1) 该程序被打印机服务作为[LOCAL SERVICE]帐户调用。2)第一个参数Username(REDMON_USER),实际上指向当前正在看屏幕的用户
最佳答案
另请参阅 CreateProcessWithLogonW
和 CreateProcess
。
它们从 CreateProcessAsUser 链接
EDIT 回复 OP 的评论。
遵循此 thread 的建议.
我正在逐字复制这里,以防原始链接失效:
The same code works for us on Vista as on XP, etc. The service is running as the Local System.
use WTSGetActiveConsoleSessionId to get the ID of the current active Windows session at the console (i.e. the machine keyboard and display, as opposed to WTS sessions).
use WTSQueryUserToken to get the token for that session.
use DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary, &hTokenDup) to duplicate that token.
use CreateEnvironmentBlock to create an environment that you will be passing to the process.
use CreateProcessAsUser with the duplicated token and the created environment. Actually, we use CreateProcessAsUserW, since the A version had some sort of bug on some older systems.
Don't forget to CloseHandle on the various tokens, etc, and to DestroyEnvironmentBlock the environment.
谢谢efratian .
附言。 Windows编程的乐趣哦,好久没做了。现在我想起来为什么了。唯一接近或更差记录的是 OpenSSH 编程。
关于c - WinAPI C - 来自 REDMON_USER 和 REDMON_SESSIONID 的 RunAsUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2907512/
我安装了 PostScript 打印机驱动程序并设置了 REDMON (redmonnt.dll) 以将 postscript 输出重定向到我的程序。在我相当简单的 c 程序中,我从 STDIN 捕获
我是一名优秀的程序员,十分优秀!