파트너 센터 API를 통해 사용자에게 라이선스 할당

고객 사용자에게 라이선스를 할당하는 방법입니다.

필수 조건

  • 자격 증명(파트너 센터 인증에서 설명). 이 시나리오는 앱 + 사용자 자격 증명을 사용한 인증만 지원합니다.

  • 고객 ID (customer-tenant-id). 고객의 ID를 모르는 경우 고객 작업 영역, 고객 목록에서 고객, 계정을 선택하여파트너 센터에서 조회할 수 있습니다. 고객의 계정 페이지에서 고객 계정 정보 섹션에서 Microsoft ID습니다. Microsoft ID는 고객 ID(customer-tenant-id)와 동일합니다.

  • 고객 사용자 식별자입니다. 이 ID는 라이선스를 할당할 사용자를 식별합니다.

  • 라이선스의 제품을 식별하는 제품 SKU 식별자입니다.

GDAP 역할

다음 GDAP 역할 중 하나 이상이 필요합니다.

  • 라이선스 관리자
  • 사용자 관리자
  • 디렉터리 작성자

코드를 통해 라이선스 할당

사용자에게 라이선스를 할당하는 경우 고객의 구독 SKU 컬렉션 중에서 선택해야 합니다. 그런 다음 할당하려는 제품을 식별한 후에는 할당을 수행하려면 각 제품에 대한 제품 SKU ID를 가져와야 합니다. 각 SubscribedSku 인스턴스에는 ProductSku 개체를 참조하고 ID가져올 수 있는 ProductSku 속성이 포함되어 있습니다.

라이선스 할당 요청에는 단일 라이선스 그룹의 라이선스가 포함되어야 합니다. 예를 들어 동일한 요청에서 Group1Group2라이선스를 할당할 수 없습니다. 단일 요청에서 둘 이상의 그룹에서 라이선스를 할당하려고 하면 적절한 오류가 발생합니다. 라이선스 그룹에서 사용할 수 있는 라이선스를 확인하려면 라이선스 그룹별 사용 가능한 라이선스 목록 가져오기를 참조하세요.

코드를 통해 라이선스를 할당하는 단계는 다음과 같습니다.

  1. LicenseAssignment 개체를 인스턴스화합니다. 이 개체를 사용하여 할당할 제품 SKU 및 서비스 계획을 지정합니다.

    LicenseAssignment license = new LicenseAssignment();
    
  2. 아래와 같이 개체 속성을 채웁다. 이 코드는 사용자가 이미 제품 SKU ID를 가지고 있으며 사용 가능한 모든 서비스 계획이 할당된다고 가정합니다(즉, 제외되지 않음).

    license.SkuId = selectedProductSkuId;
    license.ExcludedPlans = null;
    
  3. 제품 SKU ID가 없는 경우 구독된 SKU 컬렉션을 검색하고 그 중 하나에서 제품 SKU ID를 가져와야 합니다. 다음은 제품 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 인스턴스를 만들고 라이선스 할당 목록을 LicensesToAssign 속성에 할당합니다.

    LicenseUpdate updateLicense = new LicenseUpdate();
    updateLicense.LicensesToAssign = licenseList;
    
  6. Create 또는 CreateAsync 메서드를 호출하고 아래와 같이 라이선스 업데이트 개체를 전달하여 라이선스를 할당합니다.

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

C#

고객 사용자에게 라이선스를 할당하려면 먼저 LicenseAssignment 개체를 인스턴스화하고 SkuidExcludedPlans 속성을 채웁니다. 이 개체를 사용하여 할당할 제품 SKU와 제외할 서비스 계획을 지정합니다. 그런 다음 LicenseAssignment 형식의 새 목록을 인스턴스화하고 라이선스 개체를 목록에 추가합니다. 그런 다음 LicenseUpdate 인스턴스를 만들고 라이선스 할당 목록을 LicensesToAssign 속성에 할당합니다.

다음으로, 고객 ID와 함께 IAggregatePartner.Customers.ById 메서드를 사용하여 고객을 식별하고 사용자 ID가 있는 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 string 고객을 식별하는 GUID 형식 ID입니다.
user-id string 사용자를 식별하는 GUID 형식 ID입니다.

요청 헤더

자세한 내용은 파트너 센터 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"
    }
}

Important

2023년 6월 현재 최신 파트너 센터 .NET SDK 릴리스 3.4.0이 보관됩니다. 유용한 정보가 포함된 추가 정보 파일함께 GitHub에서 SDK 릴리스를 다운로드할 수 있습니다.

파트너는 파트너 센터 REST API계속 사용하는 것이 좋습니다.

REST 응답

성공하면 코드 201에 상태 HTTP 응답이 반환되고 응답 본문에는 라이선스 정보가 포함된 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"
}