@pnp/cli-microsoft365 9.0.0-beta.d6b190a → 9.0.0-beta.e16d09c

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.
Files changed (41) hide show
  1. package/allCommands.json +1 -1
  2. package/allCommandsFull.json +1 -1
  3. package/dist/Auth.js +1 -1
  4. package/dist/m365/connection/commands/connection-remove.js +6 -2
  5. package/dist/m365/connection/commands/connection-set.js +4 -1
  6. package/dist/m365/connection/commands/connection-use.js +25 -4
  7. package/dist/m365/entra/commands/multitenant/multitenant-add.js +65 -0
  8. package/dist/m365/entra/commands/multitenant/multitenant-remove.js +118 -0
  9. package/dist/m365/entra/commands/multitenant/multitenant-set.js +72 -0
  10. package/dist/m365/entra/commands.js +3 -0
  11. package/dist/m365/spo/commands/file/file-roleassignment-add.js +1 -1
  12. package/dist/m365/spo/commands/file/file-roleinheritance-break.js +1 -1
  13. package/dist/m365/spo/commands/file/file-roleinheritance-reset.js +1 -1
  14. package/dist/m365/spo/commands/folder/folder-retentionlabel-ensure.js +1 -1
  15. package/dist/m365/spo/commands/list/list-roleassignment-add.js +46 -21
  16. package/dist/m365/spo/commands/list/list-roleassignment-remove.js +48 -46
  17. package/dist/utils/spo.js +37 -6
  18. package/docs/docs/cmd/connection/connection-use.mdx +8 -2
  19. package/docs/docs/cmd/entra/multitenant/multitenant-add.mdx +107 -0
  20. package/docs/docs/cmd/entra/multitenant/multitenant-remove.mdx +58 -0
  21. package/docs/docs/cmd/entra/multitenant/multitenant-set.mdx +53 -0
  22. package/docs/docs/cmd/planner/plan/plan-remove.mdx +1 -1
  23. package/docs/docs/cmd/spe/containertype/containertype-list.mdx +24 -53
  24. package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-get.mdx +4 -4
  25. package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-list.mdx +4 -4
  26. package/docs/docs/cmd/spo/file/file-retentionlabel-ensure.mdx +1 -1
  27. package/docs/docs/cmd/spo/file/file-roleassignment-add.mdx +2 -2
  28. package/docs/docs/cmd/spo/file/file-roleassignment-remove.mdx +1 -1
  29. package/docs/docs/cmd/spo/file/file-roleinheritance-break.mdx +1 -1
  30. package/docs/docs/cmd/spo/file/file-roleinheritance-reset.mdx +1 -1
  31. package/docs/docs/cmd/spo/folder/folder-retentionlabel-ensure.mdx +2 -2
  32. package/docs/docs/cmd/spo/list/list-roleassignment-add.mdx +15 -3
  33. package/docs/docs/cmd/spo/list/list-roleassignment-remove.mdx +15 -3
  34. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-ensure.mdx +4 -4
  35. package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-remove.mdx +1 -1
  36. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-add.mdx +9 -9
  37. package/docs/docs/cmd/spo/listitem/listitem-roleassignment-remove.mdx +7 -7
  38. package/docs/docs/cmd/spo/site/site-recyclebinitem-list.mdx +1 -1
  39. package/docs/docs/cmd/spo/web/web-roleassignment-add.mdx +1 -1
  40. package/docs/docs/cmd/spo/web/web-roleassignment-remove.mdx +1 -1
  41. package/package.json +1 -1
@@ -3,16 +3,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
3
3
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
4
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
5
  };
6
- var _SpoListRoleAssignmentRemoveCommand_instances, _SpoListRoleAssignmentRemoveCommand_initTelemetry, _SpoListRoleAssignmentRemoveCommand_initOptions, _SpoListRoleAssignmentRemoveCommand_initValidators, _SpoListRoleAssignmentRemoveCommand_initOptionSets;
6
+ var _SpoListRoleAssignmentRemoveCommand_instances, _SpoListRoleAssignmentRemoveCommand_initTelemetry, _SpoListRoleAssignmentRemoveCommand_initOptions, _SpoListRoleAssignmentRemoveCommand_initValidators, _SpoListRoleAssignmentRemoveCommand_initOptionSets, _SpoListRoleAssignmentRemoveCommand_initTypes;
7
7
  import { cli } from '../../../../cli/cli.js';
