Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

Однако если вы можете реализовать свою функцию как 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);
}

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

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

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

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

Найти хорошая статья, которая описывает это здесь:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top