Gestire in blocco le identità dei dispositivi dell'hub IoTManage your IoT Hub device identities in bulk

Ogni hub IoT ha un registro delle identità che è possibile usare per creare le risorse per ogni dispositivo nel servizio.Each IoT hub has an identity registry you can use to create per-device resources in the service. e per consentire di controllare gli accessi agli endpoint per il dispositivo.The identity registry also enables you to control access to the device-facing endpoints. Questo articolo descrive come importare ed esportare in blocco le identità del dispositivo in/da un registro delle identità.This article describes how to import and export device identities in bulk to and from an identity registry.

Le operazioni di importazione ed esportazione vengono eseguite nel contesto di processi che consentono di eseguire operazioni del servizio in blocco a fronte di un hub IoT.Import and export operations take place in the context of Jobs that enable you to execute bulk service operations against an IoT hub.

La classe RegistryManager include i metodi ExportDevicesAsync e ImportDevicesAsync che usano il framework di processi.The RegistryManager class includes the ExportDevicesAsync and ImportDevicesAsync methods that use the Job framework. Questi metodi consentono di esportare, importare e sincronizzare un intero registro delle identità dell'hub IoT.These methods enable you to export, import, and synchronize the entirety of an IoT hub identity registry.

Informazioni sui processiWhat are jobs?

Le operazioni del registro delle identità usano il sistema di gestione dei processi quando l'operazione:Identity registry operations use the Job system when the operation:

  • Ha un tempo di esecuzione potenzialmente lungo rispetto alle operazioni di runtime standard.Has a potentially long execution time compared to standard run-time operations.
  • Restituisce all'utente una grande quantità di dati.Returns a large amount of data to the user.

Invece di avere una singola chiamata API in attesa o che blocca il risultato dell'operazione, quest'ultima crea in modo asincrono un processo per tale hub IoT,Instead of a single API call waiting or blocking on the result of the operation, the operation asynchronously creates a Job for that IoT hub. quindi restituisce immediatamente un oggetto JobProperties.The operation then immediately returns a JobProperties object.

Il frammento di codice C# seguente mostra come creare un processo di esportazione:The following C# code snippet shows how to create an export job:

// Call an export job on the IoT Hub to retrieve all devices
JobProperties exportJob = await registryManager.ExportDevicesAsync(containerSasUri, false);

Nota

Per usare la classe il RegistryManager nel codice c#, aggiungere il pacchetto NuGet Microsoft.Azure.Devices al progetto.To use the RegistryManager class in your C# code, add the Microsoft.Azure.Devices NuGet package to your project. La classe RegistryManager si trova nello spazio dei nomi Microsoft.Azure.Devices.The RegistryManager class is in the Microsoft.Azure.Devices namespace.

È possibile usare la classe RegistryManager per eseguire query sullo stato del processo usando i metadati di JobProperties restituiti.You can use the RegistryManager class to query the state of the Job using the returned JobProperties metadata.

Il frammento di codice C# seguente mostra come eseguire il polling ogni cinque secondi per vedere se il processo ha terminato l'esecuzione:The following C# code snippet shows how to poll every five seconds to see if the job has finished executing:

// Wait until job is finished
while(true)
{
  exportJob = await registryManager.GetJobAsync(exportJob.JobId);
  if (exportJob.Status == JobStatus.Completed || 
      exportJob.Status == JobStatus.Failed ||
      exportJob.Status == JobStatus.Cancelled)
  {
    // Job has finished executing
    break;
  }

  await Task.Delay(TimeSpan.FromSeconds(5));
}

Esportare dispositiviExport devices

Usare il metodo ExportDevicesAsync per esportare un intero registro delle identità di un hub IoT in un contenitore BLOB di Archiviazione di Azure con una firma di accesso condiviso.Use the ExportDevicesAsync method to export the entirety of an IoT hub identity registry to an Azure Storage blob container using a Shared Access Signature.

Questo metodo consente di creare backup affidabili delle informazioni sui dispositivi in un contenitore BLOB che si controlla.This method enables you to create reliable backups of your device information in a blob container that you control.

