以管理员身份运行:requireAdministrator和ClickOnce + 模拟系统时间

15

我的应用程序使用ClickOnce技术。今天我需要以管理员身份运行它。我修改了清单文件,从

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

然而,VS无法编译该项目:

Error 35:ClickOnce不支持请求执行级别“requireAdministrator”。

我认为同时使用它们是不可能的。不是吗?我需要改变系统时间,在应用程序级别可以做到吗?我能够模拟它吗,以便应用程序可以按照我的意愿执行操作。我将时间往前调整2个小时,然后再调回来。我有一些dll文件,它们需要时间。

6个回答

30

实际上,您无法以管理员权限运行ClickOnce应用程序,但有一个小技巧,您可以使用管理员权限启动新进程。 在App_Startup中:

if (!IsRunAsAdministrator())
{
  var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

  // The following properties run the new process as administrator
  processInfo.UseShellExecute = true;
  processInfo.Verb = "runas";

  // Start the new process
  try
  {
    Process.Start(processInfo);
  }
  catch (Exception)
  {
    // The user did not allow the application to run as administrator
    MessageBox.Show("Sorry, this application must be run as Administrator.");
  }

  // Shut down the current process
  Application.Current.Shutdown();
}

private bool IsRunAsAdministrator()
{
  var wi = WindowsIdentity.GetCurrent();
  var wp = new WindowsPrincipal(wi);

  return wp.IsInRole(WindowsBuiltInRole.Administrator);
}

但如果你想要更本地化和更简单的解决方案,只需要求用户以管理员身份运行Internet Explorer,ClickOnce工具也将在管理员权限下运行。

阅读全文。


1
这是个好的解决方法,并且有效!但是你将无法读取清单文件,因为你不再使用 .application 文件,而是要使用 .exe 文件本身。 - Ricardo França
哥们,你的这个东西真是让我受宠若惊。虽然起初我犯了一个错误,没有检查我的应用程序是否以管理员身份运行,所以它一直在循环中打开同一个可执行文件。 - Blacky Wolf
我尝试了一下,它没有提示任何UAC框,但是遇到了异常。这个解决方案对控制台应用程序也适用吗? - Frank Q.
运行正常,但有时在状态栏下方看不到应用程序图标。 - Pabitra Dash
这对我有所帮助,但是当我重新启动应用程序时,我的user.config文件位置不同了。最终,我使用了一个SettingsProvider,就像https://dev59.com/03E95IYBdhLWcg3wi-ee中的那个一样,将位置设置为`C:\Users\<username>\AppData\Local<appname>\user.config`。 - Rachel Martin

8

时间是系统级的东西,你不能仅仅为了你的进程而改变它。唯一的方法是使用Detours或类似的工具钩取API来欺骗你的依赖项。如果你只是一个普通用户账户,这是不允许的。

修改时间需要"更改系统时间"和/或"更改时区"权限(管理员账户通常会被授予)。

正如@Chris所提到的,管理员和ClickOnce不兼容。


那么,如果需要以管理员身份运行的应用程序,您该如何安装? - Igor
1
我已经成功地运行了一个需要管理员权限的ClickOnce应用程序,方法是首先以域管理员用户身份登录,然后运行ClickOnce应用程序。 - JoelFan

6

正确 - ClickOnce不能以管理员权限运行。事实上,它是设计成不支持此功能的。


5
   private void Form1_Load(object sender, EventArgs e)
    {
        if (WindowsIdentity.GetCurrent().Owner == WindowsIdentity.GetCurrent().User)   // Check for Admin privileges   
        {
            try
            {
                this.Visible = false;
                ProcessStartInfo info = new ProcessStartInfo(Application.ExecutablePath); // my own .exe
                info.UseShellExecute = true;
                info.Verb = "runas";   // invoke UAC prompt
                Process.Start(info);
            }
            catch (Win32Exception ex)
            {
                if (ex.NativeErrorCode == 1223) //The operation was canceled by the user.
                {
                    MessageBox.Show("Why did you not selected Yes?");
                    Application.Exit();
                }
                else
                    throw new Exception("Something went wrong :-(");
            }
            Application.Exit();
        }
        else
        {
            //    MessageBox.Show("I have admin privileges :-)");
        }
    }

3
如果你从IE启动ClickOnce应用程序,想要管理员权限,只需以管理员权限运行IE,你的应用程序也将拥有管理员权限。

1
我的应用程序访问注册表,因此需要管理员权限,因此我的项目属性/安全选项卡设置为完全权限。我将ClickOnce应用程序部署到网络驱动器上。我只能以管理员身份运行ClickOnce的"setup.exe"来安装我的应用程序。但是,在安装后我无法以管理员身份运行我的应用程序。我无法以管理员身份运行我的应用程序,但我可以返回到setup.exe并再次以管理员身份运行,这将运行我的应用程序,因为它已经安装完成。通过Win 10兼容性向导设置我的应用程序始终以提升的权限运行无效。我不喜欢告诉我的用户他们必须始终右键单击并作为管理员从网络驱动器运行setup.exe。最终,我不会“部署”ClickOnce应用程序。我只是构建到网络驱动器,我的用户运行我的应用程序exe。然后,他们可以使用兼容性向导始终以管理员身份执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接