C++处理系统相关权限问题

权限问题处理是日常开发过程中很常见的一个操作,这里记录一下使用方法

1、给某个文件或文件夹赋予特定用户的特定访问权限

/* 给文件(夹)szPath设置用户名为pszAccount的可读可写可修改权限 */
bool GiveTheAccountPrivToFile(const TCHAR szPath[], const TCHAR pszAccount[])
{
    PACL pDaclOld = NULL;
    // 获取文件安全对象的DACL列表
    if (ERROR_SUCCESS != GetNamedSecurityInfo (szPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDaclOld, NULL, NULL))
    {
        std::cout << "GetNamedSecurityInfo fail. LastError: " << GetLastError() << endl;
        return false;
    }

    EXPLICIT_ACCESS ea = { 0 };

    // 生成指定用户帐户的访问控制信息(这里指定赋予修改、读取和执行、读取、写入权限)
    ::BuildExplicitAccessWithName (&ea, (LPTSTR)pszAccount, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

    // 生成指定用户帐户的访问控制信息(这里指定赋予所有权限)
    // ::BuildExplicitAccessWithName (&ea, (LPTSTR)pszAccount, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

    BOOL bSuccess = TRUE;
    PACL pDaclNew = NULL;
    do
    {
        // 创建新的ACL对象(合并已有的ACL对象和刚生成的用户帐户访问控制信息)
        if (ERROR_SUCCESS != ::SetEntriesInAcl(1, &ea, pDaclOld, &pDaclNew))
        {
            std::cout << "SetEntriesInAcl fail. LastError: " << GetLastError() << endl;
            bSuccess = FALSE;
            break;
        }

        // 设置文件安全对象的DACL列表
        if (ERROR_SUCCESS != ::SetNamedSecurityInfo ((LPTSTR)szPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pDaclNew, NULL))
        {
            std::cout << "SetNamedSecurityInfo fail. LastError: " << GetLastError() << endl;
            bSuccess = FALSE;
        }
    }while(FALSE);

    if (NULL != pDaclNew)
    {
        ::LocalFree(pDaclNew);
    }

    return bSuccess;
}

2、提升进程权限

#include
#include
#pragma comment(lib, "cmcfg32.lib")

BOOL SetPrivilege(
    HANDLE hToken,         // access token handle
    LPCTSTR lpszPrivilege, // name of privilege to enable/disable
    BOOL bEnablePrivilege  // to enable or disable privilege
)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if (FALSE == LookupPrivilegeValue(
                     NULL,          // lookup privilege on local system
                     lpszPrivilege, // privilege to lookup
                     &luid))        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue fail. gle: 0x%08x\n", GetLastError());
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if (FALSE == AdjustTokenPrivileges(
                     hToken,
                     FALSE,
                     &tp,
                     sizeof(TOKEN_PRIVILEGES),
                     NULL,
                     NULL))
    {
        printf("AdjustTokenPrivileges fail. gle: 0x%08x\n", GetLastError());
        return FALSE;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    }

    return TRUE;
}

本文来自博客园,作者:Arthurian,转载请注明原文链接:https://www.cnblogs.com/Arthurian/p/16663266.html

欢迎邮件交流:zhuanxinxin@aliyun.com

