ChatGPT implementa la configuración de permisos del archivo de configuración de aplicaciones de Windows con C++

preguntar:

Tengo una aplicación de Windows y hay un archivo de configuración config.txt en la aplicación, ahora no quiero que ninguna otra aplicación tenga el permiso de operación para modificar o eliminar el config.txt, envíelo en lenguaje C++;

  • 1. Establezca y elimine permisos para el archivo config.txt.
  • 2. Modifique el archivo config.txt después de eliminar el permiso y continúe configurando el permiso después de la modificación.

ChatGPT

Para implementar la configuración de permisos y la eliminación de permisos para el archivo config.txt, puede usar las funciones SetFileSecurity() y SetNamedSecurityInfo() en la API de Windows para completar.

El siguiente es un código de muestra que establece los permisos del archivo config.txt en solo lectura, evitando que otras aplicaciones lo modifiquen o eliminen:

#include <Windows.h>
#include <aclapi.h>

int main()
{
    
    
    // 设置文件路径
    const wchar_t* filePath = L"C:\\path\\to\\config.txt";

    // 获取文件的安全描述符
    PSECURITY_DESCRIPTOR pSD = NULL;
    if (!GetFileSecurity(filePath, DACL_SECURITY_INFORMATION, NULL, 0, NULL))
    {
    
    
        printf("GetFileSecurity failed with error %d\n", GetLastError());
        return 1;
    }
    DWORD dwLength = 0;
    if (!GetFileSecurity(filePath, DACL_SECURITY_INFORMATION, pSD, 0, &dwLength) && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
    
    
        pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, dwLength);
        if (!GetFileSecurity(filePath, DACL_SECURITY_INFORMATION, pSD, dwLength, &dwLength))
        {
    
    
            printf("GetFileSecurity failed with error %d\n", GetLastError());
            LocalFree(pSD);
            return 1;
        }
    }

    // 创建只读访问控制的安全描述符
    PACL pACL = NULL;
    EXPLICIT_ACCESS ea;
    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
    ea.grfAccessPermissions = GENERIC_READ; // 只读权限
    ea.grfAccessMode = SET_ACCESS;
    ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
    ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
    ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
    ea.Trustee.ptstrName = L"Everyone";
    if (SetEntriesInAcl(1, &ea, NULL, &pACL) != ERROR_SUCCESS)
    {
    
    
        printf("SetEntriesInAcl failed with error %d\n", GetLastError());
        LocalFree(pSD);
        return 1;
    }

    // 将安全描述符应用到文件
    if (SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE) != ERROR_SUCCESS)
    {
    
    
        printf("SetSecurityDescriptorDacl failed with error %d\n", GetLastError());
        LocalFree(pSD);
        LocalFree(pACL);
        return 1;
    }
    if (SetNamedSecurityInfo(filePath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pACL, NULL) != ERROR_SUCCESS)
    {
    
    
        printf("SetNamedSecurityInfo failed with error %d\n",GetLastError());
        LocalFree(pSD);
        LocalFree(pACL);
        return 1;
    }

    printf("Successfully set file permissions to read-only.\n");

    // 修改config.txt文件(只读权限下修改会失败)
    FILE* fp = _wfopen(filePath, L"w");
    if (fp == NULL)
    {
    
    
        printf("Failed to open file for writing.\n");
        LocalFree(pSD);
        LocalFree(pACL);
        return 1;
    }
    fprintf(fp, "This is a test.\n");
    fclose(fp);

    printf("Successfully modified file (should have failed due to read-only permissions).\n");

    // 解除文件权限
    if (SetNamedSecurityInfo(filePath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
    {
    
    
        printf("Failed to remove file permissions.\n");
        LocalFree(pSD);
        LocalFree(pACL);
        return 1;
    }

    printf("Successfully removed file permissions.\n");

    // 再次修改config.txt文件
    fp = _wfopen(filePath, L"w");
    if (fp == NULL)
    {
    
    
        printf("Failed to open file for writing.\n");
        LocalFree(pSD);
        LocalFree(pACL);
        return 1;
    }
    fprintf(fp, "This is a test.\n");
    fclose(fp);

    printf("Successfully modified file afterremoving permissions.\n");

    // 释放内存
    LocalFree(pSD);
    LocalFree(pACL);

    return 0;
}

En el código anterior, primero se obtiene el descriptor de seguridad del archivo config.txt y luego se crea un descriptor de seguridad de control de acceso de solo lectura y se aplica al archivo, evitando así que otras aplicaciones lo modifiquen o eliminen. Luego intente modificar el archivo config.txt, debería fallar. A continuación, elimine los permisos de archivo y luego intente modificar el archivo config.txt nuevamente, y debería tener éxito en este momento.

Cabe señalar que el tipo de carácter ancho (wchar_t) se usa aquí para representar la ruta del archivo, porque la API de Windows generalmente usa el tipo de carácter ancho. Además, se deben incluir los archivos de encabezado Windows.h y aclapi.h.

おすすめ

転載: blog.csdn.net/bfhelin/article/details/130867340