如何在没有我的 WPF 主机也以管理员权限运行的情况下以管理员权限启动进程以实现文件拖放?
Posted
技术标签:
【中文标题】如何在没有我的 WPF 主机也以管理员权限运行的情况下以管理员权限启动进程以实现文件拖放?【英文标题】:How do I start a process with administrator privileges without my WPF host also runs with admin rights in order to implement file drag & drop? 【发布时间】:2016-07-19 12:48:26 【问题描述】:我创建了一个 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 客户端。由于我的应用程序以管理员权限运行,因此无法将文件从 Windows 文件资源管理器拖放到我的应用程序中。
可以使用Total Commander 拖放文件,因为Total Commander 可以使用管理员权限启动。向我的 WPF 主机添加 OpenFileDialog 是可行的,但拖放会更舒服。
当我在没有管理员权限的情况下运行我的应用程序时,拖放可以工作,但我的应用程序由于缺乏权限而无法执行命令提示符。
如何实现拖放以添加我的文件,然后在我需要这些文件作为参数的地方执行具有管理员权限的命令提示符?
【问题讨论】:
为什么你决定启动提升进程的应用程序必须具有管理员权限? 我想执行 C:\Windows\System32\wevtutil.exe 来安装一堆 ETW 清单。 wevtutil.exe 需要管理员权限才能执行此操作。 我认为你的问题不能通过代码来解决。这是一种 Windows 安全行为。但是我还是很好奇这个问题。 superuser.com/questions/59051/… @Philipp,好的,wevtutil.exe
需要管理员权限,您可以使用 Verb = "runAs"
正确操作。您要将文件拖放到哪里?进入wevtutil.exe
还是进入运行wevtutil.exe
的应用程序? 应用程序不必具有管理员权限。
【参考方案1】:
首先,如果您只需要运行一个需要管理员权限的操作 - 这并不意味着您的整个应用程序都应该以管理员权限运行。您只需要针对此特定操作进行升级。最简单的方法是在启动进程时设置 UseShellExecute = true - 然后 Windows 将向用户显示通常的 UAC 提示,以便他可以确认升级。您可以在此之前向用户描述情况(在某些对话框中),或者您可以将常用的 UAC 图标放在执行该操作的按钮上(那个盾牌图标)。
如果这不适合您(例如,您需要重定向输出) - 您可以使用具有管理员权限的某些参数运行您自己的应用程序的另一个副本(完全如上所述,但不是 wevtutil,而是您自己的应用程序) .这个升级的副本只会运行 wevtutil 并退出,什么都不做。
【讨论】:
以上是关于如何在没有我的 WPF 主机也以管理员权限运行的情况下以管理员权限启动进程以实现文件拖放?的主要内容,如果未能解决你的问题,请参考以下文章