Повышение привилегий во время выполнения (Windows API C/C++)

Моему приложению не всегда требуются права администратора, и большую часть времени он будет работать как текущий пользователь. Есть ли какой-нибудь способ, которым я могу увеличить привилегии, вырвав UAC во время выполнения после того, как моя программа уже запущена? Это произойдет только тогда, когда мне понадобятся привилегированные действия. Вместо того, чтобы начинать с высоких привилегий.

Я знаю технику "runas", файл манифеста и т. Д., Но все это до создания процесса, а не во время выполнения, по требованию

1 ответ

Решение

Поздравляю, именно так 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-объект будет создан с маркером с повышенными правами.

Другие вопросы по тегам