Dosya, klasör ve sürücü paylaşma

Her Google Drive dosyası, klasörü ve ortak Drive'ın ilişkili izinler kaynakları vardır. Her kaynak belirli bir type (kullanıcı, grup, alan, herkes) ve role (ör. "yorumcu" veya "okuyucu") için verilen izni tanımlar. Örneğin, bir dosya belirli bir kullanıcıya (type=user) salt okuma erişimi (role=reader) veren bir izne sahipken, başka bir izin belirli bir grubun (type=group) üyelerine bir dosyaya yorum ekleme (role=commenter) izni veriyor olabilir.

Rollerin ve her birinin izin verdiği işlemlerin tam listesi için Roller ve izinler bölümüne bakın.

Drive kaynaklarını paylaşmayla ilgili senaryolar

Beş farklı paylaşım senaryosu türü vardır:

  1. Kullanıcının Drive'ım bölümünde dosya paylaşabilmesi için role=writer veya role=owner öğesine sahip olması gerekir.

  2. Kullanıcının Drive'ım bölümündeki bir klasörü paylaşabilmesi için role=writer veya role=owner öğesine sahip olması gerekir.

    • writersCanShare boole değeri, dosya için False olarak ayarlanırsa kullanıcının daha geniş kapsamlı role=owner seçeneğine sahip olması gerekir.

    • role=writer içeren Drive'ım klasörlerinde geçici erişime (geçerlilik bitiş tarihi ve saatiyle yönetilen) izin verilmez. Daha fazla bilgi edinmek için Dosya erişimini sınırlamak için geçerlilik bitiş tarihi belirleme bölümünü inceleyin.

  3. Ortak Drive'daki bir dosyayı paylaşmak için kullanıcının role=writer, role=fileOrganizer veya role=organizer hesabına sahip olması gerekir.

    • writersCanShare ayarı, ortak Drive'lardaki öğeler için geçerli değildir. Bu seçenek, her zaman True olarak ayarlanmış gibi kabul edilir.
  4. Ortak Drive'daki bir klasörü paylaşabilmek için kullanıcının role=organizer ürününe sahip olması gerekir.

    • Bir ortak Drive'daki sharingFoldersRequiresOrganizerPermission kısıtlaması False olarak ayarlanırsa role=fileOrganizer erişimine sahip kullanıcılar bu ortak Drive'daki klasörleri paylaşabilir.
  5. Ortak Drive üyeliğini yönetebilmek için kullanıcının role=organizer hesabı olmalıdır. Yalnızca kullanıcılar ve gruplar ortak Drive'lara üye olabilir.

Dosya erişimini sınırlandırmak için geçerlilik bitiş tarihi belirleme

Hassas bir proje üzerinde kullanıcılarla birlikte çalışırken, bu kişilerin Drive'daki belirli dosyalara erişimini bir süre sonra kısıtlamak isteyebilirsiniz. Drive'ım bölümündeki dosyalara erişimi sınırlamak veya kaldırmak için bir geçerlilik bitiş tarihi belirleyebilirsiniz.

Geçerlilik bitiş tarihini ayarlamak için:

expirationTime alanı, RFC 3339 tarih-saati kullanılarak iznin ne zaman sona ereceğini belirtir. Sona erme süreleri için aşağıdaki kısıtlamalar geçerlidir:

  • Bunlar yalnızca kullanıcı ve grup izinlerinde ayarlanabilir.
  • Saat gelecekte olmalıdır.
  • Zaman, gelecekte bir yıldan fazla olamaz.

Geçerlilik bitiş tarihi hakkında daha fazla bilgi için aşağıdaki makalelere bakın:

İzin yayılımı

Bir klasörün izin listeleri aşağıya doğru yayılır ve tüm alt dosyalar ile klasörler, izinleri üst öğeden devralır. İzinler veya hiyerarşi her değiştirildiğinde, yayılma tüm iç içe yerleştirilmiş klasörlerde yinelemeli olarak gerçekleşir. Örneğin, bir dosya bir klasörde bulunuyorsa ve bu klasör daha sonra başka bir klasörün içine taşınırsa yeni klasördeki izinler dosyaya uygulanır. Yeni klasör, dosyanın kullanıcısına "yazar" gibi yeni bir rol verirse kullanıcının eski rolünü geçersiz kılar.

