Una herramienta para renovar la suscripción E5 llamando a las API de MSGRAPH
Crear aplicación
Consulte la aplicación de registro y configure los permisos para obtener más información. Necesitamos tenant id , client id y client secret de su aplicación para acceder a las API de MSGRAPH.
Crear archivo secretero de usuario
Copie user-secret.json.example a user-secret.json , edítelo como su necesidad. Siempre puede agregar más credenciales.
Si desea usar el certificado en lugar de Secret, que es mejor para la seguridad, puede escribir una clave certificate con ruta a su archivo de certificado en lugar de la clave secret . Si encontramos que establece certificate , siempre se usará en lugar de secret .
Si agrega el certificado después de la aplicación creada y se agregó Secret, el client_id puede cambiarse, así que actualice.
Se prueba el uso de formato PFX para esta herramienta. Pero solo necesita cargar la parte clave pública (*. CRT) a Azure.
Si su certificado tiene una contraseña, puede crear una clave passwords en el archivo de secreto del usuario como este:
{
"passwords" : {
"<sha512sum>" : " <password> "
}
} <sha512sum> es la suma SHA512 del archivo de certificado en minúsculas y <password> es su contraseña en simple , mantenga la configuración en secreto para evitar que alguien use su certificado sin estar permitido.
Es necesario establecer días para ser cautelosos, ya que significa DayOfWeek en el programa, consulte aquí para averiguar su valor correcto.
Consejo
Apoyamos los formatos JSON, YAML y TOML por ahora, aunque usamos JSON como ejemplo, siempre puede usar otros formatos. Los formatos respaldados por nosotros pueden incluso extenderse mediante el uso de módulos
Instalar .net
Vea aquí para obtener más información, necesitamos .NET 8 y posterior.
Obtener programa
Puede descargar o construir para obtener archivos binarios.
Programa de ejecución
Simplemente ejecute ./E5Renewer en la carpeta de binarios con argumentos necesarios.
Aquí hay argumentos respaldados:
--systemd : si se ejecuta en el entorno Systemd, la mayoría de las veces no debería necesitarlo.--user-secret : la ruta al archivo de secreto del usuario.--token : la cadena para acceder a la API JSON.--token-file : el archivo que se utiliza la primera línea como token.--listen-unix-socket-permission : el permiso para el archivo de socket de dominio UNIX. Escucharemos en Endpoint http://127.0.0.1:5000 de forma predeterminada, este es el valor predeterminado de ASP.NET Core.
ASP.NET Core es compatible con el parámetro --urls para establecer un punto final de escucha personalizado, como --urls=http://127.0.0.1:5001 o --urls=http://unix:/path/to/socket . El permiso del archivo de socket de Domain de Unix se puede personalizar con el argumento --listen-unix-socket-permission .
Esos argumentos personalizados son en realidad los elementos de configuración del núcleo de ASP.NET, los nombres de los elementos son la base de argumentos. Por ejemplo, --token se asignará a Token , --user-secret se asignará a UserSecret , y --listen-unix-socket-permission se asignará a ListenUnixSocketPermission . Con este mapa de conversión, puede usar las formas de ASP.NET Core para proporcionarlos, como la configuración de JSON, la variable de entorno, etc. Pero hay un caso especial: --systemd debe proporcionarse con Systemd=true si no usa el argumento de línea de comandos, ya que la configuración de ASP.NET Core requiere un valor, agregamos una verificación especial para el indicador --systemd . Esos argumentos personalizados no tienen formas cortas como -s , -u .
Se requiere que se proporcione --user-secret a través de cualquier método para proporcionar un valor de configuración del núcleo ASP.NET, o una NullReferenceException de userSecret será el Tobado.
Nota
Si --token y --token-file se especifican, preferimos --token . Si olvida establecer ninguno de ellos, usamos un valor generado al azar. Puede encontrarlo en salida de registro después de enviar cualquier solicitud al programa y cumplir con un error de autenticación.
Importante
Si desea establecer un permiso de socket Unix, debe escribir su valor real en lugar de formato Octal. Por ejemplo, se requiere usar 511 en su lugar 777 .
Ejecutar dotnet publish -c Release y puede obtener binario en E5Renewer/bin/Release/net8.0/publish
Usando curl o cualquier herramienta que pueda enviar la solicitud HTTP, envíe la solicitud a puntos finales como http://127.0.0.1:5000 o unix socket /path/to/socket , cada solicitud debe enviarse con Authorization: Bearer <auth_token> . Obtendrá una respuesta JSON si todo está bien. Si es una solicitud GET, envíe una marca de tiempo de MiliseCond en timestamp de la parámica de consultas, si es una solicitud posterior, envíe una marca de tiempo de MiliseCond en Post JSON con timestamp clave y conviértala en cadena. La mayoría de las veces, devolveremos el texto sin formato, pero debe verificar el código de respuesta para ver si la solicitud es el éxito. Si está utilizando HTTPS, simplemente envíe la solicitud HTTPS en su lugar.
Por ejemplo:
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>"
}
El servidor solo aceptará una solicitud menos de 30 segundos más antiguas que el tiempo del servidor.
Ver http-api.md para posibles API
Hemos creado un sistema de módulo para extender el programa, puede verificar MODULES.MD para obtener más información.