مشاركة الملفات والمجلدات ومحركات الأقراص

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

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

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

هناك خمسة أنواع مختلفة من سيناريوهات المشاركة:

  1. لمشاركة ملف في "ملفاتي"، يجب أن يكون لدى المستخدم role=writer أو role=owner.

  2. لمشاركة مجلد في "ملفاتي"، يجب أن يكون لدى المستخدم role=writer أو role=owner.

    • في حال ضبط القيمة المنطقية writersCanShare على False للملف، يجب أن يمتلك المستخدم role=owner الأكثر تساهلاً.

    • لا يُسمح بالوصول المؤقت (محكومًا بتاريخ ووقت انتهاء الصلاحية) في مجلدات "ملفاتي" التي تتضمن role=writer. للحصول على مزيد من المعلومات، يمكنك الاطّلاع على ضبط تاريخ انتهاء صلاحية للحد من إمكانية الوصول إلى الملفات.

  3. لمشاركة ملف في مساحة تخزين سحابي مشتركة، يجب أن يكون لدى المستخدم role=writer أو role=fileOrganizer أو role=organizer.

    • لا ينطبق الإعداد writersCanShare على العناصر في مساحات التخزين السحابي المشتركة. ويتم التعامل معها كما لو كانت مضبوطة دائمًا على True.
  4. لمشاركة مجلد في مساحة تخزين سحابي مشتركة، يجب أن يكون لدى المستخدم role=organizer.

    • في حال ضبط القيد sharingFoldersRequiresOrganizerPermission على مساحة تخزين سحابي مشتركة على False، يمكن للمستخدمين الذين لديهم role=fileOrganizer مشاركة المجلدات في مساحة التخزين السحابي المشتركة هذه.
  5. لإدارة عضوية مساحة التخزين السحابي المشتركة، يجب أن يكون لدى المستخدم role=organizer. يمكن للمستخدمين والمجموعات فقط أن يكونوا أعضاء في مساحات Drive المشتركة.

تحديد تاريخ انتهاء صلاحية للحدّ من إمكانية الوصول إلى الملفات

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

لضبط تاريخ انتهاء الصلاحية:

يشير الحقل expirationTime إلى وقت انتهاء صلاحية الإذن باستخدام RFC 3339 date-time . هناك قيود مفروضة على أوقات انتهاء الصلاحية:

  • ولا يمكن ضبطها إلا على أذونات المستخدمين والمجموعات.
  • يجب أن يكون الوقت في المستقبل.
  • لا يمكن أن يكون هذا الوقت أكثر من سنة في المستقبل.

للحصول على مزيد من المعلومات حول تاريخ انتهاء الصلاحية، يُرجى الاطّلاع على المقالات التالية:

نشر الإذن

يتم نشر قوائم الأذونات لمجلد لأسفل، وتكتسب جميع الملفات والمجلدات الفرعية الأذونات من المجلد الرئيسي. عند تغيير الأذونات أو التدرج الهرمي، يحدث النشر بشكل متكرر في جميع المجلدات المتداخلة. على سبيل المثال، إذا كان هناك ملف في مجلد ثم نقل هذا المجلد داخل مجلد آخر، سيتم نشر الأذونات في المجلد الجديد لهذا الملف. إذا يمنح المجلد الجديد مستخدم الملف دورًا جديدًا، مثل "كاتب"، فسيتم إلغاء دوره القديم.

وبالعكس، إذا كان الملف يكتسب role=writer من مجلد، وتم نقله إلى مجلد آخر يوفر دور "القارئ"، سيكتسب الملف الآن role=reader.

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

وفي المقابل، يمكن إلغاء الأذونات المكتسَبة في ملف أو مجلد في "ملفاتي". لذلك، إذا كان الملف يتضمّن role=writer من مجلد في "ملفاتي"، يمكنك ضبط role=reader في الملف لتقليل مستوى الإذن.

الإمكانات

لا يحدِّد مورد الأذونات في النهاية قدرة المستخدم الحالي على تنفيذ إجراءات على ملف أو مجلد. بدلاً من ذلك، يحتوي مورد الملفات على مجموعة من حقول capabilities المنطقية المستخدَمة للإشارة إلى ما إذا كان يمكن تنفيذ إجراء معيّن على ملف أو مجلد. تضبط Google Drive API هذه الحقول استنادًا إلى مورد أذونات المستخدم الحالي المرتبط بالملف أو المجلد.

على سبيل المثال، عندما يسجّل أليكس الدخول إلى تطبيقك ويحاول مشاركة ملف ما، يتم التحقق من دور "أليكس" بحثًا عن أذونات في الملف. إذا كان الدور يسمح له بمشاركة ملف، سيتم ملء capabilities المتعلقة بالملف، مثل canShare، في ما يتعلق بالدور. إذا أراد "أليكس" مشاركة الملف، سيتحقّق تطبيقك من capabilities للتأكّد من ضبط canShare على true.

للاطلاع على مثال لاسترداد الملف capabilities، راجع التحقق من أذونات المستخدم.

إنشاء إذن

