设置文件(夹)的用户访问权限

一般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;

}

 

posted @ 2010-05-06 09:04  孤竹君  阅读(991)  评论(0编辑  收藏  举报