Vista用户账户控制(UAC)、访问提升和.Net

5
我正在尝试找出是否有一种方法可以提升应用程序中的特定功能。例如,我有一个应用程序,其中系统和用户设置存储在注册表中,只有当需要更改系统设置时才需要提权。
不幸的是,我发现所有的信息都只谈到如何使用提升后的权限启动新进程。
6个回答

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);
}

7
我看过的最好的文章是这篇:
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
它详细解释了微软应用程序在启动用户账户控制(UAC)提示时背后发生的情况,以及一些如何自己实现的方法,或者至少你会知道要面对什么才能使其正常工作...
(请注意,他展示的示例是托管c++)

这真是一篇精彩的文章。有没有人有关于如何在.Net代码(C#或VB.Net)中实现它的参考资料? - cjbarth

3
Windows SDK中的“跨技术示例”有一个名为“UACDemo”的应用程序,展示了一个C# Windows Forms应用程序的示例,该应用程序启动管理员进程以执行需要提升权限的任务(即写入%programfiles%)。
这是编写自己功能的绝佳起点。我扩展了此示例,使用.Net Remoting和IPC在我的普通用户进程和我的提升进程之间进行调用,从而使我可以保持提升可执行文件的通用性,并在应用程序中实现特定于应用程序的代码。

1
这是上面提到的示例链接:http://msdn.microsoft.com/en-us/library/aa970890(v=vs.90).aspx - cjbarth

3
发现了一篇很好的文章,在这里,涵盖了这个问题:
大多数应用程序在运行时不需要管理员权限。如果您的应用程序在执行时不维护跨会话状态并且不执行诸如修改本地安全策略之类的操作,则在标准用户令牌下运行就可以了。有时,应用程序的某些部分将需要管理员权限,您应该将这些部分分离到单独的进程中。稍后我会详细介绍。
看起来这篇文章谈到了使用C++,所以我找到了另一篇文章,介绍了如何使用P/Invoke调用此代码。因此,从.NET应该是可行的。

参考链接已失效。你知道其他的链接吗? - cjbarth

2

你真正需要做的是将设置存储在应用程序数据文件夹中。


0

我想Aydsman在这里是正确的。随着.NET 3.5对命名管道支持的增加,您拥有了一种不错的IPC机制,可以与升高的子进程进行通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接