8
8
  import request from '../../../../request.js';
9
9
  import { formatting } from '../../../../utils/formatting.js';
10
+ import { spo } from '../../../../utils/spo.js';
10
11
  import { urlUtil } from '../../../../utils/urlUtil.js';
11
12
  import { validation } from '../../../../utils/validation.js';
12
13
  import SpoCommand from '../../../base/SpoCommand.js';
13
14
  import commands from '../../commands.js';
14
- import spoGroupGetCommand from '../group/group-get.js';
15
- import spoUserGetCommand from '../user/user-get.js';
15
+ import { entraGroup } from '../../../../utils/entraGroup.js';
16
16
  class SpoListRoleAssignmentRemoveCommand extends SpoCommand {
17
17
  get name() {
18
18
  return commands.LIST_ROLEASSIGNMENT_REMOVE;
@@ -27,11 +27,12 @@ class SpoListRoleAssignmentRemoveCommand extends SpoCommand {
27
27
  __classPrivateFieldGet(this, _SpoListRoleAssignmentRemoveCommand_instances, "m", _SpoListRoleAssignmentRemoveCommand_initOptions).call(this);
28
28
  __classPrivateFieldGet(this, _SpoListRoleAssignmentRemoveCommand_instances, "m", _SpoListRoleAssignmentRemoveCommand_initValidators).call(this);
29
29
  __classPrivateFieldGet(this, _SpoListRoleAssignmentRemoveCommand_instances, "m", _SpoListRoleAssignmentRemoveCommand_initOptionSets).call(this);
30
+ __classPrivateFieldGet(this, _SpoListRoleAssignmentRemoveCommand_instances, "m", _SpoListRoleAssignmentRemoveCommand_initTypes).call(this);
30
31
  }
31
32
  async commandAction(logger, args) {
32
33
  const removeRoleAssignment = async () => {
33
34
  if (this.verbose) {
34
- await logger.logToStderr(`Removing role assignment from list in site at ${args.options.webUrl}...`);
35
+ await logger.logToStderr(`Removing role assignment from list '${args.options.listId || args.options.listTitle || args.options.listUrl}' of site ${args.options.webUrl}...`);
35
36
  }
36
37
  try {
37
38
  let requestUrl = `${args.options.webUrl}/_api/web/`;
@@ -45,17 +46,30 @@ class SpoListRoleAssignmentRemoveCommand extends SpoCommand {
45
46
  const listServerRelativeUrl = urlUtil.getServerRelativePath(args.options.webUrl, args.options.listUrl);
46
47
  requestUrl += `GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
47
48
  }
49
+ let principalId = args.options.principalId;
48
50
  if (args.options.upn) {
49
- args.options.principalId = await this.getUserPrincipalId(args.options);
50
- await this.removeRoleAssignment(requestUrl, logger, args.options);
51
+ const user = await spo.ensureUser(args.options.webUrl, args.options.upn);
52
+ principalId = user.Id;
51
53
  }
52
54
  else if (args.options.groupName) {
53
- args.options.principalId = await this.getGroupPrincipalId(args.options);
54
- await this.removeRoleAssignment(requestUrl, logger, args.options);
55
+ const spGroup = await spo.getGroupByName(args.options.webUrl, args.options.groupName, logger, this.verbose);
56
+ principalId = spGroup.Id;
55
57
  }
56
- else {
57
- await this.removeRoleAssignment(requestUrl, logger, args.options);
58
+ else if (args.options.entraGroupId || args.options.entraGroupName) {
59
+ if (this.verbose) {
60
+ await logger.logToStderr('Retrieving group information...');
61
+ }
62
+ let group;
63
+ if (args.options.entraGroupId) {
64
+ group = await entraGroup.getGroupById(args.options.entraGroupId);
65
+ }
66
+ else {
67
+ group = await entraGroup.getGroupByDisplayName(args.options.entraGroupName);
68
+ }
69
+ const siteUser = await spo.ensureEntraGroup(args.options.webUrl, group);
70
+ principalId = siteUser.Id;
58
71
  }
72
+ await this.removeRoleAssignment(requestUrl, principalId);
59
73
  }
60
74
  catch (err) {
61
75
  this.handleRejectedODataJsonPromise(err);
@@ -65,49 +79,22 @@ class SpoListRoleAssignmentRemoveCommand extends SpoCommand {
65
79
  await removeRoleAssignment();
66
80
  }
67
81
  else {
68
- const result = await cli.promptForConfirmation({ message: `Are you sure you want to remove role assignment from list ${args.options.listId || args.options.listTitle} from site ${args.options.webUrl}?` });
82
+ const result = await cli.promptForConfirmation({ message: `Are you sure you want to remove role assignment from the specified user of list '${args.options.listId || args.options.listTitle || args.options.listUrl}'?` });
69
83
  if (result) {
70
84
  await removeRoleAssignment();
71
85
  }
72
86
  }
73
87
  }
74
- async removeRoleAssignment(requestUrl, logger, options) {
88
+ async removeRoleAssignment(requestUrl, principalId) {
75
89
  const requestOptions = {
76
- url: `${requestUrl}roleassignments/removeroleassignment(principalid='${options.principalId}')`,
77
- method: 'POST',
90
+ url: `${requestUrl}roleassignments/removeroleassignment(principalid='${principalId}')`,
78
91
  headers: {
79
- 'accept': 'application/json;odata=nometadata',
80
- 'content-type': 'application/json'
92
+ accept: 'application/json;odata=nometadata'
81
93
  },
82
94
  responseType: 'json'
83
95
  };
84
96
  return request.post(requestOptions);
85
97
  }
86
- async getGroupPrincipalId(options) {
87
- const groupGetCommandOptions = {
88
- webUrl: options.webUrl,
89
- name: options.groupName,
90
- output: 'json',
91
- debug: this.debug,
92
- verbose: this.verbose
93
- };
94
- const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
95
- const getGroupOutput = JSON.parse(output.stdout);
96
- return getGroupOutput.Id;
97
- }
98
- async getUserPrincipalId(options) {
99
- const userGetCommandOptions = {
100
- webUrl: options.webUrl,
101
- email: options.upn,
102
- id: undefined,
103
- output: 'json',
104
- debug: this.debug,
105
- verbose: this.verbose
106
- };
107
- const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
108
- const getUserOutput = JSON.parse(output.stdout);
109
- return getUserOutput.Id;
110
- }
111
98
  }
112
99
  _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssignmentRemoveCommand_initTelemetry = function _SpoListRoleAssignmentRemoveCommand_initTelemetry() {
113
100
  this.telemetry.push((args) => {
@@ -118,7 +105,9 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
118
105
  principalId: typeof args.options.principalId !== 'undefined',
119
106
  upn: typeof args.options.upn !== 'undefined',
120
107
  groupName: typeof args.options.groupName !== 'undefined',
121
- force: (!(!args.options.force)).toString()
108
+ entraGroupId: typeof args.options.entraGroupId !== 'undefined',
109
+ entraGroupName: typeof args.options.entraGroupName !== 'undefined',
110
+ force: !!args.options.force
122
111
  });
123
112
  });
124
113
  }, _SpoListRoleAssignmentRemoveCommand_initOptions = function _SpoListRoleAssignmentRemoveCommand_initOptions() {
@@ -136,6 +125,10 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
136
125
  option: '--upn [upn]'
137
126
  }, {
138
127
  option: '--groupName [groupName]'
128
+ }, {
129
+ option: '--entraGroupId [entraGroupId]'
130
+ }, {
131
+ option: '--entraGroupName [entraGroupName]'
139
132
  }, {
140
133
  option: '-f, --force'
141
134
  });
@@ -146,15 +139,24 @@ _SpoListRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListRoleAssig
146
139
  return isValidSharePointUrl;
147
140
  }
148
141
  if (args.options.listId && !validation.isValidGuid(args.options.listId)) {
149
- return `${args.options.listId} is not a valid GUID`;
142
+ return `'${args.options.listId}' is not a valid GUID for option listId.`;
143
+ }
144
+ if (args.options.upn && !validation.isValidUserPrincipalName(args.options.upn)) {
145
+ return `'${args.options.upn}' is not a valid user principal name for option upn.`;
146
+ }
147
+ if (args.options.principalId && !validation.isValidPositiveInteger(args.options.principalId)) {
148
+ return `'${args.options.principalId}' is not a valid number for option principalId.`;
150
149
  }
151
- if (args.options.principalId && isNaN(args.options.principalId)) {
152
- return `Specified principalId ${args.options.principalId} is not a number`;
150
+ if (args.options.entraGroupId && !validation.isValidGuid(args.options.entraGroupId)) {
151
+ return `'${args.options.entraGroupId}' is not a valid GUID for option entraGroupId.`;
153
152
  }
154
153
  return true;
155
154
  });
156
155
  }, _SpoListRoleAssignmentRemoveCommand_initOptionSets = function _SpoListRoleAssignmentRemoveCommand_initOptionSets() {
157
- this.optionSets.push({ options: ['listId', 'listTitle', 'listUrl'] }, { options: ['principalId', 'upn', 'groupName'] });
156
+ this.optionSets.push({ options: ['listId', 'listTitle', 'listUrl'] }, { options: ['principalId', 'upn', 'groupName', 'entraGroupId', 'entraGroupName'] });
157
+ }, _SpoListRoleAssignmentRemoveCommand_initTypes = function _SpoListRoleAssignmentRemoveCommand_initTypes() {
158
+ this.types.string.push('webUrl', 'listId', 'listTitle', 'listUrl', 'upn', 'groupName', 'entraGroupId', 'entraGroupName');
159
+ this.types.boolean.push('force');
158
160
  };
159
161
  export default new SpoListRoleAssignmentRemoveCommand();
160
162
  //# sourceMappingURL=list-roleassignment-remove.js.map
package/dist/utils/spo.js CHANGED
@@ -454,15 +454,46 @@ export const spo = {
454
454
  const res = await request.get(requestOptions);
455
455
  return res.AadObjectId.NameId;
456
456
  },
457
+ /**
458
+ * Ensure a user exists on a specific SharePoint site.
459
+ * @param webUrl URL of the SharePoint site.
460
+ * @param logonName Logon name of the user to ensure on the SharePoint site.
461
+ * @returns SharePoint user object.
462
+ */
463
+ async ensureUser(webUrl, logonName) {
464
+ const requestOptions = {
465
+ url: `${webUrl}/_api/web/EnsureUser`,
466
+ headers: {
467
+ accept: 'application/json;odata=nometadata'
468
+ },
469
+ responseType: 'json',
470
+ data: {
471
+ logonName: logonName
472
+ }
473
+ };
474
+ return request.post(requestOptions);
475
+ },
476
+ /**
477
+ * Ensure a Microsoft Entra ID group exists on a specific SharePoint site.
478
+ * @param webUrl URL of the SharePoint site.
479
+ * @param group Microsoft Entra ID group.
480
+ * @returns SharePoint user object.
481
+ */
482
+ async ensureEntraGroup(webUrl, group) {
483
+ if (!group.securityEnabled) {
484
+ throw new Error('Cannot ensure a Microsoft Entra ID group that is not security enabled.');
485
+ }
486
+ return this.ensureUser(webUrl, group.mailEnabled ? `c:0o.c|federateddirectoryclaimprovider|${group.id}` : `c:0t.c|tenant|${group.id}`);
487
+ },
457
488
  /**
458
489
  * Retrieves the spo user by email.
459
490
  * @param webUrl Web url
460
491
  * @param email The email of the user
461
492
  * @param logger the Logger object
462
- * @param debug set if debug logging should be logged
493
+ * @param verbose set if verbose logging should be logged
463
494
  */
464
- async getUserByEmail(webUrl, email, logger, debug) {
465
- if (debug) {
495
+ async getUserByEmail(webUrl, email, logger, verbose) {
496
+ if (verbose) {
466
497
  await logger.logToStderr(`Retrieving the spo user by email ${email}`);
467
498
  }
468
499
  const requestUrl = `${webUrl}/_api/web/siteusers/GetByEmail('${formatting.encodeQueryParameter(email)}')`;
@@ -533,10 +564,10 @@ export const spo = {
533
564
  * @param webUrl Web url
534
565
  * @param name The name of the group
535
566
  * @param logger the Logger object
536
- * @param debug set if debug logging should be logged
567
+ * @param verbose set if verbose logging should be logged
537
568
  */
538
- async getGroupByName(webUrl, name, logger, debug) {
539
- if (debug) {
569
+ async getGroupByName(webUrl, name, logger, verbose) {
570
+ if (verbose) {
540
571
  await logger.logToStderr(`Retrieving the group by name ${name}`);
541
572
  }
542
573
  const requestUrl = `${webUrl}/_api/web/sitegroups/GetByName('${formatting.encodeQueryParameter(name)}')`;
@@ -15,7 +15,7 @@ m365 connection use [options]
15
15
  ## Options
16
16
 
17
17
  ```md definition-list
18
- `-n, --name <name>`
18
+ `-n, --name [name]`
19
19
  : The name of the connection to switch to.
20
20
  ```
21
21
 
@@ -23,7 +23,13 @@ m365 connection use [options]
23
23
 
24
24
  ## Remarks
25
25
 
26
- The value for `--name` can be found by running [m365 connection list](connection-list.mdx). You can update the name of a connection by running [m365 connection set](connection-set.mdx).
26
+ :::tip
27
+
28
+ If you haven't disabled the "prompt" setting, running this command without options will show a list of available connections. You can then select the connection to activate it.
29
+
30
+ :::
31
+
32
+ You can update the name of a connection by running [m365 connection set](connection-set.mdx).
27
33
 
28
34
  ## Examples
29
35
 
@@ -0,0 +1,107 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # entra multitenant add
6
+
7
+ Creates a new multitenant organization
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 entra multitenant add [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md definition-list
18
+ `-n, --displayname <displayName>`
19
+ : Display name for the multitenant organization.
20
+
21
+ `-d, --description [description]`
22
+ : Description for the multitenant organiztion.
23
+ ```
24
+
25
+ <Global />
26
+
27
+ ## Remarks
28
+
29
+ :::info
30
+
31
+ To use this command you must be at least **Security Administrator**.
32
+
33
+ :::
34
+
35
+ ## Examples
36
+
37
+ Create a new multitenant organization with display name only.
38
+
39
+ ```sh
40
+ m365 entra multitenant add --displayName 'Contoso organization'
41
+ ```
42
+
43
+ Create a new multitenant organization with display name and description.
44
+
45
+ ```sh
46
+ m365 entra multitenant add --displayName 'Contoso organization' --description 'Multitenant organization between Contoso, Fabrikam, and Woodgrove Bank'
47
+ ```
48
+
49
+ ## Response
50
+
51
+ <Tabs>
52
+ <TabItem value="JSON">
53
+
54
+ ```json
55
+ {
56
+ "id": "c231d4a5-138f-4bdf-9fee-f26a90ea3ad0",
57
+ "createdDateTime": "2024-05-05T05:05:05Z",
58
+ "state": "active",
59
+ "displayName": "Contoso organization",
60
+ "description": "Multitenant organization between Contoso, Fabrikam, and Woodgrove Bank"
61
+ }
62
+ ```
63
+
64
+ </TabItem>
65
+ <TabItem value="Text">
66
+
67
+ ```text
68
+ createdDateTime: 2024-05-05T05:05:05Z
69
+ description : Multitenant organization between Contoso, Fabrikam, and Woodgrove Bank
70
+ displayName : Contoso organization
71
+ id : c231d4a5-138f-4bdf-9fee-f26a90ea3ad0
72
+ state : active
73
+ ```
74
+
75
+ </TabItem>
76
+ <TabItem value="CSV">
77
+
78
+ ```csv
79
+ id,createdDateTime,state,displayName,description
80
+ c231d4a5-138f-4bdf-9fee-f26a90ea3ad0,2024-05-05T05:05:05Z,active,Contoso organization,"Multitenant organization between Contoso, Fabrikam, and Woodgrove Bank"
81
+ ```
82
+
83
+ </TabItem>
84
+ <TabItem value="Markdown">
85
+
86
+ ```md
87
+ # entra multitenant add
88
+
89
+ Date: 5/5/2024
90
+
91
+ ## Contoso organization (c231d4a5-138f-4bdf-9fee-f26a90ea3ad0)
92
+
93
+ Property | Value
94
+ ---------|-------
95
+ id | c231d4a5-138f-4bdf-9fee-f26a90ea3ad0
96
+ createdDateTime | 2024-05-05T05:05:05Z
97
+ state | active
98
+ displayName | Contoso organization
99
+ description | Multitenant organization between Contoso, Fabrikam, and Woodgrove Bank
100
+ ```
101
+
102
+ </TabItem>
103
+ </Tabs>
104
+
105
+ ## More information
106
+
107
+ - Multitenant organization: https://learn.microsoft.com/entra/identity/multi-tenant-organizations/overview
@@ -0,0 +1,58 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+
3
+ # entra multitenant remove
4
+
5
+ Removes a multitenant organization
6
+
7
+ ## Usage
8
+
9
+ ```sh
10
+ m365 entra multitenant remove [options]
11
+ ```
12
+
13
+ ## options
14
+
15
+ ```md definition-list
16
+ `-f, --force`
17
+ : Don't prompt for confirmation.
18
+ ```
19
+
20
+ <Global />
21
+
22
+ ## Remarks
23
+
24
+ :::info
25
+
26
+ To use this command you must be at least **Security Administrator**.
27
+
28
+ :::
29
+
30
+ :::info
31
+
32
+ When removing a Multi-Tenant Organization, all associations with other tenants will be removed too.
33
+
34
+ The removing process can take up to 2 hours to complete.
35
+
36
+ :::
37
+
38
+ ## Examples
39
+
40
+ Remove the multitenant organization.
41
+
42
+ ```sh
43
+ m365 entra multitenant remove
44
+ ```
45
+
46
+ Remove the multitenant organization without prompting for confirmation.
47
+
48
+ ```sh
49
+ m365 entra multitenant remove --force
50
+ ```
51
+
52
+ ## Response
53
+
54
+ The command won't return a response on success
55
+
56
+ ## More information
57
+
58
+ - Multitenant organization: https://learn.microsoft.com/entra/identity/multi-tenant-organizations/overview
@@ -0,0 +1,53 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+
3
+ # entra multitenant set
4
+
5
+ Updates the properties of a multitenant organization
6
+
7
+ ## Usage
8
+
9
+ ```sh
10
+ m365 entra multitenant set [options]
11
+ ```
12
+
13
+ ## Options
14
+
15
+ ```md definition-list
16
+ `-n, --displayName [displayName]`
17
+ : New display name of the multitenant organization. Both options, `displayName` and `description` are optional but at least must be specified.
18
+
19
+ `-d, --description [description]`
20
+ : New description of the multitenant organization. Both options, `displayName` and `description` are optional but at least must be specified.
21
+ ```
22
+
23
+ <Global />
24
+
25
+ ## Remarks
26
+
27
+ :::info
28
+
29
+ To use this command you must be at least **Security Administrator**.
30
+
31
+ :::
32
+
33
+ ## Examples
34
+
35
+ Update display name of multitenant organization.
36
+
37
+ ```sh
38
+ m365 entra multitenant set --displayName 'Fabrikam organization'
39
+ ```
40
+
41
+ Update display name and description of multitenant organization.
42
+
43
+ ```sh
44
+ m365 entra multitenant set --displayName 'Fabrikam organization' --description 'Multitenant organization between Fabrikam and Contoso'
45
+ ```
46
+
47
+ ## Response
48
+
49
+ The command won't return a response on success
50
+
51
+ ## More information
52
+
53
+ - Multitenant organization: https://learn.microsoft.com/entra/identity/multi-tenant-organizations/overview
@@ -13,7 +13,7 @@ m365 planner plan remove [options]
13
13
  ## Options
14
14
 
15
15
  ```md definition-list
16
- `i, --id [id]`
16
+ `-i, --id [id]`
17
17
  : ID of the plan to remove. Specify either `id` or `title` but not both.
18
18
 
19
19
  `-t, --title [title]`
@@ -2,14 +2,14 @@ import Global from '/docs/cmd/_global.mdx';
2
2
  import Tabs from '@theme/Tabs';
3
3
  import TabItem from '@theme/TabItem';
4
4
 
5
- # Container Types list
5
+ # spe containertype list
6
6
 
7
- Retrieves a list of Container Types created for a SharePoint Embedded Application
7
+ Lists all Container Types
8
8
 
9
9
  ## Usage
10
10
 
11
11
  ```sh
12
- m365 containertype list [options]
12
+ m365 spe containertype list [options]
13
13
  ```
14
14
 
15
15
  ## Options
@@ -21,7 +21,7 @@ m365 containertype list [options]
21
21
  Retrieves a list of Container Types created for a SharePoint Embedded Application from the tenant.
22
22
 
23
23
  ```sh
24
- m365 containertype list
24
+ m365 spe containertype list
25
25
  ```
26
26
 
27
27
  ## Response
@@ -30,47 +30,32 @@ m365 containertype list
30
30
  <TabItem value="JSON">
31
31
 
32
32
  ```json
33
- [{
34
- "_ObjectType_": "Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties",
35
- "ApplicationRedirectUrl": null,
36
- "AzureSubscriptionId": "/Guid(00000000-0000-0000-0000-000000000000)/",
37
- "ContainerTypeId": "/Guid(073269af-f1d2-042d-2ef5-5bdd6ac83115)/",
38
- "CreationDate": null,
39
- "DisplayName": "test1",
40
- "ExpiryDate": null,
41
- "IsBillingProfileRequired": true,
42
- "OwningAppId": "/Guid(df4085cc-9a38-4255-badc-5c5225610475)/",
43
- "OwningTenantId": "/Guid(00000000-0000-0000-0000-000000000000)/",
44
- "Region": null,
45
- "ResourceGroup": null,
46
- "SPContainerTypeBillingClassification": 0
47
- },
48
- {
49
- "_ObjectType_": "Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties",
50
- "ApplicationRedirectUrl": null,
51
- "AzureSubscriptionId": "/Guid(00000000-0000-0000-0000-000000000000)/",
52
- "ContainerTypeId": "/Guid(3ec7c59d-ef31-0752-1ab5-5c343a5e8557)/",
53
- "CreationDate": null,
54
- "DisplayName": "SharePoint Embedded Free Trial Container Type",
55
- "ExpiryDate": null,
56
- "IsBillingProfileRequired": true,
57
- "OwningAppId": "/Guid(e6b529fe-84db-412a-8e9c-5bbb75f7b037)/",
58
- "OwningTenantId": "/Guid(00000000-0000-0000-0000-000000000000)/",
59
- "Region": null,
60
- "ResourceGroup": null,
61
- "SPContainerTypeBillingClassification": 1
62
- }]
33
+ [
34
+ {
35
+ "_ObjectType_": "Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties",
36
+ "ApplicationRedirectUrl": null,
37
+ "AzureSubscriptionId": "/Guid(00000000-0000-0000-0000-000000000000)/",
38
+ "ContainerTypeId": "/Guid(073269af-f1d2-042d-2ef5-5bdd6ac83115)/",
39
+ "CreationDate": null,
40
+ "DisplayName": "test1",
41
+ "ExpiryDate": null,
42
+ "IsBillingProfileRequired": true,
43
+ "OwningAppId": "/Guid(df4085cc-9a38-4255-badc-5c5225610475)/",
44
+ "OwningTenantId": "/Guid(00000000-0000-0000-0000-000000000000)/",
45
+ "Region": null,
46
+ "ResourceGroup": null,
47
+ "SPContainerTypeBillingClassification": 0
48
+ }
49
+ ]
63
50
  ```
64
51
 
65
52
  </TabItem>
66
53
  <TabItem value="Text">
67
54
 
68
55
  ```text
69
- ContainerTypeId DisplayName OwningAppId
70
- -------------------------------------------- --------------------------------------------- --------------------------------------------
71
- /Guid(073269af-f1d2-042d-2ef5-5bdd6ac83115)/ test1 /Guid(df4085cc-9a38-4255-badc-5c5225610475)/
72
- /Guid(880ab3bd-5b68-01d4-3744-01a7656cf2ba)/ test1 /Guid(50785fde-3082-47ac-a36d-06282ac5c7da)/
73
- /Guid(3ec7c59d-ef31-0752-1ab5-5c343a5e8557)/ SharePoint Embedded Free Trial Container Type /Guid(e6b529fe-84db-412a-8e9c-5bbb75f7b037)/
56
+ ContainerTypeId DisplayName OwningAppId
57
+ -------------------------------------------- --------------------------------------------- --------------------------------------------
58
+ /Guid(073269af-f1d2-042d-2ef5-5bdd6ac83115)/ test1 /Guid(df4085cc-9a38-4255-badc-5c5225610475)/
74
59
  ```
75
60
 
76
61
  </TabItem>
@@ -79,7 +64,6 @@ ContainerTypeId DisplayName
79
64
  ```csv
80
65
  _ObjectType_,ApplicationRedirectUrl,AzureSubscriptionId,ContainerTypeId,CreationDate,DisplayName,ExpiryDate,IsBillingProfileRequired,OwningAppId,OwningTenantId,Region,ResourceGroup,SPContainerTypeBillingClassification
81
66
  Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties,,/Guid(00000000-0000-0000-0000-000000000000)/,/Guid(073269af-f1d2-042d-2ef5-5bdd6ac83115)/,,test1,,1,/Guid(df4085cc-9a38-4255-badc-5c5225610475)/,/Guid(00000000-0000-0000-0000-000000000000)/,,,0
82
- Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties,,/Guid(00000000-0000-0000-0000-000000000000)/,/Guid(3ec7c59d-ef31-0752-1ab5-5c343a5e8557)/,,SharePoint Embedded Free Trial Container Type,,1,/Guid(e6b529fe-84db-412a-8e9c-5bbb75f7b037)/,/Guid(00000000-0000-0000-0000-000000000000)/,,,1
83
67
  ```
84
68
 
85
69
  </TabItem>
@@ -102,19 +86,6 @@ ContainerTypeId DisplayName
102
86
  OwningAppId | /Guid(df4085cc-9a38-4255-badc-5c5225610475)/
103
87
  OwningTenantId | /Guid(00000000-0000-0000-0000-000000000000)/
104
88
  SPContainerTypeBillingClassification | 0
105
-
106
- ## SharePoint Embedded Free Trial Container Type
107
-
108
- Property | Value
109
- ---------|-------
110
- \_ObjectType\_ | Microsoft.Online.SharePoint.TenantAdministration.SPContainerTypeProperties
111
- AzureSubscriptionId | /Guid(00000000-0000-0000-0000-000000000000)/
112
- ContainerTypeId | /Guid(3ec7c59d-ef31-0752-1ab5-5c343a5e8557)/
113
- DisplayName | SharePoint Embedded Free Trial Container Type
114
- IsBillingProfileRequired | true
115
- OwningAppId | /Guid(e6b529fe-84db-412a-8e9c-5bbb75f7b037)/
116
- OwningTenantId | /Guid(00000000-0000-0000-0000-000000000000)/
117
- SPContainerTypeBillingClassification | 1
118
89
  ```
119
90
 
120
91
  </TabItem>
@@ -36,6 +36,10 @@ m365 spo applicationcustomizer get [options]
36
36
 
37
37
  <Global />
38
38
 
39
+ ## Remarks
40
+
41
+ This command can be used for retrieving an application customizer from a specific site. To retrieve an application customizer that's installed tenant-wide, view our dedicated [spo tenant applicationcustomizer get](../tenant/tenant-applicationcustomizer-get.mdx) command.
42
+
39
43
  ## Examples
40
44
 
41
45
  Retrieves an application customizer by title.
@@ -68,10 +72,6 @@ Retrieves the client-side component properties of a application customizer.
68
72
  m365 spo applicationcustomizer get --id 14125658-a9bc-4ddf-9c75-1b5767c9a337 --webUrl https://contoso.sharepoint.com/sites/sales --clientSideComponentProperties
69
73
  ```
70
74
 
71
- ## Remarks
72
-
73
- This command can be used for retrieving an application customizer from a specific site. To retrieve an application customizer that's installed tenant-wide, view our dedicated [spo tenant applicationcustomizer get](../tenant/tenant-applicationcustomizer-get.mdx) command.
74
-
75
75
  ## Response
76
76
 
77
77
  ### Standard response
@@ -24,6 +24,10 @@ m365 spo applicationcustomizer list [options]
24
24
 
25
25
  <Global />
26
26
 
27
+ ## Remarks
28
+
29
+ This command can be used for retrieving a list of application customizers from a specific site. To retrieve a list of application customizers that are installed tenant-wide, view our dedicated [spo tenant applicationcustomizer list](../tenant/tenant-applicationcustomizer-list.mdx) command.
30
+
27
31
  ## Examples
28
32
 
29
33
  Retrieves a list of application customizers.
@@ -32,10 +36,6 @@ Retrieves a list of application customizers.
32
36
  m365 spo applicationcustomizer list --webUrl https://contoso.sharepoint.com/sites/sales
33
37
  ```
34
38
 
35
- ## Remarks
36
-
37
- This command can be used for retrieving a list of application customizers from a specific site. To retrieve a list of application customizers that are installed tenant-wide, view our dedicated [spo tenant applicationcustomizer list](../tenant/tenant-applicationcustomizer-list.mdx) command.
38
-
39
39
  ## Response
40
40
 
41
41
  <Tabs>