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

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

当用户点击DownloadUpdate.exe时,UAC提示用户inputpipe理员权限。 所以我认为在DownloadUpdate.exe中创build和调用的所有进程都将以pipe理员身份运行。 所以我做了安装调用我下载的文件与下面的代码:

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; 

尝试这个:

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

或者, 去您的应用程序的清单路线 。

这个工程,当我尝试它。 我仔细检查了两个示例程序:

 using System; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Process.Start("ConsoleApplication2.exe"); } } } 

 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(); } } } } 

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

System.UnauthorizedAccessException:访问path“c:\ program files \ test.txt”被拒绝。
//等等

然后向ConsoleApplication1添加一个清单,内容如下:

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

没有炸弹。 和一个文件,我不能轻易删除:)这是与运行Vista和Win7的各种机器上的几个以前的testing一致。 启动的程序inheritance了来自Starter程序的安全令牌。 如果初学者已经获得了pipe理员权限,则启动的程序也具有这些权限。

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

概要:

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

然后在那个文件中改变这样一行:

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

编译并运行!

 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, ""); 

同样适用于ProcessStartInfo :

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

首先你需要包含在你的项目中

 using System.Diagnostics; 

之后,你可以写一个通用的方法,你可以使用不同的.exe文件,你想要使用。 这将如下所示:

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

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

 ExecuteAsAdmin("notepad.exe"); 

这里是一个没有Windows提示的pipe理员运行过程的例子

  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(); 

您可能需要将您的应用程序设置为x64应用程序。

IIS Snap In只能工作在64位,不能在32位工作,从32位应用程序产生的进程似乎工作是一个32位的进程,同样的64位应用程序。

看看: 开始进程为64位

使用这个方法:

 public static int RunProcessAsAdmin(string exeName, string parameters) { try { System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = CurrentDirectory; startInfo.FileName = Path.Combine(CurrentDirectory, exeName); startInfo.Verb = "runas"; //MLHIDE startInfo.Arguments = parameters; startInfo.ErrorDialog = true; Process process = System.Diagnostics.Process.Start(startInfo); process.WaitForExit(); return process.ExitCode; } catch (Win32Exception ex) { WriteLog(ex); switch (ex.NativeErrorCode) { case 1223: return ex.NativeErrorCode; default: return ErrorReturnInteger; } } catch (Exception ex) { WriteLog(ex); return ErrorReturnInteger; } } 

希望能帮助到你。

  Process proc = new Process(); ProcessStartInfo info = new ProcessStartInfo("Your Process name".exe, "Arguments"); info.WindowStyle = ProcessWindowStyle.Hidden; info.UseShellExecute =true; info.Verb ="runas"; proc.StartInfo = info; proc.Start();