Comparte archivos, carpetas y unidades

Cada archivo, carpeta y unidad compartida de Google Drive tiene recursos permissions asociados. Cada recurso identifica el permiso para un type específico (user, group, domain, anyone) y un role (owner, organizer, fileOrganizer, writer, commenter, reader). Por ejemplo, un archivo puede tener un permiso que otorga a un usuario específico (type=user) acceso de solo lectura (role=reader), mientras que otro permiso otorga a los miembros de un grupo específico (type=group) la capacidad de agregar comentarios a un archivo (role=commenter).

Para obtener una lista completa de los roles y las operaciones permitidas por cada uno, consulta Roles y permisos.

Cómo se propagan los permisos

Los permisos se propagan hacia abajo, desde las carpetas superiores a todos los elementos secundarios:

  • Heredados de forma predeterminada: Todos los archivos y las carpetas secundarios heredan automáticamente los permisos de su carpeta principal.
  • No se puede reducir en elementos secundarios: No puedes quitar ni reducir un permiso heredado en un elemento secundario. Los cambios se deben realizar en la carpeta superior de origen, o bien la carpeta debe usar el parámetro de configuración de acceso limitado.
  • Se puede expandir en elementos secundarios: Un elemento secundario puede otorgar un rol más permisivo, como otorgar role=writer en un archivo dentro de una carpeta en la que el usuario tiene role=reader.
  • Se vuelve a evaluar al mover: Cuando se mueve un elemento a una nueva carpeta principal, se vuelve a evaluar y se aplican los permisos de la nueva carpeta principal al elemento y a sus elementos secundarios.

Vínculos a archivos y control de acceso

Cuando compartes un archivo o una carpeta con un usuario o grupo específico, la URL para acceder al elemento no cambia y no se genera un vínculo único para cada usuario. En cambio, el elemento tiene un solo vínculo constante basado en su fileId.

Drive controla el acceso evaluando la LCA del elemento. Cuando un usuario intenta abrir un vínculo, Drive verifica su identidad autenticada en la ACL. Si se revoca un permiso o llega a su fecha de vencimiento, se quita al usuario de la LCA. Si el usuario intenta visitar el vínculo nuevamente, Drive deniega el acceso.

Comprende las capacidades de los archivos

El recurso permissions define quién tiene acceso (la LCA), pero no indica directamente si el usuario actual puede realizar una acción específica en la IU de tu aplicación.

En cambio, el recurso files contiene una colección de campos booleanos capabilities (como canComment, canShare o canDelete) que la API de Google Drive calcula de forma dinámica según el rol del usuario y la configuración del elemento.

Obtén capacidades de archivos

Cuando renderices la IU de tu app, verifica files.capabilities en lugar de analizar los permisos directamente:

  • Llama al método files.get con fields=capabilities. Para obtener más información, consulta Cómo devolver campos específicos.
  • Usa las marcas booleanas que se devuelven para habilitar o inhabilitar las acciones correspondientes en tu interfaz. Por ejemplo, inhabilita los comentarios si canComment es false.

Situaciones para compartir recursos de Drive

En la siguiente tabla, se muestran los roles y las condiciones necesarios para compartir recursos de Drive en diferentes ubicaciones y tipos de elementos:

Ubicación Elemento Roles obligatorios Restricciones clave
Mi unidad Archivo o carpeta owner o writer Se requiere owner si writersCanShare=false.
El acceso con vencimiento a las carpetas requiere reader (consulta Cómo establecer una fecha de vencimiento).
Unidad compartida Archivo organizer, fileOrganizer o writer writersCanShare siempre se trata como true.
Unidad compartida Carpeta organizer fileOrganizer también puede compartir si sharingFoldersRequiresOrganizerPermission es false.
Unidad compartida Membresía organizer Solo se aplica a user o group (no a dominios).

Administrar permisos

En la siguiente tabla, se resumen los métodos disponibles en el recurso permissions:

