简体   繁体   中英

How to create text file(log file) having all rights(Read,Write) to all windows users (Everybody) using sprintf in VC++

I am creating Smart.log file using following code :

void S_SetLogFileName()
    {
        char HomeDir[MAX_PATH]; 

        if (strlen(LogFileName) == 0)
        {

            TCHAR AppDataFolderPath[MAX_PATH];
            if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, AppDataFolderPath)))
            {
                sprintf(AppDataFolderPath, "%s\\Netcom\\Logs", AppDataFolderPath);          
                if (CreateDirectory(AppDataFolderPath, NULL) || ERROR_ALREADY_EXISTS == GetLastError())
                    sprintf(LogFileName,"%s\\Smart.log",AppDataFolderPath);
                else
                    goto DEFAULTVALUE;               
            }
            else        
            {
    DEFAULTVALUE:

                if (S_GetHomeDir(HomeDir,sizeof(HomeDir)))
                    sprintf(LogFileName,"%s\\Bin\\Smart.log",HomeDir);                  
                else
                    strcpy(LogFileName,"Smart.log");
            }
        }
    }

and opening and modifying it as follows:

void LogMe(char *FileName,char *s, BOOL PrintTimeStamp)
{
    FILE *stream;


    char buff[2048] = "";
    char date[256];
    char time[256];
    SYSTEMTIME SystemTime;

    if(PrintTimeStamp)
    {
        GetLocalTime(&SystemTime);
        GetDateFormat(LOCALE_USER_DEFAULT,0,&SystemTime,"MM':'dd':'yyyy",date,sizeof(date));
        GetTimeFormat(LOCALE_USER_DEFAULT,0,&SystemTime,"HH':'mm':'ss",time,sizeof(time));
        sprintf(buff,"[%d - %s %s]", GetCurrentThreadId(),date,time);
    }


    stream = fopen( FileName, "a" ); 

    fprintf( stream, "%s %s\n", buff, s );

    fclose( stream );
}

Here's the problem:

UserA runs the program first, it creates \\ProgramData\\Netcom\\Smart.log using S_SetLogFileName()

UserB runs the program next, it tries to append/ modify to Smart.log and gets access denied.

What should i need to change in my code to allow all users to access Smart.log file ?

This is solution, I am looking for, Hope useful for some one.

refer from :

  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 = GRANT_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);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM