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


推荐阅读

    linux关闭系统的命令?

    linux关闭系统的命令?,系统,工作,命令,时间,用户,指令,通知,目的,终端,表示,

    linux系统nl命令?

    linux系统nl命令?,系统,工作,命令,信息,文件,标准,工具,单位,公式,内容,nl是

    linux命令修复系统?

    linux命令修复系统?,系统,地址,时间,工作,数据,一致,第一,工具,流程,命令,当L

    linux更新系统的命令?

    linux更新系统的命令?,系统,工作,单位,管理,信息,命令,地址,基础,数据,工具,l

    linux系统开发命令?

    linux系统开发命令?,工作,系统,地址,信息,命令,目录,数据,管理,单位,功能,Win

    linux系统命令awk?

    linux系统命令awk?,数据,系统,工具,基础,标准,名称,单位,命令,文本,语法,Linu

    linux命令行退出系统?

    linux命令行退出系统?,系统,工作,时间,地址,信息,命令,软件,工具,发行,电脑,

    linux系统命令vim?

    linux系统命令vim?,系统,工作,发行,模式,连续,工具,官方网站,状态,环境,时间

    linux系统常用命令表?

    linux系统常用命令表?,系统,基础,工作,工具,管理,网络,命令,数据,标准,地址,l

    linux系统命令无效?

    linux系统命令无效?,系统,密码,数据,工具,网络,信息,软件,情况,在线,时报,lin

    linux系统解压缩命令?

    linux系统解压缩命令?,系统,工具,管理,文件,命令,名称,电脑,格式,文件名,目

    linux系统用户命令?

    linux系统用户命令?,系统,工作,地址,信息,管理,命令,目录,时间,电脑,名称,请

    linux系统清缓存命令?

    linux系统清缓存命令?,数据,系统,地址,服务,网络,电脑,缓存,工具,环境,设备,l

    linux系统中vi命令?

    linux系统中vi命令?,位置,状态,档案,系统,首开,工作,数据,环境,数字,正规,lin

    linux系统负载命令?

    linux系统负载命令?,系统,情况,信息,电脑,工具,管理,状态,时间,命令,灵活,Lin

    linux系统初始化命令?

    linux系统初始化命令?,系统,基础,工作,服务,信息,命令,软件,网络,密码,发行,l

    linux系统查版本命令?

    linux系统查版本命令?,系统,信息,名称,状态,设备,命令,软件,工具,版本,终端,l

    强大系统linux命令?

    强大系统linux命令?,系统,工作,地址,信息,命令,管理,名称,位置,目录,控制台,l

    退出linux系统命令?

    退出linux系统命令?,系统,状态,工作,档案,命令,电脑,工具,基础,信息,时间,lin

    linux系统cmp命令?

    linux系统cmp命令?,系统,工作,标准,信息,命令,一致,目录,指令,功能,文件,请问