Gérer les obligations de conservation

Les obligations de conservation permettent de conserver les données indéfiniment pour répondre à des obligations légales ou de conservation. En général, une obligation de conservation s'applique à un ou plusieurs utilisateurs afin de s'assurer que les données potentiellement pertinentes ne peuvent être supprimées tant que le litige n'est pas éteint.

Si un utilisateur soumis à une obligation de conservation supprime des données conservées, ces données sont supprimées de la vue de l'utilisateur, mais sont conservées dans Vault. Tant que l'obligation de conservation est appliquée, un administrateur Vault peut rechercher et exporter ces données.

Les obligations de conservation se composent des éléments suivants:

  • Un service : l'application responsable des données devant être conservées. Le service peut être défini sur "Messagerie", "Drive" ou "Groupes".
  • Un champ d'application : les entités couvertes par l'obligation de conservation. Il peut être défini sur un ou plusieurs comptes utilisateur, ou sur une unité organisationnelle (UO).
  • Options supplémentaires (facultatif) : détails spécifiques (requêtes de recherche ou options de configuration) utilisés pour affiner les données à conserver dans le champ d'application défini. Les options sont les suivantes :
    • messagerie, Groupes: requête de recherche pour affiner la conservation
    • Drive: inclure les Drive partagés dans l'obligation de conservation

Pour utiliser des ressources Vault, le compte doit disposer des droits Vault et d'un accès au litige. Pour pouvoir accéder à un litige, le compte concerné doit avoir créé ce litige, l'avoir partagé avec lui ou disposer du droit Afficher tous les litiges.

Créer une obligation de conservation des messages de comptes utilisateur spécifiques à l'aide d'une requête de recherche

L'exemple suivant montre comment une obligation de conservation nommée "Mon premier compte de messagerie est bloquée" :

  • Service: mail
  • Entité: comptes utilisateur "utilisateur1" et "utilisateur2"
  • Options supplémentaires: requête de recherche "to:ceo@company.com"

Récupérez les ID de compte utilisateur à partir d'AdminSdk. Notez que le compte HeldAccount peut utiliser l'ID de compte ou l'adresse e-mail. Si les deux sont fournis, l'adresse e-mail est utilisée et l'ID de compte est ignoré.

Java

HeldMailQuery mailQuery = new HeldMailQuery().setTerms("to:ceo@company.com");
List accounts = Lists.newArrayList();
accounts.add(new HeldAccount().setAccountId(user1accountId));
accounts.add(new HeldAccount().setEmail(user2Email));
Hold hold = new Hold()
    .setName("My First mail Accounts Hold")
    .setCorpus("MAIL");
    .setQuery(new CorpusQuery().setMailQuery(mailQuery))
    .setAccounts(accounts);
Hold createdHold = client.matters().holds().create(matterId, hold).execute();
  

Python

def create_hold_mail_accounts(service, matter_id, account_id):
    mail_query = {'terms': 'to:ceo@company.com'}
    accounts = [
        {'accountId': user1_account_id},
        {'email': user2_email}
    ]
    wanted_hold = {
        'name': 'My First mail Accounts Hold',
        'corpus': 'MAIL',
        'query': {
            'mailQuery': mail_query
        },
        'accounts': accounts
    }
    return service.matters().holds().create(
        matterId=matter_id, body=wanted_hold).execute()

Créer une obligation de conservation pour Drive au niveau d'une unité organisationnelle et inclure le contenu des Drive partagés

L'exemple suivant montre comment une obligation de conservation nommée "Mon premier obligation de conservation Drive" est créée pour:

  • Service: Drive
  • Entité: unité organisationnelle "Finance" (l'ID de l'unité organisationnelle est capturé dans orgUnitId)
  • Options supplémentaires: inclure les Drive partagés dont les utilisateurs de cette unité organisationnelle sont membres

Récupérez les ID d'UO à partir de AdminSdk.

Java

HeldOrgUnit orgUnit = new HeldOrgUnit().setOrgUnitId(orgUnitId);
// Include shared drives content.
HeldDriveQuery driveQuery = new HeldDriveQuery().setIncludeSharedDriveFiles(true);
// Create the hold.
Hold hold = new Hold()
    .setName("My First Drive OU Hold")
    .setCorpus("DRIVE")
    .setQuery(new CorpusQuery().setDriveQuery(driveQuery))
    .setOrgUnit(orgUnit);
Hold createdHold = client.matters().holds().create(matterId, hold).execute();
return createdHold;

Python

def create_hold_drive_org(service, matter_id, org_unit_id):
    drive_query = {'includeSharedDriveFiles': True}
    org_unit = {'orgUnitId': org_unit_id}
    wanted_hold = {
        'name': 'My First Drive OU Hold',
        'corpus': 'DRIVE',
        'orgUnit': org_unit,
        'query': {
            'driveQuery': drive_query
        }
    }
    return service.matters().holds().create(
        matterId=matter_id, body=wanted_hold).execute()

Créer une obligation de conservation pour Groupes sur des comptes de groupes spécifiques associés à une plage de dates

