@pnp/cli-microsoft365 10.8.0-beta.a51d886 → 10.8.0

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 (60) hide show
  1. package/.eslintrc.cjs +2 -1
  2. package/README.md +3 -1
  3. package/allCommands.json +1 -1
  4. package/allCommandsFull.json +1 -1
  5. package/dist/cli/cli.js +1 -1
  6. package/dist/config.js +1 -0
  7. package/dist/m365/adaptivecard/commands/adaptivecard-send.js +54 -67
  8. package/dist/m365/app/commands/app-get.js +5 -2
  9. package/dist/m365/app/commands/app-open.js +9 -22
  10. package/dist/m365/app/commands/permission/permission-add.js +18 -30
  11. package/dist/m365/app/commands/permission/permission-list.js +5 -2
  12. package/dist/m365/base/AppCommand.js +9 -25
  13. package/dist/m365/booking/commands/business/business-get.js +18 -25
  14. package/dist/m365/cli/commands/app/app-reconsent.js +103 -0
  15. package/dist/m365/cli/commands.js +1 -0
  16. package/dist/m365/context/commands/context-remove.js +12 -25
  17. package/dist/m365/context/commands/option/option-remove.js +11 -25
  18. package/dist/m365/entra/commands/organization/organization-list.js +51 -0
  19. package/dist/m365/entra/commands.js +1 -0
  20. package/dist/m365/graph/commands/directoryextension/directoryextension-list.js +74 -0
  21. package/dist/m365/graph/commands/openextension/openextension-set.js +107 -0
  22. package/dist/m365/graph/commands.js +2 -0
  23. package/dist/m365/spe/commands/container/container-add.js +85 -0
  24. package/dist/m365/spe/commands/container/container-list.js +2 -9
  25. package/dist/m365/spe/commands/container/container-recyclebinitem-list.js +62 -0
  26. package/dist/m365/spe/commands/container/container-remove.js +99 -0
  27. package/dist/m365/spe/commands/containertype/containertype-add.js +11 -11
  28. package/dist/m365/spe/commands/containertype/containertype-get.js +28 -32
  29. package/dist/m365/spe/commands/containertype/containertype-list.js +14 -4
  30. package/dist/m365/spe/commands/containertype/containertype-remove.js +81 -0
  31. package/dist/m365/spe/commands.js +5 -1
  32. package/dist/m365/spo/commands/list/list-get.js +12 -6
  33. package/dist/m365/spp/commands/model/model-apply.js +130 -0
  34. package/dist/m365/spp/commands/model/model-get.js +7 -24
  35. package/dist/m365/spp/commands/model/model-list.js +1 -1
  36. package/dist/m365/spp/commands/model/model-remove.js +1 -1
  37. package/dist/m365/spp/commands.js +1 -0
  38. package/dist/utils/entraServicePrincipal.js +11 -0
  39. package/dist/utils/formatting.js +12 -0
  40. package/dist/utils/spe.js +77 -0
  41. package/dist/utils/spo.js +0 -18
  42. package/dist/utils/spp.js +59 -1
  43. package/dist/utils/zod.js +26 -1
  44. package/docs/docs/cmd/adaptivecard/adaptivecard-send.mdx +1 -1
  45. package/docs/docs/cmd/cli/app/app-reconsent.mdx +63 -0
  46. package/docs/docs/cmd/entra/organization/organization-list.mdx +154 -0
  47. package/docs/docs/cmd/graph/directoryextension/directoryextension-list.mdx +135 -0
  48. package/docs/docs/cmd/graph/openextension/openextension-set.mdx +97 -0
  49. package/docs/docs/cmd/spe/container/container-activate.mdx +0 -2
  50. package/docs/docs/cmd/spe/container/container-add.mdx +128 -0
  51. package/docs/docs/cmd/spe/container/container-recyclebinitem-list.mdx +96 -0
  52. package/docs/docs/cmd/spe/container/container-remove.mdx +65 -0
  53. package/docs/docs/cmd/spe/containertype/containertype-add.mdx +9 -1
  54. package/docs/docs/cmd/spe/containertype/containertype-get.mdx +8 -0
  55. package/docs/docs/cmd/spe/containertype/containertype-list.mdx +8 -0
  56. package/docs/docs/cmd/spe/containertype/containertype-remove.mdx +52 -0
  57. package/docs/docs/cmd/spo/list/list-get.mdx +12 -3
  58. package/docs/docs/cmd/spp/model/model-apply.mdx +79 -0
  59. package/package.json +3 -3
  60. package/dist/m365/spe/ContainerProperties.js +0 -2
