我的应用程序并不总是需要"admin"权限,大多数时候都会以当前用户的身份运行。有没有办法,我可以在程序运行后,在运行时抛出一个UAC来升级权限?这只会在我需要隐私的时候发生。而不是从高隐私开始。
我知道"runas"技术、清单文件等,但所有这些都是在创建流程之前,而不是在运行时,按需
恭喜你,这正是UAC的工作原理,大多数应用程序开发人员要么太懒,要么太害怕,根本不敢考虑:)
简而言之,您将需要提升的代码放在一个单独的COM对象(位于DLL中)中,然后使用此处描述的方法创建它的提升实例。
HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
{
BIND_OPTS3 bo;
WCHAR wszCLSID[50];
WCHAR wszMonikerName[300];
StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0]));
HRESULT hr = StringCchPrintf(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),
L"Elevation:Administrator!new:%s", wszCLSID);
if (FAILED(hr))
return hr;
memset(&bo, 0, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
return CoGetObject(wszMonikerName, &bo, riid, ppv);
}
关键字是名字对象名称的Elevation:Administrator!new:
前缀。这将触发提升提示,并使用提升的令牌创建生成的COM对象。