15

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

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

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

但是 VS 无法编译项目:

错误 35 ClickOnce 不支持请求执行级别“requireAdministrator”。

我认为不可能一次使用它们。不是吗?我需要更改系统时间,我可以在应用程序级别进行吗?我可以模仿它,所以应用程序。可以做我想做的。我改变时间+2小时然后放回一秒钟。我有几个 dll,他们要求时间。

4

6 回答 6

29

实际上,您无法使用管理员权限运行 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 工具也将以管理员权限运行。

于 2013-10-04T12:18:26.060 回答
8

时间是一个系统范围的东西,你不能仅仅为了你的过程而改变它。对依赖项撒谎的唯一方法是挂钩 API,使用 Detours 或类似的东西。如果您是低级用户帐户,则不允许。

修改时间需要“更改系统时间”和/或“更改时区”权限(通常授予管理员帐户)。

正如@Chris 所提到的,admin 和 ClickOnce 不兼容。

于 2011-04-27T04:13:27.843 回答
6

正确 - ClickOnce 不能以管理员权限操作。事实上,它的设计初衷并非如此。

于 2011-04-27T03:18:07.840 回答
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 :-)");
        }
    }
于 2016-10-13T09:37:51.953 回答
3

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

于 2013-12-06T12:31:06.843 回答
1

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

于 2020-01-30T23:08:48.070 回答