مشاركة الملفات والمجلدات ومساحات التخزين

يتضمّن كل ملف ومجلد ومساحة تخزين سحابي مشتركة في Google Drive مراجع مرتبطة permissions. يحدّد كل مرجع إذنًا خاصًا type (user وgroup وdomain وanyone) وrole (owner وorganizer وfileOrganizer وwriter وcommenter وreader). على سبيل المثال، قد يتضمّن ملف إذنًا يمنح مستخدمًا معيّنًا (type=user) إذن الوصول للقراءة فقط (role=reader)، بينما يمنح إذن آخر أعضاء مجموعة معيّنة (type=group) إمكانية إضافة تعليقات إلى ملف (role=commenter).

للحصول على قائمة كاملة بالأدوار والعمليات المسموح بها لكل دور، اطّلِع على الأدوار والأذونات.

كيفية نقل الأذونات

تنتقل الأذونات نزولاً من المجلدات الرئيسية إلى جميع العناصر الفرعية:

  • الأذونات المطبَّقة تلقائيًا: يتم تلقائيًا تطبيق أذونات المجلد الرئيسي على جميع الملفات والمجلدات الفرعية.
  • لا يمكن تقليلها على العناصر الفرعية: لا يمكنك إزالة إذن موروث أو تقليله على عنصر فرعي. يجب إجراء التغييرات على المجلد الرئيسي الأصلي، أو يجب أن يستخدم المجلد إعدادات الوصول المحدود.
  • يمكن توسيع نطاقها على العناصر الفرعية: يمكن أن يمنح العنصر الفرعي دورًا أكثر تساهلاً، مثل منح إذن role=writer لملف داخل مجلد يمتلك فيه المستخدم إذن role=reader.
  • إعادة التقييم عند النقل: عند نقل عنصر إلى مجلد رئيسي جديد، تتم إعادة تقييم أذونات المجلد الرئيسي الجديد وتطبيقها على العنصر والعناصر التابعة له.

روابط الملفات والتحكّم في الوصول

عند مشاركة ملف أو مجلد مع مستخدم أو مجموعة محدّدة، لا يتغيّر عنوان URL الخاص بالوصول إلى الملف أو المجلد، ولا يتم إنشاء رابط فريد لكل مستخدم. بدلاً من ذلك، يحتوي العنصر على رابط واحد وثابت استنادًا إلى fileId.

يتحكّم Drive في إمكانية الوصول من خلال تقييم قائمة التحكم بالوصول الخاصة بالعنصر. عندما يحاول مستخدم فتح رابط، يتحقّق Drive من هويته المصادَق عليها مقارنةً بقائمة التحكّم بالوصول. في حال تم إبطال إذن أو انتهت صلاحيته، تتم إزالة المستخدم من قائمة التحكّم بالوصول. إذا حاول المستخدم الانتقال إلى الرابط مرة أخرى، سيحظر Drive الوصول إليه.

فهم إمكانات الملفات

يحدّد مصدر permissions مَن يمكنه الوصول (قائمة التحكّم بالوصول)، ولكنّه لا يشير مباشرةً إلى ما إذا كان بإمكان المستخدم الحالي تنفيذ إجراء معيّن في واجهة مستخدم تطبيقك.

بدلاً من ذلك، يحتوي مورد files على مجموعة من حقول capabilities المنطقية (مثل canComment أو canShare أو canDelete) التي تحسبها Google Drive API بشكل ديناميكي استنادًا إلى دور المستخدم وإعدادات العنصر.

الحصول على إمكانات الملف

عند عرض واجهة مستخدم تطبيقك، تحقَّق من files.capabilities بدلاً من تحليل الأذونات مباشرةً:

  • استدعِ طريقة files.get مع fields=capabilities. لمزيد من المعلومات، يُرجى الاطّلاع على عرض حقول معيّنة.
  • استخدِم علامات القيمة المنطقية التي تم إرجاعها لتفعيل الإجراءات المقابلة أو إيقافها في واجهتك. على سبيل المثال، يمكنك إيقاف التعليق إذا كانت قيمة canComment هي false.

سيناريوهات لمشاركة مراجع Drive

يعرض الجدول التالي الأدوار والشروط المطلوبة لمشاركة مراجعات Drive في مواقع جغرافية مختلفة وأنواع عناصر مختلفة:

الموقع الجغرافي العنصر الأدوار المطلوبة القيود الأساسية
ملفاتي الملف أو المجلد owner أو writer يتطلّب owner إذا كان writersCanShare=false.
تتطلّب إمكانية الوصول المؤقتة إلى المجلدات reader (راجِع تحديد تاريخ انتهاء الصلاحية).
مساحة تخزين سحابي مشتركة ملف organizer أو fileOrganizer أو writer يتم دائمًا التعامل مع writersCanShare على أنّه true.
مساحة تخزين سحابي مشتركة مجلد organizer يمكن أيضًا مشاركة fileOrganizer إذا كان sharingFoldersRequiresOrganizerPermission false.
مساحة تخزين سحابي مشتركة العضوية organizer ينطبق هذا الخصم على user أو group فقط (وليس على النطاقات).

