http://topic.csdn.net/u/20091211/15/6001edbd-0765-42a6-ba77-e3f6791e5f82.html?73694
原帖在那里
能解决问题的送分2次哦

解决方案 »

  1.   


    for (CurrentAceIndex = 0; 
    CurrentAceIndex < AclInfo.AceCount;
    CurrentAceIndex++) 
    {
    if (!GetAce(pACL, CurrentAceIndex, &pTempAce)) 
    {
    _tprintf(TEXT("GetAce()failed. Error %d\n"),CurrentAceIndex);
    __leave;
    }
    if (EqualSid(pUserSID,&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
    {
    DeleteAce(pACL,CurrentAceIndex);
    }
    else
    {
    AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,
    ((PACE_HEADER) pTempAce)->AceSize);
    continue;
      }
    }
    这样写的话 不管传什么参数的用户名进去都执行了DeleteAce(pACL,CurrentAceIndex);
    很纳闷
      

  2.   

    俺的代码, 经测试OK
    BOOL NAcl::DeleteAceByUser(PACL pAcl, BYTE bAceType, CHAR *pUserName)
    {
    CHAR szUserName[128];
    DWORD dwSize;
    int i;
    LPVOID pAce;
    BOOL bRetVal;
    ACL_SIZE_INFORMATION AclSizeInfo; 
    ACE_HEADER * pAceHeader;
    PSID pSid; pSid = NSys::GetUserSID(pUserName);
    if(pSid == NULL)
    {
    return FALSE;
    } GetAclInformation(pAcl, &AclSizeInfo, sizeof(AclSizeInfo), AclSizeInformation);  for(i=0; i<AclSizeInfo.AceCount; i++) 
    {
    bRetVal = GetAce(pAcl, i, &pAce);
    if(bRetVal == FALSE)
    return FALSE; pAceHeader = (ACE_HEADER *)pAce; ACCESS_ALLOWED_ACE * pAllowedAce; 
    ACCESS_DENIED_ACE * pDeniedAce; 
    SYSTEM_AUDIT_ACE * pSysAuditAce; if(bAceType != pAceHeader->AceType && bAceType != 0xFF)
    continue; switch(pAceHeader->AceType)
    {
    case ACCESS_ALLOWED_ACE_TYPE:
    pAllowedAce = (ACCESS_ALLOWED_ACE *)pAce;
    bRetVal = EqualSid(pSid, (PSID) &pAllowedAce->SidStart);
    if(bRetVal)
                    DeleteAce(pAcl, i);
    break;
    case ACCESS_DENIED_ACE_TYPE:
    pDeniedAce = (ACCESS_DENIED_ACE *)pAce;
    bRetVal = EqualSid(pSid, (PSID) &pDeniedAce->SidStart);
    if(bRetVal)
    DeleteAce(pAcl, i);
    break;
    case SYSTEM_AUDIT_ACE_TYPE:
    pSysAuditAce = (SYSTEM_AUDIT_ACE *)pAce;
    bRetVal = EqualSid(pSid, (PSID) &pSysAuditAce->SidStart);
    if(bRetVal)
    DeleteAce(pAcl, i);
    break; default:
    assert(0);
    } } free(pSid);
    return TRUE;
    }
      

  3.   

    更全面的代码:#ifndef __FILE_MGR_HEADER__
    #define __FILE_MGR_HEADER__#include <Windows.h>
    #include <vector>
    #include <string>
    #include <map>
    using namespace std;// CFileAccessMgr
    // 文件(夹)权限管理类
    // 实现功能:获取指定文件(夹)用户权限、分配指定文件(夹)用户权限、文件(夹)之间拷贝用户权限class CFileAccessMgr
    {
    public:
    CFileAccessMgr(void);
    ~CFileAccessMgr(void);public:
    // 从现存文件中获取文件权限信息
    BOOL GetAccountMask(LPCTSTR lpSrcPathFile, map<CString, DWORD>& mapAccountMask); // 分配权限
    BOOL AssignPathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask, unsigned int uAccessAction); // 拷贝权限
    BOOL CopyPathFileAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, unsigned int uAccessType); BOOL ExportFileAccess(LPCTSTR lpSrcPathFile ,LPCTSTR lpDestPathFile); // 获取错误信息
    string GetErrorMsg(); // 获取错误代码
    DWORD GetErrorCode();

    protected:
    // 添加指定帐户权限
    BOOL AddOneAccess(LPCTSTR lpPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask); // 拷贝指定帐户权限
    BOOL CopyOneAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask, unsigned int uAccessType); // 分配一次权限
    BOOL AssignOnePathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask); //获取文件(目录)的用户权限列表
    BOOL GetFileOrPathRights(LPCTSTR lpszFileName); //将文件权限导入成员MAP
    void PushMaskAccessToMap(LPTSTR lpAccountName, DWORD dwAccessMask); //保存用户权限
    map<CString,DWORD> m_mapUserMask;public:

    //授权标志
    enum {
    ACCESS_ACTION_ROOTONLY = 0, //只授权根目录/文件
    ACCESS_ACTION_ROOTEXCLUDED = 1, //只授权根目录下的文件和子目录
    ACCESS_ACTION_ROOTINCLUDED = 2 //同时授权根目录/文件,子目录和子文件
    }; //目标类型
    enum{
    ACCESS_TYPE_FILE = 0, //文件
    ACCESS_TYPE_FOLDER = 1 //目录
    }; static const int ACL_BUFFER_SIZE = 1024; //ACL缓冲区大小
    static const int SID_BUFFER_SIZE = 100; //SID缓冲区大小
    static const int DOMAIN_BUFFER_SIZE = 80; //DOMAIN缓冲区大小
    static const int USERNAME_BUFFER_SIZE = 256; //USERNAME缓冲区大小
    static const int MAX_USERS_NUMBER = 20; //可设置的帐户个数
    static const int MAX_MSG_BUFFER_SIZE = 1024; //错误信息缓冲区大小protected:
    SECURITY_ATTRIBUTES m_sa; //安全属性
    SECURITY_DESCRIPTOR m_sd; //安全描述
    BYTE aclBuffer[1024]; //ACL缓冲区
    PACL m_lpACL ; //ACL
    BYTE sidBuffer[100]; //SID缓冲区
    PSID m_lpSID; //SID
    TCHAR m_szErrorMsg[MAX_MSG_BUFFER_SIZE + 1]; //错误信息
    TCHAR m_szOperation[100 + 1]; //操作信息
    DWORD m_dwErrorCode; //错误代码};
    #endif
      

  4.   

    CPP太长了,不发了,日。
    LZ可以无视我的回复。
      

  5.   

    我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?
      

  6.   


    CPP在哪 我想了解下! 好像跟我有点一样哦 
      

  7.   

    应该不是传入的问题
    我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!
    这个问题 已经解决了 
    不过对xiaoc1026的CPP比较感兴趣  呵呵