Método Extremo de API Parámetros clave Referencia
Crear POST https://www.googleapis.com/drive/v3/files/{fileId}/permissions role, type, emailAddress o domain permissions.create
Obtener GET https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} fields permissions.get
Lista GET https://www.googleapis.com/drive/v3/files/{fileId}/permissions pageSize, supportsAllDrives, pageToken permissions.list
Actualiza PATCH https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} role, allowFileDiscovery permissions.update
Borrar DELETE https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} supportsAllDrives permissions.delete

Cómo crear un permiso

Para compartir un archivo, una carpeta o una unidad compartida, llama al método create en el recurso permissions con fileId. Cuando se crea un permiso, se agrega una nueva entrada de LCA al elemento y se devuelve un permissionId asignado.

En el cuerpo de la solicitud, proporciona los siguientes campos:

  • role: Es el nivel de acceso que se otorgará (por ejemplo, reader, commenter o writer). Para obtener una lista completa, consulta Roles y permisos.
  • type: Es el alcance del beneficiario (user, group, domain o anyone).
  • Identificador del beneficiario (obligatorio según type):
    • emailAddress: Obligatorio cuando type es user o group.
    • domain: Es obligatorio cuando type es domain.

En el siguiente ejemplo de código, se muestra cómo crear un permiso. La respuesta devuelve una instancia de un recurso permissions, incluido el permissionId asignado.

Solicitud

POST https://www.googleapis.com/drive/v3/files/FILE_ID/permissions
{
  "role": "commenter",
  "type": "user",
  "emailAddress": "alex@altostrat.com"
}

Respuesta

{
  "kind": "drive#permission",
  "id": "PERMISSION_ID",
  "type": "user",
  "role": "commenter"
}

Comparte con públicos objetivo

Los usuarios objetivo son grupos de personas, como departamentos o equipos, que puedes recomendarles a los usuarios para que compartan sus elementos con ellos. Puedes invitar a los usuarios a compartir elementos con un público más específico o limitado en lugar de toda la organización. Los usuarios objetivo pueden ayudarte a mejorar la seguridad y la privacidad de tus datos, y facilitar que los usuarios compartan contenido de forma adecuada.

Para compartir con un público objetivo, establece type=domain y domain en <TARGET_AUDIENCE_ID>.audience.googledomains.com. Para obtener detalles sobre cómo ubicar o crear públicos objetivo en la Consola del administrador de Google, consulta Acerca de los públicos objetivo.

Para ver cómo interactúan los usuarios con los públicos objetivo, consulta Experiencia del usuario para el uso compartido de vínculos.

Cómo obtener un permiso

Para obtener un permiso, llama al método get en el recurso permissions con los parámetros de ruta de acceso fileId y permissionId. Si no conoces el ID del permiso, primero enumera todos los permisos.

Permisos de lista

Para enumerar los permisos de un archivo, una carpeta o una unidad compartida, llama al método list en el recurso permissions con el parámetro de ruta de acceso fileId requerido.

Puedes incluir cualquiera de los siguientes parámetros de consulta opcionales para paginar o filtrar la respuesta:

  • pageSize (opcional): Es la cantidad máxima de permisos que se devolverán por página. Si no se configura para los archivos de una unidad compartida, se devuelven como máximo 100 resultados. Si no se configura para los archivos que no están en una unidad compartida, se devuelve la lista completa.

  • pageToken (opcional): Es un token de página de una llamada a la lista anterior para recuperar la página siguiente.

  • supportsAllDrives (opcional): Indica si la app que realiza la solicitud admite Mi unidad y las unidades compartidas.

  • useDomainAdminAccess (opcional): Se establece en true para emitir la solicitud como administrador de dominio. Se le otorga acceso al solicitante si el parámetro fileId hace referencia a una unidad compartida y el solicitante es administrador del dominio al que pertenece la unidad compartida. Para obtener más información, consulta Administra unidades compartidas como administrador del dominio.

  • includePermissionsForView (opcional): Son permisos de vista adicionales que se incluirán en la respuesta. Solo se admite published.

  • fields (opcional): Campos específicos que se devolverán en la respuesta. De forma predeterminada, list solo devuelve id, type, kind y role. Para devolver campos adicionales (como permissionDetails), especifícalos con este parámetro. Para obtener más información, consulta Cómo devolver campos específicos.

Determina la fuente del rol

