إدارة مساحات Drive المشتركة

يحتوي هذا الدليل على مهام متعلقة بإدارة مساحات التخزين السحابي المشتركة، مثل إنشاء مساحات تخزين سحابي مشتركة وإدارة الأعضاء والأذونات، باستخدام Google Drive API.

إذا أردت تحديد الحقول التي سيتم عرضها في الاستجابة، يمكنك ضبط الـ fields مَعلمة النظام مع أي طريقة من طرق مورد الـdrives. إذا لم تحدّد المَعلمة fields، يعرض الخادم مجموعة تلقائية من الحقول الخاصة بالطريقة. على سبيل المثال، لا تعرض الطريقة list سوى الحقول kind وid و و name لكل مساحة تخزين سحابي مشتركة. لمزيد من المعلومات، يُرجى الاطّلاع على عرض حقول معيّنة.

لمزيد من المعلومات عن الحدود القصوى المسموح بها لمجلدات مساحة التخزين السحابي المشتركة، يُرجى الاطّلاع على حدود مجلدات مساحة التخزين السحابي المشتركة.

إنشاء "مساحة تخزين سحابي مشتركة"

لإنشاء مساحة تخزين سحابي مشتركة، استخدِم الطريقة create في مورد drives مع المَعلمة requestId.

تحدّد المَعلمة requestId المحاولة المنطقية لإنشاء مساحة تخزين سحابي مشتركة بشكل متكرّر. إذا انتهت مهلة الطلب أو عرض خطأ غير محدّد في الخلفية، يمكن تكرار الطلب نفسه ولن يؤدي ذلك إلى إنشاء نُسخ مكرّرة. يجب أن تظل المَعلمة requestId ونص الطلب كما هما.

يوضّح نموذج التعليمات البرمجية التالي كيفية إنشاء مساحة تخزين سحابي مشتركة:

جافا

drive/snippets/drive_v3/src/main/java/CreateDrive.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
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.DriveScopes;
import com.google.api.services.drive.model.Drive;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.UUID;

/* class to demonstrate use-case of Drive's create drive. */
public class CreateDrive {

  /**
   * Create a drive.
   *
   * @return Newly created drive id.
   * @throws IOException if service account credentials file not found.
   */
  public static String createDrive() 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.*/
    GoogleCredentials credentials =
        GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

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

