我创建了一个 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,
})
此命令需要管理员权限。因此,我添加了一个 list 文件,它以管理员权限启动 WPF 主机:
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"><requestedExecutionLevel level="requireAdministrator" uiAccess="false" /></requestedPrivileges>
到目前为止,这个解决方案工作正常。我可以启动我的 WPF 应用程序,通过按下按钮触发一个事件,然后我的进程将执行此命令提示符。
现在我想通过拖放到我的 WPF 客户端来添加一些文件。由于我的应用程序以管理员权限运行,因此无法将文件从 Windows 文件资源管理器拖放到我的应用程序中。
可以使用 Total Commander 拖放文件,因为 Total Commander 可以使用管理员权限启动。将 OpenFileDialog 添加到我的 WPF 主机是可行的,但拖放操作会舒服得多。
当我在没有管理员权限的情况下运行我的应用程序时,拖放工作正常,但由于缺少权限,我的应用程序无法执行命令提示符。
我如何实现拖放以添加我的文件,然后在我需要这些文件作为参数的地方执行具有管理员权限的命令提示符?
最佳答案
首先,如果您只需要运行一个需要管理员权限的操作 - 这并不意味着您的整个应用程序都应该以管理员权限运行。你只需要为这个特定的操作提升。最简单的方法是在启动进程时设置 UseShellExecute = true - 然后 Windows 将向用户显示通常的 UAC 提示,以便他可以确认升级。您可以在此之前(在某些对话框中)向用户描述情况,或者您可以将通常的 UAC 图标放在执行该操作的按钮上(那个盾牌图标)。
如果这不是您的选择(例如,您需要重定向输出)- 您可以使用具有管理员权限的某些参数运行您自己的应用程序的另一个副本(完全如上所述,但不是 wevtutil,而是您自己的应用程序) .这个提升的副本将只运行 wevtutil 并退出,什么都不做。
关于c# - 如何在没有我的 WPF 主机的情况下启动具有管理员权限的进程也以管理员权限运行以实现文件拖放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327078/