我正在尝试找出是否有一种方法可以提升应用程序中的特定功能。例如,我有一个应用程序,其中系统和用户设置存储在注册表中,只有当需要更改系统设置时才需要提权。
不幸的是,我发现所有的信息都只谈到如何使用提升后的权限启动新进程。
不幸的是,我发现所有的信息都只谈到如何使用提升后的权限启动新进程。
由于提权级别是每个进程的属性,因此不可能仅提高单个功能或任何其他单个过程的任何部分。就像怀孕一样,您的进程可以被提升或不被提升。如果您需要使代码的某些部分运行时提升权限,则必须启动单独的进程。
但是,如果您可以将函数实现为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);
}
%programfiles%
)。你真正需要做的是将设置存储在应用程序数据文件夹中。
我想Aydsman在这里是正确的。随着.NET 3.5对命名管道支持的增加,您拥有了一种不错的IPC机制,可以与升高的子进程进行通信。