系统 win server2003修改目录、文件的所有者如何实现???

解决方案 »

  1.   

    如果磁盘的格式是NTFS之类的,可以考虑一下权限设置
      

  2.   

    是ntfs,
    我是要编程实现的
      

  3.   


    BOOL NAcl::SetFileOwner(CHAR *pFilePath, CHAR *pUserName)
    {
    BOOL bRetVal; bRetVal = SetObjSecurityInfo(pFilePath, SE_FILE_OBJECT, pUserName, GRANT_ACCESS,  GENERIC_ALL); return TRUE;
    }BOOL NAcl::SetObjSecurityInfo(CHAR *pObjName, SE_OBJECT_TYPE nType,
     CHAR *pUserName, ACCESS_MODE dwMode, DWORD dwAcsPermis)
    {
    DWORD dwRetVal;
    PACL pAcl;
    PACL pNewAcl;
    CHAR szUserName[128];
    DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp;
    EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL)
    return FALSE; if(pUserName == NULL)
    {
    dwSize = sizeof(szUserName);
    GetUserNameA(szUserName, &dwSize);
    pUserName = szUserName;
    } dwRetVal = GetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION, NULL, 
    NULL, &pAcl, NULL, &pSecDesp);
    if(dwRetVal != 0)
    return FALSE; if(dwMode != GRANT_ACCESS)
    {
    DeleteAceByMode(pAcl, DENY_ACCESS);
    } BuildExplicitAccessWithNameA(&ExpAcs, pUserName, dwAcsPermis, dwMode, 
    OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE); dwRetVal = SetEntriesInAclA(1, &ExpAcs, pAcl, &pNewAcl);
    if(dwRetVal != 0)
    {
    if(pSecDesp)
    LocalFree(pSecDesp);
    return FALSE;
    } dwRetVal = SetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION, 
    NULL, NULL, pNewAcl, NULL); if(pNewAcl)
    LocalFree(pNewAcl);
    if(pSecDesp)
    LocalFree(pSecDesp); if(dwRetVal != 0)
    return FALSE; return TRUE;
    }
      

  4.   


    BOOL SetObjSecurityOwer(CHAR *pObjName, CHAR *pUserName)
    {
    DWORD dwRetVal;
    PACL pAcl;
    CHAR szUserName[128];
    DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp;
    EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL)
    return FALSE; if(pUserName == NULL)
    {
    dwSize = sizeof(szUserName);
    GetUserNameA(szUserName, &dwSize);
    pUserName = szUserName;
    } dwRetVal = GetNamedSecurityInfoA(pObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, 
    NULL, &pAcl, NULL, &pSecDesp);
    if(dwRetVal != 0)
    return FALSE; PSID pUSid = NSys::GetUserSID(pUserName); BYTE bzsdAbsFileSDData[1024];
    PSECURITY_DESCRIPTOR psdAbsFileSD = (PSECURITY_DESCRIPTOR)bzsdAbsFileSDData;
    BYTE bzaclDaclData[1024];
    PACL paclDacl = (PACL)&bzaclDaclData;
    BOOL bDaclPresent;
    BOOL bDaclDefaulted;
    BOOL bOwnerDefaulted; InitializeSecurityDescriptor(psdAbsFileSD, SECURITY_DESCRIPTOR_REVISION); GetSecurityDescriptorDacl(pSecDesp, &bDaclPresent, &paclDacl, &bDaclDefaulted);
    SetSecurityDescriptorSacl(psdAbsFileSD, bDaclPresent, paclDacl, bDaclDefaulted);// GetSecurityDescriptorOwner(pSecDesp, );
    SetSecurityDescriptorOwner(psdAbsFileSD, pUSid, FALSE);
    SetFileSecurity(pObjName, (SECURITY_INFORMATION)OWNER_SECURITY_INFORMATION, psdAbsFileSD); if(pUSid)
    free(pUSid);
    if(pSecDesp)
    LocalFree(pSecDesp); return TRUE;
    }
      

  5.   

    PSID        pUSid = NSys::GetUserSID(pUserName);
    这个函数是什么呢?
    还有我7楼的问题能帮忙解答下吗?
    还有
      

  6.   

    NSys::GetUserSID  从用户名得到SID 的一个函数
    权限函数对文件, 目录都可以的,  不会作用子目录, 需要自己遍历
    PSID NSys::GetUserSID(CHAR *pUserName)
    {
    CHAR szUserName[128];
    DWORD dwSize;
    PSID pSid = NULL;
    CHAR szDomainName[128];
    DWORD dwDomainSize;
    SID_NAME_USE    pNameUse; if(pUserName == NULL)
    {
    dwSize = sizeof(szUserName);
    GetUserNameA(szUserName, &dwSize);
    pUserName = szUserName;
    } dwDomainSize = sizeof(szDomainName);
    pSid = NULL;
    dwSize = 0; 
    LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse); 
    if(dwSize == 0)
    {
    return FALSE;
    }
    pSid = (PSID)malloc(dwSize); 
    LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse);  return pSid;
    }
      

  7.   

    发现存在一个问题,有一个目录,将所有者从test改为Administrators时正确
    但是从Administrators 改为test时
    SetFileSecurity函数返回0,调用失败
    这个是怎么回事呢?
      

  8.   

    补充一下:如果手动将所有者从Administrators 改为test是可以的