Назначение лицензий пользователю с помощью API Центра партнеров

Назначение лицензий пользователю клиента.

Необходимые компоненты

  • Учетные данные, описанные в статье о проверке подлинности в Центре партнеров. Этот сценарий поддерживает только проверку подлинности с использованием учетных данных приложений и пользователей.

  • Идентификатор клиента (customer-tenant-id). Если вы не знаете идентификатор клиента, его можно найти в Центре партнеров, выбрав рабочую область "Клиенты" , затем клиент из списка клиентов, а затем учетная запись. На странице "Учетная запись клиента" найдите идентификатор Майкрософт в разделе "Сведения о учетной записи клиента". Идентификатор Майкрософт совпадает с идентификатором клиента (customer-tenant-id).

  • Идентификатор пользователя клиента. Этот идентификатор определяет пользователя, которому нужно назначить лицензию.

  • Идентификатор SKU продукта, определяющий продукт для лицензии.

Роли GDAP

Вам потребуется по крайней мере одна из следующих ролей GDAP:

  • Администратор лицензий
  • Администратор пользователей
  • Редакторы каталогов

Назначение лицензий с помощью кода

При назначении лицензий пользователю необходимо выбрать из коллекции подписанных номеров SKU клиента. Затем, определив продукты, которые вы хотите назначить, необходимо получить идентификатор номера SKU продукта для каждого продукта, чтобы сделать назначения. Каждый экземпляр SubscribedSku содержит свойство ProductSku, из которого можно ссылаться на объект ProductSku и получить идентификатор.

Запрос на назначение лицензий должен содержать лицензии из одной группы лицензий. Например, вы не можете назначить лицензии из Group1 и Group2 в одном запросе. Попытка назначить лицензии из нескольких групп в одном запросе завершится ошибкой. Чтобы узнать, какие лицензии доступны для группы лицензий, см . список доступных лицензий по группе лицензий.

Ниже приведены действия по назначению лицензий с помощью кода:

  1. Создайте экземпляр объекта LicenseAssignment . Этот объект используется для указания номера SKU продукта и планов обслуживания для назначения.

    LicenseAssignment license = new LicenseAssignment();
    
  2. Заполните свойства объекта, как показано ниже. Этот код предполагает, что у вас уже есть идентификатор номера SKU продукта, и что будут назначены все доступные планы обслуживания (т. е. ни один из них не будет исключен).

    license.SkuId = selectedProductSkuId;
    license.ExcludedPlans = null;
    
  3. Если у вас нет идентификатора номера SKU продукта, необходимо получить коллекцию подписанных номеров SKU и получить идентификатор номера SKU продукта из одного из них. Ниже приведен пример, если вы знаете имя номера SKU продукта.

    var customerSubscribedSkus = partnerOperations.Customers.ById(selectedCustomerId).SubscribedSkus.Get();
    var sku = customerSubscribedSkus.Items.Where(n => n.ProductSku.Name == "Office 365 Enterprise E3").First();
    license.SkuId = sku.ProductSku.Id;
    license.ExcludedPlans = null;
    
  4. Затем создайте новый список типов LicenseAssignment и добавьте объект лицензии. Вы можете назначить несколько лицензий, добавив каждую отдельно в список. Лицензии, включенные в этот список, должны находиться в той же группе лицензий.

    List<LicenseAssignment> licenseList = new List<LicenseAssignment>();
    licenseList.Add(license);
    
  5. Создайте экземпляр LicenseUpdate и назначьте список назначений лицензий свойству LicenseToAssign.

    LicenseUpdate updateLicense = new LicenseUpdate();
    updateLicense.LicensesToAssign = licenseList;
    
  6. Вызовите метод Create или CreateAsync и передайте объект обновления лицензии, как показано ниже, чтобы назначить лицензии.

    var assignLicense = partnerOperations.Customers.ById(selectedCustomerId).Users.ById(selectedCustomerUserId).LicenseUpdates.Create(updateLicense);
    

