Vista UAC,访问权限和.Net
我试图找出是否有任何方法可以提升应用程序中的特定功能。例如,我有一个应用程序,其系统和用户设置存储在注册表中,当系统设置需要更改时,我仅需要提升权限。
不幸的是,我遇到的所有信息都只是关于使用特权提升开始新流程的话题。
解决方案
回答
我们真正需要做的是将设置存储在Application Data文件夹中。
回答
在这里找到一篇不错的文章,涵盖了这一点:
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执行。
回答
我看过的最好的文章是:
http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx
它解释了当现有的Microsoft应用程序显示UAC提示时幕后发生的事情的本质,以及一些如何自己执行的操作,或者至少我们会知道要做什么才能使它工作。 ..
(请注意,他显示的示例是托管c ++)
回答
仅提升一个功能或者单个流程的任何其他部分是不可能的,因为提升级别是每个流程的属性。就像怀孕一样,过程可以升高也可以不升高。如果我们需要部分代码提升运行,则必须启动一个单独的过程。
但是,如果可以将功能实现为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); }
回答
Windows SDK的" Cross Technology Samples"具有一个" UACDemo"应用程序,其中显示了一个CWindows Forms应用程序的示例,该应用程序启动一个管理员进程来执行需要提升的任务(即,写入"%programfiles%")。
这是编写自己的功能的一个很好的起点。我已经将此示例扩展为使用.Net Remoting和IPC在我的普通用户进程和提升的进程之间进行调用,这使我可以保留height可执行文件的通用性并在应用程序内实现特定于应用程序的代码。
回答
我认为Aydsman在这里是正确的方向。通过对.NET 3.5添加命名管道支持,我们可以使用一种不错的IPC机制与提升的子进程进行通信。