Il metodo ExportDevicesAsync richiede due parametri:The ExportDevicesAsync method requires two parameters:

  • Una stringa che contiene un URI di un contenitore BLOB.A string that contains a URI of a blob container. Questo URI deve contenere un token di firma di accesso condiviso che concede l'accesso in scrittura al contenitore.This URI must contain a SAS token that grants write access to the container. Il processo crea un BLOB in blocchi in questo contenitore per archiviare i dati di esportazione del dispositivo serializzati.The job creates a block blob in this container to store the serialized export device data. Il token di firma di accesso condiviso deve includere queste autorizzazioni:The SAS token must include these permissions:

    SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Delete
    
  • Oggetto booleano che indica se si vogliono escludere le chiavi di autenticazione dai dati di esportazione.A boolean that indicates if you want to exclude authentication keys from your export data. Se il valore è false, le chiavi di autenticazione sono incluse nell'output di esportazione.If false, authentication keys are included in export output. In caso contrario, le chiavi vengono esportate come null.Otherwise, keys are exported as null.

I frammenti di codice C# seguenti illustrano come inizializzare un processo di esportazione che include chiavi di autenticazione di dispositivi nei dati di esportazione e quindi eseguire il polling del completamento:The following C# code snippet shows how to initiate an export job that includes device authentication keys in the export data and then poll for completion:

// Call an export job on the IoT Hub to retrieve all devices
JobProperties exportJob = await registryManager.ExportDevicesAsync(containerSasUri, false);

// Wait until job is finished
while(true)
{
    exportJob = await registryManager.GetJobAsync(exportJob.JobId);
    if (exportJob.Status == JobStatus.Completed || 
        exportJob.Status == JobStatus.Failed ||
        exportJob.Status == JobStatus.Cancelled)
    {
    // Job has finished executing
    break;
    }

    await Task.Delay(TimeSpan.FromSeconds(5));
}

Il processo archivia l'output nel contenitore BLOB specificato come BLOB in blocchi con il nome devices.txt.The job stores its output in the provided blob container as a block blob with the name devices.txt. I dati di output sono costituiti da dati del dispositivo serializzati in formato JSON, con un dispositivo per ogni riga.The output data consists of JSON serialized device data, with one device per line.

Nell'esempio seguente vengono descritti i dati di output:The following example shows the output data:

