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

时间:2014-11-03 12:45:34

标签: c++ winapi runas privilege-elevation

我的应用程序并不总是需要“admin”权限,大部分时间都会以当前用户身份运行。有什么办法,我可以在程序运行后通过在运行时抛出UAC来升级privs吗?这只会在我需要私人时才会发生。而不是从高权限开始。

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

1 个答案:

答案 0 :(得分:11)

恭喜,这正是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, 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对象。

相关问题