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

Posted

技术标签:

【中文标题】在运行时提升权限 (Windows API C/C++)【英文标题】:Escalate Privilege at Runtime (Windows API C/C++) 【发布时间】:2014-11-03 12:45:34 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在运行时提升权限 (Windows API C/C++)的主要内容,如果未能解决你的问题,请参考以下文章

怎样提升Windows7的用户权限?

Visual Studio 需要在 Windows 7 中提升权限

Win10系统CMD提示请求的操作需要提升权限怎么办

如何在 Windows 上以提升的权限运行脚本

以提升的权限运行时如何正确检测网络驱动器

如何提升windows7的权限