Obtener un registro de la actividad del Centro de partnersGet a record of Partner Center activity

Se aplica aApplies To

  • Centro de partnersPartner Center
  • Centro de partners para Microsoft Cloud AlemaniaPartner Center for Microsoft Cloud Germany
  • Centro de partners para Microsoft Cloud for US GovernmentPartner Center for Microsoft Cloud for US Government

En este artículo se describe cómo recuperar un registro de las operaciones realizadas por un usuario asociado o una aplicación durante un período de tiempo.This article describes how to retrieve a record of operations that was performed by a partner user or application over a period of time.

Use esta API para recuperar los registros de auditoría de los 30 días anteriores a partir de la fecha actual, o para un intervalo de fechas especificado incluyendo la fecha de inicio y/o la fecha de finalización.Use this API to retrieve audit records for the previous 30 days from the current date, or for a date range specified by including the start date and/or the end date. Sin embargo, tenga en cuenta que, por motivos de rendimiento, la disponibilidad de los datos del registro de actividad se limita a los 90 días anteriores.Note, however, that for performance reasons activity log data availability is limited to the previous 90 days. Las solicitudes con una fecha de inicio superior a 90 días antes de la fecha actual recibirán una excepción de solicitud incorrecta (código de error: 400) y un mensaje adecuado.Requests with a start date greater than 90 days prior to the current date will receive a bad request exception (error code: 400) and an appropriate message.

Requisitos previosPrerequisites

  • Credenciales tal como se describen en el artículo Autenticación del Centro de partners.Credentials as described in Partner Center authentication. Este escenario admite la autenticación con las credenciales de aplicación y aplicación independientes.This scenario supports authentication with both standalone App and App+User credentials.

C#C#

Para recuperar un registro de las operaciones del centro de Partners, establezca primero el intervalo de fechas de los registros que desea recuperar.To retrieve a record of Partner Center operations, first establish the date range for the records you want to retrieve. En el ejemplo de código siguiente solo se usa una fecha de inicio, pero también se puede incluir una fecha de finalización.The following code example only uses a start date, but you can also include an end date. Para obtener más información, vea el método [query/dotnet/API/Microsoft.Store.partnercenter.AuditRecords.iauditrecordscollection.Query).For more information, see the [Query/dotnet/api/microsoft.store.partnercenter.auditrecords.iauditrecordscollection.query) method. A continuación, cree las variables que necesita para el tipo de filtro que desea aplicar y asigne los valores adecuados.Next, create the variables you need for the type of filter you want to apply, and assign the appropriate values. Por ejemplo, para filtrar por subcadena de nombre de empresa, cree una variable que contenga la subcadena.For example, to filter by company name substring, create a variable to hold the substring. Para filtrar por ID. de cliente, cree una variable que contenga el identificador.To filter by customer ID, create a variable to hold the ID.

En el ejemplo siguiente, se proporciona código de ejemplo para filtrar por una subcadena, un identificador de cliente o un tipo de recurso de nombre de empresa.In the following example, sample code is provided to filter by a company name substring, customer ID, or resource type. Elija una y comente los demás.Choose one and comment out the others. En cada caso, primero se crea una instancia de un objeto [SimpleFieldFilter/dotnet/API/Microsoft.Store.partnercenter.Models.Query.simplefieldfilter) mediante su [constructor/dotnet/API/Microsoft.Store.partnercenter.Models.Query.simplefieldfilter.-ctor) predeterminado para crear el filtro.In each case, you first instantiate a [SimpleFieldFilter/dotnet/api/microsoft.store.partnercenter.models.query.simplefieldfilter) object using its default [constructor/dotnet/api/microsoft.store.partnercenter.models.query.simplefieldfilter.-ctor) to create the filter. Deberá pasar una cadena que contenga el campo que se va a buscar y el operador adecuado que se va a aplicar, como se muestra.You'll need to pass a string that contains the field to search, and the appropriate operator to apply, as shown. También debe proporcionar la cadena por la que filtrar.You also must provide the string to filter by.

