如何启动具有管理员权限的进程,而我的WPF主机也以管理员权限运行,以实现文件拖放和放大下降?

时间:2016-03-31 07:39:21

标签: c# .net wpf cmd drag-and-drop

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

        // The 'RunAs' indicates it needs to be elevated.  
        var process = Process.Start(new ProcessStartInfo(@"C:\Windows\System32\wevtutil.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客户端。由于我的应用程序使用管理员权限运行,因此无法拖动&amp;将文件从Windows文件资源管理器拖放到我的应用程序中。

可以拖拽使用Total Commander删除文件,因为可以使用管理员权限启动Total Commander。将OpenFileDialog添加到我的WPF主机可以正常工作,但是拖放&amp;放下会更舒服。

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

如何实施拖放功能drop用于添加我的文件,然后用admin权限执行命令提示符,我需要这些文件作为参数?

1 个答案:

答案 0 :(得分:2)

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

如果这不适合您(例如您需要重定向输出) - 您可以使用具有管理员权限的某些参数运行您自己的应用程序的另一个副本(完全如上所述,但不是wevtutil,而是您自己的应用程序) 。这个复制的副本只运行wevtutil并退出,不再做任何事情。