الحقلان التاليان ضروريان عند إنشاء إذن:

  • type: يحدد type نطاق الإذن (user، أو group، أو domain، أو anyone). ويسري الإذن الذي يتم منحه في type=user على مستخدم محدّد، بينما ينطبق الإذن الذي يتم منح type=domain به على جميع المستخدمين في نطاق معيَّن.

  • role - يحدد الحقل role العمليات التي يمكن أن تنفذها type. على سبيل المثال، يؤدي الحصول على إذن مع type=user وrole=reader إلى منح مستخدم معيّن الإذن بالاطّلاع على الملف أو المجلد. بدلاً من ذلك، يسمح الإذن مع type=domain وrole=commenter لجميع المستخدمين في النطاق بإضافة تعليقات إلى الملف. للحصول على قائمة كاملة بالأدوار والعمليات التي يسمح بها كل منها، يُرجى الرجوع إلى الأدوار والأذونات.

عند إنشاء إذن في المكان type=user أو type=group، عليك أيضًا توفير emailAddress لربط المستخدم أو المجموعة المحددة بالإذن.

عند إنشاء إذن في المكان type=domain، يجب أيضًا توفير domain لربط نطاق معين بالإذن.

لإنشاء إذن، عليك اتّباع الخطوات التالية:

  1. استخدِم طريقة permissions.create مع fileId للملف أو المجلد المرتبط.
  2. في نص الطلب، حدِّد type وrole.
  3. إذا كانت السمة type=user أو السمة type=group، يجب تقديم emailAddress. إذا كانت السمة type=domain، قدِّم السمة domain.

عرض مثال

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

طلب

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

الردّ

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

استخدام الجماهير المستهدفة

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

لاستخدام ميزة الجماهير المستهدفة:

  1. في "وحدة تحكّم المشرف في Google"، انتقِل إلى القائمة > الدليل > الجماهير المستهدفة.

    الانتقال إلى صفحة "الجماهير المستهدفة"

    يجب تسجيل الدخول باستخدام حساب يمتلك امتيازات مشرف متميز لهذه المهمة.

  2. في قائمة الجماهير المستهدفة، انقر على اسم الجمهور المستهدف. لإنشاء جمهور مستهدف، يُرجى الاطّلاع على مقالة إنشاء جمهور مستهدف

  3. انسخ المعرّف الفريد من عنوان URL للجمهور المستهدف: https://admin.google.com/ac/targetaudiences/ID.

  4. أنشِئ إذنًا باستخدام type=domain واضبط الحقل domain على ID.audience.googledomains.com.

لعرض كيفية تفاعل المستخدمين مع الجماهير المستهدفة، راجع تجربة المستخدم للمشاركة باستخدام رابط .

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

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

عرض مثال

يوضّح نموذج الرمز التالي كيفية الحصول على جميع الأذونات. تعرض الاستجابة قائمة بالأذونات.

طلب

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions

الردّ

{
  "kind": "drive#permissionList",
  "permissions": [
    {
      "id": "PERMISSION_ID",
      "type": "user",
      "kind": "drive#permission",
      "role": "commenter"
    }
  ]
}

التحقّق من أذونات المستخدمين

وعندما يفتح تطبيقك ملفًا، يجب أن يتحقق من إمكانات الملف ويعرض واجهة المستخدم لتعكس أذونات المستخدم الحالي. على سبيل المثال، إذا لم تكن لدى المستخدم إمكانية canComment في الملف، يجب إيقاف إمكانية التعليق في واجهة المستخدم.

لمزيد من المعلومات عن capabilities، يُرجى الاطّلاع على قسم الإمكانات أعلاه.

للتحقق من الإمكانيات، اطلب files.get مع ضبط المَعلمة fileId والمَعلمة fields على الحقل capabilities. للحصول على مزيد من المعلومات حول عرض الحقول باستخدام المَعلمة fields، يمكنك الاطّلاع على عرض حقول خاصة بملف.

عرض مثال

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

طلب

GET https://www.googleapis.com/drive/v3/files/FILE_ID?fields=capabilities

الردّ

{
  "capabilities": {
    "canAcceptOwnership": false,
    "canAddChildren": false,
    "canAddMyDriveParent": false,
    "canChangeCopyRequiresWriterPermission": true,
    "canChangeSecurityUpdateEnabled": false,
    "canComment": true,
    "canCopy": true,
    "canDelete": true,
    "canDownload": true,
    "canEdit": true,
    "canListChildren": false,
    "canModifyContent": true,
    "canModifyContentRestriction": true,
    "canModifyLabels": true,
    "canMoveChildrenWithinDrive": false,
    "canMoveItemOutOfDrive": true,
    "canMoveItemWithinDrive": true,
    "canReadLabels": true,
    "canReadRevisions": true,
    "canRemoveChildren": false,
    "canRemoveMyDriveParent": true,
    "canRename": true,
    "canShare": true,
    "canTrash": true,
    "canUntrash": true
  }
}

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

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

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

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

عرض مثال