L'exemple suivant montre comment une obligation de conservation nommée "Mon première obligation de conservation de groupe" est créée pour:

  • Service: Groupes
  • Entité: comptes de groupe "group1" et "group2"
  • Options supplémentaires: conserver uniquement les messages dont les dates d'envoi sont comprises entre "startTime" et "endTime"

Récupérez les ID de compte de groupe à partir d'AdminSdk.

Java

String APRIL_2_2017_GMT = "2017-04-02T00:00:00Z"; // See below for format*.
 
List accounts = Lists.newArrayList();
accounts.add(new HeldAccount().setAccountId(accountId));
accounts.add(new HeldAccount().setAccountId(accountId2));
HeldGroupsQuery groupQuery = new HeldGroupsQuery();
// Restrict by sent date.
groupQuery.setStartTime(APRIL_2_2017_GMT);
groupQuery.setEndTime(APRIL_2_2017_GMT);
// create the hold
Hold hold = new Hold()
    .setName("My First Group Hold")
    .setCorpus("GROUPS")
    .setQuery(new CorpusQuery().setGroupsQuery(groupQuery));
    hold.setAccounts(accounts);
Hold createdHold = client.matters().holds().create(matterId, hold).execute();
 

Python

def create_hold_groups_date_range(service, matter_id, group_account_id):
    groups_query = {
        'startTime': '2017-04-02T00:00:00Z', # See below for format*
        'endTime': '2017-04-02T00:00:00Z'
    }
    accounts = [{'accountId': group_account_id}]
    wanted_hold = {
        'name': 'My First Group Hold',
        'corpus': 'GROUPS',
        'query': {
            'groupsQuery': groups_query
        },
        'accounts': accounts
    }
    return service.matters().holds().create(
        matterId=matter_id, body=wanted_hold).execute()
 
  • Format d'horodatage. De plus, les heures de début et de fin sont converties en heures GMT et arrondies au début de la date en question.

Interroger et modifier des obligations de conservation existantes

L'exemple suivant montre comment répertorier tous les comptes inclus dans une obligation de conservation existante:

Java

client.matters().holds().accounts().list(matterId, holdId).execute().getAccounts();

Python

# If no accounts are on hold, ['accounts'] will raise an error.
def list_held_accounts(service, matter_id, hold_id):
    return service.matters().holds().accounts().list(
        matterId=matter_id, holdId=hold_id).execute()['accounts'] 

L'exemple suivant montre comment ajouter un compte à une obligation de conservation existante et comment en supprimer un:

Java

// Add an account by id.
client
        .matters()
        .holds()
        .accounts()
        .create(matterId, holdId, new HeldAccount().setAccountId(accountId))
        .execute();
// Remove an account by id.
client.matters().holds().accounts().delete(matterId, holdId, accountId).execute();

String email = "email@email.com";
// Add an account by email.
client
        .matters()
        .holds()
        .accounts()
        .create(matterId, holdId, new HeldAccount().setEmail(email))
        .execute();

Python

 
def add_held_account(service, matter_id, hold_id, account_id):
    held_account = {'accountId': account_id}
    return service.matters().holds().accounts().create(
        matterId=matter_id, holdId=hold_id, body=held_account).execute()

def remove_held_account(service, matter_id, hold_id, account_id):
    return service.matters().holds().accounts().delete(
        matterId=matter_id, holdId=hold_id, accountId=account_id).execute()

def add_held_account(service, matter_id, hold_id, email):
    held_account = {'email': email}
    return service.matters().holds().accounts().create(
        matterId=matter_id, holdId=hold_id, body=held_account).execute()
 

L'exemple suivant montre comment modifier l'UO sur une obligation de conservation pour une UO existante:

Java

Hold hold = client.matters().holds().get(matterId, holdId).execute();
hold.getOrgUnit().setOrgUnitId(newOrgUnitId);
Hold modifiedHold = client.matters().holds().update(matterId, holdId, hold).execute();
return modifiedHold;
 

Python

def update_hold_ou(service, matter_id, hold_id, org_unit_id):
    current_hold = get_hold(matter_id, hold_id)
    current_hold['orgUnit'] = {'orgUnitId': org_unit_id}
    return service.matters().holds().update(
        matterId=matter_id, holdId=hold_id, body=current_hold).execute() 

L'exemple suivant montre comment répertorier toutes les obligations de conservation d'un litige:

Java

 
String matterId = "Matter Id";

// List all holds. List holdsList = client.matters().holds().list(matterId).execute().getHolds();

// Paginate on holds. ListHoldsResponse response = client .matters() .holds() .list(matterId) .setPageSize(10) .execute();

String nextPageToken = response.getNextPageToken(); if (nextPageToken != null) { client .matters() .holds() .list(matterId) .setPageSize(10) .setPageToken(nextPageToken) .execute(); }

Python

# This can paginate in the same manner as with matters.
def list_holds(service, matter_id):
    return service.matters().holds().list(matterId=matter_id).execute()