A continuación, use la propiedad [AuditRecords/dotnet/API/Microsoft.Store.partnercenter.ipartner.AuditRecords) para obtener una interfaz para auditar las operaciones de registro y llamar al método [query/dotnet/API/Microsoft.Store.partnercenter.AuditRecords.iauditrecordscollection.Query) o [QueryAsync/dotnet/API/Microsoft.Store.partnercenter.AuditRecords.iauditrecordscollection.queryasync) para ejecutar el filtro y obtener la colección de [AuditRecordde/dotnet/API/Microsoft.Store.partnercenter.Models.Auditing.auditrecord) que representa la primera página del resultado.Next, use the [AuditRecords/dotnet/api/microsoft.store.partnercenter.ipartner.auditrecords) property to get an interface to audit record operations, and call the [Query/dotnet/api/microsoft.store.partnercenter.auditrecords.iauditrecordscollection.query) or [QueryAsync/dotnet/api/microsoft.store.partnercenter.auditrecords.iauditrecordscollection.queryasync) method to execute the filter and get the collection of [AuditRecord's/dotnet/api/microsoft.store.partnercenter.models.auditing.auditrecord) that represent the first page of the result. Pase el método a la fecha de inicio, una fecha de finalización opcional no utilizada en el ejemplo aquí y un objeto [IQUERY/dotnet/API/Microsoft.Store.partnercenter.Models.Query.IQUERY) que representa una consulta en una entidad.Pass the method the start date, an optional end date not used in the example here, and an [IQuery/dotnet/api/microsoft.store.partnercenter.models.query.iquery) object that represents a query on an entity. El objeto IQuery se crea pasando el filtro que se ha creado anteriormente al método [QueryFactory/dotnet/API/Microsoft.Store.partnercenter.Models.Query.queryfactory) [BuildSimpleQuery/dotnet/API/Microsoft.Store.partnercenter.Models.Query.queryfactory.buildsimplequery).The IQuery object is created by passing the filter created above to the [QueryFactory's/dotnet/api/microsoft.store.partnercenter.models.query.queryfactory) [BuildSimpleQuery/dotnet/api/microsoft.store.partnercenter.models.query.queryfactory.buildsimplequery) method.

Una vez que tenga la página inicial de elementos, use el método [enumerars. AuditRecords. Create/dotnet/API/Microsoft.Store.partnercenter.Factory.iresourcecollectionenumeratorfactory-1.Create) para crear un enumerador que puede usar para recorrer en iteración las páginas restantes.Once you have the initial page of items, use the [Enumerators.AuditRecords.Create/dotnet/api/microsoft.store.partnercenter.factory.iresourcecollectionenumeratorfactory-1.create) method to create an enumerator that you can use to iterate through the remaining pages.

// IAggregatePartner partnerOperations;

var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 01);

// First perform the query, then get the enumerator. Choose one of the following and comment out the other two.

// To retrieve audit records by company name substring (for example "bri" matches "Fabrikam, Inc.").
var searchSubstring="bri";
var filter = new SimpleFieldFilter(AuditRecordSearchField.CompanyName.ToString(), FieldFilterOperation.Substring, searchSubstring);
var auditRecordsPage = partnerOperations.AuditRecords.Query(startDate.Date, query: QueryFactory.Instance.BuildSimpleQuery(filter));

// To retrieve audit records by customer ID.
var customerId="0c39d6d5-c70d-4c55-bc02-f620844f3fd1";
var filter = new SimpleFieldFilter(AuditRecordSearchField.CustomerId.ToString(), FieldFilterOperation.Equals, customerId);
var auditRecordsPage = partnerOperations.AuditRecords.Query(startDate.Date, query: QueryFactory.Instance.BuildSimpleQuery(filter));

// To retrieve audit records by resource type.
int resourceTypeInt = 3; // Subscription Resource.
string searchField = Enum.GetName(typeof(ResourceType), resourceTypeInt);
var filter = new SimpleFieldFilter(AuditRecordSearchField.ResourceType.ToString(), FieldFilterOperation.Equals, searchField);
var auditRecordsPage = partnerOperations.AuditRecords.Query(startDate.Date, query: QueryFactory.Instance.BuildSimpleQuery(filter));

var auditRecordEnumerator = partnerOperations.Enumerators.AuditRecords.Create(auditRecordsPage);