{"id":"Device1","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device2","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device3","eTag":"MA==","status":"disabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device4","eTag":"MA==","status":"disabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}
{"id":"Device5","eTag":"MA==","status":"enabled","authentication":{"symmetricKey":{"primaryKey":"abc=","secondaryKey":"def="}}}

Se un dispositivo contiene dati gemelli, allora anche i dati gemelli vengono esportati con i dati del dispositivo. Questo formato è illustrato nell'esempio seguente. Tutti i dati dalla riga di "twinETag" fino alla fine sono dati gemelli.All data from the "twinETag" line until the end are twin data.

{
   "id":"export-6d84f075-0",
   "eTag":"MQ==",
   "status":"enabled",
   "statusReason":"firstUpdate",
   "authentication":null,
   "twinETag":"AAAAAAAAAAI=",
   "tags":{
      "Location":"LivingRoom"
   },
   "properties":{
      "desired":{
         "Thermostat":{
            "Temperature":75.1,
            "Unit":"F"
         },
         "$metadata":{
            "$lastUpdated":"2017-03-09T18:30:52.3167248Z",
            "$lastUpdatedVersion":2,
            "Thermostat":{
               "$lastUpdated":"2017-03-09T18:30:52.3167248Z",
               "$lastUpdatedVersion":2,
               "Temperature":{
                  "$lastUpdated":"2017-03-09T18:30:52.3167248Z",
                  "$lastUpdatedVersion":2
               },
               "Unit":{
                  "$lastUpdated":"2017-03-09T18:30:52.3167248Z",
                  "$lastUpdatedVersion":2
               }
            }
         },
         "$version":2
      },
      "reported":{
         "$metadata":{
            "$lastUpdated":"2017-03-09T18:30:51.1309437Z"
         },
         "$version":1
      }
   }
}

Se è necessario accedere ai dati nel codice, è possibile deserializzarli facilmente con la classe ExportImportDevice .If you need access to this data in code, you can easily deserialize this data using the ExportImportDevice class. Il frammento di codice C# seguente mostra come leggere le informazioni sul dispositivo esportate precedentemente in un BLOB in blocchi:The following C# code snippet shows how to read device information that was previously exported to a block blob:

var exportedDevices = new List<ExportImportDevice>();

using (var streamReader = new StreamReader(await blob.OpenReadAsync(AccessCondition.GenerateIfExistsCondition(), null, null), Encoding.UTF8))
{
  while (streamReader.Peek() != -1)
  {
    string line = await streamReader.ReadLineAsync();
    var device = JsonConvert.DeserializeObject<ExportImportDevice>(line);
    exportedDevices.Add(device);
  }
}

Nota

È anche possibile usare il metodo GetDevicesAsync della classe RegistryManager per recuperare un elenco dei dispositivi.You can also use the GetDevicesAsync method of the RegistryManager class to fetch a list of your devices. Questo approccio presenta tuttavia un limite rigido pari a un numero di 1000 oggetti dispositivo restituiti.However, this approach has a hard cap of 1000 on the number of device objects that are returned. Il caso d'uso previsto per il metodo GetDevicesAsync è destinato a scenari di sviluppo per facilitare il debug e non è consigliabile per i carichi di lavoro di produzione.The expected use case for the GetDevicesAsync method is for development scenarios to aid debugging and is not recommended for production workloads.

Importare dispositiviImport devices

Il metodo ImportDevicesAsync nella classe RegistryManager consente di eseguire operazioni di importazione e sincronizzazione in blocco nel registro delle identità di un hub IoT.The ImportDevicesAsync method in the RegistryManager class enables you to perform bulk import and synchronization operations in an IoT hub identity registry. In modo analogo al metodo ExportDevicesAsync, il metodo ImportDevicesAsync usa il framework Job.Like the ExportDevicesAsync method, the ImportDevicesAsync method uses the Job framework.

Prestare attenzione quando si usa il metodo ImportDevicesAsync in quanto, oltre a eseguire il provisioning dei dispositivi nuovi nel registro delle identità, può anche aggiornare ed eliminare dispositivi esistenti.Take care using the ImportDevicesAsync method because in addition to provisioning new devices in your identity registry, it can also update and delete existing devices.

Avviso

Un'operazione di importazione non può essere annullata.An import operation cannot be undone. Eseguire sempre il backup dei dati esistenti usando il metodo ExportDevicesAsync in un altro contenitore BLOB, prima di apportare modifiche in blocco al registro delle identità.Always back up your existing data using the ExportDevicesAsync method to another blob container before you make bulk changes to your identity registry.

Il metodo ImportDevicesAsync usa due parametri:The ImportDevicesAsync method takes two parameters:

  • Una stringa che contiene un URI di un contenitore BLOB di Archiviazione di Azure come input del processo.A string that contains a URI of an Azure Storage blob container to use as input to the job. Questo URI deve contenere un token di firma di accesso condiviso che concede l'accesso in lettura al contenitore.This URI must contain a SAS token that grants read access to the container. Questo contenitore deve includere un BLOB con il nome devices.txt che contiene i dati serializzati del dispositivo da importare nel registro delle identità.This container must contain a blob with the name devices.txt that contains the serialized device data to import into your identity registry. I dati di importazione devono contenere informazioni sul dispositivo nello stesso formato JSON usato dal processo ExportImportDevice quando viene creato il BLOB devices.txt.The import data must contain device information in the same JSON format that the ExportImportDevice job uses when it creates a devices.txt blob. Il token di firma di accesso condiviso deve includere queste autorizzazioni:The SAS token must include these permissions:

    SharedAccessBlobPermissions.Read
    
  • Una stringa che contiene un URI di un contenitore BLOB di Archiviazione di Azure da usare come output del processo.A string that contains a URI of an Azure Storage blob container to use as output from the job. Il processo crea un BLOB in blocchi in questo contenitore per archiviare qualsiasi informazione sull'errore dal processodi importazione completato.The job creates a block blob in this container to store any error information from the completed import Job. Il token di firma di accesso condiviso deve includere queste autorizzazioni:The SAS token must include these permissions:

    SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Delete
    

Nota

I due parametri possono puntare allo stesso contenitore BLOB.The two parameters can point to the same blob container. I parametri separati consentono semplicemente un maggiore controllo dei dati, perché il contenitore di output richiede autorizzazioni aggiuntive.The separate parameters simply enable more control over your data as the output container requires additional permissions.

Il frammento di codice C# seguente mostra come avviare un processo di importazione:The following C# code snippet shows how to initiate an import job:

JobProperties importJob = await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

Questo metodo può essere usato anche per importare i dati per il dispositivo gemello.This method can also be used to import the data for the device twin. Il formato per i dati di input è uguale al formato visualizzato nella sezione ExportDevicesAsync.The format for the data input is the same as the format shown in the ExportDevicesAsync section. In questo modo, è possibile reimportare i dati esportati.In this way, you can reimport the exported data. Il $metadata è facoltativo.The $metadata is optional.

Importare il comportamentoImport behavior

È possibile usare il metodo ImportDevicesAsync per eseguire le operazioni in blocco seguenti nel registro delle identità:You can use the ImportDevicesAsync method to perform the following bulk operations in your identity registry:

  • Registrazione in blocco di nuovi dispositiviBulk registration of new devices
  • Eliminazioni in blocco dei dispositivi esistentiBulk deletions of existing devices
  • Modifiche dello stato in blocco (abilitare o disabilitare dispositivi)Bulk status changes (enable or disable devices)
  • Assegnazione in blocco di nuove chiavi di autenticazione del dispositivoBulk assignment of new device authentication keys
  • Rigenerazione automatica in blocco di chiavi di autenticazione del dispositivoBulk auto-regeneration of device authentication keys
  • Aggiornamento bulk dei dati gemelliBulk update of twin data

È possibile eseguire una combinazione qualsiasi delle operazioni precedenti in un'unica chiamata ImportDevicesAsync .You can perform any combination of the preceding operations within a single ImportDevicesAsync call. Ad esempio, è possibile registrare nuovi dispositivi ed eliminare o aggiornare contemporaneamente quelli esistenti.For example, you can register new devices and delete or update existing devices at the same time. Insieme con il metodo ExportDevicesAsync , è possibile eseguire la migrazione completa di tutti i dispositivi da un hub IoT all'altro.When used along with the ExportDevicesAsync method, you can completely migrate all your devices from one IoT hub to another.

Se il file di importazione include metadati gemelli, questi metadati sovrascrivono i metadati gemelli esistenti.If the import file includes twin metadata, then this metadata overwrites the existing twin metadata. Se il file di importazione non include i metadati gemelli, allora solo i metadati lastUpdateTime vengono aggiornati usando l'ora corrente.If the import file does not include twin metadata, then only the lastUpdateTime metadata is updated using the current time.

Usare la proprietà facoltativa importMode nei dati di serializzazione dell'importazione per ogni dispositivo per controllare il processo di importazione per dispositivo.Use the optional importMode property in the import serialization data for each device to control the import process per-device. La proprietà importMode include le opzioni seguenti:The importMode property has the following options:

importModeimportMode DescrizioneDescription
createOrUpdatecreateOrUpdate Se non esiste un dispositivo con l' IDspecificato, viene registrato di nuovo.If a device does not exist with the specified id, it is newly registered.
Se il dispositivo esiste già, le informazioni esistenti vengono sovrascritte con i dati di input specificati senza tener conto del valore ETag .If the device already exists, existing information is overwritten with the provided input data without regard to the ETag value.
L'utente può facoltativamente specificare i dati gemelli con i dati del dispositivo.The user can optionally specify twin data along with the device data. L'ETag del gemello, se specificato, viene elaborato in modo indipendente dal valore etag del dispositivo.The twin’s etag, if specified, is processed independently from the device’s etag. Se è presente una mancata corrispondenza con l'etag del gemello esistente, viene scritto un errore nel file di log.If there is a mismatch with the existing twin’s etag, an error is written to the log file.
createcreate Se non esiste un dispositivo con l' IDspecificato, viene registrato di nuovo.If a device does not exist with the specified id, it is newly registered.
Se il dispositivo esiste già, viene scritto un errore nel file di log.If the device already exists, an error is written to the log file.
L'utente può facoltativamente specificare i dati gemelli con i dati del dispositivo.The user can optionally specify twin data along with the device data. L'ETag del gemello, se specificato, viene elaborato in modo indipendente dal valore etag del dispositivo.The twin’s etag, if specified, is processed independently from the device’s etag. Se è presente una mancata corrispondenza con l'etag del gemello esistente, viene scritto un errore nel file di log.If there is a mismatch with the existing twin’s etag, an error is written to the log file.
updateupdate Se esiste già un dispositivo con l'ID specificato, le informazioni esistenti vengono sovrascritte con i dati di input specificati senza tener conto del valore ETag.If a device already exists with the specified id, existing information is overwritten with the provided input data without regard to the ETag value.
Se il dispositivo non esiste, viene scritto un errore nel file di log.If the device does not exist, an error is written to the log file.
updateIfMatchETagupdateIfMatchETag Se esiste già un dispositivo con l'ID specificato, le informazioni esistenti vengono sovrascritte con i dati di input specificati solo se viene rilevata una corrispondenza con ETag.If a device already exists with the specified id, existing information is overwritten with the provided input data only if there is an ETag match.
Se il dispositivo non esiste, viene scritto un errore nel file di log.If the device does not exist, an error is written to the log file.
In caso di mancata corrispondenza con ETag , viene scritto un errore nel file di log.If there is an ETag mismatch, an error is written to the log file.
createOrUpdateIfMatchETagcreateOrUpdateIfMatchETag Se non esiste un dispositivo con l' IDspecificato, viene registrato di nuovo.If a device does not exist with the specified id, it is newly registered.
Se il dispositivo esiste già, le informazioni esistenti vengono sovrascritte con i dati di input specificati solo se viene rilevata una corrispondenza con ETag .If the device already exists, existing information is overwritten with the provided input data only if there is an ETag match.
In caso di mancata corrispondenza con ETag , viene scritto un errore nel file di log.If there is an ETag mismatch, an error is written to the log file.
L'utente può facoltativamente specificare i dati gemelli con i dati del dispositivo.The user can optionally specify twin data along with the device data. L'ETag del gemello, se specificato, viene elaborato in modo indipendente dal valore etag del dispositivo.The twin’s etag, if specified, is processed independently from the device’s etag. Se è presente una mancata corrispondenza con l'etag del gemello esistente, viene scritto un errore nel file di log.If there is a mismatch with the existing twin’s etag, an error is written to the log file.
deletedelete Se esiste già un dispositivo con l'ID specificato, viene eliminato senza tener conto del valore ETag.If a device already exists with the specified id, it is deleted without regard to the ETag value.
Se il dispositivo non esiste, viene scritto un errore nel file di log.If the device does not exist, an error is written to the log file.
deleteIfMatchETagdeleteIfMatchETag Se esiste già un dispositivo con l'ID specificato, viene eliminato solo se viene rilevata una corrispondenza con ETag.If a device already exists with the specified id, it is deleted only if there is an ETag match. Se il dispositivo non esiste, viene scritto un errore nel file di log.If the device does not exist, an error is written to the log file.
In caso di mancata corrispondenza con ETag, viene scritto un errore nel file di log.If there is an ETag mismatch, an error is written to the log file.

Nota

Se i dati di serializzazione non definiscono in modo esplicito un flag importMode per un dispositivo, durante l'operazione di importazione l'impostazione predefinita è createOrUpdate.If the serialization data does not explicitly define an importMode flag for a device, it defaults to createOrUpdate during the import operation.

Importare dispositivi: esempio di provisioning dei dispositivi in bloccoImport devices example – bulk device provisioning

Il campione di codice C# seguente illustra come generare più identità dei dispositivi che:The following C# code sample illustrates how to generate multiple device identities that:

  • Includono chiavi di autenticazione.Include authentication keys.
  • Scrivono le informazioni del dispositivo in un BLOB in blocchi.Write that device information to a block blob.
  • Importano i dispositivi nel registro delle identità.Import the devices into the identity registry.
// Provision 1,000 more devices
var serializedDevices = new List<string>();

for (var i = 0; i < 1000; i++)
{
  // Create a new ExportImportDevice
  // CryptoKeyGenerator is in the Microsoft.Azure.Devices.Common namespace
  var deviceToAdd = new ExportImportDevice()
  {
    Id = Guid.NewGuid().ToString(),
    Status = DeviceStatus.Enabled,
    Authentication = new AuthenticationMechanism()
    {
      SymmetricKey = new SymmetricKey()
      {
        PrimaryKey = CryptoKeyGenerator.GenerateKey(32),
        SecondaryKey = CryptoKeyGenerator.GenerateKey(32)
      }
    },
    ImportMode = ImportMode.Create
  };

  // Add device to the list
  serializedDevices.Add(JsonConvert.SerializeObject(deviceToAdd));
}

// Write the list to the blob
var sb = new StringBuilder();
serializedDevices.ForEach(serializedDevice => sb.AppendLine(serializedDevice));
await blob.DeleteIfExistsAsync();

using (CloudBlobStream stream = await blob.OpenWriteAsync())
{
  byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
  for (var i = 0; i < bytes.Length; i += 500)
  {
    int length = Math.Min(bytes.Length - i, 500);
    await stream.WriteAsync(bytes, i, length);
  }
}

// Call import using the blob to add new devices
// Log information related to the job is written to the same container
// This normally takes 1 minute per 100 devices
JobProperties importJob = await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

// Wait until job is finished
while(true)
{
  importJob = await registryManager.GetJobAsync(importJob.JobId);
  if (importJob.Status == JobStatus.Completed || 
      importJob.Status == JobStatus.Failed ||
      importJob.Status == JobStatus.Cancelled)
  {
    // Job has finished executing
    break;
  }

  await Task.Delay(TimeSpan.FromSeconds(5));
}

Importare dispositivi: esempio di eliminazione in bloccoImport devices example – bulk deletion

L'esempio di codice seguente illustra come eliminare i dispositivi aggiunti con l'esempio di codice precedente:The following code sample shows you how to delete the devices you added using the previous code sample:

// Step 1: Update each device's ImportMode to be Delete
sb = new StringBuilder();
serializedDevices.ForEach(serializedDevice =>
{
  // Deserialize back to an ExportImportDevice
  var device = JsonConvert.DeserializeObject<ExportImportDevice>(serializedDevice);

  // Update property
  device.ImportMode = ImportMode.Delete;

  // Re-serialize
  sb.AppendLine(JsonConvert.SerializeObject(device));
});

// Step 2: Write the new import data back to the block blob
await blob.DeleteIfExistsAsync();
using (CloudBlobStream stream = await blob.OpenWriteAsync())
{
  byte[] bytes = Encoding.UTF8.GetBytes(sb.ToString());
  for (var i = 0; i < bytes.Length; i += 500)
  {
    int length = Math.Min(bytes.Length - i, 500);
    await stream.WriteAsync(bytes, i, length);
  }
}

// Step 3: Call import using the same blob to delete all devices
importJob = await registryManager.ImportDevicesAsync(containerSasUri, containerSasUri);

// Wait until job is finished
while(true)
{
  importJob = await registryManager.GetJobAsync(importJob.JobId);
  if (importJob.Status == JobStatus.Completed || 
      importJob.Status == JobStatus.Failed ||
      importJob.Status == JobStatus.Cancelled)
  {
    // Job has finished executing
    break;
  }

  await Task.Delay(TimeSpan.FromSeconds(5));
}

Recuperare l'URI di firma di accesso condiviso del contenitoreGet the container SAS URI

Il codice di esempio seguente illustra come generare un URI di firma di accesso condiviso con autorizzazioni di lettura, scrittura ed eliminazione per un contenitore BLOB:The following code sample shows you how to generate a SAS URI with read, write, and delete permissions for a blob container:

static string GetContainerSasUri(CloudBlobContainer container)
{
  // Set the expiry time and permissions for the container.
  // In this case no start time is specified, so the
  // shared access signature becomes valid immediately.
  var sasConstraints = new SharedAccessBlobPolicy();
  sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
  sasConstraints.Permissions = 
    SharedAccessBlobPermissions.Write | 
    SharedAccessBlobPermissions.Read | 
    SharedAccessBlobPermissions.Delete;

  // Generate the shared access signature on the container,
  // setting the constraints directly on the signature.
  string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

  // Return the URI string for the container,
  // including the SAS token.
  return container.Uri + sasContainerToken;
}

Passaggi successiviNext steps

In questo articolo si è appreso come eseguire operazioni in blocco sul registro delle identità in un hub IoT.In this article, you learned how to perform bulk operations against the identity registry in an IoT hub. Per ulteriori informazioni sulla gestione dell'hub IoT di Azure, consultare questi collegamenti:Follow these links to learn more about managing Azure IoT Hub:

Per altre informazioni sulle funzionalità dell'hub IoT, vedere:To further explore the capabilities of IoT Hub, see: