我正在尝试找出是否有任何方法可以提升应用程序中的特定函数。例如,我有一个应用程序,其系统和用户设置存储在注册表中,当系统设置需要更改时,我只需要提升。
不幸的是,我遇到的所有信息都在谈论只启动一个具有提升权限的新进程。
发布于 2008-09-17 00:41:53
您真正需要做的是将您的设置存储在Application Data文件夹中。
发布于 2008-09-18 15:02:58
不可能只提升一个函数或单个流程的任何其他部分,因为提升级别是每个流程的属性。就像怀孕一样,你的过程可以提升也可以不提升。如果您需要部分代码以提升权限运行,则必须启动一个单独的进程。
但是,如果可以将函数实现为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);
}发布于 2008-09-17 00:57:37
我见过的最好的文章是这篇:
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
它解释了当现有的microsoft应用程序打开UAC提示符时幕后发生的事情的本质,以及一些如何自己做这件事,或者至少你会知道你面对的是什么让它工作……
(请注意,他展示的示例是托管c++)
https://stackoverflow.com/questions/78696
复制相似问题