11function Set-CIPPSPOTenant {
22 <#
33 . SYNOPSIS
4- Set SharePoint Tenant properties
4+ Set SharePoint Tenant properties or invoke methods
55
66 . DESCRIPTION
7- Set SharePoint Tenant properties via SPO API
7+ Set SharePoint Tenant properties via SPO CSOM API, or invoke a CSOM method on the Tenant object.
88
99 . PARAMETER TenantFilter
1010 Tenant to apply settings to
@@ -13,7 +13,14 @@ function Set-CIPPSPOTenant {
1313 Tenant Identity (Get from Get-CIPPSPOTenant)
1414
1515 . PARAMETER Properties
16- Hashtable of tenant properties to change
16+ Hashtable of tenant properties to change (uses SetProperty actions)
17+
18+ . PARAMETER MethodName
19+ Name of the CSOM method to invoke on the Tenant object
20+
21+ . PARAMETER MethodParameters
22+ Ordered array of parameter hashtables for the method call. Each entry must have 'Type' and 'Value' keys.
23+ Supported types: Boolean, String, Int32, Int64.
1724
1825 . PARAMETER SharepointPrefix
1926 Prefix for the sharepoint tenant
@@ -24,20 +31,35 @@ function Set-CIPPSPOTenant {
2431 }
2532 Get-CippSPOTenant -TenantFilter 'contoso.onmicrosoft.com' | Set-CIPPSPOTenant -Properties $Properties
2633
34+ . EXAMPLE
35+ $MethodParams = @(
36+ @{ Type = 'Boolean'; Value = $false }
37+ @{ Type = 'Int32'; Value = 50 }
38+ @{ Type = 'Int32'; Value = 365 }
39+ )
40+ Get-CIPPSPOTenant -TenantFilter 'contoso.onmicrosoft.com' | Set-CIPPSPOTenant -MethodName 'SetFileVersionPolicy' -MethodParameters $MethodParams
41+
2742 . FUNCTIONALITY
2843 Internal
2944
3045 #>
31- [CmdletBinding (SupportsShouldProcess = $true )]
46+ [CmdletBinding (SupportsShouldProcess = $true , DefaultParameterSetName = ' Properties ' )]
3247 param (
33- [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true )]
48+ [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true , ParameterSetName = ' Properties' )]
49+ [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true , ParameterSetName = ' Method' )]
3450 [string ]$TenantFilter ,
35- [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true )]
51+ [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true , ParameterSetName = ' Properties' )]
52+ [Parameter (ValueFromPipelineByPropertyName = $true , Mandatory = $true , ParameterSetName = ' Method' )]
3653 [Alias (' _ObjectIdentity_' )]
3754 [string ]$Identity ,
38- [Parameter (Mandatory = $true )]
55+ [Parameter (Mandatory = $true , ParameterSetName = ' Properties ' )]
3956 [hashtable ]$Properties ,
40- [Parameter (ValueFromPipelineByPropertyName = $true )]
57+ [Parameter (Mandatory = $true , ParameterSetName = ' Method' )]
58+ [string ]$MethodName ,
59+ [Parameter (Mandatory = $true , ParameterSetName = ' Method' )]
60+ [array ]$MethodParameters ,
61+ [Parameter (ValueFromPipelineByPropertyName = $true , ParameterSetName = ' Properties' )]
62+ [Parameter (ValueFromPipelineByPropertyName = $true , ParameterSetName = ' Method' )]
4163 [string ]$SharepointPrefix
4264 )
4365
@@ -51,42 +73,56 @@ function Set-CIPPSPOTenant {
5173 $AdminUrl = " https://$ ( $tenantName ) -admin.sharepoint.com"
5274 }
5375 $Identity = $Identity -replace " `n " , ' 
'
54- $AllowedTypes = @ (' Boolean' , ' String' , ' Int32' )
55- $SetProperty = [System.Collections.Generic.List [string ]]::new()
56- $x = 114
57- foreach ($Property in $Properties.Keys ) {
58- # Get property type
59- $PropertyType = $Properties [$Property ].GetType().Name
60- if ($PropertyType -in $AllowedTypes ) {
61- if ($PropertyType -eq ' Boolean' ) {
62- $PropertyToSet = $Properties [$Property ].ToString().ToLower()
63- } else {
64- $PropertyToSet = $Properties [$Property ]
65- }
66- $xml = @"
76+
77+ if ($PSCmdlet.ParameterSetName -eq ' Properties' ) {
78+ $AllowedTypes = @ (' Boolean' , ' String' , ' Int32' )
79+ $SetProperty = [System.Collections.Generic.List [string ]]::new()
80+ $x = 114
81+ foreach ($Property in $Properties.Keys ) {
82+ # Get property type
83+ $PropertyType = $Properties [$Property ].GetType().Name
84+ if ($PropertyType -in $AllowedTypes ) {
85+ if ($PropertyType -eq ' Boolean' ) {
86+ $PropertyToSet = $Properties [$Property ].ToString().ToLower()
87+ } else {
88+ $PropertyToSet = $Properties [$Property ]
89+ }
90+ $xml = @"
6791 <SetProperty Id="$x " ObjectPathId="110" Name="$Property ">
6892 <Parameter Type="$PropertyType ">$ ( $PropertyToSet ) </Parameter>
6993 </SetProperty>
7094"@
71- $SetProperty.Add ($xml )
72- $x ++
95+ $SetProperty.Add ($xml )
96+ $x ++
97+ }
98+ }
99+
100+ if (($SetProperty | Measure-Object ).Count -eq 0 ) {
101+ Write-Error ' No valid properties found'
102+ return
73103 }
74- }
75104
76- if (($SetProperty | Measure-Object ).Count -eq 0 ) {
77- Write-Error ' No valid properties found'
78- return
105+ $ActionsXml = $SetProperty -join ' '
106+ $Description = $Properties.Keys -join ' , '
107+ } else {
108+ # Method call
109+ $Params = foreach ($Param in $MethodParameters ) {
110+ $ParamValue = if ($Param.Type -eq ' Boolean' ) { $Param.Value.ToString ().ToLower() } else { $Param.Value }
111+ " <Parameter Type=`" $ ( $Param.Type ) `" >$ParamValue </Parameter>"
112+ }
113+ $ActionsXml = " <Method Name=`" $MethodName `" Id=`" 114`" ObjectPathId=`" 110`" ><Parameters>$ ( $Params -join ' ' ) </Parameters></Method>"
114+ $Description = $MethodName
79115 }
80116
81- # Query tenant settings
117+ # Build CSOM request
82118 $XML = @"
83- <Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="SharePoint Online PowerShell (16.0.24908.0)" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions>$ ( $SetProperty -join ' ' ) </Actions><ObjectPaths><Identity Id="110" Name="$Identity " /></ObjectPaths></Request>
119+ <Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName="SharePoint Online PowerShell (16.0.24908.0)" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009"><Actions>$ActionsXml </Actions><ObjectPaths><Identity Id="110" Name="$Identity " /></ObjectPaths></Request>
84120"@
85121 $AdditionalHeaders = @ {
86122 ' Accept' = ' application/json;odata=verbose'
87123 }
88124
89- if ($PSCmdlet.ShouldProcess (( $Properties .Keys -join ' , ' ) , ' Set Tenant Properties' )) {
125+ if ($PSCmdlet.ShouldProcess ($Description , ' Set Tenant Properties' )) {
90126 New-GraphPostRequest - scope " $AdminURL /.default" - tenantid $TenantFilter - Uri " $AdminURL /_vti_bin/client.svc/ProcessQuery" - Type POST - Body $XML - ContentType ' text/xml' - AddedHeaders $AdditionalHeaders
91127
92128 # Invalidate cached tenant data so subsequent reads reflect the change
0 commit comments