0

我在这里有点迷路了。

我有一个应用程序,我们称它为 App1。

App1 工作正常。在某些情况下,App1 需要执行另一个程序 App2。

代码很简单:

           /*call app2*/
            ProcessStartInfo startInfo = new ProcessStartInfo(Convert.ToString(ConfigurationManager.AppSettings["pathActualizador"]));

            startInfo.UseShellExecute = false;

            try
            {
                System.Diagnostics.Process.Start(startInfo);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Error en parármetros enviados al Actualizador..", Properties.Resources.txtTituloAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            /*close app1 and letting app2 do its work*/
            Application.ExitThread();

在某些情况下,我对调用 app2 的授权有疑问。App1是一个简单的系统,app2需要创建,移动和删除一些文件和文件夹(这就是为什么给我带来麻烦)至少,我们解决它以管理员身份执行de app2,右键单击->属性->执行作为管理员。

我正在努力解决这个问题。我已经阅读了很多关于在 SO 中创建清单文件的帖子。所以,我创造了一个。我从 Application 项目中添加了新项目 --> 添加新项目 --> app.manifest

并且默认创建,只改变了这个

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

此清单适用于 App1。我们在大约 100 台计算机上都有这两个应用程序,我们不能一个一个地更改它(其中大多数都在另一个国家)但是我们有一个应用程序要修改,发送一些命令抛出 Internet,app1。所以,我读到如果一个进程创建另一个进程,这个新进程将具有与其父进程相同的 ExecutionLevel。因此,在 App1 中添加清单,当它为 App2 创建进程时,应该以管理员身份执行

我是对还是错?

另一方面,我已经添加了清单,编译并将.exe和.manifest发送到客户端,运行,我仍然遇到同样的问题:app2无法访问文件夹来修改它们,返回一个问题特权。

有什么不对 ?我必须为 App2 创建清单吗?这有点困难,也很难为每台机器配置窗口..

我读过我也可以做类似的事情

startInfo.Verb = "runas";

但也读到将来(2008 年说过)这可以被忽略,唯一的方法是使用清单。所以我想避免这个选项

编辑:使用 Visual Studio 2010、.NET 3.5

edit2:我试过“runas”,也没有工作。用户不是管理员,所以没有管理员权限

4

2 回答 2

0

我将建议您不需要管理凭据:

app2 需要创建、移动和删除一些文件和文件夹(这就是给我带来麻烦的原因)

声明中的任何内容都不能证明您需要成为管理员。我建议重新审视你的程序的架构。我要采取的第一步是在您的系统上拥有两个独立的用户。一个用户 forapp1和一个用户 for let 分别app2给他们App1User打电话App2User。现在这两个用户的配置应该如下:

非特权,不能登录,只能执行各自的程序,对任何不直接控制的东西没有权限。

现在从这里App1User可以委托App2User执行app2,这可以防止发生任何特权升级并消除对管理员的需要。现在App2User需要能够创建、移动和删除它拥有的东西。这应该不是问题,作为普通用户,我可以创建、删除和移动我拥有的东西。需要以管理员或 root 身份运行的原因很少。

更新

回复以下内容:

问题是当 App1 需要调用 App2 以便 App2 可以执行某些任务时。App1不需要创建文件夹或任何东西,所以UAC没有问题。App2 确实

好的,从头开始,我们将拥有以下三个系统对象:

AppUser1,AppUser2, AppUserGroup

遗嘱同时AppUserGroup包含AppUser1AppUser2。与应用程序用户类似,需要将AppUserGroup其锁定。需要配置权限的方式如下:

App1由 AppUserGroup 拥有,并且至少具有执行权限。
App2由 AppUserGroup 拥有,并且至少具有执行权限。

确保权限也授予组内的用户。现在,这允许您做的是调用作为AppUser1成员的程序,AppUserGroup并且App2由于在组内并且该组拥有该进程而运行。让我知道这是否需要进一步澄清。

于 2012-10-03T17:32:50.500 回答
0

你试过设置WorkingDirectory,也许你尝试从App1的WorkingDir运行App2

ProcessStartInfo info = new ProcessStartInfo();
info.WorkingDirectory ="SomePath";

编辑:

我在 SO 上找到了一个可以帮助您的条目: How to start a Process as administrator mode in C#

于 2012-10-03T15:15:25.017 回答