Para cambiar el rol en un archivo o una carpeta, debes conocer la fuente del rol. En el caso de las unidades compartidas, la fuente de un rol puede basarse en la membresía a la unidad compartida, el rol en una carpeta o el rol en un archivo.

Para determinar la fuente del rol de una unidad compartida o de los elementos que contiene, llama al método get en el recurso permissions con los parámetros de ruta fileId y permissionId, y el parámetro fields establecido en el campo permissionDetails.

Para encontrar el permissionId, usa el método list en el recurso permissions con el parámetro de ruta fileId. Para recuperar el campo permissionDetails en la solicitud list, establece el parámetro fields en permissions/permissionDetails.

En este campo, se enumeran todos los permisos de archivo heredados y directos para el usuario, el grupo o el dominio.

En la siguiente muestra de código, se muestra cómo determinar la fuente del rol. La respuesta devuelve el permissionDetails de un recurso permissions. El campo inheritedFrom proporciona el ID del elemento del que se hereda el permiso.

Solicitud

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID?fields=permissionDetails&supportsAllDrives=true

Respuesta

{
  "permissionDetails": [
    {
      "permissionType": "member",
      "role": "commenter",
      "inheritedFrom": "INHERITED_FROM_ID",
      "inherited": true
    },
    {
      "permissionType": "file",
      "role": "writer",
      "inherited": false
    }
  ]
}

Actualiza un permiso

Para actualizar los permisos de un archivo o una carpeta, puedes cambiar el rol asignado. Para obtener más información sobre cómo encontrar la fuente del rol, consulta Cómo determinar la fuente del rol.

  1. Llama al método update en el recurso permissions con el parámetro de ruta de acceso fileId establecido en el archivo, la carpeta o la unidad compartida asociados, y el parámetro de ruta de acceso permissionId establecido en el permiso que se cambiará. Para encontrar el permissionId, usa el método list en el recurso permissions con el parámetro de ruta fileId.

  2. En la solicitud, identifica el nuevo role.

Puedes otorgar permisos en archivos o carpetas individuales de una unidad compartida, incluso si el usuario o el grupo ya son miembros. Por ejemplo, Alex tiene role=commenter como parte de su membresía a una unidad compartida. Sin embargo, tu app puede otorgar acceso de role=writer a Alex para un archivo en una unidad compartida. En este caso, como el rol nuevo es más permisivo que el rol otorgado a través de la membresía, el permiso nuevo se convierte en el rol efectivo para el archivo o la carpeta.

Puedes aplicar actualizaciones a través de la semántica de parches, lo que significa que puedes realizar modificaciones parciales en un recurso. En tu solicitud, debes establecer de forma explícita los campos que deseas modificar. Los campos que no se incluyan en la solicitud conservarán sus valores existentes. Para obtener más información, consulta Trabaja con recursos parciales.

Además de cambiar los roles, también puedes modificar la visibilidad de un elemento cuando el permiso type es domain o anyone. Para que un archivo compartido se pueda buscar o no se muestre en la lista, incluye el campo booleano allowFileDiscovery en tu solicitud de parche. Si configuras este parámetro como true, el elemento podrá aparecer en los resultados de la búsqueda para el público especificado, incluso si no se le proporcionó el vínculo directo. No es necesario que borres y vuelvas a crear el permiso para cambiar este parámetro de configuración.

En el siguiente ejemplo de código, se muestra cómo cambiar los permisos de un archivo o una carpeta de commenter a writer. La respuesta devuelve una instancia de un recurso permissions.

Solicitud

PATCH https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID
{
  "role": "writer"
}

Respuesta

{
  "kind": "drive#permission",
  "id": "PERMISSION_ID",
  "type": "user",
  "role": "writer"
}

Actualiza varios permisos con solicitudes por lotes

No se admiten las modificaciones simultáneas de permisos en el mismo archivo, carpeta o unidad compartida. Esta limitación se aplica a todas las operaciones de mutación (como update o delete), independientemente de si modificas los permisos para el mismo destinatario o para diferentes destinatarios, y de si las solicitudes provienen de una sola app o de varios usuarios.

