using Azure.Core; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Resources; using Azure.ResourceManager.Storage; using Azure.ResourceManager.Storage.Models; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; namespace SubReader; internal class SubscriptionReaderSample { static async Task Main(string[] args) { const string subscriptionId = "5ce5376e-d76c-423f-995e-14a041a381ec"; const string tenantId = "34d98fe0-95c8-4cc9-a046-39ce28d1c9a5"; const string applicationId = "b74f309d-9202-4c2a-b109-b6f3274699ba"; const string password = "psl8Q~vLYaWl77HbPhUfYJ5W~ScK6epUTbIXI7Jj"; Environment.SetEnvironmentVariable("AZURE_SUBSCRIPTION_ID", subscriptionId); Environment.SetEnvironmentVariable("AZURE_TENANT_ID", tenantId); Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", applicationId); Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", password); TokenCredential credential = new EnvironmentCredential(); var arm = new ArmClient(credential); var sub = arm.GetDefaultSubscription(); // Loop over resource groups in the subscription. ResourceGroupCollection rgc = sub.GetResourceGroups(); foreach (var rg in rgc) { Console.WriteLine($"{rg.Id.Name}"); // Loop over storage accounts in the resource group. var accs = rg.GetStorageAccounts(); foreach (var acc in accs) { Console.WriteLine($"| {acc.Id.Name}"); StorageAccountKey? key1 = null; var keypages = acc.GetKeysAsync().AsPages(); await foreach (var keypage in keypages) { key1 = keypage.Values.First(); break; } string connect = $"DefaultEndpointsProtocol=https;AccountName={acc.Id.Name};AccountKey={key1!.Value};EndpointSuffix=core.windows.net"; // Loop over containers in the storage account. var bs = acc.GetBlobService(); BlobContainerCollection bcc = bs.GetBlobContainers(); string? contoken = null; do { await foreach (var conpage in bcc.GetAllAsync().AsPages()) { foreach (var con in conpage.Values) { // Loop over blobs in the container. int blobTotal = 0; long bytesTotal = 0L; var bcclient = new BlobContainerClient(connect, con.Id.Name); string? blobtoken = null; do { var pages = bcclient.GetBlobsAsync(BlobTraits.None).AsPages(blobtoken); await foreach (var page in pages) { foreach (var blob in page.Values) { ++blobTotal; bytesTotal += blob.Properties.ContentLength.Value; } } } while (blobtoken?.Length > 0); Console.WriteLine($"| | CON {con.Id.Name} • {blobTotal} • {bytesTotal}"); } contoken = conpage.ContinuationToken; } } while (contoken?.Length > 0); // Loop over tables in the storage account. var ts = acc.GetTableService(); TableCollection tcoll = ts.GetTables(); string? ttoken = null; do { await foreach (var tabpage in tcoll.GetAllAsync().AsPages()) { foreach (var table in tabpage.Values) { Console.WriteLine($"| | TABLE {table.Id.Name}"); // We could create a table client and scan all the rows // to count them and find the lowest and highest keys. // Omitted for now. } } } while (ttoken?.Length > 0); } } } }