how to change the ACLs from c++?

前端 未结 3 1756
你的背包
你的背包 2020-12-09 07:26

How to change the ACLs from c++?

Can anyone help me to do the following from c++ without any confirmations:

cacls c:\\personal\\file.txt /d everyone
         


        
相关标签:
3条回答
  • 2020-12-09 07:33

    I assume you mean on a Windows system? You need to use the NTFS part of the Win32 API, which is what cacls uses. Browse through MSDN, it'll be in there somewhere. Eg SetSecurityInfo

    0 讨论(0)
  • 2020-12-09 07:34

    If you don't want to mess around with the API (i.e. SetNamedSecurityInfo), you might be able to bypass the prompt like so:

    echo y|cacls filename /d everyone
    

    Since echo is a builtin, to call that command line from your program, you'd probably have to run:

    cmd.exe /c echo y|cacls filename /d everyone
    
    0 讨论(0)
  • 2020-12-09 07:46

    Use following code

    #include <Accctrl.h>
    #include <Aclapi.h>
    void SetFilePermission(LPCTSTR FileName)
    {
        PSID pEveryoneSID = NULL;
        PACL pACL = NULL;
        EXPLICIT_ACCESS ea[1];
        SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
    
        // Create a well-known SID for the Everyone group.
        AllocateAndInitializeSid(&SIDAuthWorld, 1,
                         SECURITY_WORLD_RID,
                         0, 0, 0, 0, 0, 0, 0,
                         &pEveryoneSID);
    
        // Initialize an EXPLICIT_ACCESS structure for an ACE.
        ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));
        ea[0].grfAccessPermissions = 0xFFFFFFFF;
        ea[0].grfAccessMode = DENY_ACCESS;
        ea[0].grfInheritance= NO_INHERITANCE;
        ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
        ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
        ea[0].Trustee.ptstrName  = (LPTSTR) pEveryoneSID;
    
        // Create a new ACL that contains the new ACEs.
        SetEntriesInAcl(1, ea, NULL, &pACL);
    
        // Initialize a security descriptor.  
        PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, 
                                    SECURITY_DESCRIPTOR_MIN_LENGTH); 
    
        InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION);
    
        // Add the ACL to the security descriptor. 
        SetSecurityDescriptorDacl(pSD, 
                TRUE,     // bDaclPresent flag   
                pACL, 
                FALSE);   // not a default DACL 
    
    
        //Change the security attributes
        SetFileSecurity(FileName, DACL_SECURITY_INFORMATION, pSD);
    
        if (pEveryoneSID) 
            FreeSid(pEveryoneSID);
        if (pACL) 
            LocalFree(pACL);
        if (pSD) 
            LocalFree(pSD);
    }
    
    0 讨论(0)
提交回复
热议问题