Vista UAC,Access Elevation和.Net

时间:2008-09-17 00:38:23

标签: .net uac elevation

我试图找出是否有任何方法来提升应用程序中的特定功能。例如,我有一个应用程序,其中包含存储在注册表中的系统和用户设置,我只需要在需要更改系统设置时进行提升。

不幸的是,我遇到的所有信息都只涉及启动具有提升权限的新进程。

6 个答案:

答案 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机制来与升级的子进程进行通信。