Original: https://www.cnblogs.com/Arthurian/p/16663266.html
Author: Arthurian
Title: C++处理系统相关权限问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/683677/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JCL 日志门面

    JCL( Jakarta Commons Logging ),是 Apache 提供的一个 通用日志 API 。用户可以自由选择第三方的日志组件作为具体实现,像 Log4j 或 J…

    技术杂谈 2023年7月11日
    073
  • 项目管理中的关键路径法-时窗图解法cpm

    完成单个活动所需的时间称为活动时间,可以形象地以一个矩形窗格来表示,这个窗格称为 时间窗口,简称 时窗。 1.1 分类 单位时窗: 基本时窗,时窗的不可分割的最小单元, 活动时窗:…

    技术杂谈 2023年7月11日
    070
  • WIN10系统提示无法使用内置管理员账户打开XXX应用程序怎么办

    重装了系统之后,只保留Administrator账户,结果打开程序的时候回弹出这个提示 运行,输入secpol.msc 本地策略-安全选项,启用下面这个,然后重启计算机 Origi…

    技术杂谈 2023年5月31日
    086
  • 动物期末代码

    Animal.java public abstract class Animal { public abstract void cry(); public abstract Str…

    技术杂谈 2023年6月21日
    093
  • DAX:跟关系相关的函数

    在表格数据模型中,用户可以创建关系,并可以沿着关系的方向自动进行交叉过滤。但是在 计算列中,必须通过RELATED 和 RELATEDTABLE函数来检索相关联的表。当使用CALC…

    技术杂谈 2023年5月31日
    088
  • 微信小程序–canvas画布实现图片的编辑

    概述 微信小程序–canvas画布实现图片的编辑 详细 一、前期准备工作 软件环境:微信开发者工具官方下载地址:https://mp.weixin.qq.com/deb…

    技术杂谈 2023年5月31日
    0103
  • rsync安装使用教程

    一、说明 自接解Linux服务器后,rsync这个东西就一直若隐若现,但也没人要求帮安装配置什么的所以也就没有研究。 但近来要推弱口令改造,发现挺多就是rsync空口令,搞不懂这是…

    技术杂谈 2023年5月31日
    085
  • Netty源码分析之ByteBuf引用计数

    引用计数是一种常用的内存管理机制,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。Netty在4.x版本开始使用引用计数机制进行部分对象的管理,其实现思路并不…

    技术杂谈 2023年7月25日
    060
  • Flink 作业提交流程

    大家好,我是小寒~ 今天给大家带来一篇 flink 作业提交相关的文章。 我们都知道,在开发完一个 flink 应用程序后,打包成 jar 包,然后通过 FLink CLI 或者 …

    技术杂谈 2023年7月24日
    055
  • windows启动NTP服务器详细步骤

    工具使用 专栏收录该内容8 篇文章0 订阅 订阅专栏windows如何开启NTP服务器 步骤如下: 禁用windows防火墙或者设置防火墙入站规则(两者二选一)。禁用防火墙步骤:控…

    技术杂谈 2023年5月31日
    097
  • 聊聊 React

    都说 React 开发效率高,但效率高在哪呢?来细看看。 用 d3 写一个 List: const renderList = data => { d3.select(&quo…

    技术杂谈 2023年7月11日
    066
  • 1维线性回归

    w= 1.0595238095237538 b= -117.79761904760 undefined Original: https://www.cnblogs.com/canx…

    技术杂谈 2023年7月10日
    061
  • GUI 快捷键的实现思路

    代码改变世界 Cnblogs Dashboard Login 2013-11-29 13:50 Clingingboy 阅读(736 ) 评论() 编辑 思路: 前提快捷键操作不可…

    技术杂谈 2023年5月31日
    093
  • MySQL

    数据库 1、为什么需要设计 当数据库比较复杂的时候,我们就需要设计了 糟糕的数据库设计: 数据冗余,浪费空间 数据库插入和删除都会麻烦、异常【屏蔽使用物理外键】 程序的性能差 良好…

    技术杂谈 2023年6月21日
    089
  • 剑指offer计划26(字符串中等)—java

    1.1、题目1 剑指 Offer 20. 表示数值的字符串 1.2、解法 这题表示直接上大佬的题解把。。。。代码太长了。有限状态自动机。对状态机一无所知的我一脸懵 1.3、代码 c…

    技术杂谈 2023年7月25日
    070
  • C宏替换优先级

    宏替换仅仅是简单的替换,它不会影响运算符优先级的,比如: #define DOUBLE(x) x+x int i = DOUBLE(5)*5; printf("%d&qu…

    技术杂谈 2023年5月30日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球