Un outil pour renouveler l'abonnement E5 en appelant les API Mgraph
Créer une application
Voir Registre Application et configurer les autorisations pour plus d'informations. Nous avons besoin tenant id , client id et client secret de votre application pour accéder aux API Mgraph.
Créer un fichier de secreur utilisateur
Copiez user-secret.json.example sur user-secret.json , modifiez-le comme besoin. Vous pouvez toujours ajouter plus d'identification.
Si vous souhaitez utiliser un certificat à la place secrète, ce qui est mieux pour la sécurité, vous pouvez écrire une clé de certificate avec un chemin vers votre fichier de certificat plutôt une clé secret . Si nous vous trouvons un certificate , il sera toujours utilisé à secret .
Si vous ajoutez un certificat après une application créée et ajouté secret, le client_id peut être modifié, veuillez donc le mettre à jour.
L'utilisation du format PFX pour cet outil est testée. Mais il vous suffit de télécharger la partie clé publique (*. CRT) à Azure.
Si votre certificat dispose d'un mot de passe, vous pouvez créer une clé passwords dans un fichier secrète utilisateur comme ceci:
{
"passwords" : {
"<sha512sum>" : " <password> "
}
} <sha512sum> est la somme SHA512 du fichier de certificat en minuscules et <password> est son mot de passe en simple , veuillez garder la configuration en secret pour éviter que quelqu'un utilise votre certificat sans être autorisé.
La définition de jours est nécessaire pour être prudente, car cela signifie que DayOfWeek dans le programme, vérifiez ici pour découvrir sa valeur correcte.
Conseil
Nous soutenons les formats JSON, YAML et TOML pour l'instant, mais nous utilisons JSON comme exemple, vous pouvez toujours utiliser d'autres formats. Les formats soutenus par nous peuvent même être étendus en utilisant des modules
Installer .net
Voir ici pour plus d'informations, nous avons besoin de .NET 8 et plus tard.
Obtenir un programme
Vous pouvez télécharger ou construire pour obtenir des fichiers binaires.
Programme d'exécution
Exécutez simplement ./E5Renewer dans le dossier binaires avec des arguments nécessaires.
Voici des arguments pris en charge:
--systemd : Si vous exécute dans l'environnement Systemd, la plupart du temps, vous ne devriez pas en avoir besoin.--user-secret : le chemin vers le fichier secrète de l'utilisateur.--token : la chaîne pour accéder à l'API JSON.--token-file : le fichier dont la première ligne est utilisée comme jeton.--listen-unix-socket-permission : l'autorisation au fichier de socket de domaine UNIX. Nous écouterons sur Endpoint http://127.0.0.1:5000 Par défaut, c'est la valeur par défaut du noyau ASP.NET.
ASP.NET CORE PRÉPATIONS --urls Paramètre pour définir le point de terminaison d'écoute personnalisé, tel que --urls=http://127.0.0.1:5001 ou --urls=http://unix:/path/to/socket . L'autorisation du fichier de socket de domaine UNIX peut être personnalisée avec l'argument --listen-unix-socket-permission .
Ces arguments personnalisés sont en fait des éléments de configuration de base ASP.NET, les noms des éléments sont le titlecase des arguments. Par exemple, --token sera mappé à Token , --user-secret sera mappé vers UserSecret , et --listen-unix-socket-permission sera cartographié pour ListenUnixSocketPermission . Avec cette carte de conversion, vous pouvez utiliser les moyens d'Asp.net Core de les fournir, tels que la configuration JSON, la variable d'environnement, etc. Mais il existe un cas spécial: --systemd devrait être fourni avec Systemd=true Si vous n'utilisez pas l'argument de commande de commandement, car la configuration d'Asp.net Core nécessite une valeur, nous avons ajouté une vérification spéciale pour l'indicateur --systemd . Ces arguments personnalisés n'ont pas de formes courtes comme -s , -u .
--user-secret doit être fourni via n'importe quelle méthode pour fournir une valeur de configuration de base ASP.NET, ou une NullReferenceException de userSecret sera Thown.
Note
Si --token --token-file les deux sont spécifiés, nous préférons --token . Si vous oubliez de définir aucun d'eux, nous utilisons une valeur générée aléatoirement. Vous pouvez le découvrir dans la sortie du journal après avoir envoyé une demande au programme et respecté une erreur d'authentification.
Important
Si vous souhaitez définir une autorisation de socket Unix, vous devez écrire sa valeur réelle plutôt que le format octal. Par exemple, l'utilisation 511 à la place 777 est requise.
Exécutez dotnet publish -c Release et vous pouvez obtenir un binaire chez E5Renewer/bin/Release/net8.0/publish
À l'aide curl ou de tout outil qui peut envoyer une demande HTTP, envoyez une demande à des points de terminaison comme http://127.0.0.1:5000 ou socket /path/to/socket , chaque demande doit être envoyée avec Authorization: Bearer <auth_token> . Vous obtiendrez une réponse JSON si tout va bien. S'il s'agit d'une demande de GET, envoyez un horodatme MILISECOND dans timestamp de la requête, s'il s'agit d'une demande de poste, envoyez un horodatme MILISECOND dans POST JSON avec timestamp de clé et convertissez-le en chaîne. La plupart du temps, nous retournerons JSON à la place en texte brut, mais vous devez vérifier le code de réponse pour voir si la demande est un succès. Si vous utilisez HTTPS, envoyez simplement la demande HTTPS à la place.
Par exemple:
curl -H 'Authorization: Bearer <auth_token>' -H 'Accept: application/json'
'http://127.0.0.1:5000/v1/list_apis?timestamp=<timestamp>' | jq '.'
{
"method": "list_apis",
"args": {},
"result": [
"AgreementAcceptances.Get",
"Admin.Get",
"Agreements.Get",
"AppCatalogs.Get",
"ApplicationTemplates.Get",
"Applications.Get",
"AuditLogs.Get",
"AuthenticationMethodConfigurations.Get",
"AuthenticationMethodsPolicy.Get",
"CertificateBasedAuthConfiguration.Get",
"Chats.Get", "Communications.Get",
"Compliance.Get",
"Connections.Get",
"Contacts.Get",
"DataPolicyOperations.Get",
"DeviceAppManagement.Get",
"DeviceManagement.Get",
"Devices.Get",
"Direcory.Get",
"DirectoryObjects.Get",
"DirectoryRoleTemplates.Get",
"DirectoryRoles.Get",
"DomainDnsRecords.Get",
"Domains.Get",
"Drives.Get",
"Education.Get",
"EmployeeExperience.Get",
"External.Get",
"FilterOperators.Get",
"Functions.Get",
"GroupLifecyclePolicies.Get",
"GroupSettingTemplates.Get",
"GroupSetings.Get",
"Groups.Get",
"Identity.Get",
"IdentityGovernance.Get",
"IdentityProtection.Get",
"IdentityProviders.Get",
"InfomationProtecion.Get",
"Invitations.Get",
"OAuth2PermissionGrants.Get",
"Organization.Get",
"PermissionGrants.Get",
"Places.Count.Get",
"Places.GraphRoom.Get",
"Planner.Get",
"Policies.Get",
"Print.Get",
"Privacy.Get",
"Reports.Get",
"RoleManagement.Get",
"SchemaExtensions.Get",
"ScopedRoleMemberships.Get",
"Search.Get",
"Security.Get",
"ServicePrincipals.Get",
"Shares.Get",
"Sites.Get",
"Solutions.Get",
"SubscribedSkus.Get",
"Subscriptions.Get",
"Teams.Get",
"TeamsTemplates.Get",
"Teamwork.Get",
"TenantRelationships.Get",
"Users.Get"
],
"timestamp": "<timestamp_returned_by_server>"
}
Le serveur n'acceptera que la demande de moins de 30 secondes de plus que l'heure du serveur.
Voir http-api.md pour les API possibles
Nous avons créé un système de modules pour étendre le programme, vous pouvez vérifier les modules.md pour plus d'informations.