Joh*_*lip 9 powershell credentials start-process
我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
此调用始终返回退出代码 - 1073741502.
快速搜索后,当程序无法加载其所需的dll(aka.STATUS_DLL_INIT_FAILED)时,此退出代码似乎与一般错误有关.
当我运行它没有-Credential $credential程序正确运行.
为了隔离问题,我some.exe在目标凭证的提示中手动启动,并且运行顺利.
所以问题似乎只来自start-process cmdlet有效启动进程的方式.
我找到了一些潜在的解决方案来解决这个问题,我尝试申请没有运气:链接和链接.
你知道这里发生了什么吗?
编辑1:
我直接或通过powershell脚本运行proc mon来监控程序活动.加载时似乎发生了这个问题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
...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
编辑2:
我应该提到powershell脚本是从服务运行的(它是一个竹子服务代理).我刚刚发现这个帖子说:
当指定凭据时,Process.Start在内部调用CreateProcessWithLogonW(CPLW).无法从Windows服务环境(例如IIS WCF服务)调用CreateProcessWithLogonW.它只能从Interactive Process(由通过CTRL-ALT-DELETE登录的用户启动的应用程序)调用.
我的猜测是PowerShell启动进程调用正在使用CreateProcessWithLogonW......
编辑3:
我的服务是使用自定义用户运行的(因为我无法模拟来自System),所以作为读取链接.我测试确保启用了"允许服务与桌面交互".因为它仅适用于非自定义帐户,所以我通过更改HKLM\System\CurrentControlSet\Services\%myservice%Type键(如此处和此处所述)在注册表上手动设置.
start-process是一个'别名' System.Diagnostics.Process.Start(),所以是的,它确实利用了CreateProcessWithLogonW().如上所述,此方法无法从服务进程调用,只能从"交互"进程调用.对"唯一"的警告是你发现的 - 当你不更改凭证时,它至少可以启动流程.(这实际上甚至可能是一个错误 - 我与之谈过这个问题的微软支持工程师"感到惊讶"它完全有效.)
从服务进程内部启动另一个进程的唯一(支持)方法是使用本机Win32 API方法CreateProcessAsUser().如何执行此操作的示例是C#.NET可以在编辑#2中提到的问题的答案中找到.
Windows进程必须作为用户会话的一部分启动.如果启动过程作为交互式会话的一部分运行 - 您使用CTRL + ALT + DELETE登录并打开桌面的类型 - 那么您可以使用CreateProcessWithLogonW(),它将自动使用您当前的用户会话.如果启动过程是服务或"批处理"过程(如计划任务那样),则启动过程必须创建新的用户会话(或标识现有的会话)以启动新进程(这就是代码)在上述答案中.)
| 归档时间: |
|
| 查看次数: |
4016 次 |
| 最近记录: |