Vista UAC, Access Elevation и .Net

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

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


person JoelHess    schedule 17.09.2008    source источник


Ответы (6)


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

person Joel Coehoorn    schedule 17.09.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);
}
person Andrei Belogortseff    schedule 18.09.2008

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

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

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

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

person uzbones    schedule 17.09.2008
comment
Это действительно замечательная статья. Есть ли у кого-нибудь ссылки на то, как реализовать это в коде .Net (C # или VB.Net)? - person cjbarth; 27.09.2011

Нашел хорошую статью об этом здесь:

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

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

person Bryant    schedule 17.09.2008
comment
Указанная ссылка больше не работает. Так вы знаете еще об одном? - person cjbarth; 27.09.2011

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

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

person Adrian Clark    schedule 22.09.2008
comment
Вот ссылка на образец, упомянутый выше: http://msdn.microsoft.com/en-us/library/aa970890(v=vs.90).aspx - person cjbarth; 27.09.2011

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

person Community    schedule 08.01.2009