    Drive driveMetadata = new Drive();
    driveMetadata.setName("Project Resources");
    String requestId = UUID.randomUUID().toString();
    try {
      Drive drive = service.drives().create(requestId,
              driveMetadata)
          .execute();
      System.out.println("Drive ID: " + drive.getId());

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

Python

drive/snippets/drive-v3/drive_snippet/create_drive.py
import uuid

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def create_drive():
  """Create a drive.
  Returns:
      Id of the created drive

  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)

    drive_metadata = {"name": "Project Resources"}
    request_id = str(uuid.uuid4())
    # pylint: disable=maybe-no-member
    drive = (
        service.drives()
        .create(body=drive_metadata, requestId=request_id, fields="id")
        .execute()
    )
    print(f'Drive ID: {drive.get("id")}')

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

  return drive.get("id")


if __name__ == "__main__":
  create_drive()

Node.js

drive/snippets/drive_v3/drive_snippets/create_drive.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';
import {v4 as uuid} from 'uuid';

/**
 * Creates a new shared drive.
 * @return {Promise<string>} The ID of the created shared drive.
 */
async function createDrive() {
  // 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});

  // The metadata for the new shared drive.
  const driveMetadata = {
    name: 'Project resources',
  };

  // A unique request ID to avoid creating duplicate shared drives.
  const requestId = uuid();

  // Create the new shared drive.
  const Drive = await service.drives.create({
    requestBody: driveMetadata,
    requestId,
    fields: 'id',
  });

  // Print the ID of the new shared drive.
  console.log('Drive Id:', Drive.data.id);
  if (!Drive.data.id) {
    throw new Error('Drive ID not found.');
  }
  return Drive.data.id;
}

PHP

drive/snippets/drive_v3/src/DriveCreateDrive.php
<?php
use Google\Client;
use Google\Service\Drive;
use Ramsey\Uuid\Uuid;
function createDrive()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);

        $driveMetadata = new Drive\Drive(array(
                'name' => 'Project Resources'));
        $requestId = Uuid::uuid4()->toString();
        $drive = $driveService->drives->create($requestId, $driveMetadata, array(
                'fields' => 'id'));
        printf("Drive ID: %s\n", $drive->id);
        return $drive->id;
    } catch(Exception $e)  {
        echo "Error Message: ".$e;
    }  

}

NET.

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

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive's create drive.
    public class CreateDrive
    {
        /// <summary>
        /// Create a drive.
        /// </summary>
        /// <returns>newly created drive Id.</returns>
        public static string DriveCreateDrive()
        {
            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 driveMetadata = new Drive()
                {
                    Name = "Project Resources"
                };
                var requestId = Guid.NewGuid().ToString();
                var request = service.Drives.Create(driveMetadata, requestId);
                request.Fields = "id";
                var drive = request.Execute();
                Console.WriteLine("Drive ID: " + drive.Id);
                return drive.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

تكون عمليات استدعاء الطريقة create متكرّرة.

إذا تم إنشاء مساحة التخزين السحابي المشتركة بنجاح في طلب سابق أو بسبب إعادة المحاولة، تعرض الطريقة مثيلاً من مورد drives. في بعض الأحيان، مثل بعد فترة طويلة أو إذا تغيّر نص الطلب، قد يتم عرض الخطأ 409 الذي يشير إلى أنّه يجب تجاهل requestId.

الحصول على مساحة تخزين سحابي مشتركة

للحصول على بيانات مساحة تخزين سحابي مشتركة، استخدِم الـ get method على الـ drives resource مع الـ driveId path parameter. إذا كنت لا تعرف رقم تعريف مساحة التخزين السحابي المشتركة، يمكنك عرض جميع مساحات التخزين السحابي المشتركة باستخدام الطريقة list.

تعرض الطريقة get مساحة تخزين سحابي مشتركة كمثيل من مورد drives.

لإرسال الطلب بصفتك مشرف نطاق، اضبط مَعلمة طلب البحث useDomainAdminAccess على true. لمزيد من المعلومات، يُرجى الاطّلاع على إدارة مساحات التخزين السحابي المشتركة بصفتك مشرف نطاق.

عرض مساحات التخزين السحابي المشتركة

لعرض مساحات التخزين السحابي المشتركة الخاصة بمستخدم، استخدِم الطريقة list في مورد drives. تعرض الطريقة قائمة بمساحات التخزين السحابي المشتركة.

مرِّر مَعلمات طلب البحث التالية لتخصيص ترقيم الصفحات لمساحات التخزين السحابي المشتركة أو لفلترتها:

  • pageSize: الحد الأقصى لعدد مساحات التخزين السحابي المشتركة التي سيتم عرضها في كل صفحة.

  • pageToken: رمز صفحة تم استلامه من طلب سابق لعرض القائمة. قدِّم هذا الرمز لاسترداد الصفحة التالية.

  • q: سلسلة طلب بحث للبحث عن مساحات التخزين السحابي المشتركة. لمزيد من المعلومات، يُرجى الاطّلاع على البحث عن مساحات تخزين سحابي مشتركة.

  • useDomainAdminAccess: اضبط هذه المَعلمة على true لإرسال الطلب بصفتك مشرف نطاق لعرض جميع مساحات التخزين السحابي المشتركة في النطاق الذي تكون فيه مقدِّم الطلب مشرفًا. لمزيد من المعلومات، يُرجى الاطّلاع على إدارة مساحات التخزين السحابي المشتركة بصفتك مشرف نطاق.

تعديل مساحة تخزين سحابي مشتركة

لتعديل بيانات مساحة تخزين سحابي مشتركة، استخدِم الطريقة update في مورد drives مع مَعلمة المسار driveId.

تعرض الطريقة مساحة تخزين سحابي مشتركة كمثيل من مورد drives.

لإرسال الطلب بصفتك مشرف نطاق، اضبط مَعلمة طلب البحث useDomainAdminAccess على true. لمزيد من المعلومات، يُرجى الاطّلاع على إدارة مساحات التخزين السحابي المشتركة بصفتك مشرف نطاق.

إخفاء مساحة تخزين سحابي مشتركة وإظهارها

لإخفاء مساحة تخزين سحابي مشتركة من العرض التلقائي، استخدِم الطريقة hide في المورد drives مع المَعلمة driveId.

عند إخفاء مساحة تخزين سحابي مشتركة، يضع Drive علامة على مورد مساحة التخزين السحابي المشتركة على أنّه hidden=true. لا تظهر مساحات التخزين السحابي المشتركة المخفية في واجهة مستخدم Drive أو في قائمة الملفات المعروضة.

لاستعادة مساحة تخزين سحابي مشتركة إلى العرض التلقائي، استخدِم الطريقة unhide في مورد drives مع المَعلمة driveId.

تعرض كلتا الطريقتَين مساحة تخزين سحابي مشتركة كمثيل من مورد drives.

حذف مساحة تخزين سحابي مشتركة

لحذف مساحة تخزين سحابي مشتركة نهائيًا، استخدِم الطريقة delete في مورد drives مع المَعلمة driveId.

قبل حذف مساحة تخزين سحابي مشتركة، يجب نقل جميع المحتويات في مساحة التخزين السحابي المشتركة إلى المهملات أو حذفها. يجب أن يكون لدى المستخدم أيضًا role=organizer في مجلد مساحة التخزين السحابي المشتركة. لمزيد من المعلومات، يُرجى الاطّلاع على نقل الملفات والمجلدات إلى المهملات أو حذفها.

مرِّر مَعلمات طلب البحث التالية لفلترة مساحات التخزين السحابي المشتركة:

  • useDomainAdminAccess: اضبط هذه المَعلمة على true لإرسال الطلب بصفتك مشرف نطاق لعرض جميع مساحات التخزين السحابي المشتركة في النطاق الذي تكون فيه مقدِّم الطلب مشرفًا. لمزيد من المعلومات، يُرجى الاطّلاع على إدارة مساحات التخزين السحابي المشتركة بصفتك مشرف نطاق.

  • allowItemDeletion: اضبط هذه المَعلمة على true لحذف العناصر داخل مساحة التخزين السحابي المشتركة. لا يتم دعم هذه المَعلمة إلا عندما يتم ضبط useDomainAdminAccess أيضًا على true.

إضافة أعضاء مساحة تخزين سحابي مشتركة أو إزالتهم

يمكنك إضافة أعضاء مساحة تخزين سحابي مشتركة أو إزالتهم باستخدام مورد permissions.

لإضافة عضو، أنشئ الإذن في مساحة التخزين السحابي المشتركة. يمكن أيضًا استخدام طرق الأذونات في الملفات الفردية داخل مساحة تخزين سحابي مشتركة لمنح الأعضاء امتيازات إضافية أو السماح لغير الأعضاء بالتعاون في عناصر معيّنة.

لمزيد من المعلومات ورمز نموذجي، يُرجى الاطّلاع على مشاركة الملفات والمجلدات ومساحات التخزين السحابي.

إدارة مساحات التخزين السحابي المشتركة بصفتك مشرف نطاق

طبِّق المَعلمة useDomainAdminAccess مع الموردَين drives وpermissions لإدارة مساحات التخزين السحابي المشتركة على مستوى المؤسسة.

يجب أن يكون لدى المستخدمين الذين يستدعون هذه الطرق مع useDomainAdminAccess=true امتياز المشرف Drive and Docs . يمكن للمشرفين البحث عن مساحات التخزين السحابي المشتركة أو تعديل أذونات مساحات التخزين السحابي المشتركة التي تملكها مؤسستهم، بغض النظر عن عضوية المشرف في أي مساحة تخزين سحابي مشتركة معيّنة.

عند استخدام حسابات الخدمة، قد تحتاج إلى انتحال صفة مشرف مصادَق عليه باستخدام انتحال صفة حساب الخدمة. يُرجى العِلم أنّ حسابات الخدمة لا تنتمي إلى نطاقك على Google Workspace، على عكس حسابات المستخدمين. إذا شاركت مواد Google Workspace، مثل المستندات أو الأحداث، مع نطاق Google Workspace بالكامل، لن تتم مشاركتها مع حسابات الخدمة. لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على حسابات الخدمة.

استرداد مساحة تخزين سحابي مشتركة لا تتضمّن منظِّمًا

توضّح عينة التعليمات البرمجية التالية كيفية استرداد مساحات التخزين السحابي المشتركة التي لم تعُد تتضمّن منظِّمًا.

جافا

drive/snippets/drive_v3/src/main/java/RecoverDrive.java
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.DriveScopes;
import com.google.api.services.drive.model.Drive;
import com.google.api.services.drive.model.DriveList;
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 Drive's shared drive without an organizer. */
public class RecoverDrive {

  /**
   * Find all shared drives without an organizer and add one.
   *
   * @param realUser User's email id.
   * @return All shared drives without an organizer.
   * @throws IOException if shared drive not found.
   */
  public static List<Drive> recoverDrives(String realUser)
      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.*/
    GoogleCredentials credentials =
        GoogleCredentials.getApplicationDefault().createScoped(Arrays.asList(DriveScopes.DRIVE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    com.google.api.services.drive.Drive service =
        new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            requestInitializer)
            .setApplicationName("Drive samples")
            .build();
    List<Drive> drives = new ArrayList<Drive>();

    // Find all shared drives without an organizer and add one.
    // Note: This example does not capture all cases. Shared drives
    // that have an empty group as the sole organizer, or an
    // organizer outside the organization are not captured. A
    // more exhaustive approach would evaluate each shared drive
    // and the associated permissions and groups to ensure an active
    // organizer is assigned.
    String pageToken = null;
    Permission newOrganizerPermission = new Permission()
        .setType("user")
        .setRole("organizer");

    newOrganizerPermission.setEmailAddress(realUser);


    do {
      DriveList result = service.drives().list()
          .setQ("organizerCount = 0")
          .setFields("nextPageToken, drives(id, name)")
          .setUseDomainAdminAccess(true)
          .setPageToken(pageToken)
          .execute();
      for (Drive drive : result.getDrives()) {
        System.out.printf("Found drive without organizer: %s (%s)\n",
            drive.getName(), drive.getId());
        // Note: For improved efficiency, consider batching
        // permission insert requests
        Permission permissionResult = service.permissions()
            .create(drive.getId(), newOrganizerPermission)
            .setUseDomainAdminAccess(true)
            .setSupportsAllDrives(true)
            .setFields("id")
            .execute();
        System.out.printf("Added organizer permission: %s\n",
            permissionResult.getId());

      }

      drives.addAll(result.getDrives());

      pageToken = result.getNextPageToken();
    } while (pageToken != null);

    return drives;
  }
}

Python

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


def recover_drives(real_user):
  """Find all shared drives without an organizer and add one.
  Args:
      real_user:User ID for the new organizer.
  Returns:
      drives object

  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)

