Запуск от имени администратора: requireAdministrator & ClickOnce + эмуляция системного времени - PullRequest
13 голосов
/ 19 апреля 2011

Мое приложение использует технологию ClickOnce. Сегодня мне нужно было запустить его от имени администратора. Я изменил файл манифеста из

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

до

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

Однако VS не может скомпилировать проект:

Ошибка 35 ClickOnce не поддерживает уровень выполнения запроса 'requireAdministrator'.

Я думаю, что невозможно использовать их сразу. Не так ли? Мне нужно изменить системное время, могу ли я сделать это на уровне приложения? Могу ли я подражать, так приложение. могу делать что хочу Я меняю время на +2 часа, потом откладываю на секунду. У меня есть несколько библиотек, и они просят время.

Ответы [ 5 ]

25 голосов
/ 04 октября 2013

На самом деле вы не можете запустить приложение 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 также будет работать с правами администратора.

7 голосов
/ 27 апреля 2011

Время - это общесистемная вещь, вы не можете изменить его только для своего процесса. Единственный способ обмануть ваши зависимости - это подключить API, используя Detours или что-то подобное. Не допускается, если вы непритязательный пользователь.

Изменение времени требует привилегий «Изменить системное время» и / или «Изменить часовой пояс» (которые обычно предоставляются учетной записи администратора).

И как уже упоминалось @Chris, admin и ClickOnce не совместимы.

5 голосов
/ 27 апреля 2011

Правильно - ClickOnce не может работать с правами администратора. На самом деле, он предназначен не для.

4 голосов
/ 13 октября 2016
   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 :-)");
        }
    }
2 голосов
/ 06 декабря 2013

Если вы запускаете приложение ClickOnce из IE, чтобы иметь административные привилегии, просто запустите IE с административными привилегиями, и ваше приложение также получит его.

...