如何在管理模式下异步运行进程?

Posted

技术标签:

【中文标题】如何在管理模式下异步运行进程?【英文标题】:How to run a process asynchronously in administration mode? 【发布时间】:2021-06-23 10:45:38 【问题描述】:

在异步运行进程之前,我需要我的应用需要管理员权限。它曾经与 app.manifest 中的以下配置很好地配合使用:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

但是,由于现在添加了不需要管理员权限才能运行的进程,因此这个优雅的解决方案不再削减它。我希望这样做可以解决问题:

process.StartInfo.UseShellExecute = true;
process.StartInfo.Verb = "runas";

这就是我所拥有的,但一定是某处出现错误,因为此代码按预期运行该过程,但实际上并不需要管理员权限:

public async Task ExecuteElevatedProcessAsync(string executablePathArg)

    using (var process = new Process())
    
        process.StartInfo.FileName = executablePathArg;
        process.StartInfo.UseShellExecute = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.Verb = "runas";
        await RunAsync(process);
    ;


private Task RunAsync(Process processArg)

    var taskCompletionSrc = new TaskCompletionSource<object>();
    processArg.EnableRaisingEvents = true;
    processArg.Exited += (s, e) => taskCompletionSrc.TrySetResult(null);
    if (!processArg.Start())
    
        taskCompletionSrc.SetException(new Exception("Some descriptive error-message."));
    
    return taskCompletionSrc.Task;


你知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

通过在另一台计算机上运行它,我了解到上面的代码确实按预期工作:在执行异步进程之前,它会触发 Windows UAC 弹出窗口,要求用户提供对设备进行更改的应用权限。

在我的 Windows 机器上从未触发弹出窗口,因为用户帐户控制已完全禁用,这不是一个明智的选择...

【讨论】:

以上是关于如何在管理模式下异步运行进程?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下异步回收子进程

python如何在分离模式下运行进程

如何使用多处理在Python中运行多个异步进程?

node.js 进程如何知道何时停止?

如何在分离模式下杀死进程

Swoole系列3.2Swoole 异步进程服务系统