Bagikan file, folder & drive

Setiap file, folder, dan drive bersama Google Drive telah dikaitkan izin. Setiap resource mengidentifikasi izin untuk type tertentu (pengguna, grup, domain, siapa saja) dan role, seperti "pengomentar" atau "pembaca". Misalnya, sebuah file mungkin memiliki izin yang memberikan akses hanya baca kepada pengguna tertentu (type=user) (role=reader) sedangkan izin lainnya memberikan anggota grup tertentu (type=group) kemampuan untuk menambahkan komentar ke file (role=commenter).

Untuk daftar lengkap tentang peran dan operasi yang diizinkan oleh masing-masing peran, lihat Peran & izin akses.

Skenario untuk berbagi resource Drive

Ada lima jenis skenario berbagi:

  1. Untuk berbagi file di Drive Saya, pengguna harus memiliki role=writer atau role=owner.

  2. Untuk berbagi folder di Drive Saya, pengguna harus memiliki role=writer atau role=owner.

    • Jika nilai boolean writersCanShare ditetapkan ke False untuk file tersebut, pengguna harus memiliki role=owner yang lebih permisif.

    • Akses sementara (diatur menurut tanggal dan waktu habis masa berlaku) tidak diizinkan di folder Drive Saya dengan role=writer. Untuk selengkapnya informasi, lihat Tetapkan tanggal habis masa berlaku untuk membatasi akses file.

  3. Untuk berbagi file di drive bersama, pengguna harus memiliki role=writer, role=fileOrganizer, atau role=organizer.

    • Setelan writersCanShare tidak berlaku untuk item di drive bersama. Atribut ini diperlakukan seolah-olah selalu disetel ke True.
  4. Untuk berbagi folder di drive bersama, pengguna harus memiliki role=organizer.

    • Jika pembatasan sharingFoldersRequiresOrganizerPermission pada drive bersama disetel ke False, pengguna dengan role=fileOrganizer dapat membagikan folder di drive bersama tersebut.
  5. Untuk mengelola keanggotaan drive bersama, pengguna harus memiliki role=organizer. Hanya pengguna dan grup dapat menjadi anggota {i>drive<i} bersama.

Tetapkan tanggal habis masa berlaku untuk membatasi akses file

Ketika Anda bekerja dengan orang-orang pada proyek yang sensitif, Anda mungkin ingin membatasi akses mereka ke file tertentu di Drive setelah periode baik. Untuk file di Drive Saya, Anda dapat menyetel tanggal habis masa berlaku ke membatasi atau menghapus akses ke file tersebut.

Untuk menetapkan tanggal habis masa berlaku:

Kolom expirationTime menunjukkan kapan izin berakhir menggunakan RFC 3339 tanggal-waktu kami. Waktu habis masa berlaku memiliki batasan berikut:

  • Izin ini hanya dapat ditetapkan berdasarkan izin pengguna dan grup.
  • Waktu harus berada di masa mendatang.
  • Waktunya tidak boleh lebih dari setahun ke depan.

Untuk informasi selengkapnya tentang tanggal habis masa berlaku, lihat artikel berikut:

Penerapan izin

Daftar izin untuk folder menyebar ke bawah, dan semua file turunan dan folder mewarisi izin akses dari induknya. Kapan pun izin akses atau berubah, penyebaran terjadi secara rekursif melalui semua folder. Misalnya, jika sebuah file ada dalam folder dan folder tersebut kemudian dipindahkan di dalam folder lain, izin akses pada folder baru itu menyebar ke file tersebut. Jika folder baru memberikan peran baru kepada pengguna file, seperti "writer", ini mengganti peran lama.

Sebaliknya, jika file mewarisi role=writer dari folder, dan dipindahkan ke folder lain yang menyediakan "pembaca" , file kini mewarisi role=reader.

Izin yang diwarisi tidak dapat dihapus dari file atau folder di drive bersama. Sebaliknya, izin ini harus disesuaikan dengan izin akses langsung atau tidak langsung yang diwariskan. Izin yang diwarisi dapat dihapus dari item dalam "Drive Saya" atau "Dibagikan kepada saya".

Sebaliknya, izin yang diwarisi dapat diganti pada file atau folder di Mengemudi. Jadi, jika file mewarisi role=writer dari Drive, Anda dapat menetapkan role=reader pada file untuk menurunkan tingkat izin akses.

Kemampuan

Resource Izin pada akhirnya tidak menentukan kemampuan pengguna saat ini untuk melakukan tindakan pada file atau folder. Sebaliknya, resource Files berisi kumpulan Kolom capabilities boolean digunakan untuk menunjukkan apakah suatu tindakan dapat yang dijalankan pada file atau folder. Google Drive API menetapkan kolom ini berdasarkan sumber daya izin pengguna saat ini yang terkait dengan file atau folder.

Misalnya, saat Alex login ke aplikasi Anda dan mencoba membagikan file, peran Alex diperiksa izin akses pada file. Jika peran itu memungkinkan mereka untuk berbagi file, capabilities yang terkait dengan file tersebut, seperti canShare, diisi relatif terhadap peran. Jika Alex ingin membagikan file, aplikasi Anda akan memeriksa capabilities untuk memastikan canShare ditetapkan ke true.