إدارة الأذونات

يلخّص الجدول التالي الطرق المتاحة في المرجع permissions:

الطريقة نقطة النهاية لواجهة برمجة التطبيقات المَعلمات الرئيسية مراجع
الإنشاء POST https://www.googleapis.com/drive/v3/files/{fileId}/permissions role أو type أو emailAddress أو domain permissions.create
الحصول على GET https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} fields permissions.get
القائمة GET https://www.googleapis.com/drive/v3/files/{fileId}/permissions pageSize، supportsAllDrives، pageToken permissions.list
تعديل PATCH https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} role، allowFileDiscovery permissions.update
حذف DELETE https://www.googleapis.com/drive/v3/files/{fileId}/permissions/{permissionId} supportsAllDrives permissions.delete

إنشاء إذن

لمشاركة ملف أو مجلد أو مساحة تخزين سحابي مشتركة، استخدِم طريقة create في مصدر permissions مع fileId. يؤدي إنشاء إذن إلى إضافة إدخال جديد في قائمة التحكم بالوصول إلى العنصر وعرض permissionId تم تعيينه.

في نص الطلب، أدخِل الحقول التالية:

  • role: مستوى الوصول الذي سيتم منحه (على سبيل المثال، reader أو commenter أو writer). للاطّلاع على قائمة كاملة، راجِع الأدوار والأذونات.
  • type: نطاق المستفيد (user أو group أو domain أو anyone)
  • معرّف الجهة المانحة (مطلوب استنادًا إلى type):
    • emailAddress: هذه السمة مطلوبة عندما تكون قيمة type هي user أو group.
    • domain: مطلوبة عندما تكون قيمة type هي domain.

يوضّح نموذج الرمز البرمجي التالي كيفية إنشاء إذن. تعرض الاستجابة مثيلاً لمورد permissions، بما في ذلك permissionId المعيّن.

الطلب

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

الردّ

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

المشاركة مع شرائح الجمهور المستهدَفة

الجماهير المستهدفة هي مجموعات من الأشخاص، مثل الأقسام أو الفِرق، يمكنك اقتراحها للمستخدمين لمشاركة العناصر معها. يمكنك تشجيع المستخدمين على مشاركة العناصر مع جمهور مُعيَّن أو محدود بدلاً من المؤسسة بأكملها. يمكن أن تساعدك الجماهير المستهدفة في تحسين أمان بياناتك وخصوصيتها، وتسهيل مشاركتها بشكل مناسب.

للمشاركة مع جمهور مستهدَف، اضبط type=domain واضبط domain على <TARGET_AUDIENCE_ID>.audience.googledomains.com. للحصول على تفاصيل حول تحديد موقع الجماهير المستهدفة أو إنشائها في "وحدة تحكّم المشرف في Google"، اطّلِع على لمحة عن الجماهير المستهدفة.

لمعرفة كيفية تفاعل المستخدمين مع شرائح الجمهور المستهدَفة، اطّلِع على تجربة المستخدمين في ما يتعلّق بمشاركة الروابط.

الحصول على إذن

للحصول على إذن، استدعِ طريقة get على المورد permissions باستخدام مَعلمتَي المسار fileId وpermissionId. إذا كنت لا تعرف معرّف الإذن، عليك أولاً إدراج جميع الأذونات.

أذونات القائمة

لعرض قائمة بأذونات ملف أو مجلد أو مساحة تخزين سحابي مشتركة، استدعِ طريقة list في مورد permissions مع مَعلمة المسار fileId المطلوبة.

يمكنك تضمين أيّ من مَعلمات طلب البحث الاختيارية التالية لتقسيم الردّ إلى صفحات أو فلترته:

  • pageSize (اختياري): الحدّ الأقصى لعدد الأذونات التي سيتم عرضها في كل صفحة. إذا لم يتم ضبطها للملفات في مساحة تخزين سحابي مشتركة، سيتم عرض 100 نتيجة كحد أقصى. إذا لم يتم ضبطها للملفات غير الموجودة في مساحة تخزين سحابي مشتركة، سيتم عرض القائمة بأكملها.

  • pageToken (اختياري): رمز مميّز للصفحة من طلب قائمة سابق لاسترداد الصفحة التالية.

  • supportsAllDrives (اختياري): ما إذا كان التطبيق الذي يطلب الإذن يتيح استخدام كل من &quot;ملفاتي&quot; ومساحات التخزين السحابي المشتركة.

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

  • includePermissionsForView (اختياري): أذونات العرض الإضافية التي سيتم تضمينها في الرد. يُسمح فقط بالقيمة published.

  • fields (اختياري): الحقول المحدّدة التي سيتم عرضها في الردّ. تُرجع الدالة list تلقائيًا id وtype وkind وrole فقط. لعرض حقول إضافية (مثل permissionDetails)، حدِّدها باستخدام هذه المَعلمة. لمزيد من المعلومات، يُرجى الاطّلاع على عرض حقول معيّنة.