Drive evalúa y actualiza los permisos de un elemento como una sola LCA. Las operaciones simultáneas provocan condiciones de carrera en las que "gana la última escritura", lo que puede anular de forma silenciosa los cambios de permisos o activar errores de sharingRateLimitExceeded.

Para evitar conflictos, ejecuta los cambios de permisos en el mismo elemento de forma secuencial o usa solicitudes por lotes para modificar varios permisos en una sola solicitud.

A continuación, se muestra un ejemplo de cómo realizar una modificación de permisos por lotes con una biblioteca cliente.

Java

drive/snippets/drive_v3/src/main/java/ShareFile.java
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.Permission;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Class to demonstrate use-case of modify permissions. */
public class ShareFile {

  /**
   * Batch permission modification.
   * realFileId file Id.
   * realUser User Id.
   * realDomain Domain of the user ID.
   *
   * @return list of modified permissions if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static List<String> shareFile(String realFileId, String realUser, String realDomain)
      throws IOException {
        /* Load pre-authorized user credentials from the environment.
         TODO(developer) - See https://developers.google.com/identity for
         guides on implementing OAuth2 for your application.application*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    final List<String> ids = new ArrayList<String>();


    JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() {
      @Override
      public void onFailure(GoogleJsonError e,
                            HttpHeaders responseHeaders)
          throws IOException {
        // Handle error
        System.err.println(e.getMessage());
      }

      @Override
      public void onSuccess(Permission permission,
                            HttpHeaders responseHeaders)
          throws IOException {
        System.out.println("Permission ID: " + permission.getId());

        ids.add(permission.getId());

      }
    };
    BatchRequest batch = service.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer");

    userPermission.setEmailAddress(realUser);
    try {
      service.permissions().create(realFileId, userPermission)
          .setFields("id")
          .queue(batch, callback);

      Permission domainPermission = new Permission()
          .setType("domain")
          .setRole("reader");

      domainPermission.setDomain(realDomain);

      service.permissions().create(realFileId, domainPermission)
          .setFields("id")
          .queue(batch, callback);

      batch.execute();

      return ids;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to modify permission: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/share_file.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def share_file(real_file_id, real_user, real_domain):
  """Batch permission modification.
  Args:
      real_file_id: file Id
      real_user: User ID
      real_domain: Domain of the user ID
  Prints modified permissions

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)
    ids = []
    file_id = real_file_id

    def callback(request_id, response, exception):
      if exception:
        # Handle error
        print(exception)
      else:
        print(f"Request_Id: {request_id}")
        print(f'Permission Id: {response.get("id")}')
        ids.append(response.get("id"))

    # pylint: disable=maybe-no-member
    batch = service.new_batch_http_request(callback=callback)
    user_permission = {
        "type": "user",
        "role": "writer",
        "emailAddress": "user@example.com",
    }
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=user_permission,
            fields="id",
        )
    )
    domain_permission = {
        "type": "domain",
        "role": "reader",
        "domain": "example.com",
    }
    domain_permission["domain"] = real_domain
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=domain_permission,
            fields="id",
        )
    )
    batch.execute()

  except HttpError as error:
    print(f"An error occurred: {error}")
    ids = None

  return ids


if __name__ == "__main__":
  share_file(
      real_file_id="1dUiRSoAQKkM3a4nTPeNQWgiuau1KdQ_l",
      real_user="gduser1@workspacesamples.dev",
      real_domain="workspacesamples.dev",
  )

Node.js

drive/snippets/drive_v3/file_snippets/share_file.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Shares a file with a user and a domain.
 * @param {string} fileId The ID of the file to share.
 * @param {string} targetUserEmail The email address of the user to share with.
 * @param {string} targetDomainName The domain to share with.
 * @return {Promise<Array<string>>} A promise that resolves to an array of permission IDs.
 */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  /** @type {Array<string>} */
  const permissionIds = [];

  // The permissions to create.
  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // e.g., 'user@partner.com'
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // e.g., 'example.com'
    },
  ];

  // Iterate through the permissions and create them one by one.
  for (const permission of permissions) {
    const result = await service.permissions.create({
      requestBody: permission,
      fileId,
      fields: 'id',
    });

    if (result.data.id) {
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } else {
      throw new Error('Failed to create permission');
    }
  }
  return permissionIds;
}

