0

我在 VC++ 中有应用程序。它在应用程序会话结束后启动和修改日志文件时创建 test.log 文件。

我的问题是让两个普通的 Windows 用户 test1 和 test2 都没有管理员权限。

1]当我使用test1用户登录windows并启动我的应用程序时。如果用户不进行任何操作,应用程序会话将在 10 分钟后结束。当应用程序结束时,我在“C:\ProgramData\MyApplication\datalog.log”位置创建 datalog.log 文件。

2]我注销Windows test1用户

3]我在同一个窗口上登录 test2 用户并运行我的应用程序,这次当会话结束时,我的应用程序崩溃并显示如下错误消息:

问题签名:问题事件名称:BEX 应用程序名称:MyApplication.exe 应用程序版本:1.0.0.0 应用程序时间戳:5d60cf28 故障模块名称:ucrtbase.DLL 故障模块版本:10.0.10240.16390 故障模块时间戳:55a5bf73
异常偏移量:0007c3b4 异常代码: c0000417 异常数据:00000000 操作系统版本:6.1.7601.2.1.0.256.48

为了解决这个问题,我实现了以下功能

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

从以下调用

SetFilePermission(FileName); 
    stream = fopen( FileName, "a" );
    //LOG
    //fprintf( stream, "%s\n", s );
    fprintf( stream, "%s %s\n", buff, s );
    //LOG
    fclose( stream );

fprintf( stream, "%s %s\n", buff, s );在调试时,我的应用程序在此行没有任何消息而崩溃。

当我尝试手动修改文件时,它会给出访问权限权限消息。

我需要为 datalog.log 文件提供读/写访问权限,而不管用户在 Windows 上登录和创建文件的用户如何。

操作系统是windows 7

4

0 回答 0