如何以管理员权限启动进程,而不使我的WPF宿主也以管理员权限运行,以实现文件拖放?

3

我创建了一个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主机是可行的,但是拖放会更加舒适。

当我以非管理员权限运行我的应用程序时,拖放功能可以正常工作,但是由于缺乏权限,我的应用程序无法执行命令提示符。

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


为什么您决定启动提升进程的应用程序必须具有管理员权限? - Sinatr
我想执行C:\Windows\System32\wevtutil.exe来安装一堆ETW清单。wevtutil.exe需要管理员权限才能这样做。 - Philipp Stauss
1
我认为你的问题无法通过代码解决。这是Windows安全行为。但我仍然对这个问题很好奇。http://superuser.com/questions/59051/drag-and-drop-file-into-application-under-run-as-administrator - Smartis
@Philipp,好的,“wevtutil.exe”需要管理员权限,并且您使用“Verb =“ runAs””是正确的。您想要拖放文件到哪里?是拖放到“wevtutil.exe”还是运行“wevtutil.exe”的应用程序中? 应用程序不必具有管理员权限。 - Sinatr
1个回答

2
首先,如果您只需要运行需要管理员权限的一个操作,那并不意味着您的整个应用程序都应该以管理员权限运行。您只需要为此特定操作提升权限。最简单的方法是在启动进程时设置UseShellExecute = true - 然后Windows会向用户显示常规的UAC提示,以便他可以确认权限提升。您可以在此之前向用户描述情况(在某个对话框中),或者您可以在执行该操作的按钮上放置常规的UAC图标(即盾牌图标)。
如果这对您来说不是一个选项(例如,您需要重定向输出),则可以使用带有特定参数的管理员权限运行自己的应用程序的另一个副本(与上述描述完全相同,但不是wevtutil,而是您自己的应用程序)。这个提升权限的副本只会运行wevtutil并退出,不会执行其他任何操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接