问题标签 [createprocessasuser]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 从 Windows 服务打印 Pdf 并在注销后继续工作
我正在创建一个 Windows 服务,它将按时间间隔打印 pdf。
我对此进行了一些研究并找到了一个类
并像这样调用这个类
这段代码运行良好并且做得很好。
但这仅在某些用户登录系统时才有效。意味着当我登录时它正在工作。但是当我注销我的用户时,它就不起作用了。当我锁定我的系统时,它可以工作,但是当我注销并切换用户时,它就无法工作。
我检查了服务日志以检查问题所在。
所以我在Run
方法中找到了这个语句
当用户登录时primaryToken
很好,但当注销或切换用户时,它是IntPtr.Zero
。
然后我检查了GetCurrentUserToken
方法。我发现这个方法正在为当前登录的用户令牌创建令牌。这就是为什么这在注销后不起作用的原因。
但我想在注销后打印。
在此Run
方法CreateProcessAsUser
中用于创建打印过程。
但我不知道如何在没有用户的情况下创建进程。有一个方法CreateProcess
。也许它会在没有用户令牌的情况下创建进程,我对此不太了解。在这里找到这个。
但它也不起作用。即使在用户登录时它也不起作用。
我想使用 Windows 服务在一段时间内打印 pdf 文件。并且在用户注销或切换用户或锁定后应该继续工作。
任何人都知道我怎样才能做到这一点?
谢谢
c# - 从 Windows 服务打印时,CreateProcessAsUser 不使用 LogonUser 令牌
我正在 LocalSystem 帐户下构建一个 Windows 服务,它将在某个时间间隔内打印 pdf。
为此,我正在使用创建用户令牌LogonUser
并将其currentToken
传入CreateProcessAsUser
但它没有做它的工作
如果我使用以下代码获取当前用户令牌。
然后CreateProcessAsUser works fine. But I need to create token by
LogonUser because after user logoff
GetCurrentUserToken` 方法不返回用户令牌,注销后我也想要用户令牌。
更新
我在CreateProcessAsUser
这样调用后检查最后一个错误
但是 GetExitCodeProcess 返回 true。我没有发现任何错误
c# - 如何使用参数以用户身份创建进程
试图以用户身份创建一个进程,portablechrome.exe
但我无法用参数处理它。
如何打开带有参数的 HTML 文件?如portablechrome.exe sample.html --kiosk
我正在使用这样的系统服务:
我的包装StartProcessAsUser
:
在我调用此函数后,信息亭模式隐身 Chrome 会打开,但不会打开我的 html 文件。只是一个空白页。
那么如何打开带有参数的 html 文件呢?
winapi - Win32 - 将最高可用的子进程作为普通用户进程启动
假设您的 Windows 用户帐户在 Admin 组中,启用了 UAC,并且您正在运行具有普通用户权限的某个程序 A。A 从不要求提升,也从不接受。现在假设 A 想要启动程序 B,它的清单中有最高可用。
如果 A 调用 CreateProcess(B),这将失败并出现错误 740(“需要提升”)
如果 A 调用 ShellExecuteEx(B),Windows 将显示一个 UAC 框,要求运行 B 提升。用户可以说是,在这种情况下 B 将运行提升,或者说否,在这种情况下启动将失败。
我的问题是:有什么方法可以实现第三种选择,即我们只需启动 B 而无需提升?
这似乎原则上应该是可能的,因为“highestAvailable”意味着 B更喜欢在海拔高度运行,但完全能够在正常用户模式下运行。但我想不出任何方法来完成它。我已经用令牌和 CreateProcessAsUser() 尝试过各种事情,但这一切似乎都归结为:“highestAvailable”似乎一成不变地指的是用户帐户中固有的潜在权限,而不是任何明确表达的实际权限构造的令牌。
我希望实际上有某种方法可以使用 CreateProcessAsUser() 来做到这一点,而我只是错过了正确构造令牌的技巧。
更新 - 解决了:下面的 __COMPAT_LAYER=RunAsInvoker 解决方案效果很好。一个警告,不过。这强制子进程无条件地“作为调用者”运行:即使被调用的 exe 在其清单中指定“requireAdministrator”,它也适用。我认为当 exe 指定“requireAdministrator”时,原始的“需要提升”错误通常更可取。我想要标记为“highestAvailable”的程序的 RunAsInvoker 行为的全部原因是,这些程序明确表示“我可以在任一模式下正常运行”——所以让我们继续并在不方便使用管理员模式时以普通用户模式运行。但是“requireAdministrator”是另一回事:此类程序说“如果没有提升的权限,我将无法正常运行”。对于这样的程序来说,预先失败似乎比强迫它们在未提升的情况下运行更好,这可能会使它们遇到他们没有正确编程处理的特权/访问错误。所以我认为这里一个完整的通用解决方案需要检查应用程序清单,并且只有在清单显示“highestAvailable”时才应用 RunAsInvoker 强制。一个更完整的解决方案是使用其他地方讨论的技术之一,当出现“requireAdministrator”程序时,给调用者一个调用 UAC 的选项,并为用户提供启动它的机会。我可以想象一个 CreateProcessEx() 覆盖有几个新标志,用于“将进程权限视为最高可用权限”和“如果需要提升则调用 UAC”。
(这可能表明 Windows shell 甚至不提供执行此操作的方法......直接从 shell 启动 B 会给您一个 UAC 框,让您可以使用 Admin privs 启动或根本不启动。如果有任何方式来实现它,UAC 框可能会提供第三个按钮来启动没有特权。但话又说回来,这可能只是一个 UX 决定,第三个选项对平民来说太混乱了。)
(请注意,在 StackOverflow 和 Microsoft 开发支持网站上有很多帖子询问一个看起来非常相似的场景,但不幸的是,这并不适用于此。这种场景是您有一个正在运行的父程序,并且它想要启动一个非提升的子进程.典型的例子是一个安装程序,像安装程序倾向于做的那样运行提升,它想要在正常用户级别启动它刚刚安装的程序,就在它退出之前.有很多关于发布的代码如何做到这一点,我的尝试基于其中一些技术,但这确实是一个不同的场景,解决方案在我的情况下不起作用.最大的区别是他们试图启动的子程序在这种情况下不是标有highestAvailable - child 只是一个正常程序,在正常情况下无需任何UAC 参与即可启动。还有另一个区别,那就是在这些场景中,父级已经在提升,而在我的场景中,父级以普通用户级别运行;这会稍微改变一些事情,因为在其他场景中的父进程可以访问我无法使用的令牌上的一些特权操作,因为 A 本身并没有提升。但据我所知,这些特权令牌操作无论如何都无济于事。事实上,孩子拥有最高可用标志,这是我的场景的关键元素。)
windows - CreateProcessAsUser 错误代码 6
我正在使用 LogonUser 获取主用户令牌,然后使用 CreateProcessAsUser APIs 来创建进程。但我收到错误代码 6。不确定是什么问题。下面是代码。
下面是错误
我无法为 logonUser 和 CreateProcessAsUser API 找到任何合适的文档。我正在尝试在具有多个用途的机器上运行此代码。我从一个用户登录并尝试从另一个用户创建进程。如果有人能指出正确的文档或示例,那就太好了。请帮忙。提前致谢。
c# - C# 中 CreateProcessAsUser 的标准输出始终为空
第一次调用Launch方法写入文件echo1,但我无法捕获测试第二行的标准输出,我做错了什么?
我一直在关注这个线程,但它没有回答:Capture standard output from CreateProcessAsUser in C#
我从https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c0ca087-5e7b-4046-93cb-c7b3e48d0dfb/how-run-client-application-as-a-windows-service获得实施-in-c?forum=csharpgeneral 并且我已经编辑了代码以获得与第一个链接相同的标准输出而没有答案。
这里的实现:
注意:这只是一个示例代码,在实际代码中,我想使用另一个进程从 Window 服务截取桌面的屏幕截图,在 explorer.exe 的上下文中,因为 Windows 服务无法直接访问桌面并且需要另一个上下文来做它。
如果您需要更多信息,请告诉我,谢谢!
com - 在 Windows 7 中,使用本地系统帐户的 Windows 服务使用 CreateProcessAsUser 启动的进程崩溃
在 Windows 7 中,使用本地系统帐户的 Windows 服务使用 CreateProcessAsUser 启动的进程崩溃,但手动启动的同一进程运行良好。CreateProcessAsUser 功能位于单独的 COM 组件 [64 位 C++ dll] 中,Windows 服务 [dot net 4.6.1] 具有平台目标 [Any CPU]。该进程也没有向事件日志写入任何内容,这表明没有执行任何代码,并且它立即崩溃。此代码在 Windows 10 中完美运行。
我试图附加到这个过程,但它结束得太早了,无法做任何事情。我确实收到一条消息“未找到模块”,表明它没有找到库。但我无法弄清楚是哪一个。我给了它它需要的所有库,这可以从程序在从同一文件夹手动启动时运行正常的事实中看出。我也尝试在函数CreateProcessAsUser中指定启动文件夹,但没有区别,但我认为它默认在正确的文件夹中启动[它所在的位置]我在SO上找到了以下链接 为什么这个进程会尽快崩溃当它启动时? 但这也无济于事。ProcMon 不显示找不到模块的位置 [如果我删除已知模块,它会显示 PATH NOT FOUND]
The process exit status is -1066598274 and the stack trace is 0 ntoskrnl.exe RtlNtStatusToDosError + 0x1086 0xfffff8000712f206 C:\Windows\system32\ntoskrnl.exe 1 ntoskrnl.exe RtlCopySidAndAttributesArray + 0x1789 0xfffff8000714b0d9 C:\Windows\system32\ntoskrnl.exe 2 ntoskrnl .exe RtlNtStatusToDosError + 0x1538 0xfffff8000712f6b8 C:\Windows\system32\ntoskrnl.exe 3 ntoskrnl.exe KeSynchronizeExecution + 0x3a23 0xfffff80006e75e53 C:\Windows\system32\ntoskrnl.exe
事件查看器显示以下信息错误应用程序名称:BizBrainAgentPluginHost.exe,版本:1.0.0.0,时间戳:0x5b88084d 错误模块名称:KERNELBASE.dll,版本:6.1.7601.18015,时间戳:0x50b8479b 异常代码:0xc06d007e 故障偏移量: 0x0000000000009e5d 错误进程 id:0x484 错误应用程序启动时间:0x01d440746491e037 错误应用程序路径:C:\Program Files\Avinashi Ventures Pvt Ltd\myTallyApp Agent\BizBrainAgentPluginHost.exe 错误模块路径:C:\Windows\system32\KERNELBASE.dll 报告 ID: a2f39c97-ac67-11e8-94f1-0023ae9747d0
谢谢
kerberos - 使用 Java 和 Kerberos 以不同用户身份创建进程
我正在开发一个 Java 服务器应用程序(在 Windows 下作为服务运行)并希望实现以下场景:
- 用户向服务器发出 POST 请求。用户通过 Kerberos(SPNEGO、企业环境中的 SSO)进行身份验证。
- 该服务创建一个新的 Java 进程。该进程必须作为经过身份验证的用户而不是服务用户(模拟/委托)运行。
- 新进程应在用户的安全上下文中执行。它必须与需要 Kerberos 身份验证的其他远程系统通信(例如文件共享、其他 Web 服务……)。
工作概念验证:
- 用于 Kerberos 身份验证的带有Waffle的Spring Boot 应用程序。
- 为经过身份验证的用户创建一个新进程。我使用JNA和 Windows 原生函数CreateProcessAsUser。
- 该进程被创建为经过身份验证的用户。我可以使用 Process Explorer 实用程序来验证这一点。
缺少什么并且不起作用:
- 进程无法请求其他 Kerberos 票证(例如通过调用 InitializeSecurityContext())
- 该进程无法访问网络共享。
- 该进程无法与需要 Kerberos 身份验证的其他 Web 服务进行通信。
我的问题:
- 我错过了什么或我的代码可能有什么问题?
- 甚至有可能实现我想要实现的目标吗?
服务器 - 身份验证(缩短,从 Waffle 中提取):
服务器 - CreateProcessAsUser:
c++ - 在 Windows 7 64 位上使用 CreateProcessAsUserW 从 64 位进程创建的进程立即退出,异常代码为 0xc06d007e
我有一个 C# 应用程序,它是使用 CreateProcessAsUserW api 从 C++ DLL 启动的。该进程成功启动,但立即终止。它在 Windows 10 [32 位和 64 位] 和 Windows 7 上的 32 位上正常工作。我找到了以下链接,
但是,SysInternals 的进程监视器没有发现丢失的 dll。[我可以从 ProcMon 附加保存的日志] 我还尝试在 API 的 lpCurrentDirectory 参数中按照其他地方的建议将路径传递到应用程序文件夹,但这也不起作用。
我遵循了如何在多个用户在 Windows 中登录时获取活动用户中的指导?编写启动进程的代码,并从 Windows 服务调用启动进程的方法。为了从命令行模拟它,我使用了以下 如何在本地系统帐户下运行 CMD.exe?[psexec64 -i -s cmd.exe,然后从cmd.exe启动进程] 方法如下 // Windows下多个用户登录时如何获取活动用户?
Procmon 屏幕截图附在下面请帮助。谢谢,萨加尔
我尝试了以下排列
所以看起来如果启动器进程是 64 位,它总是崩溃,如果它是 32 位,它总是成功。64 位和 32 位启动器进程有什么区别?
c++ - 从服务中打开 UWP 应用程序
我正在尝试使用CreateProcessAsUser
我创建的服务启动应用程序和进程。我尝试打开记事本、IE 等应用程序是成功的。但是我在尝试打开 Groove Music 时遇到了障碍,这是一个 UWP 应用程序。
当我尝试从命令提示符打开 Groove Music 时,该文件夹被隐藏并且访问被拒绝。
有什么方法可以从我编写的程序中启动 UWP 应用程序?还是我错过了任何明显的方法?