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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

نشر الأذونات

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

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

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

وعلى النقيض، يمكن إلغاء الأذونات الموروثة على ملف أو مجلد في Google Drive. لذلك، إذا كان أحد الملفات يكتسب role=writer من ملف مجلد Drive، يمكنك ضبط 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
  }
}

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

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

لتحديد مصدر الدور في مساحة تخزين سحابي مشتركة أو عناصر داخلها القيادة، أو الاتصال بالرقم 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;
        }
    }
}