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

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

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

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

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

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

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

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

  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 بعد فترة من الوقت. بالنسبة إلى الملفات في "ملفاتي"، يمكنك ضبط تاريخ انتهاء صلاحية لتقييد إمكانية الوصول إلى هذا الملف أو إزالتها.

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

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

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

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

نشر الأذونات

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

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

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

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

الإمكانات

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

على سبيل المثال، عندما يسجّل أليكس الدخول إلى تطبيقك ويحاول مشاركة ملف، يتم التحقق من دور أليكس بحثًا عن أذونات في الملف. إذا كان الدور يسمح له بمشاركة ملف، سيتم ملء 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
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;
}

PHP

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