Windows中编程一般很少人关注权限问题,但是真正碰到需要考虑权限的地方时,很多人就措手无策了。这里针对常见的windows三种权限问题:管理员权限运行、开启指定特权和降权运行程序封装了一个工具类并给出示例代码。

说明

【1】管理员权限运行程序的几种方法包括:
1.使用API ShellExcuteEx传入runas参数
2.修改manifest文件 运行权限为requireAdministrator
3.修改工程链接配置为level=requireAdministrator,其实是修改的内嵌manifest
4.设置程序的兼容性为以管理员权限运行
【2】开启指定特权指在很多时候相应的特权被关闭,我们需要手动启用特权,常见的特权包括关机、备份等等。
【3】降权运行程序在很多安全软件中需要用到,实际上这里的降权简单的指的是程序的完整性级别,实际中降权实现要复杂一些,因为还要考虑禁用不必要的特权等等。

接口声明

class CPrivilegeMisc
{
public:
    typedef enum
    {
        RUNAS_S_OK,            //管理员权限运行成功
        RUNAS_F_DENY,        //拒绝提升权限
        RUNAS_F_NOTFOUND,    //待运行的文件不存在
        RUNAS_F_OTHER        //其他原因导致失败
    }RUNAS_RESULT;

    CPrivilegeMisc(void);
    virtual ~CPrivilegeMisc(void);

    //管理员权限运行相关
    static BOOL ShellExecute_RunAs(LPCTSTR lpFile, INT nShowCmd=SW_SHOWNORMAL, RUNAS_RESULT* pRes=NULL);
    static BOOL GetElevatedState(TOKEN_ELEVATION_TYPE* pEleType, BOOL* pIsAdmin=NULL);
    static void ChangeBtnStyleToRunas(HWND hBtn, BOOL bRunasState=TRUE);
    static HICON GetRunasIcon();

    //特权提升和调整相关操作
    static BOOL EnablePrivilege(LPTSTR pszPriv, BOOL bEnable=TRUE);
    static BOOL EnablePrivilege(HANDLE hTok, LPTSTR pszPriv, 
                                BOOL bEnable=TRUE, TOKEN_PRIVILEGES* pTpOld = NULL);
    static VOID RestorePrivilege(HANDLE hTok,  TOKEN_PRIVILEGES* pTpOld );

    //强制完整性操作相关
    static BOOL CreateLowIntegrityProcess(PWSTR pszCommandLine);
    static BOOL GetProcessIntegrityLevel(PDWORD pdwIntegrityLevel);
};

测试界面

0.png

下载

源码下载链接