【问题标题】:Run as administrator: requireAdministrator & ClickOnce + emulating system time以管理员身份运行:requireAdministrator & ClickOnce + 模拟系统时间
【发布时间】:2011-08-08 12:01:55
【问题描述】:

我的应用使用 ClickOnce 技术。今天我需要以管理员身份运行它。我从

修改了清单文件
<requestedExecutionLevel  level="asInvoker" uiAccess="false" />

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

然而VS无法编译项目:

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

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

【问题讨论】:

    标签: c# winapi time clickonce administrator


    【解决方案1】:

    实际上,您不能以管理员权限运行 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);
    }
    

    Read full article.

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

    【讨论】:

    • 这是一个很好的解决方法并且有效!但是您无法再读取清单文件,因为您没有使用 .application,您将使用 .exe 本身。
    • 伙计,你用这个让我很开心。虽然一开始我犯了一个错误,没有检查我的应用程序是否以管理员身份运行,所以它只是在循环中一遍又一遍地打开同一个可执行文件。
    • 我试过了,没有提示任何UAC框。然后它遇到了异常。此解决方案是否也适用于控制台应用程序?
    • 工作正常,但有时我在状态栏下方看不到应用程序图标。
    • 这有帮助,但是当我重新启动应用程序时,我的 user.config 文件位置不同。我最终使用SettingsProvider 中的stackoverflow.com/questions/2265271/… 将位置设置为C:\Users\&lt;username&gt;\AppData\Local\&lt;appname&gt;\user.config
    【解决方案2】:

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

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

    正如@Chris 所说,admin 和 ClickOnce 不兼容。

    【讨论】:

    • 那么你将如何安装需要以管理员身份运行的应用程序?
    • 我已经成功运行了一个需要管理员权限的 ClickOnce 应用程序,方法是首先以域管理员用户身份登录,然后运行 ​​clickOnce 应用程序
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
         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 :-)");
              }
          }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-09-24
            • 1970-01-01
            • 1970-01-01
            • 2011-03-14
            • 2012-11-22
            • 2016-09-20
            • 2010-11-26
            • 2012-05-28
            • 2011-03-24
            相关资源
            最近更新 更多