加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

运行时升级权限(Windows API C/C++)

发布时间:2020-12-14 01:48:56 所属栏目:Windows 来源:网络整理
导读:我的应用程序并不总是需要“admin”权限,大多数时间都会以当前用户身份运行.有什么办法,我可以在程序运行后通过在运行时抛出UAC来升级privs吗?这只会在我需要私人时才会发生.而不是从高权限开始. 我知道“runas”技术,清单文件等,但所有这些都是在创建进程
我的应用程序并不总是需要“admin”权限,大多数时间都会以当前用户身份运行.有什么办法,我可以在程序运行后通过在运行时抛出UAC来升级privs吗?这只会在我需要私人时才会发生.而不是从高权限开始.

我知道“runas”技术,清单文件等,但所有这些都是在创建进程之前,而不是在运行时,按需

恭喜,这正是UAC的设计工作原理,而且大多数应用程序开发人员要么太懒,要么太害怕,不要考虑看:)

简而言之,您将需要提升的代码放在一个单独的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对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读