PHP

drive/snippets/drive_v3/src/DriveShareFile.php
<?php
use Google\Client;
use Google\Service\Drive;
function shareFile()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $realUser = readline("Enter user email address: ");
        $realDomain = readline("Enter domain name: ");
        $ids = array();
            $fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
            $fileId = $realFileId;
            $driveService->getClient()->setUseBatch(true);
            try {
                $batch = $driveService->createBatch();

                $userPermission = new Drive\Permission(array(
                    'type' => 'user',
                    'role' => 'writer',
                    'emailAddress' => 'user@example.com'
                ));
                $userPermission['emailAddress'] = $realUser;
                $request = $driveService->permissions->create(
                    $fileId, $userPermission, array('fields' => 'id'));
                $batch->add($request, 'user');
                $domainPermission = new Drive\Permission(array(
                    'type' => 'domain',
                    'role' => 'reader',
                    'domain' => 'example.com'
                ));
                $userPermission['domain'] = $realDomain;
                $request = $driveService->permissions->create(
                    $fileId, $domainPermission, array('fields' => 'id'));
                $batch->add($request, 'domain');
                $results = $batch->execute();

                foreach ($results as $result) {
                    if ($result instanceof Google_Service_Exception) {
                        // Handle error
                        printf($result);
                    } else {
                        printf("Permission ID: %s\n", $result->id);
                        array_push($ids, $result->id);
                    }
                }
            } finally {
                $driveService->getClient()->setUseBatch(false);
            }
            return $ids;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/ShareFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Requests;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive modify permissions.
    public class ShareFile
    {
        /// <summary>
        /// Batch permission modification.
        /// </summary>
        /// <param name="realFileId">File id.</param>
        /// <param name="realUser">User id.</param>
        /// <param name="realDomain">Domain id.</param>
        /// <returns>list of modified permissions, null otherwise.</returns>
        public static IList<String> DriveShareFile(string realFileId, string realUser, string realDomain)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var ids = new List<String>();
                var batch = new BatchRequest(service);
                BatchRequest.OnResponse<Permission> callback = delegate(
                    Permission permission,
                    RequestError error,
                    int index,
                    HttpResponseMessage message)
                {
                    if (error != null)
                    {
                        // Handle error
                        Console.WriteLine(error.Message);
                    }
                    else
                    {
                        Console.WriteLine("Permission ID: " + permission.Id);
                    }
                };
                Permission userPermission = new Permission()
                {
                    Type = "user",
                    Role = "writer",
                    EmailAddress = realUser
                };

                var request = service.Permissions.Create(userPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);

                Permission domainPermission = new Permission()
                {
                    Type = "domain",
                    Role = "reader",
                    Domain = realDomain
                };
                request = service.Permissions.Create(domainPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);
                var task = batch.ExecuteAsync();
                task.Wait();
                return ids;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Cómo borrar un permiso

Para revocar el acceso a un archivo o una carpeta, llama al método delete en el recurso permissions con los parámetros de ruta de acceso fileId y permissionId.

Los permisos heredados no se pueden revocar directamente en los elementos secundarios. En su lugar, actualiza o borra el permiso en la carpeta superior (o usa el parámetro de configuración de acceso limitado).

Ten en cuenta que quitar el acceso de un usuario a un elemento principal solo revoca los permisos heredados de ese elemento principal. Si al usuario también se le otorgaron permisos directos en un elemento secundario, ese acceso directo persistirá. Para confirmar que se quitó un permiso, llama a list con fileId.

Establece una fecha de vencimiento

Para otorgar acceso temporal a un archivo o una carpeta, configura el campo expirationTime (fecha y hora RFC 3339) cuando llames a los métodos create o update.

Los tiempos de vencimiento tienen las siguientes restricciones:

  • Solo se puede configurar en los permisos user y group (no en domain ni anyone).
  • La fecha y hora deben ser posteriores a la actual, con un máximo de un año.
  • En el caso de las carpetas, el acceso temporal solo se admite con el rol de reader.