Vista UAC,访问权限和.Net

Vista UAC,访问权限和.Net

Vista UAC, Access Elevation and .Net

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

不幸的是,我遇到的所有信息都只是关于使用特权提升开始新流程的话题。


仅提升一个功能或单个流程的任何其他部分是不可能的,因为提升级别是每个流程的属性。就像怀孕一样,您的过程可以升高也可以不升高。如果需要部分代码提升运行,则必须启动一个单独的过程。

但是,如果可以将功能实现为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机制来与提升的子进程进行通信。


推荐阅读