Подтвердить что ты не робот

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

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

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

к

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 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

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