1

我通过 kernal32.CreateProcess 启动 msEdge,进程启动,但是当我尝试与初始进程交互时,它已经退出并且新进程正在运行。我已经编写了代码来处理这个问题,但是我在野外有代码受到这种新行为的影响并且无法与进程交互,因为它看起来像是退出了......

此行为首次出现在 msEdge 更新 89.0.774.57 中,但一位同事在降级到 86.0.622.56 后发现它发生了

寻求有关如何阻止 msEdge 以这种方式启动的帮助,我认为它缺少一些配置选项...

示例代码(适用于 VB!):

Sub Main()
       Dim processInfo As PROCESS_INFORMATION
       Dim creationFlags As Integer = CreationFlagsLocal.NORMAL_PRIORITY_CLASS Or CreationFlagsLocal.DETACHED_PROCESS

       Dim startupInfo As STARTUPINFO = New STARTUPINFO
       startupInfo.cb = Marshal.SizeOf(startupInfo)

       Dim path = "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
       CreateProcess(Nothing, path, Nothing, Nothing, False, creationFlags, IntPtr.Zero, Nothing, startupInfo, processInfo)
       Console.WriteLine("The processID from CreateProcess was: " & processInfo.dwProcessId)
       Thread.Sleep(2000)
       Console.WriteLine("GetRunningEdgeProcessID() returns " & GetRunningEdgeProcessID())
       Dim originalPidExists = Process.GetProcesses().Any(Function(x) x.Id = processInfo.dwProcessId)
       Console.WriteLine($"PID {processInfo.dwProcessId} still exists? {originalPidExists}")
   End Sub

初始进程退出后获取运行进程的代码:

 Function GetRunningEdgeProcessID() As Integer
        Dim edgeProcesses = Process.GetProcessesByName("msedge")
        Dim mainProcess = edgeProcesses.FirstOrDefault(Function(x) Not String.IsNullOrEmpty(x.MainWindowTitle))
        If mainProcess IsNot Nothing Then Return mainProcess.Id
        Return -1
    End Function

CreateProcess 的导入:

 <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
    Function CreateProcess(ByVal lpApplicationName As String,
      ByVal lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES,
       ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Boolean,
       ByVal dwCreationFlags As Integer, ByVal lpEnvironment As IntPtr, ByVal lpCurrentDirectory As String,
       <[In]()> ByRef lpStartupInfo As STARTUPINFO,
       <[Out]()> ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean


    End Function
4

1 回答 1

0

事实证明,启动 msEdge 的进程已提升,而 edge 不想运行提升,因此它会在正常用户上下文中重新启动自身。有一个标志允许边缘在提升模式下运行,可以解决原始问题。

此外,该问题可能是由于使用了 MS 最近远程禁用的 Start-Up Boost 功能引起的,因为它会导致此类问题edge://flags#edge-de-elevate-on-launch

进一步阅读: https ://winaero.com/microsoft-edge-now-de-elevates-itself-automatically/

于 2021-04-22T09:51:28.493 回答