C#

Чтобы назначить лицензию пользователю клиента, сначала создайте экземпляр объекта LicenseAssignment и заполните свойства Skuid и ExcludedPlans. Этот объект используется для указания номера SKU продукта для назначения и исключения планов обслуживания. Затем создайте новый список типов LicenseAssignment и добавьте объект лицензии в список. Затем создайте экземпляр LicenseUpdate и назначьте список назначений лицензий свойству LicenseToAssign.

Затем используйте метод IAggregatePartner.Customers.ById с идентификатором клиента для идентификации клиента и метода Users.ById с идентификатором пользователя для идентификации пользователя. Затем получите интерфейс для операций обновления лицензии пользователя клиента из свойства License Обновления.

Наконец, вызовите метод Create или CreateAsync и передайте объект обновления лицензии, чтобы назначить лицензию.

// IAggregatePartner partnerOperations;
// string selectedCustomerUserId;
// string selectedCustomerId;
// string selectedProductSkuId;

// Instantiate and populate a LicenseAssignment object.
LicenseAssignment license = new LicenseAssignment();
license.SkuId = selectedProductSkuId;
license.ExcludedPlans = null;

// Instantiate a list of licenses to assign and add the license to it.
List<LicenseAssignment> licenseList = new List<LicenseAssignment>();
licenseList.Add(license);

// Instantiate a LicenseUpdate object and add the list of licenses to assign.
LicenseUpdate updateLicense = new LicenseUpdate();
updateLicense.LicensesToAssign = licenseList;

// Update the user licenses.
var assignLicense = partnerOperations.Customers.ById(selectedCustomerId).Users.ById(selectedCustomerUserId).LicenseUpdates.Create(updateLicense);

Пример: тестовое приложение консоли. Проект: Класс примеров пакета SDK Для Центра партнеров: CustomerUserAssignLicenses.cs

Запрос REST

Синтаксис запроса

Способ URI запроса
POST {baseURL}/v1/customers/{customer-id}/users/{user-id}/licenseupdates HTTP/1.1

Параметры универсального кода ресурса (URI)

Используйте следующие параметры пути для идентификации клиента и пользователя.

Имя. Type Обязательно Описание
customer-id строка Да Идентификатор GUID, отформатированный идентификатором, определяющим клиента.
user-id строка Да Идентификатор GUID, отформатированный идентификатором, определяющим пользователя.

Заголовки запросов

Дополнительные сведения см. в статье о заголовках REST Центра партнеров.

Текст запроса

Включите ресурс LicenseUpdate в текст запроса, указывающий назначенные лицензии.

Пример запроса

POST https://api.partnercenter.microsoft.com/v1/customers/0c39d6d5-c70d-4c55-bc02-f620844f3fd1/users/554526aa-cf5e-46fa-95df-98dbc55d8a1e/licenseupdates HTTP/1.1
Authorization: Bearer <token>
Accept: application/json
MS-RequestId: a37d3009-665d-4e12-b76e-1aa10cf80140
MS-CorrelationId: c73c9570-c352-459e-98a3-dafe4bd8c821
X-Locale: en-US
MS-PartnerCenter-Client: Partner Center .NET SDK
Content-Type: application/json
Host: api.partnercenter.microsoft.com
Content-Length: 183
Expect: 100-continue

{
    "LicensesToAssign": [{
            "ExcludedPlans": null,
            "SkuId": "f8a1db68-be16-40ed-86d5-cb42ce701560"
        }
    ],
    "LicensesToRemove": null,
    "LicenseWarnings": null,
    "Attributes": {
        "ObjectType": "LicenseUpdate"
    }
}

Важно!

По состоянию на июнь 2023 г. последняя версия пакета SDK для .NET для Центра партнеров 3.4.0 теперь архивируется. Вы можете скачать выпуск пакета SDK из GitHub вместе с файлом чтения, содержащим полезные сведения.

