我试图找出是否有任何方法来提升应用程序中的特定功能。例如,我有一个应用程序,其中包含存储在注册表中的系统和用户设置,我只需要在需要更改系统设置时进行提升。
不幸的是,我遇到的所有信息都只涉及启动具有提升权限的新进程。
答案 0 :(得分:11)
不可能只提升单个进程的一个函数或任何其他部分,因为提升级别是每个进程的属性。就像怀孕一样,您的过程可以升高与否。如果您需要部分代码升级,则必须启动一个单独的过程。
但是,如果您可以将您的函数实现为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);
}
答案 1 :(得分:7)
我见过的最好的文章是这个:
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
它解释了当现有微软应用程序提出UAC提示时幕后发生的细节,以及一些如何自己做的事情,或者至少你会知道你的反对意见它工作......
(注意他展示的例子是托管c ++)
答案 2 :(得分:3)
找到nice article that covers this here:
大多数应用程序在运行时不需要管理员权限。如果您的应用程序在执行时不保持跨会话状态,并且不执行修改本地安全策略之类的操作,则应该使用标准用户令牌进行良好运行。有时,应用程序的某些部分需要管理员权限,您应该将这些部分分离到一个单独的进程中。我稍后会谈到这一点。
看起来这篇文章正在谈论使用C ++,所以我发现another article涵盖了如何使用P / Invoke调用此代码。所以应该可以从.NET。
答案 3 :(得分:3)
Windows SDK“跨技术示例”有一个“UACDemo”应用程序,它显示了C#Windows窗体应用程序的示例,该应用程序启动管理员进程以执行需要提升的任务(即写入%programfiles%
)。 / p>
这是编写自己的功能的一个很好的起点。我已经扩展了这个示例,使用.Net Remoting和IPC在我的正常用户进程和我提升的进程之间调用,这使我能够保持高程可执行通用,并在应用程序中实现特定于应用程序的代码。
答案 4 :(得分:2)
您真正需要做的是将您的设置存储在Application Data文件夹中。
答案 5 :(得分:0)
我认为Aydsman在这里走在正确的轨道上。通过为.NET 3.5添加命名管道支持,您可以使用一个不错的IPC机制来与升级的子进程进行通信。