随笔 - 223  文章 - 0  评论 - 77  阅读 - 68万

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 <windows.h>
#include <stdio.h>
#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;
}
复制代码

 

posted on   Arthurian  阅读(348)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示