我试图找出是否有任何方法可以提升应用程序中的特定功能。 例如,我有一个应用程序,其系统和用户设置存储在注册表中,当系统设置需要更改时,我仅需要提升权限。
不幸的是,我遇到的所有信息都只是关于使用特权提升开始新流程的话题。
仅提升一个功能或单个流程的任何其他部分是不可能的,因为提升级别是每个流程的属性。就像怀孕一样,您的过程可以升高也可以不升高。如果需要部分代码提升运行,则必须启动一个单独的过程。
但是,如果可以将功能实现为COM对象,则可以通过创建提升的COM对象来间接提升其功能,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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 ++)
Windows SDK" Cross Technology Samples"具有一个" UACDemo"应用程序,其中显示了C#Windows Forms应用程序的示例,该示例启动管理员进程来执行需要提升的任务(即写入%programfiles%)。
这是编写自己的功能的一个很好的起点。我已经将此示例扩展为使用.Net Remoting和IPC在我的普通用户进程和提升的进程之间进行调用,这使我可以保留height可执行文件的通用性并在应用程序内实现特定于应用程序的代码。
在这里找到一篇不错的文章涵盖了这一点:
Most applications do not require administrator privileges at run time. If your application doesn't maintain cross-session state while it executes and doesn't do something like modifying the local security policy, it should be just fine running with a standard-user token. Sometimes certain parts of your application will require administrator privileges, and you should separate out those pieces into a separate process. I'll get into that a little later.
看来本文在谈论使用C ++,所以我找到了另一篇文章,该文章介绍了如何使用P / Invoke调用此代码。因此应该可以从.NET执行。
您真正需要做的是将设置存储在Application Data文件夹中。
我认为Aydsman在这里是正确的方向。在.NET 3.5中添加了命名管道支持后,您就拥有了一个不错的IPC机制来与提升的子进程进行通信。