Партнерам рекомендуется продолжать использовать REST API Центра партнеров.

Ответ REST

В случае успешного выполнения возвращается код состояния HTTP-ответа 201, а текст ответа содержит ресурс LicenseUpdate с информацией о лицензии.

Коды успешного выполнения и ошибок в ответе

Каждый ответ сопровождается кодом состояния HTTP, обозначающим успешное или неудачное выполнение, и дополнительными сведениями для отладки. Используйте средство трассировки сети, чтобы просматривать этот код, тип ошибки и дополнительные параметры. Полный список ответов есть в статье Коды ошибок REST в Центре партнеров.

Пример ответа (успешное выполнение)

HTTP/1.1 201 Created
Content-Length: 139
Content-Type: application/json; charset=utf-8
MS-CorrelationId: c73c9570-c352-459e-98a3-dafe4bd8c821
MS-RequestId: a37d3009-665d-4e12-b76e-1aa10cf80140
MS-CV: 5AnzcZQrvUqCq3kd.0
MS-ServerId: 030020525
Date: Thu, 20 Apr 2017 21:50:39 GMT

{
    "licensesToAssign": [{
            "skuId": "f8a1db68-be16-40ed-86d5-cb42ce701560"
        }
    ],
    "licenseWarnings": [],
    "attributes": {
        "objectType": "LicenseUpdate"
    }
}

Пример ответа (лицензия недоступна)

HTTP/1.1 400 Bad Request
Content-Length: 341
Content-Type: application/json; charset=utf-8
MS-CorrelationId: c73c9570-c352-459e-98a3-dafe4bd8c821
MS-RequestId: f4f3b748-8b22-4d07-a5a1-dceb32824192
MS-CV: 5npA0K22CUmWPOzB.0
MS-ServerId: 102030524
Date: Thu, 20 Apr 2017 22:12:36 GMT

{
    "code": 60012,
    "description": "We are sorry, it looks like you have run out of licenses. Buy more licenses, and then try again.",
    "data": ["LicenseQuotaExceededException : Subscription with Account 0c39d6d5-c70d-4c55-bc02-f620844f3fd1 and SKU f8a1db68-be16-40ed-86d5-cb42ce701560 does not have any available licenses left."],
    "source": "PartnerFD"
}

Пример ответа (недопустимый маркер)

HTTP/1.1 400 Bad Request
Content-Length: 342
Content-Type: application/json; charset=utf-8
MS-CorrelationId: c5359db2-fb21-485c-90b1-0a2c3b484783
MS-RequestId: f0caf048-380c-4d6f-968a-3ccce01e11c1
MS-CV: 6npA0K22CUmWPOzC.0
MS-ServerId: 102045524
Date: Thu, 20 Apr 2023 21:12:36 GMT

{
    "code": 900316,
    "description": "Partner token is not allowed in license management calls. Please call with Partner Access Token. To learn more, see https://learn.microsoft.com/partner-center/developer/enable-secure-app-model#get-access-token",
    "source": "PartnerFD"
}

Пример ответа (проблема с политикой условного доступа)

HTTP/1.1 403 Forbidden
Content-Length: 342
Content-Type: application/json; charset=utf-8
MS-CorrelationId: c5359db2-fb21-485c-90b1-0a2c3b484783
MS-RequestId: f0caf048-380c-4d6f-968a-3ccce01e11c1
MS-CV: 6npA0K22CUmWPOzC.0
MS-ServerId: 102045524
Date: Thu, 20 Apr 2023 21:12:36 GMT

{
    "code": 900309,
    "description": "Access has been blocked by Conditional Access policies. The access policy does not allow token issuance. Learn more at https://learn.microsoft.com/azure/active-directory/conditional-access/concept-conditional-access-users-groups.",
    "source": "PartnerFD"
}