@knowttl/mg-axi 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -45
- package/dist/api.js +119 -0
- package/dist/app-auth.js +5 -1
- package/dist/catalogue.js +311 -3
- package/dist/cli.js +44 -12
- package/dist/docs.js +139 -47
- package/dist/entra-apps.js +158 -6
- package/dist/entra-audit-logs.js +93 -12
- package/dist/entra-conditional-access.js +416 -11
- package/dist/entra-federation-configurations.js +7 -4
- package/dist/entra-grants.js +8 -4
- package/dist/entra-group-lifecycle.js +13 -8
- package/dist/entra-identity-providers.js +7 -4
- package/dist/entra-lifecycle-workflows.js +16 -4
- package/dist/entra-multi-tenant-organization.js +7 -4
- package/dist/entra-on-premises-synchronization.js +6 -4
- package/dist/entra-risk-prevention.js +10 -4
- package/dist/entra-risk.js +11 -4
- package/dist/entra-roles.js +194 -8
- package/dist/entra-terms-of-use.js +13 -8
- package/dist/graph-session.js +1 -0
- package/dist/msal-app-provider.js +96 -13
- package/dist/profiles.js +55 -9
- package/dist/setup.js +5 -2
- package/docs/coverage.md +721 -654
- package/inventory/operations.json +2 -2
- package/inventory/schema.json +1 -1
- package/package.json +1 -1
- package/skills/mg-axi/SKILL.md +34 -1
package/README.md
CHANGED
|
@@ -12,12 +12,12 @@ API-01 executes `mg-axi api get <path>`, serving the reviewed v1.0 raw surface t
|
|
|
12
12
|
READ-01 executes Entra user list/show through that session in both delegated and application modes; current usage follows below.
|
|
13
13
|
READ-02 adds group list/show and direct or transitive member and parent-membership reads through the same session.
|
|
14
14
|
READ-04 adds targeted per-user authentication-method reads and the tenant registration report through the same session, with phone numbers redacted.
|
|
15
|
-
READ-09 adds directory-role list/show, current role-assignment inventory and active/eligible PIM reads through the same session.
|
|
16
|
-
READ-03 adds Conditional Access policy and named-location list/show as separate grammar through the same session; Conditional Access usage follows the device and administrative-unit usage below.
|
|
17
|
-
READ-05 executes Entra sign-in
|
|
18
|
-
READ-07 adds application and service-principal list/show with credential expiry metadata and
|
|
15
|
+
READ-09 adds directory-role list/show, directory-role-template list/show, directory-role member and scoped-member reads, scoped-role-membership reads, current role-assignment inventory and active/eligible PIM reads through the same session.
|
|
16
|
+
READ-03 adds Conditional Access policy, named-location, authentication-strength-policy, combination-configuration, authentication-method-mode, template, auth-context, deleted-policy and deleted-named-location list/show as separate grammar through the same session; Conditional Access usage follows the device and administrative-unit usage below.
|
|
17
|
+
READ-05 executes Entra sign-in, directory-audit and provisioning-log list/show through that session; log usage follows the Conditional Access usage below.
|
|
18
|
+
READ-07 adds application and service-principal list/show with credential expiry metadata, owner reads, federated-credential reads, and service-principal app-role-assigned-to reads through the same session.
|
|
19
19
|
READ-10 adds directory-device and administrative-unit list/show and unit-member reads through the same session.
|
|
20
|
-
READ-08 adds service-principal delegated-grant and app-role-assignment consent reads for a named client through the same session.
|
|
20
|
+
READ-08 adds service-principal delegated-grant list and app-role-assignment list/show consent reads for a named client through the same session.
|
|
21
21
|
EXT-01 (domains) adds tenant-domain list/show, per-domain verification and service-configuration DNS record reads, and top-level domain DNS record reads through the same session.
|
|
22
22
|
EXT-01 (certificate auth) adds PKI configuration and certificate-authority list/show/count reads with default certificate-blob omission through the same session.
|
|
23
23
|
EXT-01 (directory subscriptions) adds commercial-subscription list/show/count reads with compact licence rows through the same session.
|
|
@@ -151,6 +151,8 @@ mg-axi entra application owner list --profile soc --application <application-obj
|
|
|
151
151
|
mg-axi entra service-principal list --profile soc --limit 10
|
|
152
152
|
mg-axi entra service-principal show --profile soc --id <service-principal-object-id>
|
|
153
153
|
mg-axi entra service-principal owner list --profile soc --service-principal <service-principal-object-id>
|
|
154
|
+
mg-axi entra application federated-credential list --profile soc --application <application-object-id>
|
|
155
|
+
mg-axi entra service-principal federated-credential list --profile soc --service-principal <service-principal-object-id>
|
|
154
156
|
```
|
|
155
157
|
|
|
156
158
|
Read granted consent for one client service principal; delegated profiles first need explicit login with the read scopes:
|
|
@@ -159,14 +161,18 @@ Read granted consent for one client service principal; delegated profiles first
|
|
|
159
161
|
mg-axi login --profile soc --scopes https://graph.microsoft.com/Directory.Read.All,https://graph.microsoft.com/Application.Read.All
|
|
160
162
|
mg-axi entra service-principal oauth2-grant list --profile soc --service-principal <service-principal-object-id>
|
|
161
163
|
mg-axi entra service-principal app-role-assignment list --profile soc --service-principal <service-principal-object-id> --filter "resourceId eq '<resource-id>'"
|
|
164
|
+
mg-axi entra service-principal app-role-assignment show --profile soc --service-principal <service-principal-object-id> --id <assignment-id>
|
|
165
|
+
mg-axi entra service-principal app-role-assigned-to list --profile soc --service-principal <service-principal-object-id>
|
|
162
166
|
```
|
|
163
167
|
|
|
164
168
|
`entra service-principal oauth2-grant list` defaults to `id`, `consentType`, `principalId`, `resourceId` and `scope`: the delegated scopes granted to the client, with `consentType` AllPrincipals covering every user (and an explicit null `principalId`) versus Principal covering the one user named by `principalId`.
|
|
165
169
|
`entra service-principal app-role-assignment list` defaults to `id`, `appRoleId`, `resourceDisplayName` and `resourceId`: the app-only roles granted to the client on each resource API.
|
|
166
|
-
|
|
170
|
+
`entra service-principal app-role-assignment show --service-principal <service-principal-object-id> --id <assignment-id>` returns one such grant with the full reviewed app-role set.
|
|
171
|
+
`entra service-principal app-role-assigned-to list` defaults to `id`, `appRoleId`, `principalDisplayName`, `principalId`, `principalType`, `resourceDisplayName` and `resourceId`: the reverse view, principals assigned to one resource service principal; `app-role-assigned-to show` returns one such record with the full reviewed set.
|
|
172
|
+
All these views show actual granted consent records; the application's requested permissions (`requiredResourceAccess`) are declared on the application object and are never shown here, and grant creation, revocation and consent belong to later write slices, never to these reads.
|
|
167
173
|
`--select` requests properties from the [reviewed grant property sets](src/entra-grants.ts); `--fields` must be a subset of the fetched selection.
|
|
168
|
-
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; the named-list caps, `count
|
|
169
|
-
Resume
|
|
174
|
+
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; the named-list caps, uniform `count` totals, cursor resume rules and 500-character text truncation described above also apply.
|
|
175
|
+
Resume any of these lists with the same `--service-principal` object ID.
|
|
170
176
|
Delegated oauth2-grant reads default to `https://graph.microsoft.com/Directory.Read.All` and app-role reads to `https://graph.microsoft.com/Application.Read.All`, while application profiles use the configured `.default` audience; reads never request a write-consent scope such as `DelegatedPermissionGrant.ReadWrite.All`, `Application.ReadWrite.All` or `Directory.ReadWrite.All`.
|
|
171
177
|
Delegated callers additionally need a supported directory role per operation (for example Directory Readers, Global Reader or Application Administrator).
|
|
172
178
|
Denied reads name that role and read-scope requirement instead of only the generic grant/role/licence cause.
|
|
@@ -188,7 +194,7 @@ Relationship rows default to `id` and `displayName`; `--select` accepts only `id
|
|
|
188
194
|
Returned `@odata.type` stays visible alongside any `--fields` projection.
|
|
189
195
|
Group lists return `groups`, member lists return `members`, parent-membership lists return `memberOf`, and single-group reads return `group`.
|
|
190
196
|
Group and relationship lists report uniform totals through the shared list-totals helper: `total` holds the server-supplied `@odata.count` when the query carries `$count` (filtered reads) and `null` otherwise, beside a `count` line such as `3 of 10 groups`, `3 groups` or, when the total is unknown and more pages remain, `3 groups shown, more available`.
|
|
191
|
-
The same helper covers the other wired core-directory lists: users, applications, service principals, owners, devices, administrative units and unit members, contacts, direct reports and memberships, directory roles, role assignments and PIM eligible/active assignments, group PIM assignment/eligibility schedules, instances and eligibility requests, directory objects, deleted items, domains and DNS records, contracts, organizations and branding localizations, subscriptions, access-review definitions, instances, decisions, contacted reviewers and stages, sign-ins and directory audits, authentication methods and registration reports, PKI configurations and certificate authorities, Conditional Access policies and named locations, attribute sets, custom-security-attribute definitions and allowed values, data-policy operations, delegated-admin customers, relationships and navigation lists,
|
|
197
|
+
The same helper covers the other wired core-directory lists: users, applications, service principals, owners, devices, administrative units and unit members, contacts, direct reports and memberships, directory roles, directory-role templates, role members, scoped members, scoped role memberships, role assignments and PIM eligible/active assignments, group PIM assignment/eligibility schedules, instances and eligibility requests, directory objects, deleted items, domains and DNS records, contracts, organizations and branding localizations, subscriptions, access-review definitions, instances, decisions, contacted reviewers and stages, sign-ins and directory audits, authentication methods and registration reports, PKI configurations and certificate authorities, Conditional Access policies, named locations, authentication-strength policies, combination configurations, authentication method modes, templates, authentication contexts, deleted policies and deleted named locations, attribute sets, custom-security-attribute definitions and allowed values, data-policy operations, delegated-admin customers, relationships and navigation lists, entitlement catalogs, access packages, assignment policies, resource-role scopes, assignments and assignment requests, federation configurations, oauth2 grants, app-role assignments and app-role-assigned-to, federated credentials, group lifecycle policies and setting templates, identity providers, lifecycle workflows, workflow templates, task definitions, runs, processing results and task reports, multi-tenant-organization tenants, on-premises synchronizations, risky users, risk detections, risky service principals and their history and detections, fraud-protection, web-application-firewall and verification providers, and agreements and acceptances. Every entra list command now reports through the same helper; only the dedicated `count` and `available-types` commands keep their `count` aggregates.
|
|
192
198
|
`complete` names pagination state, with `reason` and an opaque `cursor` on partial reads.
|
|
193
199
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to group and relationship reads.
|
|
194
200
|
Resume relationships with the same `--group` and direct or `--transitive` command, profile, scopes and API version; omit or repeat the original server query flags, and repeat local `--fields` and `--full` when wanted.
|
|
@@ -199,12 +205,19 @@ Direct member results always carry the [v1.0 service-principal limitation](docs/
|
|
|
199
205
|
Delegated group reads default to `https://graph.microsoft.com/GroupMember.Read.All`; hidden members need `Member.Read.Hidden` and richer group properties may need `Group.Read.All`, while application profiles use the configured `.default` audience.
|
|
200
206
|
When richer group access is needed, pass `--scopes https://graph.microsoft.com/Group.Read.All`; for hidden-member access, explicitly log in and read with `--scopes https://graph.microsoft.com/GroupMember.Read.All,https://graph.microsoft.com/Member.Read.Hidden` and satisfy the operation's delegated role requirements.
|
|
201
207
|
|
|
202
|
-
Read directory roles, current assignments and PIM activity through
|
|
208
|
+
Read directory roles, templates, members, scoped memberships, current assignments and PIM activity through twelve views; delegated profiles first need explicit login with the read scopes:
|
|
203
209
|
|
|
204
210
|
```sh
|
|
205
211
|
mg-axi login --profile soc --scopes https://graph.microsoft.com/RoleManagement.Read.Directory,https://graph.microsoft.com/RoleEligibilitySchedule.Read.Directory,https://graph.microsoft.com/RoleAssignmentSchedule.Read.Directory
|
|
206
212
|
mg-axi entra directory-role list --profile soc --limit 10
|
|
207
213
|
mg-axi entra directory-role show --profile soc --id <role-id>
|
|
214
|
+
mg-axi entra directory-role-template list --profile soc
|
|
215
|
+
mg-axi entra directory-role-template show --profile soc --id <template-id>
|
|
216
|
+
mg-axi entra directory-role member list --profile soc --role <role-id>
|
|
217
|
+
mg-axi entra directory-role scoped-member list --profile soc --role <role-id>
|
|
218
|
+
mg-axi entra directory-role scoped-member show --profile soc --role <role-id> --id <scoped-membership-id>
|
|
219
|
+
mg-axi entra scoped-role-membership list --profile soc
|
|
220
|
+
mg-axi entra scoped-role-membership show --profile soc --id <scoped-membership-id>
|
|
208
221
|
mg-axi entra role-assignment list --profile soc --filter "principalId eq '<principal-id>'"
|
|
209
222
|
mg-axi entra pim eligible list --profile soc
|
|
210
223
|
mg-axi entra pim active list --profile soc --filter "assignmentType eq 'Activated'"
|
|
@@ -212,6 +225,9 @@ mg-axi entra pim active list --profile soc --filter "assignmentType eq 'Activate
|
|
|
212
225
|
|
|
213
226
|
`entra directory-role list` defaults to `id`, `displayName`, `description` and `roleTemplateId`; `entra directory-role show --id <role-id>` defaults to the full reviewed role set.
|
|
214
227
|
Directory roles are activated instances only: a role appears after activation, never before, so an empty result never proves the role does not exist.
|
|
228
|
+
`entra directory-role-template list` and `show` default to `id`, `displayName` and `description`; templates describe every role definition whether or not the role is activated.
|
|
229
|
+
`entra directory-role member list --role <role-id>` defaults to `id` and `displayName` and carries each member kind in `@odata.type` (user, group, device or service principal); request `mail` or `userPrincipalName` with `--select` for richer member rows.
|
|
230
|
+
`entra directory-role scoped-member list` and `show` and `entra scoped-role-membership list` and `show` default to `id`, `principalId`, `roleId` and `directoryScopeId` with the full reviewed set (`administrativeUnitId` included) on show; administrative-unit scopes need P1.
|
|
215
231
|
`entra role-assignment list` defaults to `id`, `principalId`, `roleDefinitionId` and `directoryScopeId` and returns the current assignment inventory, including direct and PIM-activated assignments.
|
|
216
232
|
Use `entra pim active list` to classify those assignments as described below.
|
|
217
233
|
`entra pim eligible list` defaults to `id`, `principalId`, `roleDefinitionId` and `memberType`; it covers PIM-eligible assignments, which are not active, and eligible instances carry no `assignmentType`.
|
|
@@ -219,10 +235,10 @@ Use `entra pim active list` to classify those assignments as described below.
|
|
|
219
235
|
For built-in roles the unified `roleDefinitionId` matches the directory-role `roleTemplateId`.
|
|
220
236
|
`--select` requests properties from the [reviewed role property sets](src/entra-roles.ts); `--fields` must be a subset of the fetched selection.
|
|
221
237
|
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; the named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply.
|
|
222
|
-
Delegated directory-role and role-assignment reads default to `https://graph.microsoft.com/RoleManagement.Read.Directory`; eligible PIM reads default to `https://graph.microsoft.com/RoleEligibilitySchedule.Read.Directory` and active PIM reads to `https://graph.microsoft.com/RoleAssignmentSchedule.Read.Directory`, while application profiles use the configured `.default` audience.
|
|
238
|
+
Delegated directory-role, template, member, scoped-member, scoped-membership and role-assignment reads default to `https://graph.microsoft.com/RoleManagement.Read.Directory`; eligible PIM reads default to `https://graph.microsoft.com/RoleEligibilitySchedule.Read.Directory` and active PIM reads to `https://graph.microsoft.com/RoleAssignmentSchedule.Read.Directory`, while application profiles use the configured `.default` audience.
|
|
223
239
|
Delegated callers additionally need a supported directory role per operation (for example Privileged Role Administrator, Global Reader or Security Reader for role reads, Directory Readers for assignments, Security Operator for PIM reads).
|
|
224
240
|
Denied reads name that role requirement instead of only the generic grant/role/licence cause.
|
|
225
|
-
Built-in roles are base inventory and custom role assignments need P1; PIM reads need P2 or ID Governance.
|
|
241
|
+
Built-in roles are base inventory and custom role assignments need P1; administrative-unit-scoped memberships need P1; PIM reads need P2 or ID Governance.
|
|
226
242
|
Role assignment, activation and every other PIM mutation belongs to later write slices, never to these reads.
|
|
227
243
|
|
|
228
244
|
Read PIM-for-Groups assignment and eligibility through ten views; delegated profiles first need explicit login with the read scopes:
|
|
@@ -323,7 +339,7 @@ Approval and subject reads carry personal data and belong to later parts, never
|
|
|
323
339
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to entitlement reads.
|
|
324
340
|
Resume any entitlement list with `--cursor -` and supply the returned cursor on stdin; resume policy and role-scope lists with the same `--access-package`, profile, scopes and API version.
|
|
325
341
|
Delegated reads default to `https://graph.microsoft.com/EntitlementManagement.Read.All`, while application profiles use the configured `.default` audience.
|
|
326
|
-
See the [entitlement-management scope decisions](docs/coverage.md#ext-02-entitlement-management-scope-decisions) for the
|
|
342
|
+
See the [entitlement-management scope decisions](docs/coverage.md#ext-02-entitlement-management-scope-decisions) for the deferred personal-data part and scheduled beta reads.
|
|
327
343
|
Delegated callers additionally need a supported Entra role with catalog visibility (Global Reader and Identity Governance Administrator are among the supported roles).
|
|
328
344
|
Denied reads name that role requirement instead of only the generic grant/role/licence cause.
|
|
329
345
|
Entitlement management needs P2 or ID Governance depending on capability, not one uniform licence, and delegated personal Microsoft accounts are not supported.
|
|
@@ -428,10 +444,10 @@ Workflow rows never carry tasks, runs, processing results or task reports: tasks
|
|
|
428
444
|
`entra lifecycle settings show` returns the tenant schedule interval with the email and quarantine configuration; updating settings belongs to no read slice.
|
|
429
445
|
`--select` requests properties from the [reviewed lifecycle property sets](src/entra-lifecycle-workflows.ts); `--fields` must be a subset of the fetched selection, and navigation names (`tasks`, `createdBy`, `lastModifiedBy`, `previewScope`) fail as unknown properties.
|
|
430
446
|
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; `$search`, `$orderby` and `$expand` stay unreviewed.
|
|
431
|
-
The named-list caps, `count
|
|
447
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to lifecycle reads.
|
|
432
448
|
Resume any lifecycle list with `--cursor -` and supply the returned cursor on stdin.
|
|
433
449
|
Delegated workflow reads default to `https://graph.microsoft.com/LifecycleWorkflows-Workflow.ReadBasic.All` (richer detail may need `LifecycleWorkflows-Workflow.Read.All` or `LifecycleWorkflows.Read.All`), template, task-definition and settings reads to `https://graph.microsoft.com/LifecycleWorkflows.Read.All`, and run, processing-result and task-report reads to `https://graph.microsoft.com/LifecycleWorkflows-Reports.Read.All` (richer detail may need `LifecycleWorkflows.Read.All` or `LifecycleWorkflows.ReadWrite.All`), while application profiles use the configured `.default` audience.
|
|
434
|
-
See the [lifecycle-workflows scope decisions](docs/coverage.md#ext-02-lifecycle-workflows-scope-decisions) for the
|
|
450
|
+
See the [lifecycle-workflows scope decisions](docs/coverage.md#ext-02-lifecycle-workflows-scope-decisions) for the deferred nested-result and summary parts.
|
|
435
451
|
Delegated callers additionally need Global Reader or Lifecycle Workflows Administrator.
|
|
436
452
|
Denied reads name that scope, role and licensing requirement instead of only the generic grant/role/licence cause.
|
|
437
453
|
Lifecycle workflows need Microsoft Entra ID Governance or Microsoft Entra Suite (every governed user, not only administrators), and delegated personal Microsoft accounts are not supported.
|
|
@@ -516,7 +532,7 @@ Lifecycle-policy lists accept `--filter` as plain `$filter` without adding `$cou
|
|
|
516
532
|
Each `count` returns one scalar (`groupLifecyclePolicyCount`, `groupSettingTemplateCount`) from its text/plain `$count` route and takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
517
533
|
Raw `api get` supports `/groupLifecyclePolicies`, `/groupLifecyclePolicies/<policy-id>`, `/groupSettingTemplates` and `/groupSettingTemplates/<template-id>`; the `$count` routes are available only through the named count commands.
|
|
518
534
|
Lifecycle-policy lists return `groupLifecyclePolicies`, single-policy reads return `groupLifecyclePolicy`, template lists return `groupSettingTemplates` and single-template reads return `groupSettingTemplate`.
|
|
519
|
-
The named-list caps, `count
|
|
535
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to these reads.
|
|
520
536
|
Named reads truncate top-level strings and strings in string arrays at 500 characters with a `--full` recovery hint; nested objects in template `values` pass through without text truncation.
|
|
521
537
|
All six named reads support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
522
538
|
Delegated lifecycle-policy reads default to `https://graph.microsoft.com/Directory.Read.All` and delegated template reads default to `https://graph.microsoft.com/GroupSettings.Read.All`, while application profiles use the configured `.default` audience.
|
|
@@ -629,12 +645,12 @@ At most one multitenant organization exists per tenant; a tenant outside any mul
|
|
|
629
645
|
`entra multi-tenant-organization tenant list` defaults to compact properties (`tenantId`, `displayName`, `role`, `state`); both show commands default to the full reviewed property set.
|
|
630
646
|
`--select` requests properties from the reviewed multi-tenant-organization field sets; `--fields` projects locally and must be a subset of the fetched selection.
|
|
631
647
|
The tenant list accepts `--filter` as plain `$filter` without adding `$count=true` or `ConsistencyLevel`.
|
|
632
|
-
The named-list caps, `count
|
|
648
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to multi-tenant-organization reads.
|
|
633
649
|
All four named reads support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
634
650
|
Delegated multi-tenant-organization reads default to `https://graph.microsoft.com/MultiTenantOrganization.Read.All` (the lower-privileged delegated `MultiTenantOrganization.ReadBasic.All` returns displayName and tenantId only) and additionally need Security Reader or Global Reader, while application profiles use the configured `.default` audience.
|
|
635
651
|
Personal Microsoft accounts are not supported, and these reads run in the commercial Global service only.
|
|
636
652
|
Multi-tenant-organization participation needs Entra ID P1; denied reads name the scope, roles and licensing guidance instead of only the generic cause.
|
|
637
|
-
No multi-tenant-organization mutation lives here; the single-member read stays
|
|
653
|
+
No multi-tenant-organization mutation lives here; the single-member read stays deferred because its documented least privilege is the write scope `MultiTenantOrganization.ReadWrite.All`, and tenant-lookup functions ship as `entra tenant-information show` in the tenant-information usage below; see the [multi-tenant-organization scope decisions](docs/coverage.md#ext-04-multi-tenant-organization-scope-decisions) for the deferred read.
|
|
638
654
|
|
|
639
655
|
Log in with `https://graph.microsoft.com/CrossTenantInformation.ReadBasic.All`, then look up tenant information by domain name or tenant ID:
|
|
640
656
|
|
|
@@ -742,11 +758,11 @@ mg-axi entra on-premises-synchronization show --profile soc --id <synchronizatio
|
|
|
742
758
|
Both commands support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
743
759
|
Neither leaf offers `--filter`: Graph documents `$select` only here, so strict input validation refuses the flag before credentials.
|
|
744
760
|
Synchronization lists return `synchronizations` and single reads return `synchronization`; secret-shaped values inside `configuration` and `features` stay redacted by the shared session.
|
|
745
|
-
The named-list caps, cursors, null/missing preservation and 500-character text truncation described above also apply to on-premises-synchronization reads.
|
|
761
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to on-premises-synchronization reads.
|
|
746
762
|
Delegated reads default to `https://graph.microsoft.com/OnPremDirectorySynchronization.Read.All`; application profiles are refused before credentials because Graph documents no supported application permission for this operation.
|
|
747
763
|
Delegated callers additionally need Global Administrator, the only supported Entra role for this operation; personal Microsoft accounts are not supported.
|
|
748
764
|
No P1/P2 prerequisite is stated for on-premises-synchronization reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
749
|
-
No on-premises-synchronization mutation lives here; the `$count` scalar and beta operations stay scheduled; see the [on-premises-synchronization scope decisions](docs/coverage.md#ext-01-on-premises-synchronization-scope-decisions).
|
|
765
|
+
No on-premises-synchronization mutation lives here; the `$count` scalar stays deferred and beta operations stay scheduled; see the [on-premises-synchronization scope decisions](docs/coverage.md#ext-01-on-premises-synchronization-scope-decisions).
|
|
750
766
|
|
|
751
767
|
Log in with `https://graph.microsoft.com/Agreement.Read.All`, then inspect terms-of-use agreements (delegated profiles only):
|
|
752
768
|
|
|
@@ -770,12 +786,12 @@ mg-axi entra agreement-acceptance show --id <acceptance-id> --profile soc
|
|
|
770
786
|
|
|
771
787
|
Acceptance lists return `agreementAcceptances` and single reads return `agreementAcceptance`; default rows stay minimal (`id`, `agreementId`, `state`, `recordedDateTime`) because acceptance records are personal data, and identifying fields need an explicit `--select` naming them.
|
|
772
788
|
All six commands support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
773
|
-
The named-list caps, cursors, null/missing preservation and 500-character text truncation described above also apply to terms-of-use reads.
|
|
789
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to terms-of-use reads.
|
|
774
790
|
Delegated agreement reads default to `https://graph.microsoft.com/Agreement.Read.All` and delegated acceptance reads default to `https://graph.microsoft.com/AgreementAcceptance.Read` (`AgreementAcceptance.Read.All` is the documented higher-privileged alternative); application profiles are refused before credentials because Graph documents no supported application permission for these operations.
|
|
775
791
|
Delegated callers additionally need Security Reader, the least-privileged supported Entra role for these operations; personal Microsoft accounts are not supported.
|
|
776
792
|
Terms of use needs Microsoft Entra ID P1; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
777
793
|
Agreement file contents are never downloaded or printed; only agreement metadata is projected.
|
|
778
|
-
No terms-of-use mutation lives here; the acceptances `$count` scalar
|
|
794
|
+
No terms-of-use mutation lives here; the acceptances `$count` scalar and the agreement file/localization sub-reads stay deferred and beta operations stay scheduled; see the [terms-of-use scope decisions](docs/coverage.md#ext-01-terms-of-use-scope-decisions).
|
|
779
795
|
|
|
780
796
|
Log in with `https://graph.microsoft.com/Directory.Read.All`, then inspect directory objects:
|
|
781
797
|
|
|
@@ -794,7 +810,7 @@ Rows are polymorphic: only the base-type properties are ever requested or projec
|
|
|
794
810
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to directory-object reads.
|
|
795
811
|
Reads default to `https://graph.microsoft.com/Directory.Read.All` for delegated access, while application profiles use the configured `.default` audience.
|
|
796
812
|
No delegated role or P1/P2 prerequisite is stated for directory-object reads; personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
797
|
-
No directory-object mutation lives here; the delta sync
|
|
813
|
+
No directory-object mutation lives here; the delta sync and the POST lookup/validation actions stay deferred and beta operations stay scheduled; see the [directory-objects scope decisions](docs/coverage.md#ext-01-directory-objects-scope-decisions).
|
|
798
814
|
|
|
799
815
|
Log in with the scope matching the deleted type (`User.Read.All`, `Group.Read.All`, `Application.Read.All` or `AdministrativeUnit.Read.All`), then inspect the directory recycle bin:
|
|
800
816
|
|
|
@@ -818,7 +834,7 @@ Soft-deleted security groups report `securityEnabled` false through a known upst
|
|
|
818
834
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to deleted-item reads.
|
|
819
835
|
List and count reads default to the type's least-privileged scope for delegated access (`User.Read.All`, `Group.Read.All`, `Application.Read.All` or `AdministrativeUnit.Read.All`, all read scopes already allowlisted), while application profiles use the configured `.default` audience.
|
|
820
836
|
No delegated role or P1/P2 prerequisite is stated for deleted-item reads; personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
821
|
-
No deleted-item mutation lives here; restore and permanent delete stay out entirely, and the POST lookup/validation actions and beta operations stay scheduled; see the [deleted-items scope decisions](docs/coverage.md#ext-01-deleted-items-scope-decisions).
|
|
837
|
+
No deleted-item mutation lives here; restore and permanent delete stay out entirely, and the POST lookup/validation actions stay deferred and beta operations stay scheduled; see the [deleted-items scope decisions](docs/coverage.md#ext-01-deleted-items-scope-decisions).
|
|
822
838
|
Log in with `https://graph.microsoft.com/OrgContact.Read.All`, then inspect organizational contacts:
|
|
823
839
|
|
|
824
840
|
```sh
|
|
@@ -845,7 +861,7 @@ Top-level list and show request and project only flat scalar properties (`$expan
|
|
|
845
861
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to contact reads.
|
|
846
862
|
Reads default to `https://graph.microsoft.com/OrgContact.Read.All` for delegated access, while application profiles use the configured `.default` audience; transitive member-of reads additionally need `https://graph.microsoft.com/Group.Read.All`.
|
|
847
863
|
Delegated callers additionally need a supported Entra role (Directory Readers reads basic properties; Global Reader, Directory Writers, Intune Administrator or User Administrator also work); personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
848
|
-
No contact mutation lives here; the delta sync
|
|
864
|
+
No contact mutation lives here; the delta sync and the POST lookup actions stay deferred and beta operations stay scheduled, and the error/sync navigation reads stay unavailable with no documented permission contract; see the [contacts scope decisions](docs/coverage.md#ext-01-contacts-scope-decisions).
|
|
849
865
|
|
|
850
866
|
Log in with `https://graph.microsoft.com/IdentityProvider.Read.All`, then read workforce identity providers:
|
|
851
867
|
|
|
@@ -867,7 +883,7 @@ Provider lists accept `--filter` as plain `$filter`; counts accept `--filter` to
|
|
|
867
883
|
Rows carry `@odata.type` naming the provider kind (social or built-in).
|
|
868
884
|
The reviewed workforce fields are `id`, `displayName`, `identityProviderType`, and `clientId`.
|
|
869
885
|
`clientSecret` and `certificateData` are never selectable and any row carrying them is scrubbed before output, so key material can never reach stdout, errors or logs.
|
|
870
|
-
Provider lists use the named-list caps, `count`
|
|
886
|
+
Provider lists use the named-list caps, uniform `count` totals and cursors described above.
|
|
871
887
|
List and show preserve null/missing properties and truncate text longer than 500 characters; `--full` restores complete text without lifting redaction or row caps.
|
|
872
888
|
Delegated provider reads default to `https://graph.microsoft.com/IdentityProvider.Read.All`, while application profiles use the configured `.default` audience.
|
|
873
889
|
Delegated callers additionally need a directory role that can read federation configuration (Global Reader is the least-privileged read-only directory role); personal Microsoft accounts are not supported.
|
|
@@ -892,7 +908,7 @@ Configuration lists return `federationConfigurations`, single-configuration read
|
|
|
892
908
|
`signingCertificate` carries the public token-signing key only and is omitted from every default select; request it explicitly when rotation evidence is needed. No private key material exists on these resources.
|
|
893
909
|
Configuration lists accept `--filter` as plain `$filter`; counts accept `--filter` to narrow the total server-side.
|
|
894
910
|
Rows carry `@odata.type` naming the configuration kind.
|
|
895
|
-
Configuration lists use the named-list caps, `count`
|
|
911
|
+
Configuration lists use the named-list caps, uniform `count` totals and cursors described above.
|
|
896
912
|
List and show preserve null/missing properties and truncate text longer than 500 characters; `--full` restores complete text without lifting row caps.
|
|
897
913
|
Delegated callers additionally need External Identity Provider Administrator, the least-privileged supported Entra role for these reads; personal Microsoft accounts are not supported.
|
|
898
914
|
No per-operation licence prerequisite is stated for these reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
@@ -945,14 +961,14 @@ Verification rows never carry provider detail; `provider show --id <verification
|
|
|
945
961
|
Fraud and WAF rows carry `@odata.type` naming the provider kind (Arkose or HUMAN; Akamai or Cloudflare).
|
|
946
962
|
The reviewed fraud fields are `id`, `displayName`, `clientSubDomain`, `verifySubDomain` and `appId`; the reviewed WAF fields are `id`, `displayName`, `hostPrefix` and `zoneId`; the reviewed verification fields are `id`, `verifiedHost`, `providerType`, `verificationResult` and `verifiedDetails`.
|
|
947
963
|
Arkose `privateKey`/`publicKey`, HUMAN `serverToken`, Akamai `clientSecret`/`clientToken`/`accessToken` and Cloudflare `apiToken` are never selectable and any row carrying them is scrubbed before output, so key material can never reach stdout, errors or logs.
|
|
948
|
-
Risk-prevention lists use the named-list caps, `count`
|
|
964
|
+
Risk-prevention lists use the named-list caps, uniform `count` totals and cursors described above.
|
|
949
965
|
List and show preserve null/missing properties and truncate text longer than 500 characters; `--full` restores complete text without lifting redaction or row caps.
|
|
950
966
|
Delegated risk-prevention reads default to `https://graph.microsoft.com/RiskPreventionProviders.Read.All`; Graph documents no supported application permission, so application profiles are refused before credentials.
|
|
951
967
|
Delegated callers additionally need a directory role that can read risk-prevention configuration (Security Reader is the least-privileged read-only role); personal Microsoft accounts are not supported.
|
|
952
968
|
No per-operation licence prerequisite is stated for these reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
953
969
|
No provider create/update/delete and no verification submission live here; beta operations stay scheduled (see the [risk-prevention scope decisions](docs/coverage.md#ext-03-risk-prevention-scope-decisions)).
|
|
954
970
|
|
|
955
|
-
Log in with `https://graph.microsoft.com/Policy.Read.All`, then read Conditional Access policies
|
|
971
|
+
Log in with `https://graph.microsoft.com/Policy.Read.All`, then read Conditional Access policies, named locations and templates as separate grammar:
|
|
956
972
|
|
|
957
973
|
```sh
|
|
958
974
|
mg-axi login --profile soc --scopes https://graph.microsoft.com/Policy.Read.All
|
|
@@ -961,21 +977,59 @@ mg-axi entra conditional-access policy list --profile soc --filter "state eq 'en
|
|
|
961
977
|
mg-axi entra conditional-access policy show --profile soc --id <policy-id>
|
|
962
978
|
mg-axi entra conditional-access named-location list --profile soc
|
|
963
979
|
mg-axi entra conditional-access named-location show --profile soc --id <named-location-id>
|
|
980
|
+
mg-axi entra conditional-access template list --profile soc --limit 10
|
|
981
|
+
mg-axi entra conditional-access template show --profile soc --id <template-id>
|
|
982
|
+
mg-axi entra conditional-access deleted-policy list --profile soc --limit 10
|
|
983
|
+
mg-axi entra conditional-access deleted-policy show --profile soc --id <deleted-policy-id>
|
|
984
|
+
mg-axi entra conditional-access deleted-named-location list --profile soc
|
|
985
|
+
mg-axi entra conditional-access deleted-named-location show --profile soc --id <deleted-named-location-id>
|
|
986
|
+
```
|
|
987
|
+
|
|
988
|
+
Log in with `https://graph.microsoft.com/AuthenticationContext.Read.All`, then read authentication context class references through the same session:
|
|
989
|
+
|
|
990
|
+
```sh
|
|
991
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/AuthenticationContext.Read.All
|
|
992
|
+
mg-axi entra conditional-access auth-context list --profile soc --limit 10
|
|
993
|
+
mg-axi entra conditional-access auth-context show --profile soc --id <auth-context-id>
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
Log in with `https://graph.microsoft.com/Policy.Read.AuthenticationMethod`, then read the authentication-strength family through the same session:
|
|
997
|
+
|
|
998
|
+
```sh
|
|
999
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/Policy.Read.AuthenticationMethod
|
|
1000
|
+
mg-axi entra conditional-access auth-strength-policy list --profile soc --limit 10
|
|
1001
|
+
mg-axi entra conditional-access auth-strength-policy show --profile soc --id <auth-strength-policy-id>
|
|
1002
|
+
mg-axi entra conditional-access combination-configuration list --policy <auth-strength-policy-id> --profile soc
|
|
1003
|
+
mg-axi entra conditional-access combination-configuration show --policy <auth-strength-policy-id> --id <combination-configuration-id> --profile soc
|
|
1004
|
+
mg-axi entra conditional-access auth-method-mode list --profile soc --limit 10
|
|
1005
|
+
mg-axi entra conditional-access auth-method-mode show --profile soc --id <auth-method-mode-id>
|
|
964
1006
|
```
|
|
965
1007
|
|
|
966
1008
|
`entra conditional-access policy list` defaults to compact properties (`id`, `displayName`, `state`); `policy show --id <policy-id>` defaults to the full reviewed condition and control property set.
|
|
967
1009
|
`entra conditional-access named-location list` defaults to `id` and `displayName`; `named-location show --id <named-location-id>` defaults to the full reviewed location set.
|
|
968
|
-
|
|
1010
|
+
`entra conditional-access auth-strength-policy list` defaults to compact properties (`id`, `displayName`, `policyType`); `auth-strength-policy show --id <auth-strength-policy-id>` defaults to the full reviewed strength set.
|
|
1011
|
+
`entra conditional-access combination-configuration list --policy <auth-strength-policy-id>` defaults to `id`; `combination-configuration show` takes `--policy` plus `--id` and defaults to the full reviewed base set.
|
|
1012
|
+
`entra conditional-access auth-method-mode list` defaults to `id` and `displayName`; `auth-method-mode show --id <auth-method-mode-id>` defaults to the full reviewed mode set.
|
|
1013
|
+
`entra conditional-access template list` defaults to `id` and `name`; `template show --id <template-id>` defaults to the full reviewed template set.
|
|
1014
|
+
`entra conditional-access auth-context list` defaults to `id` and `displayName`; `auth-context show --id <auth-context-id>` defaults to the full reviewed authentication-context set.
|
|
1015
|
+
`entra conditional-access deleted-policy list` defaults to compact properties (`id`, `displayName`, `state`, `deletedDateTime`); `deleted-policy show --id <deleted-policy-id>` defaults to the full reviewed deleted-policy set. Deleted-policy reads never restore; restore is a beta-only mutation outside mg-axi scope.
|
|
1016
|
+
`entra conditional-access deleted-named-location list` defaults to `id`, `displayName` and `deletedDateTime`; `deleted-named-location show --id <deleted-named-location-id>` defaults to the full reviewed deleted-location set. Deleted named-location reads never restore; restore is a beta-only mutation outside mg-axi scope.
|
|
1017
|
+
Policy `--select` accepts the [reviewed policy property set](src/entra-conditional-access.ts) and location `--select` accepts the [reviewed location property set](src/entra-conditional-access.ts); strength, combination-configuration, method-mode, template, authentication-context, deleted-policy and deleted-named-location `--select` accept their own [reviewed property sets](src/entra-conditional-access.ts); `--fields` must be a subset of the fetched selection in each family.
|
|
969
1018
|
Returned `@odata.type` stays visible on named-location rows so IP and country locations stay distinguishable alongside any `--fields` projection.
|
|
1019
|
+
Returned `@odata.type` also stays visible on combination-configuration rows so configuration kinds stay distinguishable alongside any `--fields` projection.
|
|
1020
|
+
Returned `@odata.type` also stays visible on deleted-named-location rows so IP and country locations stay distinguishable alongside any `--fields` projection.
|
|
970
1021
|
Policy lists return `policies`, location lists return `namedLocations`, single-policy reads return `policy` and single-location reads return `namedLocation`.
|
|
1022
|
+
Strength lists return `authStrengthPolicies`, combination lists return `combinationConfigurations`, mode lists return `authMethodModes`, template lists return `templates`, authentication-context lists return `authContexts`, deleted-policy lists return `deletedPolicies` and deleted-named-location lists return `deletedNamedLocations`; single reads return `authStrengthPolicy`, `combinationConfiguration`, `authMethodMode`, `template`, `authContext`, `deletedPolicy` and `deletedNamedLocation`.
|
|
971
1023
|
Successful empty collections return an empty list with a uniform `count` line (`0 policies` or `0 named locations`, `total: null`) and absence guidance.
|
|
1024
|
+
The authentication-strength, combination-configuration, authentication-method-mode, template, authentication-context, deleted-policy and deleted-named-location lists report uniform totals through the shared list-totals helper beside a `count` line such as `2 auth-strength policies` or `2 templates` (`0 ...` with absence guidance on empty results).
|
|
972
1025
|
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to Conditional Access reads, including nested condition values; every truncated value carries a `--full` hint.
|
|
973
|
-
Resume
|
|
1026
|
+
Resume any Conditional Access list with `--cursor -` and supply the returned cursor on stdin, for example `mg-axi entra conditional-access policy list --profile soc --cursor - < cursor.txt`.
|
|
1027
|
+
Resume combination-configuration lists with the same `--policy`, profile, scopes and API version.
|
|
974
1028
|
Small cursors can also use `--cursor <token>`; both forms enforce a 16 MB size ceiling.
|
|
975
1029
|
Use `--full` when reasoning from complete condition or control text; `--select` and `--fields` still determine which properties are visible, and missing properties remain unknown.
|
|
976
1030
|
To replay a resumed result with `--full`, reuse the original input cursor; the returned cursor continues after that result.
|
|
977
|
-
Delegated policy and location reads default to `https://graph.microsoft.com/Policy.Read.All`;
|
|
978
|
-
HTTP 403 policy and location errors name the operation's supported directory roles (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader for delegated access)
|
|
1031
|
+
Delegated policy, named-location, template, deleted-policy and deleted-named-location reads default to `https://graph.microsoft.com/Policy.Read.All`; delegated authentication-strength-policy, combination-configuration and authentication-method-mode reads default to `https://graph.microsoft.com/Policy.Read.AuthenticationMethod`; delegated authentication-context reads default to `https://graph.microsoft.com/AuthenticationContext.Read.All`; application profiles require the admin-consented scope for the family, use the configured Graph `.default` audience and reject `--scopes`.
|
|
1032
|
+
HTTP 403 policy, location, template, deleted-policy and deleted-named-location errors name the operation's supported directory roles (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader for delegated access); HTTP 403 authentication-context errors name the same broad role set with `AuthenticationContext.Read.All`; HTTP 403 authentication-strength errors name the narrower role set (Conditional Access Administrator, Security Administrator or Security Reader) with `Policy.Read.AuthenticationMethod`; all include guidance from the [licensing contract](docs/graph-coverage.md#licence-matrix-by-area), and Conditional Access reads need P1; the response alone does not identify the missing prerequisite.
|
|
979
1033
|
WRITE-04 adds a named write: `mg-axi entra conditional-access policy update --id <policy-id>` PATCHes one policy with only the reviewed fields `--display-name`, `--state`, `--conditions`, `--grant-controls` and `--session-controls` (JSON objects for the last three); any other property has no flag and is refused before credentials.
|
|
980
1034
|
At least one reviewed field flag is required.
|
|
981
1035
|
The command supports only `--api-version v1.0`; `--state` accepts `enabled`, `enabledForReportingButNotEnforced` or `disabled`, and each JSON flag supplies the full corresponding block.
|
|
@@ -1022,7 +1076,7 @@ Delegated method reads default to `https://graph.microsoft.com/UserAuthenticatio
|
|
|
1022
1076
|
Delegated callers acting on another user additionally need Global Reader, Authentication Administrator or Privileged Authentication Administrator for methods, and Reports Reader, Security Reader, Security Administrator or Global Reader for the report.
|
|
1023
1077
|
Denied reads name that role requirement instead of only the generic grant/role/licence cause.
|
|
1024
1078
|
|
|
1025
|
-
Log in with `https://graph.microsoft.com/AuditLog.Read.All`, then query sign-ins
|
|
1079
|
+
Log in with `https://graph.microsoft.com/AuditLog.Read.All`, then query sign-ins, directory audits and provisioning logs in bounded time windows (provisioning needs the extra scope below):
|
|
1026
1080
|
|
|
1027
1081
|
```sh
|
|
1028
1082
|
mg-axi login --profile soc --scopes https://graph.microsoft.com/AuditLog.Read.All
|
|
@@ -1031,14 +1085,22 @@ mg-axi entra sign-in list --profile soc --since 2026-09-01T00:00:00Z --filter "s
|
|
|
1031
1085
|
mg-axi entra sign-in show --profile soc --id <sign-in-id>
|
|
1032
1086
|
mg-axi entra directory-audit list --profile soc --since 2026-09-01T00:00:00Z
|
|
1033
1087
|
mg-axi entra directory-audit show --profile soc --id <directory-audit-id>
|
|
1088
|
+
mg-axi entra provisioning list --profile soc --since 2026-09-01T00:00:00Z
|
|
1089
|
+
mg-axi entra provisioning show --profile soc --id <provisioning-id>
|
|
1090
|
+
```
|
|
1091
|
+
|
|
1092
|
+
Provisioning logs additionally need `https://graph.microsoft.com/Directory.Read.All` alongside `AuditLog.Read.All`, plus a Microsoft Entra ID P1 or P2 licence on the tenant:
|
|
1093
|
+
|
|
1094
|
+
```sh
|
|
1095
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/AuditLog.Read.All,https://graph.microsoft.com/Directory.Read.All
|
|
1034
1096
|
```
|
|
1035
1097
|
|
|
1036
1098
|
Log lists always carry an explicit time bound: `--since` is required for a new query (with optional `--until` and `--filter` refinements), and resume reuses `--cursor` instead.
|
|
1037
1099
|
Resume validates the saved time bounds; a cursor from an unbounded raw query is rejected, so start a new query with `--since`.
|
|
1038
|
-
Resume sign-in
|
|
1100
|
+
Resume sign-in, directory-audit and provisioning lists with `--cursor -` and supply the returned cursor on stdin, for example `mg-axi entra sign-in list --profile soc --cursor - < cursor.txt`.
|
|
1039
1101
|
Small cursors can also use `--cursor <token>`; both forms enforce a 16 MB size ceiling.
|
|
1040
|
-
`entra sign-in list` defaults to `id`, `createdDateTime`, `userPrincipalName` and `appDisplayName`; `entra directory-audit list` defaults to `id`, `activityDateTime`, `activityDisplayName` and `result`.
|
|
1041
|
-
|
|
1102
|
+
`entra sign-in list` defaults to `id`, `createdDateTime`, `userPrincipalName` and `appDisplayName`; `entra directory-audit list` defaults to `id`, `activityDateTime`, `activityDisplayName` and `result`; `entra provisioning list` defaults to `id`, `activityDateTime`, `action` and `provisioningStatusInfo`.
|
|
1103
|
+
All three log show commands default to the full reviewed property set.
|
|
1042
1104
|
`--select` requests properties from the [supported log property sets](src/entra-audit-logs.ts); `--fields` projects locally and must be a subset of the fetched selection.
|
|
1043
1105
|
Log reads truncate text longer than 500 characters, including nested values; `--full` restores complete text without lifting redaction, row caps or time bounds.
|
|
1044
1106
|
To replay a resumed result with `--full`, supply the original input cursor on stdin; the returned cursor continues after that result.
|
|
@@ -1054,12 +1116,14 @@ Credential collections expose only expiry metadata (`keyId`, `displayName`, `sta
|
|
|
1054
1116
|
Non-array credential collections become empty arrays, and non-object entries are dropped; other properties retain the null/missing behavior described above.
|
|
1055
1117
|
Secret-minting routes are never constructed.
|
|
1056
1118
|
`entra application owner list --application <application-object-id>` and `entra service-principal owner list --service-principal <service-principal-object-id>` list owners; rows carry `@odata.type` naming the owner kind.
|
|
1119
|
+
`entra application federated-credential list` and `entra service-principal federated-credential list` default to `id`, `name`, `issuer` and `subject`: workload-identity trust metadata only, never secret material; each `show` defaults to the full reviewed set (`id`, `name`, `issuer`, `subject`, `description`, `audiences`).
|
|
1120
|
+
There is no named command for the parenthesised `(appId='...')` or `(name='...')` lookups; filter the list instead. Those rows stay deferred (see the [READ-07 scope decisions](docs/coverage.md#read-07-application-lookups-scope-decisions)).
|
|
1057
1121
|
For consent grants, use the service-principal grant commands described above.
|
|
1058
|
-
Application lists return `applications`, service-principal lists return `servicePrincipals`, owner lists return `owners`, and single-object reads return `application` or `
|
|
1122
|
+
Application lists return `applications`, service-principal lists return `servicePrincipals`, owner lists return `owners`, federated lists return `federatedCredentials`, and single-object reads return `application`, `servicePrincipal` or `federatedCredential`.
|
|
1059
1123
|
App and service-principal `--select` accepts the [reviewed property sets](src/entra-apps.ts); `--fields` must be a subset of the fetched selection.
|
|
1060
1124
|
Owner rows default to `id`, `displayName` and `mail`, the only selectable owner properties; rows without non-null descriptive properties are preserved with a hint about limited consent or unset properties.
|
|
1061
1125
|
The named-list caps, uniform `count` totals, cursor resume rules and 500-character text truncation described above also apply to these reads; resume owner lists with the same `--application` or `--service-principal` object ID.
|
|
1062
|
-
Delegated application reads default to `https://graph.microsoft.com/Application.Read.All`, while application profiles use the configured `.default` audience.
|
|
1126
|
+
Delegated application reads, including federated-credential reads, default to `https://graph.microsoft.com/Application.Read.All`, while application profiles use the configured `.default` audience.
|
|
1063
1127
|
|
|
1064
1128
|
Log in with `https://graph.microsoft.com/IdentityRiskyUser.Read.All`, `https://graph.microsoft.com/IdentityRiskEvent.Read.All` and `https://graph.microsoft.com/IdentityRiskyServicePrincipal.Read.All`, then triage risky users, risk detections, risky service principals and service-principal risk detections:
|
|
1065
1129
|
|
|
@@ -1192,22 +1256,40 @@ mg-axi profile create --name batch --tenant <tenant-id> --client <client-id> --c
|
|
|
1192
1256
|
mg-axi profile show --profile daemon
|
|
1193
1257
|
```
|
|
1194
1258
|
|
|
1195
|
-
Omitting `--mode` selects delegated mode; certificate and federation flags require application mode.
|
|
1259
|
+
Omitting `--mode` selects delegated mode; certificate, client-secret and federation flags require application mode.
|
|
1196
1260
|
Application profiles reject `--allow-device-code`, and `login` with either login method exits 2 before authentication.
|
|
1197
1261
|
For certificates, register the matching public certificate on the app registration.
|
|
1198
|
-
|
|
1262
|
+
By default the provider expects a PEM private key in the OS credential store under service `mg-axi` and account equal to the profile's `credentialRef.key`, shown by `profile show`.
|
|
1199
1263
|
Profile creation records the thumbprint and reference; it does not import the private key, and there is no CLI key-import command.
|
|
1200
1264
|
Provision that key through protected storage tooling; never put private keys in argv or profile JSON.
|
|
1201
|
-
|
|
1265
|
+
Keychain certificate acquisition fails if `keytar` or the referenced key is unavailable; file and environment key holders below authenticate session-only instead.
|
|
1202
1266
|
For workload federation, configure the app registration's federated credential mapping for the workload and set `AZURE_FEDERATED_TOKEN_FILE` to its assertion file.
|
|
1203
1267
|
The provider reads the file on each assertion request so projected tokens can rotate; missing or empty assertions fail authentication.
|
|
1268
|
+
`--federated-token-file-env <NAME>` names a different holder variable when the workload does not use the default.
|
|
1269
|
+
|
|
1270
|
+
Headless systems (containers, CI, services) have no OS keychain, so application profiles also accept file and environment references that are read at acquisition time:
|
|
1271
|
+
|
|
1272
|
+
```sh
|
|
1273
|
+
mg-axi profile create --name svc --tenant <tenant-id> --client <client-id> --cloud commercial --mode application --client-secret-env MG_AXI_CLIENT_SECRET
|
|
1274
|
+
mg-axi profile create --name daemon-file --tenant <tenant-id> --client <client-id> --cloud commercial --mode application --certificate-thumbprint <40-hex-digit-thumbprint> --certificate-key-file /run/secrets/mg-axi-key.pem
|
|
1275
|
+
mg-axi profile create --name daemon-env --tenant <tenant-id> --client <client-id> --cloud commercial --mode application --certificate-thumbprint <40-hex-digit-thumbprint> --certificate-key-env MG_AXI_PRIVATE_KEY
|
|
1276
|
+
MG_AXI_CLIENT_SECRET=<secret> mg-axi doctor --profile svc
|
|
1277
|
+
```
|
|
1278
|
+
|
|
1279
|
+
A profile stores only the reference (an env var name or a file path), never the value.
|
|
1280
|
+
The environment supplies the value on each acquisition, so rotation updates the env var or file contents with no profile change.
|
|
1281
|
+
Relative paths resolve against the working directory at acquisition time.
|
|
1282
|
+
Key and secret files must be regular files owned by the current user with mode 0600, never symlinks; Windows skips the ownership and mode checks.
|
|
1283
|
+
A missing, empty or exposed holder fails closed with `AUTH_REQUIRED` naming only the reference, never its value.
|
|
1284
|
+
PEM values from env vars may use escaped `\n` newlines; passphrase-protected keys are unsupported.
|
|
1285
|
+
A client secret is weaker than a certificate or federated credential: it is a bearer string with no proof of possession.
|
|
1286
|
+
Prefer certificates or federation where the platform allows them, and rotate secrets on a schedule.
|
|
1204
1287
|
Application credentials remain in process memory and are reacquired at a 60-second expiry margin.
|
|
1205
1288
|
The service requests only `https://graph.microsoft.com/.default`, representing the app registration's admin-consented Graph application permissions, with no signed-in user.
|
|
1206
1289
|
Ask an administrator to grant those permissions on the configured app registration; per-command delegated scopes cannot narrow the application token.
|
|
1207
|
-
Acquisition failures return `AUTH_REQUIRED` with consent and
|
|
1290
|
+
Acquisition failures return `AUTH_REQUIRED` with consent and credential-holder guidance, without user or device-code fallback.
|
|
1208
1291
|
|
|
1209
1292
|
Run `corepack pnpm build`, `corepack pnpm test` (test files run at most 4 at a time via `--test-concurrency=4` in the `test` script) and `corepack pnpm lint` for shell validation.
|
|
1210
|
-
The [CI workflow](.github/workflows/ci.yml) defines the platform/runtime matrix for shell build, test and lint checks, validates the Python inventory tooling separately, and rejects stale generated docs.
|
|
1211
1293
|
The [implementation plan](PLAN.md) remains the design authority.
|
|
1212
1294
|
|
|
1213
1295
|
The pinned [Entra operation inventory](docs/inventory.md) defines the INV-01 discovery boundary and schema for later build slices.
|
|
@@ -1245,5 +1327,5 @@ The hook makes no network, Graph or sign-in call, and prints a short `not config
|
|
|
1245
1327
|
Restart the agent session after running the installer.
|
|
1246
1328
|
No other ordinary command installs hooks, plugins or configuration.
|
|
1247
1329
|
The skill file is generated in full from the template in [src/docs.ts](src/docs.ts) and the command catalogue; [docs/coverage.md](docs/coverage.md) also uses the discovery inventory.
|
|
1248
|
-
After building, regenerate both with `corepack pnpm run docs:generate` and verify freshness with `corepack pnpm run docs:check`;
|
|
1330
|
+
After building, regenerate both with `corepack pnpm run docs:generate` and verify freshness with `corepack pnpm run docs:check`; the release publish job runs the freshness check.
|
|
1249
1331
|
Critical journeys stay packaged offline: `test/pack.test.mjs` drives setup, doctor and the user, group, Conditional Access and sign-in reads through the packaged executable with fixture credentials and blocked networking.
|