В настоящее время мы находимся в процессе перехода к аутентификации сертификата клиента для нашего приложения и получили этот рабочий код из предыдущего запроса на получение удаленных объектов приложения из Microsoft Graph Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Указанный сетевой пароль не правильный.'
using Azure.Identity;
using Microsoft.Graph;
using System.Security.Cryptography.X509Certificates;
var scopes = new[] { "https://graph.microsoft.com/.default" };
var clientId = "appID";
var tenantId = "tenantId";
var certificatePath = "C:/MYPATH";
var certificatePassword = "xxxxxxxx";
var clientCertificate = new X509Certificate2(certificatePath, certificatePassword);
var options = new ClientCertificateCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientCertCredential = new ClientCertificateCredential(
tenantId, clientId, clientCertificate, options);
var graphClient = new GraphServiceClient(clientCertCredential, scopes);
var apps= await graphClient.Directory.DeletedItems.GraphApplication.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Count = true;
requestConfiguration.QueryParameters.Orderby = new string[] { "deletedDateTime asc" };
requestConfiguration.QueryParameters.Select = new string[] { "appId", "DisplayName", "deletedDateTime" };
requestConfiguration.Headers.Add("Consistencylevel", "Eventual");
});
Console.WriteLine($"Total deleted apps: {apps.OdataCount}\n");
foreach (var app in apps.Value)
{
Console.WriteLine($"App ID: {app.AppId}");
Console.WriteLine($"Application Name: {app.DisplayName}");
Console.WriteLine($"Deleted Date and Time: {app.DeletedDateTime}");
Console.WriteLine();
}
Хотя код эффективно извлекает удаленные объекты приложения, теперь у нас есть особое требование восстанавливать только те удаленные приложения, имена которых начинаются с «dev». Мы попытались изменить код, чтобы добиться этого, включив условие фильтра, но столкнулись с трудностями в реализации. .
Не могли бы вы предоставить рекомендации о том, как интегрировать условие фильтра для выборочного восстановления удаленных приложений на основе их имен, начинающихся с «dev»? Любая помощь или идеи будут очень признательны.
Чтобы восстановить удаленное приложение, вам необходимо предоставить Application.ReadWrite.All разрешение типа Приложение:
У меня есть 3 удаленных приложения, имена которых начинаются с «dev» в моем клиенте, вот так:
Теперь вы можете использовать приведенный ниже модифицированный код для восстановления этих удаленных приложений, отфильтровав их, начиная с «dev»:
using Azure.Identity;
using Microsoft.Graph;
using System.Security.Cryptography.X509Certificates;
var scopes = new[] { "https://graph.microsoft.com/.default" };
var clientId = "appID";
var tenantId = "tenantId";
// Load certificate from file
var certificatePath = "C:/demo/graphcert20.pfx";
var certificatePassword = "password"; // Provide the password here
var clientCertificate = new X509Certificate2(certificatePath, certificatePassword);
// using Azure.Identity;
var options = new ClientCertificateCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};
var clientCertCredential = new ClientCertificateCredential(
tenantId, clientId, clientCertificate, options);
var graphClient = new GraphServiceClient(clientCertCredential, scopes);
var deletedApps = await graphClient.Directory.DeletedItems.GraphApplication.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Count = true;
requestConfiguration.QueryParameters.Filter = "startsWith(displayName, 'dev')";
requestConfiguration.QueryParameters.Select = new string[] { "displayName", "Id", "deletedDateTime" };
requestConfiguration.Headers.Add("Consistencylevel", "Eventual");
});
Console.WriteLine($"Total deleted apps starting with 'dev': {deletedApps.OdataCount}\n");
foreach (var deletedApp in deletedApps.Value)
{
var appId = deletedApp.Id;
Console.WriteLine($"Restoring app with ID: {appId}");
var restoreResponse = await graphClient.Directory.DeletedItems[appId].Restore.PostAsync();
if (restoreResponse != null)
{
Console.WriteLine($"App with display name '{deletedApp.DisplayName}' restored successfully.\n");
}
else
{
Console.WriteLine($"Failed to restore app with ID {appId}.");
}
}
Ответ:
Чтобы подтвердить это, я проверил то же самое на портале, где удаленные приложения, начинающиеся с «dev», успешно восстанавливаются следующим образом:
Огромное спасибо, ваш код снова заработал безупречно, как и ожидалось!