تحديد مصدر الدور

لتغيير الدور في ملف أو مجلد، يجب معرفة مصدر الدور. بالنسبة إلى مساحات التخزين السحابي المشتركة، يمكن أن يستند مصدر الدور إلى العضوية في مساحة التخزين السحابي المشتركة أو الدور في مجلد أو الدور في ملف.

لتحديد مصدر الدور لمساحة تخزين سحابي مشتركة أو العناصر داخلها، استدعِ طريقة get في مورد permissions باستخدام مَعلمتَي المسار fileId وpermissionId، مع ضبط المَعلمة fields على الحقل permissionDetails.

للعثور على permissionId، استخدِم طريقة list في مورد permissions مع مَعلمة المسار fileId. لاسترداد حقل permissionDetails في طلب list، اضبط المَعلمة fields على permissions/permissionDetails.

يسرد هذا الحقل جميع أذونات الملفات المكتسَبة والمباشرة للمستخدم أو المجموعة أو النطاق.

توضح عينة التعليمات البرمجية التالية كيفية تحديد مصدر الدور. يعرض الردّ permissionDetails لمورد permissions. يوفّر الحقل inheritedFrom معرّف العنصر الذي يتم اكتساب الإذن منه.

الطلب

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

الردّ

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

تعديل إذن

لتعديل الأذونات في ملف أو مجلد، يمكنك تغيير الدور المعيّن. لمزيد من المعلومات حول العثور على مصدر الدور، راجِع تحديد مصدر الدور.

  1. استدعِ طريقة update في المورد permissions مع ضبط المَعلمة fileId للمسار على الملف أو المجلد أو مساحة التخزين السحابي المشتركة المرتبطة، وضبط المَعلمة permissionId للمسار على الإذن المطلوب تغييره. للعثور على permissionId، استخدِم طريقة list في مورد permissions مع مَعلمة المسار fileId.

  2. في الطلب، حدِّد role الجديد.

يمكنك منح أذونات في ملفات أو مجلدات فردية في مساحة تخزين سحابي مشتركة حتى إذا كان المستخدم أو المجموعة عضوًا فيها. على سبيل المثال، يملك "أحمد" role=commenter كجزء من عضويته في مساحة تخزين سحابي مشتركة. ومع ذلك، يمكن لتطبيقك منح Alex role=writer إذن الوصول إلى ملف في مساحة تخزين سحابي مشتركة. في هذه الحالة، وبما أنّ الدور الجديد يمنح أذونات أكثر من الدور الممنوح من خلال الاشتراك، يصبح الإذن الجديد هو الدور الفعّال للملف أو المجلد.

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

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

يوضّح نموذج الرمز البرمجي التالي كيفية تغيير الأذونات في ملف أو مجلد من commenter إلى writer. تعرض الاستجابة مثيلاً لمورد permissions.

الطلب

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

الردّ

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

تعديل أذونات متعددة باستخدام طلبات مجمّعة

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

يقيّم Drive أذونات أحد العناصر ويعدّلها كقائمة تحكّم بالوصول واحدة. تتسبّب العمليات المتزامنة في حدوث حالات تعارض حيث "يفوز آخر تعديل"، ما قد يؤدي إلى استبدال تغييرات الأذونات بدون تنبيه أو إلى ظهور أخطاء sharingRateLimitExceeded.

لتجنُّب حدوث تعارضات، نفِّذ تغييرات الأذونات على العنصر نفسه بالتسلسل، أو استخدِم طلبات مجمّعة لتعديل أذونات متعددة في طلب واحد.

في ما يلي مثال على إجراء تعديل مجمّع للأذونات باستخدام مكتبة برامج.

جافا

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;
        }
    }
}

حذف إذن

لإبطال إذن الوصول إلى ملف أو مجلد، استخدِم طريقة delete في المورد permissions مع مَعلمتَي المسار fileId وpermissionId.

لا يمكن إبطال الأذونات المكتسبة مباشرةً على العناصر الفرعية. يمكنك تعديل الإذن أو حذفه في المجلد الرئيسي بدلاً من ذلك (أو استخدام إعدادات الوصول المحدود).

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

تحديد تاريخ انتهاء الصلاحية

لمنح إذن وصول مؤقت إلى ملف أو مجلد، اضبط الحقل expirationTime (RFC 3339 date-time) عند استدعاء الطريقتَين create أو update.

تنطبق القيود التالية على أوقات انتهاء الصلاحية:

  • يمكن ضبطها فقط على أذونات user وgroup (وليس domain أو anyone).
  • يجب أن يكون الوقت في المستقبل، لمدة عام واحد كحد أقصى.
  • بالنسبة إلى المجلدات، لا تتوفّر إمكانية الوصول المؤقت إلا لدور reader.