int pageNumber = 1;
while (auditRecordEnumerator.HasValue)
{
    // Work with the current page.
    foreach (var c in auditRecordEnumerator.Current.Items)
    {
        // Display some info, such as operation type, operation date, and operation status.
        Console.WriteLine(string.Format("{0} {1} {2}.", c.OperationType, c.OperationDate, c.OperationStatus));
    }

    // Get the next page of audit records.
    auditRecordEnumerator.Next();
}

Ejemplo: aplicación de prueba de consola.Sample: Console test app. Proyecto: SDK del centro de Partners carpetade ejemplos: auditoríaProject: Partner Center SDK Samples Folder: Auditing

Solicitud RESTREST request

Sintaxis de la solicitudRequest syntax

MétodoMethod URI de la solicitudRequest URI
GETGET {baseurl}/v1/AuditRecords? startDate = {STARTDATE} http/1.1{baseURL}/v1/auditrecords?startDate={startDate} HTTP/1.1
GETGET {baseurl}/v1/AuditRecords? startDate = {startDate} &EndDate = {ENDDATE} http/1.1{baseURL}/v1/auditrecords?startDate={startDate}&endDate={endDate} HTTP/1.1
GETGET {baseurl}/v1/AuditRecords? startDate = {startDate} &EndDate = {endDate} &Filter = {"Field": "CompanyName", "Value": "{searchSubstring}", "Operator": "substring"} http/1.1{baseURL}/v1/auditrecords?startDate={startDate}&endDate={endDate}&filter={"Field":"CompanyName","Value":"{searchSubstring}","Operator":"substring"} HTTP/1.1
GETGET {baseurl}/v1/AuditRecords? startDate = {startDate} &EndDate = {endDate} &Filter = {"Field": "CustomerID", "Value": "{CustomerID}", "Operator": "Equals"} http/1.1{baseURL}/v1/auditrecords?startDate={startDate}&endDate={endDate}&filter={"Field":"CustomerId","Value":"{customerId}","Operator":"equals"} HTTP/1.1
GETGET {baseurl}/v1/AuditRecords? startDate = {startDate} &EndDate = {endDate} &filtro = {"campo": "resourcetype", "valor": "{resourcetype}", "operador": "es igual a"} http/1.1{baseURL}/v1/auditrecords?startDate={startDate}&endDate={endDate}&filter={"Field":"ResourceType","Value":"{resourceType}","Operator":"equals"} HTTP/1.1

Parámetro de URIURI parameter

Utilice los siguientes parámetros de consulta al crear la solicitud.Use the following query parameters when creating the request.

NombreName TipoType ObligatorioRequired DescripciónDescription
startDatestartDate Fechadate NoNo Fecha de inicio en formato AAAA-MM-DD.The start date in yyyy-mm-dd format. Si no se proporciona ninguno, el conjunto de resultados tendrá como valor predeterminado 30 días antes de la fecha de solicitud.If none is provided, the result set will default to 30 days prior to the request date. Este parámetro es opcional cuando se proporciona un filtro.This parameter is optional when a filter is supplied.
endDateendDate Fechadate NoNo Fecha de finalización en formato AAAA-MM-DD.The end date in yyyy-mm-dd format. Este parámetro es opcional cuando se proporciona un filtro.This parameter is optional when a filter is supplied. Cuando se omite la fecha de finalización o se establece en null, la solicitud devuelve la ventana Max o usa hoy como fecha de finalización, lo que sea menor.When the end date is omitted or set to null, the request returns the max window or uses today as the end date, whichever is less.
filterfilter stringstring NoNo El filtro que se va a aplicar.The filter to apply. Este parámetro debe ser una cadena codificada.This parameter must be an encoded string. Este parámetro es opcional cuando se proporcionan la fecha de inicio o la fecha de finalización.This parameter is optional when the start date or end date are supplied.

Sintaxis de filtroFilter syntax

Debe crear el parámetro de filtro como una serie de pares de clave y valor separados por comas.You must compose the filter parameter as a series of comma separated, key-value pairs. Cada clave y valor debe estar entrecomillado individualmente y separado por dos puntos.Each key and value must be individually quoted and separated by a colon. Todo el filtro debe estar codificado.The entire filter must be encoded.

Este sería un ejemplo de un filtro sin codificar: An unencoded example looks like this:

?filter{"Field":"CompanyName","Value":"bri","Operator":"substring"}

En la tabla siguiente se describen los pares clave-valor necesarios:The following table describes the required key-value pairs:

ClaveKey ValorValue
CampoField El campo que se va a filtrar.The field to filter. Los valores admitidos se pueden encontrar en la sintaxis de la solicitud.The supported values can be found in Request syntax.
ValorValue El valor según el cual se aplicará el filtro.The value to filter by. El caso del valor se omite.The case of the value is ignored. Se admiten los siguientes parámetros de valor, tal como se muestra en la sintaxis de la solicitud:The following value parameters are supported as shown in Request syntax:
  • searchSubstring: reemplace por el nombre de la empresa.searchSubstring - Replace with the name of the company. Puede escribir una subcadena para que coincida con parte del nombre de la empresa (por ejemplo `bri` , coincidirá `Fabrikam, Inc` ).You can enter a substring to match part of the company name (for example `bri` will match `Fabrikam, Inc`).

    Ejemplo: " valor " : " BRI"Example: "Value":"bri"

  • customerId: reemplazar por una cadena con formato de GUID que representa el identificador del cliente.customerId - Replace with a GUID formatted string that represents the customer identifier.

    Ejemplo: " valor " : " 0c39d6d5-c70d-4c55-BC02-f620844f3fd1"Example: "Value":"0c39d6d5-c70d-4c55-bc02-f620844f3fd1"

  • resourceType: reemplazar por el tipo de recurso para el que se van a recuperar los registros de auditoría (por ejemplo, suscripción).resourceType - Replace with the type of resource for which to retrieve audit records (for example, Subscription). Los tipos de recursos disponibles se definen en resourcetype.The available resource types are defined in ResourceType.

    Ejemplo: " valor " : " suscripción"Example: "Value":"Subscription"

OperatorOperator El operador que se va a aplicar.The operator to apply. Los operadores admitidos se pueden encontrar en la sintaxis de la solicitud.The supported operators can be found in Request syntax.

Encabezados de solicitudRequest headers

Cuerpo de la solicitudRequest body

Ninguno.None.

Ejemplo de solicitudRequest example

GET https://api.partnercenter.microsoft.com/v1/auditrecords?startDate=6/1/2017%2012:00:00%20AM&filter=%7B%22Field%22:%22CustomerId%22,%22Value%22:%220c39d6d5-c70d-4c55-bc02-f620844f3fd1%22,%22Operator%22:%22equals%22%7D HTTP/1.1
Authorization: Bearer <token>
Accept: application/json
MS-RequestId: 127facaa-e389-41f8-8bb7-1d1af99db893
MS-CorrelationId: de9c2ccc-40dd-4186-9660-65b9b64c3d14
X-Locale: en-US
Host: api.partnercenter.microsoft.com
Connection: Keep-Alive

Respuesta RESTREST response

Si es correcto, este método devuelve un conjunto de actividades que cumplen los filtros.If successful, this method returns a set of activities that meet the filters.

Códigos de error y de respuesta correctosResponse success and error codes

Cada respuesta incluye un código de estado HTTP que indica si la operación se ha realizado correctamente o con errores y proporciona información de depuración adicional.Each response comes with an HTTP status code that indicates success or failure and additional debugging information. Use una herramienta de seguimiento de red para leer este código, el tipo de error y los parámetros adicionales.Use a network trace tool to read this code, error type, and additional parameters. Para obtener la lista completa, consulta Códigos de error de REST del Centro de partners.For the full list, see Partner Center REST error codes.

Ejemplo de respuestaResponse example

HTTP/1.1 200 OK
Content-Length: 2859
Content-Type: application/json; charset=utf-8
MS-CorrelationId: de9c2ccc-40dd-4186-9660-65b9b64c3d14
MS-RequestId: 127facaa-e389-41f8-8bb7-1d1af99db893
MS-CV: 4xDKynq/zE2im0wj.0
MS-ServerId: 030011719
Date: Tue, 27 Jun 2017 22:19:46 GMT