package/dist/utils/spo.js CHANGED
@@ -53,24 +53,6 @@ export const spo = {
53
53
  };
54
54
  return context;
55
55
  },
56
- async getAllContainerTypes(spoAdminUrl, logger, verbose) {
57
- const formDigestInfo = await spo.ensureFormDigest(spoAdminUrl, logger, undefined, verbose);
58
- const requestOptions = {
59
- url: `${spoAdminUrl}/_vti_bin/client.svc/ProcessQuery`,
60
- headers: {
61
- 'X-RequestDigest': formDigestInfo.FormDigestValue
62
- },
63
- data: `<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="${config.applicationName}" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions><ObjectPath Id="46" ObjectPathId="45" /><Method Name="GetSPOContainerTypes" Id="47" ObjectPathId="45"><Parameters><Parameter Type="Enum">1</Parameter></Parameters></Method></Actions><ObjectPaths><Constructor Id="45" TypeId="{268004ae-ef6b-4e9b-8425-127220d84719}" /></ObjectPaths></Request>`
64
- };
65
- const res = await request.post(requestOptions);
66
- const json = JSON.parse(res);
67
- const response = json[0];
68
- if (response.ErrorInfo) {
69
- throw new Error(response.ErrorInfo.ErrorMessage);
70
- }
71
- const containerTypes = json[json.length - 1];
72
- return containerTypes;
73
- },
74
56
  async waitUntilFinished({ operationId, siteUrl, logger, currentContext, debug, verbose }) {
75
57
  const resFormDigest = await spo.ensureFormDigest(siteUrl, logger, currentContext, debug);
76
58
  currentContext = resFormDigest;
package/dist/utils/spp.js CHANGED
@@ -1,11 +1,17 @@
1
1
  import request from '../request.js';
2
+ import { formatting } from './formatting.js';
2
3
  export const spp = {
3
4
  /**
4
5
  * Asserts whether the specified site is a content center
5
6
  * @param siteUrl The URL of the site to check
7
+ * @param logger Logger instance
8
+ * @param verbose Whether to log verbose messages
6
9
  * @throws error when site is not a content center.
7
10
  */
8
- async assertSiteIsContentCenter(siteUrl) {
11
+ async assertSiteIsContentCenter(siteUrl, logger, verbose) {
12
+ if (verbose) {
13
+ await logger.log(`Checking if '${siteUrl}' is a valid content center site...`);
14
+ }
9
15
  const requestOptions = {
10
16
  url: `${siteUrl}/_api/web?$select=WebTemplateConfiguration`,
11
17
  headers: {
@@ -17,6 +23,58 @@ export const spp = {
17
23
  if (response.WebTemplateConfiguration !== 'CONTENTCTR#0') {
18
24
  throw Error(`${siteUrl} is not a content site.`);
19
25
  }
26
+ },
27
+ /**
28
+ * Gets a SharePoint Premium model by title
29
+ * @param contentCenterUrl a content center site URL
30
+ * @param title model title
31
+ * @param logger Logger instance
32
+ * @param verbose Whether to log verbose messages
33
+ * @returns SharePoint Premium model
34
+ */
35
+ async getModelByTitle(contentCenterUrl, title, logger, verbose) {
36
+ if (verbose) {
37
+ await logger.log(`Retrieving model information...`);
38
+ }
39
+ let requestTitle = title.toLowerCase();
40
+ if (!requestTitle.endsWith('.classifier')) {
41
+ requestTitle += '.classifier';
42
+ }
43
+ const requestUrl = `${contentCenterUrl}/_api/machinelearning/models/getbytitle('${formatting.encodeQueryParameter(requestTitle)}')`;
44
+ const requestOptions = {
45
+ url: requestUrl,
46
+ headers: {
47
+ accept: 'application/json;odata=nometadata'
48
+ },
49
+ responseType: 'json'
50
+ };
51
+ const result = await request.get(requestOptions);
52
+ if (result['odata.null'] === true) {
53
+ throw Error(`Model '${title}' was not found.`);
54
+ }
55
+ return result;
56
+ },
57
+ /**
58
+ * Gets a SharePoint Premium model by unique id
59
+ * @param contentCenterUrl a content center site URL
60
+ * @param id model unique id
61
+ * @param logger Logger instance
62
+ * @param verbose Whether to log verbose messages
63
+ * @returns SharePoint Premium model
64
+ */
65
+ async getModelById(contentCenterUrl, id, logger, verbose) {
66
+ if (verbose) {
67
+ await logger.log(`Retrieving model information...`);
68
+ }
69
+ const requestUrl = `${contentCenterUrl}/_api/machinelearning/models/getbyuniqueid('${id}')`;
70
+ const requestOptions = {
71
+ url: requestUrl,
72
+ headers: {
73
+ accept: 'application/json;odata=nometadata'
74
+ },
75
+ responseType: 'json'
76
+ };
77
+ return await request.get(requestOptions);
20
78
  }
21
79
  };
22
80
  //# sourceMappingURL=spp.js.map
package/dist/utils/zod.js CHANGED
@@ -110,16 +110,41 @@ function parseDef(def, options, currentOption) {
110
110
  }
111
111
  } while (parsedDef);
112
112
  }
113
+ function optionToString(optionInfo) {
114
+ let s = '';
115
+ if (optionInfo.short) {
116
+ s += `-${optionInfo.short}, `;
117
+ }
118
+ s += `--${optionInfo.long}`;
119
+ if (optionInfo.type !== 'boolean') {
120
+ s += ' ';
121
+ s += optionInfo.required ? '<' : '[';
122
+ s += optionInfo.long;
123
+ s += optionInfo.required ? '>' : ']';
124
+ }
125
+ return s;
126
+ }
127
+ ;
113
128
  export const zod = {
114
129
  alias(alias, type) {
115
130
  type._def.alias = alias;
116
131
  return type;
117
132
  },
118
- schemaToOptions(schema) {
133
+ schemaToOptionInfo(schema) {
119
134
  const options = [];
120
135
  parseDef(schema._def, options);
121
136
  return options;
122
137
  },
138
+ schemaToOptions(schema) {
139
+ const optionsInfo = this.schemaToOptionInfo(schema);
140
+ const options = optionsInfo.map(option => {
141
+ return {
142
+ option: optionToString(option),
143
+ autocomplete: option.autocomplete
144
+ };
145
+ });
146
+ return options;
147
+ },
123
148
  coercedEnum: (e) => z.preprocess(val => {
124
149
  const target = String(val)?.toLowerCase();
125
150
  for (const k of Object.values(e)) {
@@ -17,7 +17,7 @@ m365 adaptivecard send [options]
17
17
  : URL where to send the card to.
18
18
 
19
19
  `-t, --title [title]`
20
- : Title of the card. Specify either `title` or `card` but not both.
20
+ : Title of the card. If you specify `title` and `card`, the `title` will be merged into the card.
21
21
 
22
22
  `-d, --description [description]`
23
23
  : Contents of the card.
@@ -0,0 +1,63 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # cli app reconsent
6
+
7
+ Reconsent all permission scopes used in CLI for Microsoft 365
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 cli app reconsent [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ <Global />
18
+
19
+ ## Remarks
20
+
21
+ This command will add all missing scopes used in CLI for Microsoft 365 to your current app registration. It will only add missing scopes and won't remove any scopes that are already present in the app registration.
22
+
23
+ ## Examples
24
+
25
+ Consent all permission scopes used in CLI for Microsoft 365 to the current app registration
26
+
27
+ ```sh
28
+ m365 cli app reconsent
29
+ ```
30
+
31
+ ## Response
32
+
33
+ <Tabs>
34
+ <TabItem value="JSON">
35
+
36
+ ```json
37
+ "To consent to the new scopes for your Microsoft Entra application registration, please navigate to the following URL: https://login.microsoftonline.com/f72203fd-b0a0-472d-85eb-079a117a80de/adminconsent?client_id=62b981af-59d3-4d25-8baf-6cc067a03102"
38
+ ```
39
+
40
+ </TabItem>
41
+ <TabItem value="Text">
42
+
43
+ ```text
44
+ To consent to the new scopes for your Microsoft Entra application registration, please navigate to the following URL: https://login.microsoftonline.com/f72203fd-b0a0-472d-85eb-079a117a80de/adminconsent?client_id=62b981af-59d3-4d25-8baf-6cc067a03102
45
+ ```
46
+
47
+ </TabItem>
48
+ <TabItem value="CSV">
49
+
50
+ ```csv
51
+ To consent to the new scopes for your Microsoft Entra application registration, please navigate to the following URL: https://login.microsoftonline.com/f72203fd-b0a0-472d-85eb-079a117a80de/adminconsent?client_id=62b981af-59d3-4d25-8baf-6cc067a03102
52
+ ```
53
+
54
+ </TabItem>
55
+ <TabItem value="Markdown">
56
+
57
+ ```md
58
+ To consent to the new scopes for your Microsoft Entra application registration, please navigate to the following URL: https://login.microsoftonline.com/f72203fd-b0a0-472d-85eb-079a117a80de/adminconsent?client_id=62b981af-59d3-4d25-8baf-6cc067a03102
59
+ ```
60
+
61
+ </TabItem>
62
+ </Tabs>
63
+
@@ -0,0 +1,154 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # entra organization list
6
+
7
+ Retrieves a list of organizations
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 entra organization list [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md definition-list
18
+ `-p, --properties [properties]`
19
+ : The comma separated list of properties to be returned.
20
+ ```
21
+
22
+ <Global />
23
+
24
+ ## Remarks
25
+
26
+ :::info
27
+
28
+ Applications granted the `User.Read` permission are able to read only the id, displayName, and verifiedDomains properties of the organization.
29
+ All other properties return with null values. To read all properties, use at least `Organization.Read.All`.
30
+
31
+ :::
32
+
33
+ ## Examples
34
+
35
+ Retrieve organizations
36
+
37
+ ```sh
38
+ m365 entra organization list
39
+ ```
40
+
41
+ Retrieve specific info
42
+
43
+ ```sh
44
+ m365 entra organization list --properties 'id,displayName,tenantType'
45
+ ```
46
+
47
+ ## Response
48
+
49
+ <Tabs>
50
+ <TabItem value="JSON">
51
+
52
+ ```json
53
+ [
54
+ {
55
+ "id": "e65b162c-6f87-4eb1-a24e-1b37d3504663",
56
+ "deletedDateTime": null,
57
+ "businessPhones": [
58
+ "4258828080"
59
+ ],
60
+ "city": null,
61
+ "country": null,
62
+ "countryLetterCode": "IE",
63
+ "createdDateTime": "2023-02-21T19:56:38Z",
64
+ "defaultUsageLocation": null,
65
+ "displayName": "Contoso",
66
+ "isMultipleDataLocationsForServicesEnabled": null,
67
+ "marketingNotificationEmails": [],
68
+ "onPremisesLastSyncDateTime": null,
69
+ "onPremisesSyncEnabled": null,
70
+ "partnerTenantType": null,
71
+ "postalCode": null,
72
+ "preferredLanguage": "en",
73
+ "securityComplianceNotificationMails": [],
74
+ "securityComplianceNotificationPhones": [],
75
+ "state": null,
76
+ "street": null,
77
+ "technicalNotificationMails": [
78
+ "john.doe@contoso.com"
79
+ ],
80
+ "tenantType": "AAD",
81
+ "directorySizeQuota": {
82
+ "used": 1400,
83
+ "total": 300000
84
+ },
85
+ "assignedPlans": [],
86
+ "onPremisesSyncStatus": [],
87
+ "privacyProfile": {
88
+ "contactEmail": "john.doe@contoso.com",
89
+ "statementUrl": ""
90
+ },
91
+ "provisionedPlans": [],
92
+ "verifiedDomains": [
93
+ {
94
+ "capabilities": "Email, OfficeCommunicationsOnline",
95
+ "isDefault": true,
96
+ "isInitial": true,
97
+ "name": "contoso.onmicrosoft.com",
98
+ "type": "Managed"
99
+ },
100
+ {
101
+ "capabilities": "Email, OfficeCommunicationsOnline, MoeraDomain",
102
+ "isDefault": false,
103
+ "isInitial": false,
104
+ "name": "contoso2.onmicrosoft.com",
105
+ "type": "Managed"
106
+ }
107
+ ]
108
+ }
109
+ ]
110
+ ```
111
+
112
+ </TabItem>
113
+ <TabItem value="Text">
114
+
115
+ ```text
116
+ displayName: Contoso
117
+ id : e65b162c-6f87-4eb1-a24e-1b37d3504663
118
+ tenantType : AAD
119
+ ```
120
+
121
+ </TabItem>
122
+ <TabItem value="CSV">
123
+
124
+ ```csv
125
+ id,deletedDateTime,city,country,countryLetterCode,createdDateTime,defaultUsageLocation,displayName,isMultipleDataLocationsForServicesEnabled,onPremisesLastSyncDateTime,onPremisesSyncEnabled,partnerTenantType,postalCode,preferredLanguage,state,street,tenantType
126
+ e65b162c-6f87-4eb1-a24e-1b37d3504663,,,,IE,2023-02-21T19:56:38Z,,Contoso,,,,,,en,,,AAD
127
+ ```
128
+
129
+ </TabItem>
130
+ <TabItem value="Markdown">
131
+
132
+ ```md
133
+ # entra organization list --debug "false" --verbose "false"
134
+
135
+ Date: 4/18/2025
136
+
137
+ ## Contoso (e65b162c-6f87-4eb1-a24e-1b37d3504663)
138
+
139
+ Property | Value
140
+ ---------|-------
141
+ id | e65b162c-6f87-4eb1-a24e-1b37d3504663
142
+ countryLetterCode | IE
143
+ createdDateTime | 2023-02-21T19:56:38Z
144
+ displayName | Contoso
145
+ preferredLanguage | en
146
+ tenantType | AAD
147
+ ```
148
+
149
+ </TabItem>
150
+ </Tabs>
151
+
152
+ ## More information
153
+
154
+ - Organization: https://learn.microsoft.com/graph/api/organization-list
@@ -0,0 +1,135 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # graph directoryextension list
6
+
7
+ Retrieves a list of directory extensions
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 graph directoryextension list [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md definition-list
18
+ `--appId [appId]`
19
+ : Application (client) ID of the Entra application where the directory extensions are registered. Specify either `appId`, `appObjectId` or `appName`, but not multiple.
20
+
21
+ `--appObjectId [appObjectId]`
22
+ : Object ID of the Entra application where the directory extensions are registered. Specify either `appId`, `appObjectId` or `appName`, but not multiple.
23
+
24
+ `--appName [appName]`
25
+ : The name of Entra application where the directory extensions are registered. Specify either `appId`, `appObjectId` or `appName`, but not multiple.
26
+ ```
27
+
28
+ <Global />
29
+
30
+ ## Remarks
31
+
32
+ When neither `appId`, `appObjectId` nor `appName` is specified, the command will return all available directory extensions including those registered for multi-tenant apps.
33
+
34
+ https://learn.microsoft.com/en-us/graph/api/directoryobject-getavailableextensionproperties?view=graph-rest-1.0&tabs=http
35
+
36
+ Otherwise, it will return directory extensions for a specific application.
37
+
38
+ https://learn.microsoft.com/en-us/graph/api/application-list-extensionproperty?view=graph-rest-1.0&tabs=http
39
+
40
+ ## Examples
41
+
42
+ Get all available directory extensions including those registered for multi-tenant apps
43
+
44
+ ```sh
45
+ m365 graph directoryextension list
46
+ ```
47
+
48
+ Get all directory extensions registered for an application specified by app id.
49
+
50
+ ```sh
51
+ m365 graph directoryextension list --appId fd918e4b-c821-4efb-b50a-5eddd23afc6f
52
+ ```
53
+
54
+ Get all directory extensions registered for an application specified by app object id.
55
+
56
+ ```sh
57
+ m365 graph directoryextension list --appObjectId 1caf7dcd-7e83-4c3a-94f7-932a1299c844
58
+ ```
59
+
60
+ Get all directory extensions registered for an application specified by name.
61
+
62
+ ```sh
63
+ m365 graph directoryextension list --appName ContosoApp
64
+ ```
65
+
66
+ ## Response
67
+
68
+ <Tabs>
69
+ <TabItem value="JSON">
70
+
71
+ ```json
72
+ [
73
+ {
74
+ "id": "8133c498-ad76-4a7b-90a0-675bf5adf492",
75
+ "deletedDateTime": null,
76
+ "appDisplayName": "ContosoApp",
77
+ "dataType": "String",
78
+ "isMultiValued": true,
79
+ "isSyncedFromOnPremises": false,
80
+ "name": "extension_66eac1c505384aec9e024b9e60f5e4b9_jobGroup",
81
+ "targetObjects": [
82
+ "User"
83
+ ]
84
+ }
85
+ ]
86
+ ```
87
+
88
+ </TabItem>
89
+ <TabItem value="Text">
90
+
91
+ ```text
92
+ appDisplayName : ContosoApp
93
+ dataType : String
94
+ deletedDateTime : null
95
+ id : 8133c498-ad76-4a7b-90a0-675bf5adf492
96
+ isMultiValued : true
97
+ isSyncedFromOnPremises: false
98
+ name : extension_66eac1c505384aec9e024b9e60f5e4b9_jobGroup
99
+ targetObjects : ["User"]
100
+ ```
101
+
102
+ </TabItem>
103
+ <TabItem value="CSV">
104
+
105
+ ```csv
106
+ id,deletedDateTime,appDisplayName,dataType,isMultiValued,isSyncedFromOnPremises,name
107
+ 8133c498-ad76-4a7b-90a0-675bf5adf492,,ContosoApp,String,1,0,extension_66eac1c505384aec9e024b9e60f5e4b9_jobGroup
108
+ ```
109
+
110
+ </TabItem>
111
+ <TabItem value="Markdown">
112
+
113
+ ```md
114
+ # graph directoryextension list --debug "false" --verbose "false" --appId "66eac1c5-0538-4aec-9e02-4b9e60f5e4b9"
115
+
116
+ Date: 3/23/2025
117
+
118
+ ## extension_66eac1c505384aec9e024b9e60f5e4b9_jobGroup (8133c498-ad76-4a7b-90a0-675bf5adf492)
119
+
120
+ Property | Value
121
+ ---------|-------
122
+ id | 8133c498-ad76-4a7b-90a0-675bf5adf492
123
+ appDisplayName | ContosoApp
124
+ dataType | String
125
+ isMultiValued | true
126
+ isSyncedFromOnPremises | false
127
+ name | extension\_66eac1c505384aec9e024b9e60f5e4b9\_jobGroup
128
+ ```
129
+
130
+ </TabItem>
131
+ </Tabs>
132
+
133
+ ## More information
134
+
135
+ - Directory extensions: https://learn.microsoft.com/graph/extensibility-overview#directory-microsoft-entra-id-extensions
@@ -0,0 +1,97 @@
1
+ import Global from '/docs/cmd/_global.mdx';
2
+ import Tabs from '@theme/Tabs';
3
+ import TabItem from '@theme/TabItem';
4
+
5
+ # graph openextension set
6
+
7
+ Updates an open extension for a resource
8
+
9
+ ## Usage
10
+
11
+ ```sh
12
+ m365 graph openextension set [options]
13
+ ```
14
+
15
+ ## Options
16
+
17
+ ```md definition-list
18
+ `-n, --name <name>`
19
+ : The name of the open extension.
20
+
21
+ `-i, --resourceId <resourceId>`
22
+ : The Id of the resource for which to update the open extension.
23
+
24
+ `-t, --resourceType <resourceType>`
25
+ : The type of resource. Allowed values are `user`, `group`, `device`, `organization`.
26
+
27
+ `-k, --keepUnchangedProperties`
28
+ : Keeps unspecified properties. Without this flag, any property that is not updated will be removed from the extension.
29
+ ```
30
+
31
+ <Global />
32
+
33
+ ## Remarks
34
+
35
+ This command allows using unknown options to update custom data of the open extension.
36
+
37
+ When updating an open extension to a user, it's possible to use the UPN as the resourceId.
38
+
39
+ :::warning[Escaping JSON in PowerShell]
40
+
41
+ When updating open extensions it's possible to enter a JSON string. In PowerShell 5 to 7.2 [specific escaping rules](./../../../user-guide/using-cli.mdx#escaping-double-quotes-in-powershell) apply due to an issue. Remember that you can also use [file tokens](./../../../user-guide/using-cli.mdx#passing-complex-content-into-cli-options) instead.
42
+
43
+ :::
44
+
45
+ :::info
46
+
47
+ If a property of the open extension is not specified, the property is removed from the open extension.
48
+
49
+ If a property of the open extension is not specified and `keepUnchangedProperties` is specified, the property will be kept in the open extension.
50
+
51
+ :::
52
+
53
+ ## Examples
54
+
55
+ Updates an open extension for a user specified by id
56
+
57
+ ```sh
58
+ m365 graph openextension set --userId eb77fbcf-6fe8-458b-985d-1747284793bc --name 'com.contoso.roamingSettings' --resourceType user --theme dark --color red --language English
59
+ ```
60
+
61
+ Updates an open extension for a user specified by UPN
62
+
63
+ ```sh
64
+ m365 graph openextension set --userName john.doe@contoso.com --name 'com.contoso.roamingSettings' --resourceType user --theme dark --color red --language English
65
+ ```
66
+
67
+ Updates an open extension for a group specified by id, one of the property represents a JSON object
68
+
69
+ ```sh
70
+ m365 graph openextension set --resourceId c956e711-f074-40c3-8431-fbd69bb67d9c --name 'com.contoso.roamingSettings' --resourceType group --settings '{"theme": "dark", "color": "red" }'
71
+ ```
72
+
73
+ Updates an open extension, but keeps the properties that are not specified
74
+
75
+ ```sh
76
+ m365 graph openextension set --userId eb77fbcf-6fe8-458b-985d-1747284793bc --name 'com.contoso.roamingSettings' --resourceType user --color red --keepUnchangedProperties
77
+ ```
78
+
79
+ Updates an open extension, but removes the properties that are not specified
80
+
81
+ ```sh
82
+ m365 graph openextension set --userId eb77fbcf-6fe8-458b-985d-1747284793bc --name 'com.contoso.roamingSettings' --resourceType user --color red
83
+ ```
84
+
85
+ Clears the value of the property
86
+
87
+ ```sh
88
+ m365 graph openextension set --userId eb77fbcf-6fe8-458b-985d-1747284793bc --name 'com.contoso.roamingSettings' --resourceType user --theme ""
89
+ ```
90
+
91
+ ## Response
92
+
93
+ The command won't return a response on success.
94
+
95
+ ## More information
96
+
97
+ - Open extensions: https://learn.microsoft.com/graph/extensibility-overview?tabs=http#open-extensions
@@ -1,6 +1,4 @@
1
1
  import Global from '/docs/cmd/_global.mdx';
2
- import Tabs from '@theme/Tabs';
3
- import TabItem from '@theme/TabItem';
4
2
 
5
3
  # spe container activate
6
4