2014-09-25 51 views
2

全部。这可能看起来像一个重复的问题,在这里有很多关于提升和降低儿童进程的问题。是否可以提升多个子进程的权限,仅提示一次?

我知道使用UseShellExecute = true连同Verb = "runas"选项以提升权限启动子进程。

例(在许多问题的答案找到):

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location) 
{ 
    UseShellExecute = true, // ! 
    Verb = "runas", 
}; 

我在这里的问题是不是开始升高访问的子进程,我想知道是否有一种方法来提示升高访问只一次,之后几次启动同一个子进程,比如说其中的8个进程。

我正在使用的应用程序使用排队系统来处理任务。根据用户的内核数量,为每个内核启动子进程(QueueProcessor),然后开始处理该队列。因此,本质上,我想检查用户的权限,提升权限一次,并启动所有8个队列处理器。

我无法使用manifest-route来要求整个应用程序在管理权限中运行,因为这不是我们许多用户的选项。编辑根据@ MPatel的评论:为了澄清,我们特别不强制用户按照设计决定以管理员身份运行应用程序。

显然你可以看到当你每次想要运行这些任务之一时,如果你不得不点击UAC对话8次,它会变得很烦人。

我遇到了这篇文章:Vista UAC The Definitive Guide,在我的搜索过程中,但我在C#.NET 3.5项目中实现C++ dll时遇到问题。这是基本上让我问这是否可能的文章。

可能值得一提的另一件事:我不确定我是否稍微误解了这个问题。用户必须有足够的权限才能使用我们程序使用的基本SQL功能。所以我认为我的问题可能不是让子进程运行完整的管理权限,而是让子进程启动。我得到的问题是.NET不允许某些用户从正在运行的应用程序运行子进程。让用户使用“以管理员身份运行”运行主应用似乎可以解决此问题。是否有一些UAC特定的权利,我可以通过提示设置一次,以允许主App启动child.exe?

+1

用提升的权限启动父进程?当然,这将启动具有相同权限的所有子进程。 – 2014-09-25 09:31:07

+0

我已经编辑了一下这个问题。我们特别不强制用户以管理员身份运行。为什么我在问题中添加了最后一位,我们的用户至少可以访问sql服务器并执行查询,所以这实际上是我需要的所有权利。所以我认为我的问题可能会更强迫父应用程序能够启动子进程。 – DeVil 2014-09-25 09:41:29

回答

9

您可以编写自己的进程(C#应用程序),该进程将由具有提升权限的主应用程序启动。

比起来,无论何时您需要使用提升的权限启动进程,您都可以通过使用某种进程间通信(NamedPipes,TcpClient等)将此请求转发给您的提升进程,并且将像往常一样启动此进程,导致升高的过程,因为它是从高架起步的。

+0

+1。这里的问题是,对于不同价格的子树,海拔反复发生。这种方法确保有一个提升的子树可用于等待命令。 – TomTom 2014-09-25 12:07:20

+2

+1,或者我们甚至可能安装一个具有所需特权的Windows服务,让它为我们的任务生成子项,然后根本没有UAC弹出窗口(服务安装期间或手动启动期间除外)。 – user3473830 2014-10-01 22:27:38

0

首先,微软发布了关于处理UAC的指导方针。显示烦人用户提示的背后原理是,微软希望开发人员能够从头开始创建具有最小权限的应用程序。我不认为有一些神奇的参数可以用一个用户提示来分叉几个提升的子进程。

与提升您的主应用程序的解决方案相比,您可以创建一个服务器/服务应用程序并将所有管理任务移入其中。该应用程序将在后台运行而无需UI。它只会显示一次UAC提示。您可以设置具有特定池大小的线程池来有效地处理任务。当您创建任何子进程时,子进程可以在本地和无提示运行非管理任务。要执行管理任务,它将使用任何IPC技术与服务器/服务应用程序进行通信。

我希望我的建议可以帮助你。当然,解决方案需要额外的编码工作。如果您认为这种方法适合您,我可以分享更多的线索。