Buna karşılık, bir dosya bir klasörden role=writer değerini devralırsa ve "okuyucu" rolü sağlayan başka bir klasöre taşınırsa dosya artık role=reader değerini devralır.

Devralınan izinler, ortak Drive'daki bir dosya veya klasörden kaldırılamaz. Bunun yerine, bu izinlerin devralındıkları doğrudan veya dolaylı üst öğe üzerinde ayarlanması gerekir. Devralınan izinler, "Drive'ım" veya "Benimle paylaşılanlar" bölümündeki öğelerden kaldırılabilir.

Buna karşılık, Drive'ım bölümündeki bir dosya veya klasörde devralınan izinler geçersiz kılınabilir. Bu nedenle, bir dosya Drive'ım klasöründen role=writer öğesini devralıyorsa dosyada role=reader öğesini izin düzeyini düşürecek şekilde ayarlayabilirsiniz.

Özellikler

İzinler kaynağı, geçerli kullanıcının bir dosya veya klasörde işlem gerçekleştirip gerçekleştirmediğini belirlemez. Bunun yerine, Files kaynağı, bir işlemin dosya veya klasörde gerçekleştirilip gerçekleştirilemeyeceğini belirtmek için kullanılan bir boole capabilities alanları koleksiyonu içerir. Google Drive API bu alanları, geçerli kullanıcının dosya veya klasörle ilişkili izin kaynağına göre ayarlar.

Örneğin, Alex uygulamanızda oturum açıp dosya paylaşmaya çalıştığında, Alex'in rolünde dosya izinleri kontrol edilir. Rol, kullanıcının dosya paylaşmasına izin veriyorsa dosyayla ilişkili capabilities (ör. canShare) role göre doldurulur. Ali dosyayı paylaşmak isterse uygulamanız, canShare politikasının true olarak ayarlandığından emin olmak için capabilities özelliğini kontrol eder.

capabilities dosyasının alınmasına ilişkin bir örnek için Kullanıcı izinlerini doğrulama bölümüne bakın.

İzin oluştur

İzin oluştururken aşağıdaki iki alan gereklidir:

  • type: type, iznin kapsamını tanımlar (user, group, domain veya anyone). type=user ile verilen izin belirli bir kullanıcı için geçerliyken type=domain izni belirli bir alandaki herkes için geçerlidir.

  • role: role alanı, type uygulamasının gerçekleştirebileceği işlemleri tanımlar. Örneğin, type=user ve role=reader içeren bir izin, belirli bir kullanıcıya dosya veya klasöre salt okuma erişimi verir. Alternatif olarak, type=domain ve role=commenter izni, alandaki herkesin dosyaya yorum eklemesine de olanak tanır. Rollerin ve her birinin izin verdiği işlemlerin tam listesi için Roller ve izinler bölümüne bakın.

type=user veya type=group şeklinde bir izin oluşturduğunuzda söz konusu kullanıcı veya grubu izne bağlamak için bir emailAddress de sağlamanız gerekir.

type=domain durumunda bir izin oluşturduğunuzda belirli bir alanı izne bağlamak için domain da sağlamanız gerekir.

İzin oluşturmak için:

  1. İlişkilendirilmiş dosya veya klasör için fileId ile birlikte permissions.create yöntemini kullanın.
  2. İstek gövdesinde type ve role değerlerini belirtin.
  3. type=user veya type=group ise emailAddress sağlayın. type=domain ise domain sağlayın.

Örnek göster

Aşağıdaki kod örneğinde, izin oluşturma işlemi gösterilmektedir. Yanıt, atanan permissionId dahil olmak üzere bir Permission kaynağının örneğini döndürür.

İstek

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

Yanıt

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

Hedef kitleleri kullanın

Hedef kitleler, kullanıcıların öğelerini paylaşmaları için önerebileceğiniz bölümler veya ekipler gibi kullanıcı gruplarıdır. Kullanıcıları, öğelerini kuruluşunuzun tamamı yerine daha belirli veya sınırlı bir kitleyle paylaşmaya teşvik edebilirsiniz. Hedef kitleler, verilerinizin güvenliğini ve gizliliğini artırmanıza yardımcı olur ve kullanıcıların uygun şekilde paylaşımda bulunmasını kolaylaştırır. Daha fazla bilgi için Hedef kitleler hakkında bölümünü inceleyin.

