我的应用程序并不总是需要“admin”权限,大多数时间都会以当前用户身份运行.有什么办法,我可以在程序运行后通过在运行时抛出UAC来升级privs吗?这只会在我需要私人时才会发生.而不是从高权限开始.
我知道“runas”技术,清单文件等,但所有这些都是在创建进程之前,而不是在运行时,按需
恭喜,这正是UAC的设计工作原理,而且大多数应用程序开发人员要么太懒,要么太害怕,不要考虑看:)
原文链接:https://www.f2er.com/windows/363362.html简而言之,您将需要提升的代码放在一个单独的COM对象(存在于DLL中)中,然后使用here中描述的方法创建它的提升实例.
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,sizeof(bo)); bo.cbStruct = sizeof(bo); bo.hwnd = hwnd; bo.dwClassContext = CLSCTX_LOCAL_SERVER; return CoGetObject(wszMonikerName,&bo,riid,ppv); }
关键是Elevation:Administrator!new:名字对象的前缀.这会导致触发提升提示,并且将使用提升的令牌创建生成的COM对象.