{
    "totalCount": 2,
    "items": [{
            "partnerId": "3b33e682-00c3-41ee-9dd2-a548adf56438",
            "customerId": "0c39d6d5-c70d-4c55-bc02-f620844f3fd1",
            "customerName": "Relecloud",
            "userPrincipalName": "admin@domain.onmicrosoft.com",
            "resourceType": "order",
            "resourceNewValue": "{\"Id\":\"d51a052e-043c-4a2a-aa37-2bb938cef6c1\",\"ReferenceCustomerId\":\"0c39d6d5-c70d-4c55-bc02-f620844f3fd1\",\"BillingCycle\":\"none\",\"LineItems\":[{\"LineItemNumber\":0,\"OfferId\":\"C0BD2E08-11AC-4836-BDC7-3712E744922F\",\"SubscriptionId\":\"488745B5-2086-4912-802C-6ABB9F7C3638\",\"ParentSubscriptionId\":null,\"FriendlyName\":\"Office 365 Business Premium Trial\",\"Quantity\":25,\"PartnerIdOnRecord\":null,\"Links\":{\"Subscription\":{\"Uri\":\"/customers/0c39d6d5-c70d-4c55-bc02-f620844f3fd1/subscriptions/488745B5-2086-4912-802C-6ABB9F7C3638\",\"Method\":\"GET\",\"Headers\":[]}}}],\"CreationDate\":\"2017-06-15T15:56:04.077-07:00\",\"Links\":{\"Self\":{\"Uri\":\"/customers/0c39d6d5-c70d-4c55-bc02-f620844f3fd1/orders/d51a052e-043c-4a2a-aa37-2bb938cef6c1\",\"Method\":\"GET\",\"Headers\":[]}},\"Attributes\":{\"Etag\":\"eyJpZCI6ImQ1MWEwNTJlLTA0M2MtNGEyYS1hYTM3LTJiYjkzOGNlZjZjMSIsInZlcnNpb24iOjF9\",\"ObjectType\":\"Order\"}}",
            "operationType": "create_order",
            "operationDate": "2017-06-15T22:56:05.0589308Z",
            "operationStatus": "succeeded",
            "customizedData": [{
                    "key": "OrderId",
                    "value": "d51a052e-043c-4a2a-aa37-2bb938cef6c1"
                }, {
                    "key": "BillingCycle",
                    "value": "None"
                }, {
                    "key": "OfferId-0",
                    "value": "C0BD2E08-11AC-4836-BDC7-3712E744922F"
                }, {
                    "key": "SubscriptionId-0",
                    "value": "488745B5-2086-4912-802C-6ABB9F7C3638"
                }, {
                    "key": "SubscriptionName-0",
                    "value": "Office 365 Business Premium Trial"
                }, {
                    "key": "Quantity-0",
                    "value": "25"
                }, {
                    "key": "PartnerOnRecord-0",
                    "value": null
                }
            ],
            "attributes": {
                "objectType": "AuditRecord"
            }
        }, {
            "partnerId": "3b33e682-00c3-41ee-9dd2-a548adf56438",
            "customerId": "0c39d6d5-c70d-4c55-bc02-f620844f3fd1",
            "customerName": "Relecloud",
            "userPrincipalName": "admin@domain.onmicrosoft.com",
            "applicationId": "Partner Center Native App",
            "resourceType": "license",
            "resourceNewValue": "{\"LicensesToAssign\":[{\"ExcludedPlans\":null,\"SkuId\":\"efccb6f7-5641-4e0e-bd10-b4976e1bf68e\"}],\"LicensesToRemove\":null,\"LicenseWarnings\":[],\"Attributes\":{\"ObjectType\":\"LicenseUpdate\"}}",
            "operationType": "update_customer_user_licenses",
            "operationDate": "2017-06-01T20:09:07.0450483Z",
            "operationStatus": "succeeded",
            "customizedData": [{
                    "key": "CustomerUserId",
                    "value": "482e2152-4b49-48ec-b715-823365ce3d4c"
                }, {
                    "key": "AddedLicenseSkuId",
                    "value": "efccb6f7-5641-4e0e-bd10-b4976e1bf68e"
                }
            ],
            "attributes": {
                "objectType": "AuditRecord"
            }
        }
    ],
    "links": {
        "self": {
            "uri": "/auditrecords?startDate=2017-06-01&size=500&filter=%7B%22Field%22%3A%22CustomerId%22%2C%22Value%22%3A%220c39d6d5-c70d-4c55-bc02-f620844f3fd1%22%2C%22Operator%22%3A%22equals%22%7D",
            "method": "GET",
            "headers": []
        }
    },
    "attributes": {
        "objectType": "Collection"
    }
}