7

Вопрос по uac, windows, scheduled-tasks, c# – Выборочное отключение контроля учетных записей для определенных программ в Windows программно

В стеке и на других форумах публикуются десятки постов с вопросами / ответами об отключении / обходе / подавлении UAC. Есть и решения. Но, по-видимому, программно нет. Я мог видеть только одно решениеОтключение UAC программно но, возможно, там не дано реального программного решения.

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

я нашелВот Это окно предоставляет эту возможность в планировщике заданий через графический интерфейс, так что это должно быть возможно и через код.

Обновление: я подготовил чистое программное решение, которое работает. Смотри мой ответ.

<span>Почему можноты протестируешь против этого? Зачем вам нужно отключить UAC?</span>

Mar 03, 2013, 10:49 PMотGreg

<span>спорить в интернете - все равно что играть в шахматы с голубем. Вы можете выиграть, но пиджин все еще будет расхаживать по всей доске, чувствуя себя победителем</span>

Mar 03, 2013, 10:06 PMотJakob Bowyer

<span>Этот вопрос имеет -4, этот другой<a href="http://stackoverflow.com/questions/682182/disabling-uac-programmatically?lq=1">stackoverflow.com/questions/682182/...</a> имеет 10. Оба вопроса касаются отключения UAC; у одного из них есть реальные ответы, а у другого есть мнения. Это&#39;грустно<a href="http://stackoverflow.com/faq#etiquette">stackoverflow.com/faq#etiquette</a></span>

May 24, 2013, 1:27 PMотdaniloquio

<span>Зачем вам нужно это делать, и нет способа решить вашу проблему, чтобы вы нене нужен обход UAC? Можете ли вы вместо этого запустить свою задачу в процессе обслуживания?</span>

Mar 03, 2013, 10:11 PMотMeirion Hughes

3ответа

12

Краткое описание: Создайте новое консольное / оконное приложение для запуска любого приложения в обход UAC, выбрав путь к целевому приложению в этом приложении, как описано ниже, скомпилируйте эту программу один раз и выполняйте в любое время

Шаг за шагом

  1. Загрузите файл Microsoft.Win32.TaskScheduler.dll изЭта ссылка на Codeplex
  2. Создайте приложение на c # (Windows или Console) и добавьте ссылку на вышеупомянутую dll
  3. Добавить новый элемент (файл манифеста приложения) в ваш проект (это приложение)
  4. + Изменить в
  5. Запишите следующий код в ваш файл program.cs

using System;
using Microsoft.Win32.TaskScheduler;
class Program
{
   static void Main(string[] args)
   {
      TaskService ts = new TaskService();          
      TaskDefinition td = ts.NewTask();
      td.Principal.RunLevel = TaskRunLevel.Highest;
      //td.Triggers.AddNew(TaskTriggerType.Logon);          
      td.Triggers.AddNew(TaskTriggerType.Once);    // 
      string program_path = @"c:\wamp\wampmanager.exe"; // you can have it dynamic
//even of user choice giving an interface in win-form or wpf application

      td.Actions.Add(new ExecAction(program_path, null));
      ts.RootFolder.RegisterTaskDefinition("anyNamefortask", td);          
   }
}

6. Теперь скомпилируйте и запустите ваше приложение (это приложение).


Теперь ваше приложение (например, WAMP) будет работать без запроса какого-либо диалогового окна UAC по вашему желаемому расписанию (каждый раз, когда вы входите в Windows в моем случае)

источники

Инициировано из:Можете ли вы отключить UAC для одного приложения? а такжеВыборочное отключение UAC для определенных программ в Windows 7

Основная идея от:Заставить Vista запускать программы с ограниченным доступом UAC при запуске с помощью Task Scheduler

Базовая реализация отСоздание запланированных задач

2

Правильная методология неэто должно игнорировать Контроль доступа пользователя (UAC), а скорее тестировать в пределах этих параметров. Таким образом, вы нене нарушайте безопасность, вы вместо этого работаете в нейс ограничениями.

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

Это означает, что ваше приложение может стать жертвой в какой-то момент.

Подход, который я бы выбрал, это тестирование в UAC. Убедитесь, что существуют соответствующие разрешения для выполнения вашей задачи, таким образом, это не 't постоянно работает с повышенными правами. Примером может быть:

class Elevated_Rights
{
    // Token Bool:
    private bool _level = false;

    #region Constructor:
    protected Elevated_Rights()
    {
           // Invoke Method On Creation:
           Elevate();
     }
     #endregion
     public void Elevate()
     {
           // Get Identity:
           WindowsIdentity user = WindowsIdentity.GetCurrent();

           // Set Principal
           WindowsPrincipal role = new WindowsPrincipal(user);

           #region Test Operating System for UAC:
           if (Environment.OSVersion.Platform != PlatformID.Win32NT ||            Environment.OSVersion.Version.Major < 6)
            {
                 // False:
                 _level = false;
             }
             #endregion
             else
             {
                    #region Test Identity Not Null:
                    if (user == null)
                    {
                        // False:
                        _level = false;
                    }
                    #endregion
                    else
                    {
                        #region Ensure Security Role:
                        if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
                        {
                            // False:
                            _level = false;
                        }
                        else
                        {
                            // True:
                            _level = true;
                        }
                        #endregion
             } 
      }
} 

Что-то в этом духе позволит вам проверить UAC, а затем выполнить задачу. Я'Я не совсем уверен, почему вы хотели бы отключить UAC, но это мой подход.

Надеюсь, это поможет.

0

Если вы хотите обойти защиту, которую вы получаете, работая от имени обычного пользователя, то лучшим решением будет изменение разрешений для папки и раздела реестра, чтобы все пользователи могли изменять ваше приложение ».с папкой.

GrantAllUsersFullControlToFileOrFolder("C:\Program Files\Grobtastic");

с реализацией псевдокода:

void  GrantAllUsersFullControlToFileOrFolder(String path)
{
    PACL oldDACL;
    PACL newDACL;    
    PSECURITY_DESCRIPTOR sd;

    //Get the current DALC (Discretionary Access Control List) and Security Descriptor
    GetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, 
          nil, nil, ref oldDACL, nil, ref sd);

    //Create an SID for the "Users" group
    PSID usersSid = StringToSid("S-1-5-32-545");

    // Initialize an EXPLICIT_ACCESS structure for the new Access Control Entry (ACE)
    EXPLICIT_ACCESS ea;
    ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));
    ea.grfAccessPermissions  = GENERIC_ALL;
    ea.grfAccessMode         = GRANT_ACCESS;
    ea.grfInheritance        = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
    ea.Trustee.TrusteeForm   = TRUSTEE_IS_SID;
    ea.Trustee.TrusteeType   = TRUSTEE_IS_GROUP;
    ea.Trustee.ptstrName     = PChar(usersSID);

    // Create a new ACL that merges the new ACE into the existing ACL.
    // SetEntriesInAcl takes care of adding the ACE in the correct order in the list
    SetEntriesInAcl(1, @ea, oldDACL, ref newDACL); //use LocalFree to free returned newDACL

    //Attach the new ACL as the object's new DACL
    SetNamedSecurityInfo(path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
          nil, nil, newDACL, nil);

    LocalFree(HLOCAL(sd));
    LocalFree(HLOCAL(newDACL));
    FreeSid(usersSID);
}

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

Затем вы указываете свой исполняемый файл для запускаasInvoker, так как вам не нужны административные разрешения.


Спроси себя:

Что бы я сделал на Windows XP?

Что бы я сделал на Windows 7 с отключенным UAC?

Если они'Вы обычный пользователь, ваша программа не работает?

RelatedQuestions