zoukankan      html  css  js  c++  java
  • 设置文件(夹)的用户访问权限

    一般Windows下的系统文件(夹)只让受限帐户读取而不让写入和修改。如果要开启写操作权限就需要手动修改文件(夹)的用户帐户安全权限(这操作当然要在管理员帐户下执行).以下用程序封装了一下该操作:

    先来个API版本:

    //
    // 启用某个账户对某个文件(夹)的所有操作权限
    // pszPath: 文件(夹)路径
    // pszAccount: 账户名称
    //
    BOOL  EnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)
    {
        BOOL bSuccess 
    = TRUE;
        PACL pNewDacl 
    = NULL, pOldDacl = NULL;
        EXPLICIT_ACCESS ea;

        
    do 
        {
            
    // 获取文件(夹)安全对象的DACL列表
            if (ERROR_SUCCESS != ::GetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, NULL))
            {
                bSuccess  
    =  FALSE;
                
    break;
            }

            
    // 此处不可直接用AddAccessAllowedAce函数,因为已有的DACL长度是固定,必须重新创建一个DACL对象
            
    // 生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限)
            ::BuildExplicitAccessWithName (&ea, (LPTSTR)pszAccount, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);
            
    // 创建新的ACL对象(合并已有的ACL对象和刚生成的用户帐户访问控制信息)
            if (ERROR_SUCCESS != ::SetEntriesInAcl(1&ea, pOldDacl, &pNewDacl))
            {
                bSuccess   
    =  FALSE;
                
    break;
            }

            
    // 设置文件(夹)安全对象的DACL列表
            if (ERROR_SUCCESS != ::SetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL))
            {
                bSuccess   
    =  FALSE;
            }
        } 
    while (FALSE);

        
    // 释放资源
        if (pNewDacl != NULL)
            ::LocalFree(pNewDacl);

        
    return bSuccess;
    }
    ATL封装了安全操作函数,用ATL来写就简单多了:
    //
    // 启用某个账户对某个文件(夹)的所有操作权限(ATL版本)
    // pszPath: 文件(夹)路径
    // pszAccount: 账户名称
    //
    BOOL  AtlEnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)
    {
        CDacl  dacl;
        CSid   sid;
        
    // 获取用户帐户标志符
        if (!sid.LoadAccount (pszAccount))
        {
            
    return FALSE;
        }

        
    // 获取文件(夹)的DACL
        if (!AtlGetDacl (pszPath, SE_FILE_OBJECT, &dacl))
        {
            
    return FALSE;
        }

        
    // 在DACL中添加新的ACE项
        dacl.AddAllowedAce (sid, GENERIC_ALL);

        
    // 设置文件(夹)的DACL
        return AtlSetDacl (pszPath, SE_FILE_OBJECT, dacl) ? TRUE : FALSE;

    }
  • 相关阅读:
    Bash's Big Day
    树链剖分求lca
    Contest1814
    启发式合并
    2019 Multi-University Training Contest 10
    图论题
    vijos-记数问题
    2018届研究生招生预推免(THU,HIT)经历分享
    数细胞-swust oj
    Bone Collector-HDU
  • 原文地址:https://www.cnblogs.com/fangkm/p/1728542.html
Copyright © 2011-2022 走看看