保全可无限期保留数据,以履行法律义务或保留义务。通常情况下,保全会应用于一个或多个用户,以确保可能与诉讼或调查相关的数据在诉讼或调查不再有效之前无法删除。
如果处于保全状态的用户删除了保全的数据,则相应数据会从用户视图中移除,但会保留在保险柜中。只要保全未解除,保险柜管理员就可以搜索和导出这些数据。
保全包含以下组件:
- 服务 - 负责存储数据的应用。服务可以设置为邮件、云端硬盘或群组。
- 范围 - 保全涵盖的实体。可以将范围设为一个或多个用户账号,也可以设为组织部门 (OU)。
- 其他选项(可选):用于缩小要在指定范围内保存的数据的具体详细信息(搜索查询或配置选项)。选项包括:
<ph type="x-smartling-placeholder">
- </ph>
- 邮件、群组:用于缩小保全范围的搜索查询
- 云端硬盘:将共享云端硬盘纳入保全
要使用保险柜资源,账号必须拥有所需的保险柜 权限以及对 至关重要。要访问某个诉讼或调查,该账号必须是该诉讼或调查的创建者,且拥有该诉讼或调查的 或拥有查看所有诉讼或调查的权限。
使用搜索查询为特定用户账号中的邮件创建保全
以下示例展示了名为“My First mail Accounts Hold”的保全如何创建对象:
- 服务:mail
- 实体:用户账号“user1”和“user2”
- 其他选项:搜索查询“to:[email protected]”
从 AdminSdk 检索用户账号 ID。请注意, HeldAccount 可接收账号 ID 或电子邮件地址。如果同时提供两个选项,则使用电子邮件地址 且账号 ID 会被忽略。
Java
HeldMailQuery mailQuery = new HeldMailQuery().setTerms("to:[email protected]"); Listaccounts = 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:[email protected]'} 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()
为组织部门中的云端硬盘创建保全,并纳入共享云端硬盘内容
以下示例展示了名为“My First Drive 组织部门保全”的保全如何创建对象:
- 服务:云端硬盘
- 实体:组织部门“财务”(组织部门 ID 通过 orgUnitId 获取)
- 其他选项:添加此组织部门中的用户所属的共享云端硬盘
从 AdminSdk 检索组织部门 ID。
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()
为特定群组账号在指定日期范围内为群组创建保全
以下示例展示了名为“My First Group Hold”的保全创建对象:
- 服务:群组
- 实体:群组账号“group1”和“group2”
- 其他选项:仅保留发送日期在“startTime”之间的邮件和“endTime”
从 AdminSdk 检索群组账号 ID。
Java
String APRIL_2_2017_GMT = "2017-04-02T00:00:00Z"; // See below for format*. Listaccounts = 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()
- 时间戳格式。此外,开始时间/结束时间会换算为格林尼治标准时间,并向下舍入到指定日期的开始时间。
查询和修改现有保全
以下示例展示了如何列出现有保全包含的所有账号:
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']
以下示例展示了如何向现有的保全添加账号以及从中移除账号:
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 protected]"; // 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()
以下示例展示了如何修改现有组织部门保全的组织部门:
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()
以下示例展示了如何列出诉讼或调查的所有保全:
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()