يوضّح نموذج الرمز التالي كيفية تحديد مصدر الدور. يتم عرض permissionDetails لمورد Permission في الاستجابة. يوفِّر الحقل 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. عليك استدعاء permissions.update مع الحصول على permissionId الإذن بالتغيير وfileId للملف أو المجلد أو مساحة التخزين السحابي المشتركة المرتبطة. للعثور على permissionId، استخدِم permissions.list مع fileId.

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

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

عرض مثال

يوضح نموذج التعليمة البرمجية التالي كيفية تغيير الأذونات في ملف أو مجلد من معلق إلى كاتب. تعرض الاستجابة مثيلاً من مورد Permission.

طلب

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

الردّ

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

إبطال الإذن بالوصول إلى ملف أو مجلد

لإبطال الوصول إلى ملف أو مجلد، يُرجى استدعاء delete مع fileId وpermissionId لحذف الإذن.

بالنسبة إلى العناصر الموجودة في "ملفاتي"، يمكن حذف إذن مكتسب. يؤدي حذف الإذن المكتسب إلى إبطال الوصول إلى العنصر والعناصر الفرعية، إن توفرت.

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

تُستخدَم عملية delete أيضًا لحذف الأذونات المطبَّقة مباشرةً على ملف أو مجلد على مساحة تخزين سحابي مشتركة.

عرض مثال

يعرض نموذج الرمز التالي كيفية إبطال إذن الوصول من خلال حذف permissionId. في حال نجاح هذا الإجراء، يكون نص الاستجابة فارغًا. لتأكيد إزالة الإذن، استخدِم permissions.list مع fileId.

طلب

DELETE https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID

نقل ملكية الملفات إلى حساب Google Workspace آخر في المؤسسة نفسها

يمكن نقل ملكية الملفات الحالية في "ملفاتي" من حساب Google Workspace إلى حساب آخر في المؤسسة نفسها. تمتلك المؤسسة التي تمتلك مساحة درايف مشتركة الملفات الموجودة بداخلها. لذلك، لا تتوفّر إمكانية نقل الملكية للملفات والمجلدات في مساحات التخزين السحابي المشتركة. يمكن لمنظمي مساحة التخزين السحابي المشتركة نقل العناصر من مساحة التخزين السحابي المشتركة هذه إلى "ملفاتي" الخاصة بهم والتي تنقل الملكية إليهم.

لنقل ملكية ملف في "ملفاتي"، يمكنك تنفيذ أحد الإجراءات التالية:

  • إنشاء إذن ملف يمنح مستخدِمًا معيّنًا (type=user) إذن وصول المالك (role=owner).

  • يمكنك تعديل إذن ملف حالي من خلال role=owner ونقل الملكية إلى المستخدم المحدّد (transferOwnership=true).

نقل ملكية الملفات من حساب مستهلك إلى آخر

يمكن نقل ملكية الملفات بين حساب مستهلك إلى آخر. ومع ذلك، لا تنقل خدمة Drive ملكية ملف بين حسابَين للمستهلكين حتى يوافق المالك الجديد المحتمل صراحةً على عملية النقل. لنقل ملكية الملف من حساب مستهلك إلى آخر:

  1. يبدأ المالك الحالي عملية نقل الملكية من خلال إنشاء أو تعديل إذن ملف المالك الجديد المحتمل. يجب أن يتضمّن الإذن هذه الإعدادات: role=writer وtype=user وpendingOwner=true. إذا كان المالك الجديد بصدد إنشاء إذن للمالك المحتمل، فسيتم إرسال إشعار عبر البريد الإلكتروني إلى المالك الجديد المحتمل للإشارة إلى أنه يُطلب منه افتراض ملكية الملف.

  2. يقبل المالك الجديد طلب نقل الملكية من خلال إنشاء إذن الملف أو تحديثه. يجب أن يتضمّن الإذن هذين الإعدادَين: role=owner وtransferOwnership=true. إذا كان المالك الجديد ينشئ إذنًا جديدًا، يتم إرسال إشعار عبر البريد الإلكتروني إلى المالك السابق يشير إلى أنه تم نقل الملكية.

عند نقل ملف، يتم خفض مستوى دور المالك السابق إلى writer.

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

ننصحك بشدة باستخدام الطلبات المجمّعة لتعديل أذونات متعددة.

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

لغة 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
from __future__ import print_function

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
/**
 * Batch permission modification
 * @param{string} fileId file ID
 * @param{string} targetUserEmail username
 * @param{string} targetDomainName domain
 * @return{list} permission id
 * */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const permissionIds = [];

  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // 'user@partner.com',
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // 'example.com',
    },
  ];
  // Note: Client library does not currently support HTTP batch
  // requests. When possible, use batched requests when inserting
  // multiple permissions on the same item. For this sample,
  // permissions are inserted serially.
  for (const permission of permissions) {
    try {
      const result = await service.permissions.create({
        resource: permission,
        fileId: fileId,
        fields: 'id',
      });
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } catch (err) {
      // TODO(developer): Handle failed permissions
      console.error(err);
    }
  }
  return permissionIds;
}

‫2,999

drive/snippets/drive_v3/src/DriveShareFile.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;
        }
    }
}