Hedef kitleleri kullanmak için:

  1. Google Yönetici Konsolu'nda, Menü > Dizin > Hedef kitleler'e gidin.

    Hedef kitleler sayfasına gidin.

    Bu görev için süper yönetici ayrıcalıklarına sahip bir hesapla oturum açmış olmanız gerekir.

  2. Hedef kitleler listesinde, hedef kitlenin adını tıklayın. Hedef kitle oluşturmak için Hedef kitle oluşturma başlıklı makaleyi inceleyin

  3. Şu hedef kitle URL'sinden benzersiz kimliği kopyalayın: https://admin.google.com/ac/targetaudiences/ID.

  4. type=domain ile bir izin oluşturun ve domain alanını ID.audience.googledomains.com olarak ayarlayın.

Kullanıcıların hedef kitlelerle nasıl etkileşimde bulunduğunu görmek için Bağlantı paylaşımı için kullanıcı deneyimi başlıklı makaleyi inceleyin.

Dosya, klasör veya ortak Drive için tüm izinleri alma

Bir dosya, klasör veya ortak Drive için tüm izinleri almak üzere permissions.list yöntemini kullanın.

Örnek göster

Aşağıdaki kod örneğinde tüm izinlerin nasıl alınacağı gösterilmektedir. Yanıt, bir izin listesi döndürür.

İstek

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

Yanıt

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

Kullanıcı izinlerini doğrulama

Uygulamanız bir dosya açtığında dosyanın özelliklerini kontrol etmeli ve kullanıcı arayüzünü, geçerli kullanıcının izinlerini yansıtacak şekilde oluşturmalıdır. Örneğin, kullanıcının dosyada canComment özelliği yoksa kullanıcı arayüzünde yorum yapma özelliği devre dışı bırakılmalıdır.

capabilities hakkında daha fazla bilgi için yukarıdaki Özellikler bölümüne bakın.

Özellikleri kontrol etmek için fileId ve fields parametresi capabilities alanına ayarlanmış şekilde files.get çağrısı yapın. fields parametresini kullanarak alanları döndürme hakkında daha fazla bilgi için Bir dosya için belirli alanları döndürme bölümüne bakın.

Örnek göster

Aşağıdaki kod örneğinde, kullanıcı izinlerinin nasıl doğrulanacağı gösterilmektedir. Yanıt, kullanıcının dosyada sahip olduğu özelliklerin bir listesini döndürür. Her özellik, kullanıcının yapabileceği ayrıntılı bir işleme karşılık gelir. Bazı alanlar yalnızca ortak Drive'lardaki öğeler için doldurulur.

İstek

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

Yanıt

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

Ortak Drive dosya ve klasörleri için rolün kaynağını belirleme

Bir dosya veya klasördeki rolü değiştirmek için rolün kaynağını bilmeniz gerekir. Ortak Drive'larda rolün kaynağı; ortak Drive üyeliğine, klasördeki role veya dosyadaki role göre olabilir.

Bir ortak Drive'ın rolünün kaynağını veya bu sürücüdeki öğeleri belirlemek için fileId, permissionId ve fields parametresi permissionDetails alanına ayarlanmış olarak permissions.get çağrısı yapın. permissionId öğesini bulmak için fileId ile birlikte permissions.list işlevini kullanın. permissions.list isteğinde permissionDetails alanını getirmek için fields parametresini permissions/permissionDetails olarak ayarlayın.

Bu alan; kullanıcı, grup veya alan için devralınan tüm ve doğrudan dosya izinlerini sıralar.

Örnek göster

Aşağıdaki kod örneğinde, rol kaynağının nasıl belirleneceği gösterilmektedir. Yanıt, Permission kaynağının permissionDetails değerini döndürür. inheritedFrom alanı, iznin devralındığı öğenin kimliğini sağlar.

İstek

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

Yanıt

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

İzinleri değiştir

Bir dosya veya klasördeki izinleri değiştirmek için atanan rolü değiştirebilirsiniz:

  1. Değişiklik izni için permissionId numaralı telefonu ve ilişkilendirilmiş dosya, klasör veya ortak Drive için fileId kodunu permissions.update çağırın. permissionId öğesini bulmak için fileId ile birlikte permissions.list işlevini kullanın.

  2. İstekte yeni role öğesini tanımlayın.