Untuk contoh mengambil file capabilities, lihat Memverifikasi pengguna izin.

Membuat izin

Dua kolom berikut diperlukan saat membuat izin:

  • typetype mengidentifikasi cakupan izin (user, group, domain, atau anyone). Izin dengan type=user berlaku untuk pengguna tertentu, sementara izin dengan type=domain berlaku untuk semua orang di domain tertentu.

  • role—Kolom role mengidentifikasi operasi yang dapat dilakukan type. Sebagai contoh, izin dengan type=user dan role=reader memberikan pengguna tertentu akses {i>read-only<i} ke file atau folder. Atau, izin dengan type=domain dan role=commenter memungkinkan semua orang di domain menambahkan komentar ke file. Sebagai daftar lengkap peran dan operasi yang diizinkan oleh masing-masing peran, mengacu pada Peran & izin akses.

Saat membuat izin di mana type=user atau type=group, Anda juga harus sediakan emailAddress untuk mengaitkan pengguna atau grup tertentu untuk izin akses itu.

Saat membuat izin di mana type=domain, Anda juga harus memberikan domain untuk mengaitkan domain tertentu ke izin.

Untuk membuat izin:

  1. Gunakan metode permissions.create dengan fileId untuk file atau folder terkait.
  2. Dalam isi permintaan, tentukan type dan role.
  3. Jika type=user atau type=group, berikan emailAddress. Jika type=domain, menyediakan domain.

Tampilkan contoh

Contoh kode berikut menunjukkan cara membuat izin. Respons menampilkan instance resource Permission, termasuk permissionId yang ditetapkan.

Permintaan

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

Respons

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

Menggunakan audiens target

Target audiens adalah kelompok orang—seperti departemen atau tim—yang dapat rekomendasi kepada pengguna untuk membagikan item mereka. Anda dapat mendorong pengguna untuk membagikan item dengan audiens yang lebih spesifik atau terbatas daripada seluruh organisasi/pengaturan. Target audiens dapat membantu Anda meningkatkan keamanan dan privasi data Anda, dan memudahkan pengguna untuk berbagi dengan tepat. Untuk selengkapnya informasi, lihat Tentang target audiens kami.

Untuk menggunakan audiens target:

  1. Di konsol Google Admin, buka Menu &gt; Direktori &gt; Target audiens.

    Buka Target audiens

    Anda harus login menggunakan akun dengan hak istimewa administrator super untuk tugas ini.

  2. Di Daftar target audiens, klik nama target audiens. Kepada membuat target audiens, lihat Membuat target audiens

  3. Salin ID unik dari URL target audiens: https://admin.google.com/ac/targetaudiences/ID.

  4. Buat izin dengan type=domain, dan setel kolom domain ke ID.audience.googledomains.com.

Untuk melihat cara pengguna berinteraksi dengan target audiens, lihat Pengalaman pengguna untuk link berbagi kami.

Mengambil semua izin untuk file, folder, atau drive bersama

Gunakan metode permissions.list untuk mengambil semua izin untuk file, folder, atau drive bersama.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mendapatkan semua izin. Respons akan menampilkan daftar izin.

Permintaan

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

Respons

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

Memverifikasi izin pengguna

Saat aplikasi Anda membuka file, aplikasi harus memeriksa kemampuan file dan merender UI untuk mencerminkan izin akses pengguna saat ini. Misalnya, jika pengguna tidak memiliki kemampuan canComment pada file tersebut, kemampuan untuk memberi komentar harus dinonaktifkan di UI.

Untuk mengetahui informasi selengkapnya tentang capabilities, lihat Kemampuan di atas.

Untuk memeriksa kemampuannya, panggil files.get dengan parameter fileId dan fields yang disetel ke kolom capabilities. Sebagai informasi lebih lanjut tentang menampilkan kolom menggunakan parameter fields, lihat Menampilkan kolom tertentu untuk file.

Tampilkan contoh

Contoh kode berikut menunjukkan cara memverifikasi izin pengguna. Respons akan menampilkan daftar kemampuan yang dimiliki pengguna pada file tersebut. Setiap kemampuan berhubungan dengan tindakan terperinci yang dapat dilakukan pengguna. Beberapa kolom hanya diisi untuk item di drive bersama.

Permintaan

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

Respons

{
  "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
  }
}

Menentukan sumber peran untuk file drive bersama & folder

Untuk mengubah peran di file atau folder, Anda harus mengetahui sumber peran. Untuk drive bersama, sumber peran dapat didasarkan pada keanggotaan ke drive bersama {i>drive<i}, peran di folder, atau peran di file.

Untuk menentukan sumber peran di drive bersama, atau item di dalamnya mengemudi, panggil permissions.get dengan parameter fileId, permissionId, dan fields disetel ke Kolom permissionDetails. Untuk menemukan permissionId, gunakan permissions.list dengan fileId. Kepada mengambil kolom permissionDetails pada permintaan permissions.list, menyetel atribut fields ke permissions/permissionDetails.