    drives = []

    # pylint: disable=maybe-no-member
    page_token = None
    new_organizer_permission = {
        "type": "user",
        "role": "organizer",
        "emailAddress": "user@example.com",
    }
    new_organizer_permission["emailAddress"] = real_user

    while True:
      response = (
          service.drives()
          .list(
              q="organizerCount = 0",
              fields="nextPageToken, drives(id, name)",
              useDomainAdminAccess=True,
              pageToken=page_token,
          )
          .execute()
      )
      for drive in response.get("drives", []):
        print(
            "Found shared drive without organizer: "
            f"{drive.get('title')}, {drive.get('id')}"
        )
        permission = (
            service.permissions()
            .create(
                fileId=drive.get("id"),
                body=new_organizer_permission,
                useDomainAdminAccess=True,
                supportsAllDrives=True,
                fields="id",
            )
            .execute()
        )
        print(f'Added organizer permission: {permission.get("id")}')

      drives.extend(response.get("drives", []))
      page_token = response.get("nextPageToken", None)
      if page_token is None:
        break

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

  return drives


if __name__ == "__main__":
  recover_drives(real_user="gduser1@workspacesamples.dev")

Node.js

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

/**
 * Finds all shared drives without an organizer and adds one.
 * @param {string} userEmail The email of the user to assign ownership to.
 * @return {Promise<object[]>} A list of the recovered drives.
 */
async function recoverDrives(userEmail) {
  // 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});

  // The permission to add to the shared drive.
  const newOrganizerPermission = {
    type: 'user',
    role: 'organizer',
    emailAddress: userEmail, // e.g., 'user@example.com'
  };

  // List all shared drives with no organizers.
  const result = await service.drives.list({
    q: 'organizerCount = 0',
    fields: 'nextPageToken, drives(id, name)',
    useDomainAdminAccess: true,
  });

  // Add the new organizer to each found shared drive.
  for (const drive of result.data.drives ?? []) {
    if (!drive.id) {
      continue;
    }

    console.log('Found shared drive without organizer:', drive.name, drive.id);
    await service.permissions.create({
      requestBody: newOrganizerPermission,
      fileId: drive.id,
      useDomainAdminAccess: true,
      supportsAllDrives: true,
      fields: 'id',
    });
  }
  return result.data.drives ?? [];
}

PHP

drive/snippets/drive_v3/src/DriveRecoverDrives.php
<?php
use Google\Client;
use Google\Service\Drive;
use Ramsey\Uuid\Uuid;
function recoverDrives()
{
   try {
    $client = new Client();
    $client->useApplicationDefaultCredentials();
    $client->addScope(Drive::DRIVE);
    $driveService = new Drive($client);

    $realUser = readline("Enter user email address: ");

    $drives = array();
    // Find all shared drives without an organizer and add one.
    // Note: This example does not capture all cases. Shared drives
    // that have an empty group as the sole organizer, or an
    // organizer outside the organization are not captured. A
    // more exhaustive approach would evaluate each shared drive
    // and the associated permissions and groups to ensure an active
    // organizer is assigned.
    $pageToken = null;
    $newOrganizerPermission = new Drive\Permission(array(
        'type' => 'user',
        'role' => 'organizer',
        'emailAddress' => 'user@example.com'
    ));
    $newOrganizerPermission['emailAddress'] = $realUser;
    do {
        $response = $driveService->drives->listDrives(array(
            'q' => 'organizerCount = 0',
            'fields' => 'nextPageToken, drives(id, name)',
            'useDomainAdminAccess' => true,
            'pageToken' => $pageToken
        ));
        foreach ($response->drives as $drive) {
            printf("Found shared drive without organizer: %s (%s)\n",
                $drive->name, $drive->id);
            $permission = $driveService->permissions->create($drive->id,
                $newOrganizerPermission,
                array(
                    'fields' => 'id',
                    'useDomainAdminAccess' => true,
                    'supportsAllDrives' => true
                ));
            printf("Added organizer permission: %s\n", $permission->id);
        }
        array_push($drives, $response->drives);
        $pageToken = $response->pageToken;
    } while ($pageToken != null);
    return $drives;
   } catch(Exception $e) {
      echo "Error Message: ".$e;
   }
}

NET.

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

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive's shared drive without an organizer.
    public class RecoverDrives
    {
        /// <summary>
        /// Find all shared drives without an organizer and add one.
        /// </summary>
        /// <param name="realUser">User ID for the new organizer.</param>
        /// <returns>all shared drives without an organizer.</returns>
        public static IList<Drive> DriveRecoverDrives(string realUser)
        {
            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 drives = new List<Drive>();
                // Find all shared drives without an organizer and add one.
                // Note: This example does not capture all cases. Shared drives
                // that have an empty group as the sole organizer, or an
                // organizer outside the organization are not captured. A
                // more exhaustive approach would evaluate each shared drive
                // and the associated permissions and groups to ensure an active
                // organizer is assigned.
                string pageToken = null;
                var newOrganizerPermission = new Permission()
                {
                    Type = "user",
                    Role = "organizer",
                    EmailAddress = realUser
                };

                do
                {
                    var request = service.Drives.List();
                    request.UseDomainAdminAccess = true;
                    request.Q = "organizerCount = 0";
                    request.Fields = "nextPageToken, drives(id, name)";
                    request.PageToken = pageToken;
                    var result = request.Execute();
                    foreach (var drive in result.Drives)
                    {
                        Console.WriteLine(("Found abandoned shared drive: {0} ({1})",
                            drive.Name, drive.Id));
                        // Note: For improved efficiency, consider batching
                        // permission insert requests
                        var permissionRequest = service.Permissions.Create(
                            newOrganizerPermission,
                            drive.Id
                        );
                        permissionRequest.UseDomainAdminAccess = true;
                        permissionRequest.SupportsAllDrives = true;
                        permissionRequest.Fields = "id";
                        var permissionResult = permissionRequest.Execute();
                        Console.WriteLine("Added organizer permission: {0}", permissionResult.Id);
                    }

                    pageToken = result.NextPageToken;
                } while (pageToken != null);

                return drives;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

منع المستخدمين من تنزيل ملفك أو طباعته أو نسخه

يمكنك الحدّ من كيفية تنزيل المستخدمين للملفات وطباعتها ونسخها داخل مساحات التخزين السحابي المشتركة.

لتحديد ما إذا كان بإمكان المستخدم تغيير قيود التنزيل التي يفرضها المنظِّم على مساحة تخزين سحابي مشتركة، تحقَّق من الحقل المنطقي capabilities.canChangeDownloadRestriction. إذا تم ضبط capabilities.canChangeDownloadRestriction على true، يمكن تطبيق قيود التنزيل على مساحة التخزين السحابي المشتركة. لمزيد من المعلومات، يُرجى الاطّلاع على فهم إمكانات الملفات.

يحتوي المورد drives على مجموعة من الحقول المنطقية restrictions التي تُستخدم للإشارة إلى ما إذا كان يمكن تنفيذ إجراء معيّن على مساحة تخزين سحابي مشتركة. تنطبق القيود على مساحة تخزين سحابي مشتركة أو على العناصر داخل مساحة التخزين السحابي المشتركة. يمكن ضبط القيود باستخدام الطريقة drives.update.

لتطبيق قيود التنزيل على مساحة تخزين سحابي مشتركة، يمكن لمدير مساحة التخزين السحابي المشتركة ضبط الحقل restrictions.downloadRestriction في مورد drives باستخدام DownloadRestriction الكائن. يؤدي ضبط الحقل المنطقي restrictedForReaders على true إلى الإعلان عن أنّ التنزيل والنسخ محظوران على القرّاء. يؤدي ضبط الحقل المنطقي restrictedForWriters على true إلى الإعلان عن أنّ التنزيل والنسخ محظوران على الكتّاب. يُرجى العِلم أنّه إذا كان الحقل restrictedForWriters هو true، يكون التنزيل والنسخ محظورَين أيضًا على القرّاء. وبالمثل، فإنّ ضبط restrictedForWriters على true وrestrictedForReaders على false يعادل ضبط كل من restrictedForWriters وrestrictedForReaders على true.

التوافق مع الإصدارات السابقة

مع طرح الكائن DownloadRestriction، تم تعديل وظيفة الحقل المنطقي restrictions.copyRequiresWriterPermission.

الآن، يؤدي ضبط restrictions.copyRequiresWriterPermission على true إلى تعديل restrictedForReaders الحقل المنطقي في الكائن DownloadRestriction إلى true للإعلان عن أنّ التنزيل والنسخ محظوران على القرّاء.

يؤدي ضبط الحقل copyRequiresWriterPermission على false إلى تعديل كل من الحقلَين restrictedForWriters وrestrictedForReaders إلى false. وهذا يعني إزالة إعدادات حظر التنزيل أو النسخ لجميع المستخدمين.

الحقول التي تتحكّم في ميزات التنزيل والطباعة والنسخ

يسرد الجدول التالي drives حقول مورد التي تؤثر في وظائف التنزيل والطباعة والنسخ:

الحقل الوصف الإصدار
capabilities.canCopy ما إذا كان بإمكان المستخدم الحالي نسخ الملفات في مساحة تخزين سحابي مشتركة الإصداران v2 وv3
capabilities.canDownload ما إذا كان بإمكان المستخدم الحالي تنزيل الملفات في مساحة تخزين سحابي مشتركة الإصداران v2 وv3
capabilities.canChangeCopyRequiresWriterPermission ما إذا كان بإمكان المستخدم الحالي تغيير قيد copyRequiresWriterPermission لمساحة تخزين سحابي مشتركة الإصداران v2 وv3
capabilities.canResetDriveRestrictions ما إذا كان بإمكان المستخدم الحالي إعادة ضبط قيود مساحة التخزين السحابي المشتركة على الإعدادات التلقائية الإصداران v2 وv3
capabilities.canChangeDownloadRestriction ما إذا كان بإمكان المستخدم الحالي تغيير قيد التنزيل لمساحة تخزين سحابي مشتركة الإصدار v3 فقط
restrictions.copyRequiresWriterPermission ما إذا كانت خيارات نسخ الملفات أو طباعتها أو تنزيلها داخل مساحة تخزين سحابي مشتركة غير مفعّلة للقرّاء والمعلِّقين عندما تكون القيمة true، يتم ضبط الحقل الذي يحمل الاسم نفسه على true لأي ملف داخل مساحة التخزين السحابي المشتركة هذه. الإصداران v2 وv3
restrictions.downloadRestriction قيود التنزيل التي يفرضها مديرو مساحات التخزين السحابي المشتركة الإصدار v3 فقط

حدود المجلدات

تفرض مساحات التخزين السحابي المشتركة بعض الحدود القصوى على مساحة التخزين. لمزيد من المعلومات، يُرجى الاطّلاع على حدود مساحة التخزين السحابي المشتركة في Google Drive.

الحد الأقصى لعدد العناصر

يبلغ الحد الأقصى لعدد عناصر كل مساحة تخزين سحابي مشتركة لكل مستخدم 500,000 عنصر، بما في ذلك الملفات والمجلدات والاختصارات.

عند الوصول إلى هذا الحدّ الأقصى، لن تتمكّن مساحة التخزين السحابي المشتركة من قبول العناصر بعد ذلك. لمواصلة تلقّي الملفات، على المستخدمين حذف العناصر نهائيًا من مساحة التخزين السحابي المشتركة. يُرجى العِلم أنّ العناصر في المهملات تُحتسب ضمن الحدّ الأقصى، ولكن لا تُحتسب العناصر المحذوفة نهائيًا. لمزيد من المعلومات، يُرجى الاطّلاع على نقل الملفات والمجلدات إلى المهملات أو حذفها.

الحد الأقصى لعمق المجلد

لا يمكن أن يحتوي مجلد في مساحة تخزين سحابي مشتركة على أكثر من 100 مستوى من المجلدات المُدمجة. وهذا يعني أنّه لا يمكن تخزين مجلد فرعي ضمن مجلد يزيد عمقه عن 99 مستوى. لا ينطبق هذا القيد إلا على المجلدات الفرعية.

تؤدي محاولات إضافة أكثر من 100 مستوى من المجلدات إلى عرض استجابة رمز حالة teamDriveHierarchyTooDeep HTTP.