Vista UAC, Access Elevation и .Net - PullRequest
       26

Vista UAC, Access Elevation и .Net

5 голосов
/ 17 сентября 2008

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

К сожалению, вся информация, с которой я столкнулся, говорит только о запуске нового процесса с повышенными привилегиями.

Ответы [ 6 ]

11 голосов
/ 18 сентября 2008

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

Однако, если вы можете реализовать свою функцию как COM-объект, вы можете запустить ее с повышенными правами косвенно, создав COM-объект с повышенными правами, например:

HRESULT 
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
    WCHAR monikerName[1024];
    WCHAR clsid[1024];
    BIND_OPTS3 bo;

    StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);

    swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);

    memset (&bo, 0, sizeof (bo));
    bo.cbStruct = sizeof (bo);
    bo.hwnd = hwnd;
    bo.dwClassContext = CLSCTX_LOCAL_SERVER;

    // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
    MSG paintMsg;
    int MsgCounter = 5000;  // Avoid endless processing of paint messages
    while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
    {
        DispatchMessage (&paintMsg);
    }

    return CoGetObject (monikerName, &bo, iid, ppv);
}
7 голосов
/ 17 сентября 2008

Лучшая статья, которую я видел, это:

http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

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

(обратите внимание, что примеры, которые он показывает, управляются c ++)

3 голосов
/ 22 сентября 2008

Windows Cross SDK «Примеры технологий» содержит приложение «UACDemo», в котором показаны примеры приложения C # Windows Forms, которое запускает процесс администратора для выполнения задачи, требующей повышения прав (т.е. запись в %programfiles%).

Это отличная отправная точка для написания ваших собственных функций. Я расширил этот пример, чтобы использовать .Net Remoting и IPC для вызова между моим обычным пользовательским процессом и моим процессом с повышенными правами, что позволяет мне сохранять универсальный исполняемый файл повышения прав и реализовывать специфичный для приложения код в приложении.

3 голосов
/ 17 сентября 2008

Найдена хорошая статья, которая освещает это здесь :

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

Похоже, в статье говорится об использовании C ++, поэтому я нашел еще одну статью , которая описывает, как вызывать этот код с помощью P / Invoke. Так должно быть выполнимо из .NET.

2 голосов
/ 17 сентября 2008

Что вам действительно нужно сделать, это сохранить ваши настройки в папке Application Data.

0 голосов
/ 08 января 2009

Я думаю, что Aydsman находится на правильном пути здесь. С добавлением поддержки именованных каналов в .NET 3.5 у вас есть достойный механизм IPC для связи с дочерним процессом с повышенными правами.

...