31

从不是以管理员身份运行的应用程序,我有以下代码:

ProcessStartInfo proc = new ProcessStartInfo();
proc.WindowStyle = ProcessWindowStyle.Normal;
proc.FileName = myExePath;
proc.CreateNoWindow = false;
proc.UseShellExecute = false;
proc.Verb = "runas";

当我调用 Process.Start(proc) 时,我没有弹出要求以管理员身份运行的权限,并且 exe 也没有以管理员身份运行。

我尝试将 app.manifest 添加到在 myExePath 找到的可执行文件中,并将 requestedExecutionLevel 更新为

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

使用更新的 app.manifest,在 Process.Start(proc) 调用中,我得到一个异常,“请求的操作需要提升。”

为什么 .Verb 操作不设置管理员权限?

我正在 Windows Server 2008 R2 Standard 上进行测试。

4

1 回答 1

55

必须使用ShellExecute. ShellExecute 是唯一知道如何启动Consent.exe以提升的 API。

示例 (.NET) 源代码

在 C# 中,您调用的方式ShellExecute是与Process.Start一起使用UseShellExecute = true

private void button1_Click(object sender, EventArgs e)
{
   //Public domain; no attribution required.
   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   Process.Start(info);
}

如果您想成为一名优秀的开发人员,您可以在用户单击No时进行捕捉:

private void button1_Click(object sender, EventArgs e)
{
   //Public domain; no attribution required.
   const int ERROR_CANCELLED = 1223; //The operation was canceled by the user.

   ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\Notepad.exe");
   info.UseShellExecute = true;
   info.Verb = "runas";
   try
   {
      Process.Start(info);
   }
   catch (Win32Exception ex)
   {
      if (ex.NativeErrorCode == ERROR_CANCELLED)
         MessageBox.Show("Why you no select Yes?");
      else
         throw;
   }
}

奖金观看

  • UAC - 什么。如何。为什么。. UAC的架构,解释CreateProcess不能做提升,只能创建一个进程。ShellExecute是知道如何启动 Consent.exe 的人,而 Consent.exe 是检查组策略选项的人。
于 2014-01-01T19:14:07.793 回答