gpt4 book ai didi

当与 Windows 服务环境中的 Credential 一起使用时,powershell Start-Process 退出代码 -1073741502

转载 作者:行者123 更新时间:2023-12-02 23:13:27 25 4
gpt4 key购买 nike

我在 powershell Start-Process 调用中遇到了奇怪的行为。

这是电话:

$process = start-process `
"C:\somepath\MyBinary.exe" `
-PassThru `
-Credential $defaultCredential `
-Wait `
-WorkingDirectory "C:\somepath" `
-LoadUserProfile
if ($process.ExitCode -ne 0)
{
#do something
}

此调用始终返回退出代码 - 1073741502 .
经过快速搜索后,此退出代码似乎与程序无法加载其所需的 dll 时的一般错误有关(又名 STATUS_DLL_INIT_FAILED )。

当我在没有 -Credential $credential 的情况下运行它时程序运行正确。

为了隔离问题,我手动启动了some.exe在提示中显示我的目标凭据,并且运行顺利。

因此,问题似乎仅来自于 start-process cmdlet 有效启动进程的方式。

我发现了这个问题的一些潜在解决方案,但我尝试应用但没有成功:linklink .

你知道这里发生了什么吗?

编辑1:
我运行 proc mon 来监视直接启动或通过 powershell 脚本启动的程序事件。加载 kernelbase.dll 时似乎出现问题.

本地 procmon 转储(工作):

9:06:35.3837439 AM  MyBinary.exe    2620    Load Image  C:\Windows\SysWOW64\kernelbase.dll  SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:06:35.4317417 AM MyBinary.exe 2620 RegOpenKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions REPARSE Desired Access: Read
9:06:35.4317751 AM MyBinary.exe 2620 RegOpenKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions SUCCESS Desired Access: Read
9:06:35.4318016 AM MyBinary.exe 2620 RegSetInfoKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions SUCCESS KeySetInformationClass: KeySetHandleTagsInformation, Length: 0
9:06:35.4318152 AM MyBinary.exe 2620 RegQueryValue HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions\(Default) SUCCESS Type: REG_SZ, Length: 36, Data: 00060101.00060101
...

Powershell procmon(失败,查看线程退出,进程退出代码 - 1073741502):

9:35:07.9455191 AM  MyBinary.exe    2276    Load Image  C:\Windows\SysWOW64\kernelbase.dll  SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:35:07.9537146 AM MyBinary.exe 2276 Thread Exit SUCCESS Thread ID: 5112, User Time: 0.0000000, Kernel Time: 0.0000000
9:35:07.9537386 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\apisetschema.dll SUCCESS Name: \Windows\System32\apisetschema.dll
9:35:07.9537686 AM MyBinary.exe 2276 QueryNameInformationFile C:\somepath\MyBinary\MyBinary.exe SUCCESS Name: \somepath\MyBinary\MyBinary.exe
9:35:07.9537914 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64cpu.dll SUCCESS Name: \Windows\System32\wow64cpu.dll
9:35:07.9538134 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64win.dll SUCCESS Name: \Windows\System32\wow64win.dll
9:35:07.9538349 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\wow64.dll SUCCESS Name: \Windows\System32\wow64.dll
9:35:07.9538579 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\System32\ntdll.dll SUCCESS Name: \Windows\System32\ntdll.dll
9:35:07.9538796 AM MyBinary.exe 2276 QueryNameInformationFile C:\Windows\SysWOW64\ntdll.dll SUCCESS Name: \Windows\SysWOW64\ntdll.dll
9:35:07.9539425 AM MyBinary.exe 2276 Process Exit SUCCESS Exit Status: -1073741502, User Time: 0.0000000 seconds, Kernel Time: 0.0000000 seconds, Private Bytes: 339,968, Peak Private Bytes: 401,408, Working Set: 1,523,712, Peak Working Set: 1,826,816

编辑2:
我应该提到powershell 脚本是从服务运行的(它是一个bamboo 服务代理)。我刚刚发现了这个thread说:

Process.Start internally calls CreateProcessWithLogonW(CPLW) when credentials are specified. CreateProcessWithLogonW cannot be called from a Windows Service Environment (such as an IIS WCF service). It can only be called from an Interactive Process (an application launched by a user who logged on via CTRL-ALT-DELETE).

我的猜测是 powershell 启动进程调用正在利用 CreateProcessWithLogonW ...

编辑3:
我的服务是使用自定义用户运行的(因为我无法模拟系统),因此请阅读 link 。我进行了测试,确保启用了“允许服务与桌面交互”。因为它仅适用于非自定义帐户,所以我通过更改 HKLM\System\CurrentControlSet\Services\%myservice% 在注册表上手动设置它。键入 key (如所述 herehere )。

最佳答案

start-processSystem.Diagnostics.Process.Start() 的“别名”,所以是的,它确实使用了 CreateProcessWithLogonW() 。如前所述,不能从服务进程调用此方法,只能从“交互式”进程调用。对“唯一”的警告是您发现的——当您不更改凭据时,它至少可以启动该过程。 (这实际上甚至可能是一个错误 - 与我交谈过的一位 Microsoft 支持工程师对此问题感到“惊讶”,它居然能起作用。)

从服务进程内部启动另一个进程的唯一(受支持)方法是使用 native Win32 API 方法 CreateProcessAsUser()。有关如何执行此操作的示例是 C#.NET,可以在 the answer 中找到。对于编辑 #2 中提到的问题。

Windows 进程必须作为用户 session 的一部分启动。如果启动进程作为交互式 session 的一部分运行 - 您使用 CTRL+ALT+DELETE 登录并打开桌面 - 那么您可以使用 CreateProcessWithLogonW(),它将使用您的自动当前用户 session 。如果启动进程是一项服务或“批处理”进程(如计划任务),则启动进程必须创建一个新的用户 session (或标识一个现有 session )来启动新进程(这就是代码中的内容)在上述答案中确实如此。)

关于当与 Windows 服务环境中的 Credential 一起使用时,powershell Start-Process 退出代码 -1073741502,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com