Vista UAC, повышение уровня доступа и .Net
Вопрос
Я пытаюсь выяснить, есть ли способ повысить определенную функцию в приложении.Например, у меня есть приложение с системными и пользовательскими настройками, которые хранятся в реестре. Повышение прав мне нужно только в том случае, если необходимо изменить системные настройки.
К сожалению, вся информация, с которой я столкнулся, говорит о запуске нового процесса только с повышенными привилегиями.
Решение
Что вам действительно нужно сделать, так это сохранить настройки в папке 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 для взаимодействия с дочерним процессом с повышенными правами.