2016-04-24 18 views
-2

У меня есть exe, созданный с помощью старого компилятора Borland C++. Для правильной работы необходимы права администратора. Поскольку приложение запускается при запуске, я не хочу, чтобы пользователь запросил, нормально ли запускать программу (тестирование на Win7). Мой вопрос в том, есть ли ЛЮБОЙ способ удалить это раздражающее приглашение каждый раз, когда приложение запускается?Windows UAC Security с Exe

Я добавил файл манифеста с правами администратора и подписал его, но он все равно появляется с именем издателя.

Это будет распространено, поэтому я не хочу, чтобы пользователям приходилось отключать UAC или делать что-то слишком сложное. Любые предложения очень ценятся.

Я надеюсь, что для UAC есть что-то вроде «Всегда доверяйте этой программе» или что-то в этом роде.

+0

Это победит всю цель ОАК. –

+0

Нет, я надеялся, что для UAC есть что-то вроде «Всегда доверяй этой программе» или что-то в этом роде. Удалите -1. – kizeloo

+0

Это не мой -1, но я буду бросать +1 туда, чтобы это было –

ответ

1

Ответ будет выполнен с помощью запланированной задачи для запуска при входе в систему. Запланированные задачи запускаются службой планировщика задач, которая работает с привилегиями SYSTEM, и поэтому их можно запускать с повышенными привилегиями без запроса пользователя при запуске. Вы все равно должны получать подтверждение пользователя один раз - когда вы настраиваете запланированную задачу, но не каждый раз, когда программа запускается.

Поскольку я не знаю, как вы устанавливаете свою программу (какой установщик вы используете, если есть), я опишу вам способ, которым вы, вероятно, можете реализовать в любой среде: с помощью schtasks.exe и XML-файла , (Обратите внимание, что это не будет работать с Windows XP и старше, но вам не придется беспокоиться о UAC в любом случае.)

Вам нужно создать файл XML, как это:

<?xml version="1.0" ?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
     <Date>2013-11-01T00:00:00.0000000</Date> 
     <Author>USERDOMAIN\USERNAME</Author> 
    </RegistrationInfo> 
    <Triggers> 
     <LogonTrigger> 
      <Enabled>true</Enabled> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
     </LogonTrigger> 
    </Triggers> 
    <Principals> 
     <Principal id="Author"> 
      <RunLevel>HighestAvailable</RunLevel> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
      <LogonType>InteractiveToken</LogonType> 
     </Principal> 
    </Principals> 
    <Settings> 
     <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
     <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
     <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
     <AllowHardTerminate>false</AllowHardTerminate> 
     <StartWhenAvailable>false</StartWhenAvailable> 
     <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
     <IdleSettings> 
      <StopOnIdleEnd>false</StopOnIdleEnd> 
      <RestartOnIdle>false</RestartOnIdle> 
     </IdleSettings> 
     <AllowStartOnDemand>true</AllowStartOnDemand> 
     <Enabled>true</Enabled> 
     <Hidden>false</Hidden> 
     <RunOnlyIfIdle>false</RunOnlyIfIdle> 
     <WakeToRun>false</WakeToRun> 
     <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> 
     <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
     <Exec> 
      <Command>c:\path\to\your\app.exe</Command> 
      <Arguments>/your /parameters</Arguments> 
     </Exec> 
    </Actions> 
</Task> 
  • Замените все USERDOMAIN\USERNAME здесь с указанием фактического имени пользователя и имени. Вы можете, например, прочитать данные из соответствующих переменных окружения USERDOMAIN и USERNAME.
  • Замените c:\path\to\your\app.exe на путь вашего приложения и /your /parameters с аргументами, которые вы хотите передать в свое приложение, если они есть.
  • Тайная магия здесь находится в <RunLevel>HighestAvailable</RunLevel>, которая заставит планировщик задач запустит ваше приложение.
  • Date не имеет значения, но для полноты вы можете установить его на текущую дату и время.

После создания файла XML и сохранить его где-нибудь (например, временную папку), вы должны выполнить эту команду, которая создаст реальную задачу: schtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml" (заменить My App с именем, которое должно появиться в планировщик задач при просмотре).

Вы можете снова удалить задачу, используя schtasks.exe /Delete /TN "My App".

(для чистого C++ решение, вы также могли бы принять this example и добавить недостающие вещи, которые будут задающие имя пользователя и установки флага для использования самых высоких доступных привилегий.)

0

Я пишу это, потому что, хотя CherryDT годов ответ - хороший подход, более продолжительный, в зависимости от контекста, он может быть немного негибким.

Другой вариант (в зависимости от контекста) могут быть реорганизовать на две составляющие:

  1. системная служба, которая работает при запуске и делает все, что нужно доступ администратора
  2. Клиентская программа, которая взаимодействует с службы и не нуждается в доступе администратора.

Это позволяет избежать раздражающего запроса, но это больше работает. Основываясь на вашем описании, неясно, как правильно это сделать, но это может быть по дороге (и для других, кто находит этот билет), поэтому я считаю, что это стоит упомянуть отдельно.