如何在C#中以管理员模式启动进程

RPS*_*RPS 84 .net c#

我有一个Visual Studio Windows应用程序项目.我添加了代码来下载安装程序更新文件.完成下载后的安装程序需要管理员权限才能运行.我添加了一个清单文件.

当用户单击DownloadUpdate.exe时,UAC会提示用户输入管理员权限.所以我假设在DownloadUpdate.exe中创建和调用的所有进程都将以管理员身份运行.所以我使用以下代码调用我的下载文件:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = strFile;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 81

试试这个:

//Vista or higher check
if (System.Environment.OSVersion.Version.Major >= 6)
{
   p.StartInfo.Verb = "runas";
}
Run Code Online (Sandbox Code Playgroud)

或者,转到您的应用程序的清单路线.

  • 请注意,如果没有“p.StartInfo.UseShellExecute = true;”,这个答案可能不起作用。 (3认同)

drg*_*mak 27

首先,您需要包含在您的项目中

using System.Diagnostics;
Run Code Online (Sandbox Code Playgroud)

之后,您可以编写一个通用方法,您可以将其用于要使用的不同.exe文件.它将如下所示:

public void ExecuteAsAdmin(string fileName)
{
    Process proc = new Process();
    proc.StartInfo.FileName = fileName;
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.Verb = "runas";
    proc.Start();
}
Run Code Online (Sandbox Code Playgroud)

如果你想执行notepad.exe,那么你所做的就是调用这个方法:

ExecuteAsAdmin("notepad.exe");
Run Code Online (Sandbox Code Playgroud)


MSa*_*adi 21

这是对您的问题的明确答案: 如何强制我的.NET应用程序以管理员身份运行?

摘要:

右键单击项目 - >添加新项 - >应用程序清单文件

然后在该文件中更改如下所示的行:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

编译并运行!

  • 如您所见,该行包含在@Hans Passant的答案中。但是,每次程序启动另一个程序时,只有该行会打开UAC的窗口吗? (2认同)

Dar*_*rov 18

var pass = new SecureString();
pass.AppendChar('s');
pass.AppendChar('e');
pass.AppendChar('c');
pass.AppendChar('r');
pass.AppendChar('e');
pass.AppendChar('t');
Process.Start("notepad", "admin", pass, "");
Run Code Online (Sandbox Code Playgroud)

也适用于ProcessStartInfo:

var psi = new ProcessStartInfo
{
    FileName = "notepad",
    UserName = "admin",
    Domain = "",
    Password = pass,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};
Process.Start(psi);
Run Code Online (Sandbox Code Playgroud)

  • Cauz这是一个秘密 (18认同)
  • @Jet没有,因为它需要一个securestring而不是一个字符串,那些永远不会在内存中作为1个未加密的块提供 (7认同)
  • @MarkRichman失败了使用`SecureString`的目的. - 你应该从某个地方一次一个地读取它们(即键盘或加密的源等). - 如果你有一个包含数据的实际`字符串`,那么它就不安全了. (5认同)
  • 好的,但为什么要使用AppendChar?你不能写`pass ="secret"`? (4认同)

Han*_*ant 18

这在我尝试时有效.我用两个示例程序仔细检查:

using System;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      Process.Start("ConsoleApplication2.exe");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
using System;
using System.IO;

namespace ConsoleApplication2 {
  class Program {
    static void Main(string[] args) {
      try {
        File.WriteAllText(@"c:\program files\test.txt", "hello world");
      }
      catch (Exception ex) {
        Console.WriteLine(ex.ToString());
        Console.ReadLine();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

首先证实我得到了UAC炸弹:

System.UnauthorizedAccessException:拒绝访问路径'c:\ program files\test.txt'.
//等..

然后使用以下短语向ConsoleApplication1添加了清单:

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

没有炸弹.而且我无法轻易删除文件:)这与运行Vista和Win7的各种机器上的几个先前测试一致.启动的程序从启动程序继承安全令牌.如果启动器已获得管理员权限,则启动的程序也具有管理员权限.


小智 6

以下是没有Windows Prompt的管理员运行过程的示例

  Process p = new Process();
  p.StartInfo.FileName = Server.MapPath("process.exe");
  p.StartInfo.Arguments = "";
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.CreateNoWindow = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.Verb = "runas";
  p.Start();
  p.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

  • 这不会以管理员身份运行。如果添加清单并请求提升的权限,它将仍然无法使用。 (3认同)