如何在没有 WPF 主机的情况下以管理员权限启动进程,以便使用管理员权限运行以实现文件拖放?



我创建了一个WPF应用程序,它需要在Windows命令提示符下执行命令。因此,我创建了以下代码:

        // The 'RunAs' indicates it needs to be elevated.  
        var process = Process.Start(new ProcessStartInfo(@"C:WindowsSystem32wevtutil.exe", commandArgs)
        {
            //Process will be started as admin
            Verb = "runAs",
            //Do not show the shell window
            CreateNoWindow = true,
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
        })

此命令需要管理员权限。因此,我添加了一个清单文件,该文件以管理员权限启动WPF主机:

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"><requestedExecutionLevel level="requireAdministrator" uiAccess="false" /></requestedPrivileges>

到目前为止,这个解决方案运行良好。我可以启动我的WPF应用程序,通过按下按钮触发一个事件,我的进程将通过这个命令提示符执行。

现在我想通过拖动添加一些文件;转到我的WPF客户端。由于我的应用程序是用管理员权限运行的,所以不可能拖动&将文件从Windows文件资源管理器拖放到我的应用程序中。

可以拖动&使用Total Commander删除文件,因为Total Commander可以使用管理员权限启动。将OpenFileDialog添加到我的WPF主机上是可行的,但拖动&降落会舒服得多。

当我在没有管理权限的情况下运行我的应用程序时,拖动&drop可以工作,但由于缺少权限,我的应用程序无法执行命令提示符。

我如何实现拖放;删除以添加我的文件,然后在我需要这些文件作为参数的地方使用管理员权限执行命令提示符?

首先,如果只需要运行一个需要管理权限的操作,这并不意味着整个应用程序都应该使用管理权限运行。你只需要为这个特定的操作而迟到。最简单的方法是在启动进程时将UseShellExecute设置为true,然后Windows将向用户显示通常的UAC提示,以便他可以确认级别。在此之前,您可以向用户描述情况(在某些对话框中),也可以将通常的UAC图标放在执行该操作的按钮上(屏蔽图标)。

如果这对您来说不是一个选项(例如,您需要重定向输出),您可以使用具有管理权限的某些参数运行自己的应用程序的另一个副本(与上面所述完全相同,但不是wevtutil,而是您自己的应用程序)。此级别相关的副本将只运行wevtutil并退出,不执行任何操作。

最新更新