Kullanıcı veya grup zaten üye olsa bile ortak Drive'daki tek tek dosya veya klasörler için izin verebilirsiniz. Örneğin, Alex'in ortak Drive üyeliğinin bir parçası olarak role=commenter var. Ancak uygulamanız, ortak Drive'daki bir dosya için Alex role=writer'e izin verebilir. Bu durumda, yeni rol üyeliğiyle verilen rolden daha geniş kapsamlı olduğundan yeni izin dosya veya klasör için etkili rol haline gelir.

Örnek göster

Aşağıdaki kod örneğinde, dosya veya klasördeki izinlerin yorumcudan yazara nasıl değiştirileceği gösterilmektedir. Yanıt, Permission kaynağının bir örneğini döndürür.

İstek

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

Yanıt

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

Dosya veya klasöre erişimi iptal etme

Bir dosyaya veya klasöre erişimi iptal etmek için fileId ve permissionId ile delete çağrısı yaparak izni silin.

"Drive'ım" bölümündeki öğeler için devralınan bir izni silmek mümkündür. Devralınan bir iznin silinmesi, öğeye ve varsa alt öğelere erişimi iptal eder.

Ortak Drive'daki öğeler için devralınan izinler iptal edilemez. Bunun yerine üst dosya veya klasördeki izni güncelleyin veya iptal edin.

delete işlemi, doğrudan bir ortak Drive dosyasına veya klasörüne uygulanan izinleri silmek için de kullanılır.

Örnek göster

Aşağıdaki kod örneğinde, bir permissionId silerek erişimin nasıl iptal edileceği gösterilmektedir. Başarılı olursa yanıt gövdesi boş olur. İznin kaldırıldığını onaylamak için fileId ile birlikte permissions.list öğesini kullanın.

İstek

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

Dosya sahipliğini aynı kuruluştaki başka bir Google Workspace hesabına aktarma

"Drive'ım" bölümünde bulunan dosyaların sahipliği bir Google Workspace hesabından aynı kuruluştaki başka bir hesaba aktarılabilir. İçindeki dosyaların sahibi, ortak drive'ın sahibi olan bir kuruluşa aittir. Bu nedenle, ortak Drive'lardaki dosyalar ve klasörler için sahiplik aktarımları desteklenmemektedir. Ortak Drive'ı düzenleyen kişiler, ilgili ortak Drive'daki öğeleri kendi "Drive'ım" bölümüne taşıyabilir ve bu şekilde sahipliklerini kendilerine aktarabilirler.

"Drive'ım" bölümündeki bir dosyanın sahipliğini aktarmak için aşağıdakilerden birini yapın:

  • Belirli bir kullanıcıya (type=user) sahip erişimi (role=owner) vermek için dosya izni oluşturun.

  • Mevcut bir dosyanın iznini role=owner ile güncelleyin ve sahipliği belirtilen kullanıcıya (transferOwnership=true) aktarın.

Dosya sahipliğini bir tüketici hesabından diğerine aktarma

Dosyaların sahipliği bir tüketici hesabı arasında başka bir tüketici hesabına aktarılabilir. Ancak Drive, potansiyel yeni sahip aktarıma açıkça izin verene kadar bir dosyanın sahipliğini iki tüketici hesabı arasında aktarmaz. Dosya sahipliğini bir tüketici hesabından diğerine aktarmak için:

  1. Mevcut sahip, potansiyel yeni sahibin dosya iznini oluşturarak veya güncelleyerek bir sahiplik aktarımı başlatır. İzin şu ayarları içermelidir: role=writer, type=user ve pendingOwner=true. Yeni sahip potansiyel sahip için izin oluşturuyorsa potansiyel yeni sahibe dosyanın sahipliğini üstlenmesinin istendiğini belirten bir e-posta bildirimi gönderilir.

  2. Yeni sahip, dosya iznini oluşturarak veya güncelleyerek sahiplik aktarma isteğini kabul eder. İzin şu ayarları içermelidir: role=owner ve transferOwnership=true. Yeni sahip yeni bir izin oluşturuyorsa önceki sahibe sahipliğin aktarıldığını belirten bir e-posta bildirimi gönderilir.

Bir dosya aktarıldığında önceki sahibin rolü writer rolüne düşürülür.

Toplu isteklerle birden çok izni değiştirme

Birden çok izni değiştirmek için toplu istekleri kullanmanızı önemle tavsiye ederiz.

Aşağıda, istemci kitaplığıyla toplu izin değişikliği yapmaya ilişkin bir örnek verilmiştir.

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