我试图找出是否有任何方法来提升应用程序中的特定功能.例如,我有一个应用程序,其中包含存储在注册表中的系统和用户设置,我只需要在需要更改系统设置时进行提升.
不幸的是,我遇到的所有信息都只涉及启动具有提升权限的新进程.
由于高程级别是每进程属性,因此无法仅提升单个进程的一个函数或任何其他部分.就像怀孕一样,您的过程可以升高与否.如果您需要部分代码运行提升,则必须启动一个单独的进程.
但是,如果您可以将您的函数实现为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
它解释了当现有的微软应用程序提出UAC提示时,幕后工作的细节,以及一些如何自己动手,或者至少你会知道你的反对是什么让它起作用. ..
(注意他展示的例子是托管的c ++)