Isian ini mencantumkan semua izin akses file yang diwariskan dan langsung untuk pengguna, grup, atau domain.

Tampilkan contoh

Contoh kode berikut menunjukkan cara menentukan sumber peran. Respons menampilkan permissionDetails dari resource Permission. Kolom inheritedFrom memberikan ID item tempat izin diwarisi.

Permintaan

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

Respons

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

Ubah izin

Untuk mengubah izin pada file atau folder, Anda dapat mengubah peran yang ditetapkan:

  1. Panggil permissions.update dengan permissionId dari izin yang akan diubah dan fileId untuk file, folder, atau drive bersama terkait. Untuk menemukan permissionId, gunakan permissions.list dengan fileId.

  2. Dalam permintaan, identifikasi role baru.

Anda dapat memberikan izin pada setiap file atau folder di drive bersama, bahkan jika pengguna atau grup sudah menjadi anggota. Misalnya, Alex memiliki role=commenter sebagai bagian dari keanggotaan mereka ke sebuah drive bersama. Namun, aplikasi Anda dapat memberi Alex role=writer untuk file di drive bersama. Dalam hal ini, karena peran baru lebih permisif daripada peran yang diberikan melalui keanggotaannya, izin akses menjadi peran efektif untuk file atau folder tersebut.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mengubah izin pada file atau folder dari pemberi komentar menjadi penulis. Respons menampilkan instance resource Permission.

Permintaan

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

Respons

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

Mencabut akses ke file atau folder

Untuk mencabut akses ke file atau folder, panggil delete dengan fileId dan permissionId untuk menghapus izin.

Untuk item di "Drive Saya", Anda dapat menghapus turunan izin akses. Menghapus izin yang diwarisi akan mencabut akses ke item dan item turunan, jika ada.

Untuk item di drive bersama, izin yang diwariskan tidak dapat dicabut. Perbarui atau mencabut izin akses di file atau folder induk.

Operasi delete juga digunakan untuk menghapus izin yang langsung diterapkan ke file atau folder drive bersama.

Tampilkan contoh

Contoh kode berikut menunjukkan cara mencabut akses dengan menghapus permissionId. Jika berhasil, isi respons akan kosong. Untuk mengonfirmasi bahwa izin dihapus, gunakan permissions.list dengan fileId.

Permintaan

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

Transfer kepemilikan file ke akun Google Workspace lain di organisasi yang sama

Kepemilikan file yang ada di "Drive Saya" dapat ditransfer dari satu akun Google Workspace ke akun lain di organisasi yang sama. Organisasi yang memiliki akun bersama {i>drive <i}memiliki file-file di dalamnya. Oleh karena itu, transfer kepemilikan tidak didukung untuk file dan folder di drive bersama. Pengelola drive bersama dapat memindahkan item dari drive bersama tersebut ke "Drive Saya" miliknya sendiri yang mana mentransfer kepemilikan kepada mereka.

Untuk mentransfer kepemilikan file di "Drive Saya", lakukan salah satu berikut ini:

  • Membuat izin file yang memberikan pengguna tertentu (type=user) akses pemilik (role=owner).

  • Perbarui izin file yang ada dengan role=owner, lalu transfer kepemilikan kepada pengguna yang ditentukan (transferOwnership=true).

Mentransfer kepemilikan file dari satu akun konsumen ke akun konsumen lainnya

Kepemilikan file dapat ditransfer antara satu akun konsumen ke akun konsumen lainnya. Namun, Drive tidak mentransfer kepemilikan file antara dua konsumen akun sampai calon pemilik baru secara eksplisit menyetujui pengalihan tersebut. Untuk mentransfer kepemilikan file dari satu akun konsumen ke akun konsumen lainnya:

  1. Pemilik saat ini memulai transfer kepemilikan dengan membuat atau memperbarui izin akses file calon pemilik baru. Izin akses harus mencakup setelan ini: role=writer, type=user, dan pendingOwner=true. Jika pemilik baru membuat izin untuk calon pemilik, melalui email pemberitahuan dikirim kepada calon pemilik baru yang menunjukkan bahwa mereka diminta untuk mengasumsikan kepemilikan file tersebut.

  2. Pemilik baru menyetujui permintaan transfer kepemilikan dengan membuat atau memperbarui izin akses file mereka. Izin harus menyertakan setelan berikut: role=owner dan transferOwnership=true. Jika pemilik baru membuat izin baru, notifikasi email akan dikirim ke pemilik sebelumnya yang menunjukkan bahwa kepemilikan telah ditransfer.

Saat file ditransfer, peran pemilik sebelumnya akan didowngrade menjadi writer.

Mengubah beberapa izin dengan permintaan batch

Kami sangat menyarankan penggunaan permintaan batch untuk mengubah beberapa izin akses.

Berikut ini adalah contoh cara melakukan modifikasi izin batch dengan library klien.

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