13

所以我有一个简单的例子,我有一个应用程序 A,它对用户 X 有一些硬编码的凭据,一个本地管理员,然后它使用硬编码的绝对路径使用这些凭据启动应用程序 B。A 和 B 以及 dotnet 控制台应用程序,但是它们不与控制台交互,只是将信息写入文件。

当我以交互方式运行 A 时(在我的 Creds 下,通过双击,或通过 CMD.exe 或交互式 PowerShell 会话运行良好。成功调用 B

当我通过计划任务运行它时,A 受信任,并使用用户 X 调用 B,Process.Start(mystartinfo) 的错误代码是十六进制的 -1073741502 或 0xC0000142,这意味着“应用程序无法正确初始化”

但是,如果我使用用户 X 凭据运行调用 A 的计划任务,它就可以工作..

我做了这个小测试,主要是因为我在尝试从计划任务或远程处理中尝试在 powershell 中执行“start-job -Credential”时看到类似的行为,或者在 powershell 中调用 start-process 或 System.Diagnostic>Process.Start 从 PowerShell 中在相同的场景中。起初我认为这是 PowerShell 中的一个错误,但它似乎更深。无论是 Windows 还是特别是 Dotnet,我想知道这是否已知/记录在案,以及是否有任何解决方法。

4

3 回答 3

2

好的,这篇文章已经很老了,但我在同一个问题上运行(通过服务运行时,powershell 启动进程失败,退出代码为 -1073741502)。
显然这与这个问题有关(为什么这个进程一启动就崩溃?

Process.Start 在指定凭据时在内部调用 CreateProcessWithLogonW(CPLW)。不能从 Windows 服务环境(如 IIS WCF 服务)调用 CreateProcessWithLogonW。它只能从交互式进程(由通过 CTRL-ALT-DELETE 登录的用户启动的应用程序)调用。

我想当您运行计划任务时它是类似的,它在 Windows 服务环境中运行。
可能会阻止您诱导的 API 本机调用从服务运行。

于 2015-06-22T11:17:00.153 回答
1

因此,您有一个进程 A,它像您一样从计划任务(非交互式)运行,并以 X(本地管理员)的身份启动进程 B 说明:

  • 你是那个盒子的管理员吗?
  • B 是否需要窗口句柄或控制台句柄?

您可以尝试使用 ProcessMonitor 来查看哪个调用完全失败。我的猜测是 B 正在尝试与桌面交互并且被拒绝这样做的权限。

当您以用户 A 的身份登录并使用调度程序启动交互式进程时,窗口会正常显示。但是,如果您以用户 B(例如来宾用户)身份登录并启动以 A 身份(例如本地管理员)运行的交互式进程,那么系统在显示 UI 方面确实存在问题

总而言之,如果您有一个使用未登录用户凭据的交互式流程,那么对于正确的做法没有明确的赢家。

于 2012-07-09T19:57:01.603 回答
1

我在 Windows Server 2008R2 下遇到过这样的行为。我的 C# 应用程序 (A) 启动了一个进程 B。

进程 B 在无法访问 Windows 桌面的情况下无法运行,[调用 Windows API CreateWindow() 失败;] 在作为服务(或通过调度程序)运行时被阻止运行(这是为了防止使用“at /interactive cmd.exe”进行众所周知的用户权限升级)

我建议检查您正在使用的环境并检查它是否是同样的问题。如果是这样,那么您应该搜索如何删除对 CreateWindow() API 调用的引用或正确处理它。

不幸的是,我无法访问流程 B,因此无法成功解决此问题。我最终在 Server 2003 机器上部署了该解决方案。

于 2012-04-23T11:13:01.613 回答