Here we have 2 PowerShell scripts to Enable-Disable a feature using CSOM
Enable Feature
1 |
<span id="lnum1" style="color: #606060"> 1:</span> ########################################################################################## |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> # Name: Enable-SPOFeature |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> # Description: This script enables a feature <span style="color: #0000ff">using</span> CSOM |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> # Usage: .Enable-SPOFeature -User <span style="color: #006080">"name@server.onmicrosoft.com"</span> -Password <span style="color: #006080">"Password"</span> -Url <span style="color: #006080">"https://sposite.sharepoint.com/"</span> -Feature <span style="color: #006080">"4aec7207-0d02-4f4f-aa07-b370199cd0c7"</span> -Scope Site -Sandbox $<span style="color: #0000ff">true</span> -Force $<span style="color: #0000ff">true</span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> # Creator: Luis Manez |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> ########################################################################################## |
1 |
<span id="lnum7" style="color: #606060"> 7:</span>  |
1 |
<span id="lnum8" style="color: #606060"> 8:</span> param([<span style="color: #0000ff">string</span>]$user, [<span style="color: #0000ff">string</span>]$password, [<span style="color: #0000ff">string</span>]$url, [<span style="color: #0000ff">string</span>]$feature, [ValidateSet(<span style="color: #006080">"Site"</span>,<span style="color: #006080">"Web"</span>)][<span style="color: #0000ff">string</span>]$scope, [<span style="color: #0000ff">bool</span>]$sandbox, [<span style="color: #0000ff">bool</span>]$force) |
1 |
<span id="lnum9" style="color: #606060"> 9:</span>  |
1 |
<span id="lnum10" style="color: #606060"> 10:</span> Add-Type -Path <span style="color: #006080">"c:Program FilesCommon Filesmicrosoft sharedWeb Server Extensions15ISAPIMicrosoft.SharePoint.Client.dll"</span> |
1 |
<span id="lnum11" style="color: #606060"> 11:</span>  |
1 |
<span id="lnum12" style="color: #606060"> 12:</span> <span style="color: #0000ff">if</span> ($user -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum13" style="color: #606060"> 13:</span> Write-Host <span style="color: #006080">"User parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum14" style="color: #606060"> 14:</span> exit 1; |
1 |
<span id="lnum15" style="color: #606060"> 15:</span> } |
1 |
<span id="lnum16" style="color: #606060"> 16:</span> <span style="color: #0000ff">if</span> ($password -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum17" style="color: #606060"> 17:</span> Write-Host <span style="color: #006080">"Password parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum18" style="color: #606060"> 18:</span> exit 1; |
1 |
<span id="lnum19" style="color: #606060"> 19:</span> } |
1 |
<span id="lnum20" style="color: #606060"> 20:</span> <span style="color: #0000ff">if</span> ($url -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum21" style="color: #606060"> 21:</span> Write-Host <span style="color: #006080">"Url parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum22" style="color: #606060"> 22:</span> exit 1; |
1 |
<span id="lnum23" style="color: #606060"> 23:</span> } |
1 |
<span id="lnum24" style="color: #606060"> 24:</span> <span style="color: #0000ff">if</span> ($feature -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum25" style="color: #606060"> 25:</span> Write-Host <span style="color: #006080">"Feature parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum26" style="color: #606060"> 26:</span> exit 1; |
1 |
<span id="lnum27" style="color: #606060"> 27:</span> } |
1 |
<span id="lnum28" style="color: #606060"> 28:</span> <span style="color: #0000ff">if</span> ($scope -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum29" style="color: #606060"> 29:</span> Write-Host <span style="color: #006080">"Scope parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum30" style="color: #606060"> 30:</span> exit 1; |
1 |
<span id="lnum31" style="color: #606060"> 31:</span> } |
1 |
<span id="lnum32" style="color: #606060"> 32:</span> <span style="color: #0000ff">if</span> ($sandbox -eq $<span style="color: #0000ff">null</span>) { |
1 |
<span id="lnum33" style="color: #606060"> 33:</span> Write-Host <span style="color: #006080">"Sanbox parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum34" style="color: #606060"> 34:</span> exit 1; |
1 |
<span id="lnum35" style="color: #606060"> 35:</span> } |
1 |
<span id="lnum36" style="color: #606060"> 36:</span> <span style="color: #0000ff">if</span> ($force -eq $<span style="color: #0000ff">null</span>) { |
1 |
<span id="lnum37" style="color: #606060"> 37:</span> $force = $<span style="color: #0000ff">false</span>; |
1 |
<span id="lnum38" style="color: #606060"> 38:</span> } |
1 |
<span id="lnum39" style="color: #606060"> 39:</span>  |
1 |
<span id="lnum40" style="color: #606060"> 40:</span> <span style="color: #0000ff">function</span> GetClientContext($url, $user, $password) { |
1 |
<span id="lnum41" style="color: #606060"> 41:</span>  |
1 |
<span id="lnum42" style="color: #606060"> 42:</span> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force |
1 |
<span id="lnum43" style="color: #606060"> 43:</span>  |
1 |
<span id="lnum44" style="color: #606060"> 44:</span> $context = New-Object Microsoft.SharePoint.Client.ClientContext($url) |
1 |
<span id="lnum45" style="color: #606060"> 45:</span> $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $securePassword) |
1 |
<span id="lnum46" style="color: #606060"> 46:</span> $context.Credentials = $credentials |
1 |
<span id="lnum47" style="color: #606060"> 47:</span>  |
1 |
<span id="lnum48" style="color: #606060"> 48:</span> <span style="color: #0000ff">return</span> $context |
1 |
<span id="lnum49" style="color: #606060"> 49:</span> } |
1 |
<span id="lnum50" style="color: #606060"> 50:</span>  |
1 |
<span id="lnum51" style="color: #606060"> 51:</span> # MAIN CODE |
1 |
<span id="lnum52" style="color: #606060"> 52:</span> # |
1 |
<span id="lnum53" style="color: #606060"> 53:</span>  |
1 |
<span id="lnum54" style="color: #606060"> 54:</span> $featureId = [GUID]($feature) |
1 |
<span id="lnum55" style="color: #606060"> 55:</span> $clientContext = GetClientContext $url $user $password |
1 |
<span id="lnum56" style="color: #606060"> 56:</span> write-host <span style="color: #006080">"Conected to SharePoint OK"</span> |
1 |
<span id="lnum57" style="color: #606060"> 57:</span>  |
1 |
<span id="lnum58" style="color: #606060"> 58:</span> <span style="color: #0000ff">if</span> ($scope.ToLower() -eq <span style="color: #006080">"web"</span>) { |
1 |
<span id="lnum59" style="color: #606060"> 59:</span> $features = $clientContext.Web.Features |
1 |
<span id="lnum60" style="color: #606060"> 60:</span> } |
1 |
<span id="lnum61" style="color: #606060"> 61:</span> <span style="color: #0000ff">else</span> { |
1 |
<span id="lnum62" style="color: #606060"> 62:</span> $features = $clientContext.Site.Features |
1 |
<span id="lnum63" style="color: #606060"> 63:</span> } |
1 |
<span id="lnum64" style="color: #606060"> 64:</span>  |
1 |
<span id="lnum65" style="color: #606060"> 65:</span> $featureDefinitionScope = [Microsoft.SharePoint.Client.FeatureDefinitionScope]::Farm |
1 |
<span id="lnum66" style="color: #606060"> 66:</span> <span style="color: #0000ff">if</span> ($sandbox) { |
1 |
<span id="lnum67" style="color: #606060"> 67:</span> $featureDefinitionScope = [Microsoft.SharePoint.Client.FeatureDefinitionScope]::Site |
1 |
<span id="lnum68" style="color: #606060"> 68:</span> } |
1 |
<span id="lnum69" style="color: #606060"> 69:</span>  |
1 |
<span id="lnum70" style="color: #606060"> 70:</span> $clientContext.Load($features) |
1 |
<span id="lnum71" style="color: #606060"> 71:</span> $clientContext.ExecuteQuery() |
1 |
<span id="lnum72" style="color: #606060"> 72:</span>  |
1 |
<span id="lnum73" style="color: #606060"> 73:</span>  |
1 |
<span id="lnum74" style="color: #606060"> 74:</span> $features.Add($featureId, $force, $featureDefinitionScope) |
1 |
<span id="lnum75" style="color: #606060"> 75:</span> <span style="color: #0000ff">try</span> { |
1 |
<span id="lnum76" style="color: #606060"> 76:</span> $clientContext.ExecuteQuery() |
1 |
<span id="lnum77" style="color: #606060"> 77:</span> write-host <span style="color: #006080">"Feature activated"</span> |
1 |
<span id="lnum78" style="color: #606060"> 78:</span> } |
1 |
<span id="lnum79" style="color: #606060"> 79:</span> <span style="color: #0000ff">catch</span> { |
1 |
<span id="lnum80" style="color: #606060"> 80:</span> write-host <span style="color: #006080">"An error ocurred activating Feature. Error detail: $($_)"</span> |
1 |
<span id="lnum81" style="color: #606060"> 81:</span> } |
- User: user in the Office 365 tenant
- Password: user password
- Url: Full URL to the site or web
- Scope: Site / Web. Scope of the feature that we want to activate.
- Feature: Feature Id.
- Force: Re-enable feature if is already activated
- Sandbox: true/false. Basically this param indicates if the solution where the feature lives, is a Farm solution, or a Sandbox solution.
About the Sandbox param. This is a little confuse if we take a look to the MSDN documentation
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.client.featurecollection.add.aspx
If we look at the FeatureDefinitionScope enum, we have:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">enum</span> FeatureDefinitionScope |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> { |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> None, |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> Farm, |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> Site, |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> Web |
1 |
<span id="lnum7" style="color: #606060"> 7:</span> } |
However, the documentation in the Add method says that you can only use 2 values: Farm and Site. This param can make you be wrong, because you can think that is the Scope of the feature, so, if you want to activate a Web scope feature, you’d try with the Web value in the enum type. However, this param indicates the scope of the Solution that contains the feature: Farm or Sandbox solution, so, the possible values are only Farm and Site.
Microsoft, Why are you using an Enum with 4 values in a function that only accept 2 possible values from the Enum ??? OK… that’s another question…
Let’s see now how we can use the same approach to Disable a Feature.
Disable Feature
1 |
<span id="lnum1" style="color: #606060"> 1:</span> ########################################################################################## |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> # Name: Disable-SPOFeature |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> # Description: This script disables a feature <span style="color: #0000ff">using</span> CSOM |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> # Usage: .Disable-SPOFeature -User <span style="color: #006080">"name@server.onmicrosoft.com"</span> -Password <span style="color: #006080">"Password"</span> -Url <span style="color: #006080">"https://sposite.sharepoint.com/"</span> -Feature <span style="color: #006080">"4aec7207-0d02-4f4f-aa07-b370199cd0c7"</span> -Scope Site |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> # Creator: Luis Manez |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> ########################################################################################## |
1 |
<span id="lnum7" style="color: #606060"> 7:</span>  |
1 |
<span id="lnum8" style="color: #606060"> 8:</span> param([<span style="color: #0000ff">string</span>]$user, [<span style="color: #0000ff">string</span>]$password, [<span style="color: #0000ff">string</span>]$url, [<span style="color: #0000ff">string</span>]$feature, [ValidateSet(<span style="color: #006080">"Site"</span>,<span style="color: #006080">"Web"</span>)][<span style="color: #0000ff">string</span>]$scope) |
1 |
<span id="lnum9" style="color: #606060"> 9:</span>  |
1 |
<span id="lnum10" style="color: #606060"> 10:</span> Add-Type -Path <span style="color: #006080">"c:Program FilesCommon Filesmicrosoft sharedWeb Server Extensions15ISAPIMicrosoft.SharePoint.Client.dll"</span> |
1 |
<span id="lnum11" style="color: #606060"> 11:</span>  |
1 |
<span id="lnum12" style="color: #606060"> 12:</span> <span style="color: #0000ff">if</span> ($user -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum13" style="color: #606060"> 13:</span> Write-Host <span style="color: #006080">"User parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum14" style="color: #606060"> 14:</span> exit 1; |
1 |
<span id="lnum15" style="color: #606060"> 15:</span> } |
1 |
<span id="lnum16" style="color: #606060"> 16:</span> <span style="color: #0000ff">if</span> ($password -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum17" style="color: #606060"> 17:</span> Write-Host <span style="color: #006080">"Password parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum18" style="color: #606060"> 18:</span> exit 1; |
1 |
<span id="lnum19" style="color: #606060"> 19:</span> } |
1 |
<span id="lnum20" style="color: #606060"> 20:</span> <span style="color: #0000ff">if</span> ($url -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum21" style="color: #606060"> 21:</span> Write-Host <span style="color: #006080">"Url parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum22" style="color: #606060"> 22:</span> exit 1; |
1 |
<span id="lnum23" style="color: #606060"> 23:</span> } |
1 |
<span id="lnum24" style="color: #606060"> 24:</span> <span style="color: #0000ff">if</span> ($feature -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum25" style="color: #606060"> 25:</span> Write-Host <span style="color: #006080">"Feature parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum26" style="color: #606060"> 26:</span> exit 1; |
1 |
<span id="lnum27" style="color: #606060"> 27:</span> } |
1 |
<span id="lnum28" style="color: #606060"> 28:</span> <span style="color: #0000ff">if</span> ($scope -eq <span style="color: #006080">""</span>) { |
1 |
<span id="lnum29" style="color: #606060"> 29:</span> Write-Host <span style="color: #006080">"Scope parameter not provided, exiting"</span> -ForegroundColor Red |
1 |
<span id="lnum30" style="color: #606060"> 30:</span> exit 1; |
1 |
<span id="lnum31" style="color: #606060"> 31:</span> } |
1 |
<span id="lnum32" style="color: #606060"> 32:</span>  |
1 |
<span id="lnum33" style="color: #606060"> 33:</span> function GetClientContext($url, $user, $password) { |
1 |
<span id="lnum34" style="color: #606060"> 34:</span>  |
1 |
<span id="lnum35" style="color: #606060"> 35:</span> $securePassword = ConvertTo-SecureString $password -AsPlainText -Force |
1 |
<span id="lnum36" style="color: #606060"> 36:</span>  |
1 |
<span id="lnum37" style="color: #606060"> 37:</span> $context = New-Object Microsoft.SharePoint.Client.ClientContext($url) |
1 |
<span id="lnum38" style="color: #606060"> 38:</span> $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $securePassword) |
1 |
<span id="lnum39" style="color: #606060"> 39:</span> $context.Credentials = $credentials |
1 |
<span id="lnum40" style="color: #606060"> 40:</span>  |
1 |
<span id="lnum41" style="color: #606060"> 41:</span> <span style="color: #0000ff">return</span> $context |
1 |
<span id="lnum42" style="color: #606060"> 42:</span> } |
1 |
<span id="lnum43" style="color: #606060"> 43:</span>  |
1 |
<span id="lnum44" style="color: #606060"> 44:</span> # MAIN CODE |
1 |
<span id="lnum45" style="color: #606060"> 45:</span> # |
1 |
<span id="lnum46" style="color: #606060"> 46:</span>  |
1 |
<span id="lnum47" style="color: #606060"> 47:</span> $featureId = [GUID]($feature) |
1 |
<span id="lnum48" style="color: #606060"> 48:</span> $clientContext = GetClientContext $url $user $password |
1 |
<span id="lnum49" style="color: #606060"> 49:</span> write-host <span style="color: #006080">"Conected to SharePoint OK"</span> |
1 |
<span id="lnum50" style="color: #606060"> 50:</span>  |
1 |
<span id="lnum51" style="color: #606060"> 51:</span> <span style="color: #0000ff">if</span> ($scope.ToLower() -eq <span style="color: #006080">"web"</span>) { |
1 |
<span id="lnum52" style="color: #606060"> 52:</span> $features = $clientContext.Web.Features |
1 |
<span id="lnum53" style="color: #606060"> 53:</span> } |
1 |
<span id="lnum54" style="color: #606060"> 54:</span> <span style="color: #0000ff">else</span> { |
1 |
<span id="lnum55" style="color: #606060"> 55:</span> $features = $clientContext.Site.Features |
1 |
<span id="lnum56" style="color: #606060"> 56:</span> } |
1 |
<span id="lnum57" style="color: #606060"> 57:</span>  |
1 |
<span id="lnum58" style="color: #606060"> 58:</span> $featureDefinitionScope = [Microsoft.SharePoint.Client.FeatureDefinitionScope]::Farm |
1 |
<span id="lnum59" style="color: #606060"> 59:</span> <span style="color: #0000ff">if</span> ($sandbox) { |
1 |
<span id="lnum60" style="color: #606060"> 60:</span> $featureDefinitionScope = [Microsoft.SharePoint.Client.FeatureDefinitionScope]::Site |
1 |
<span id="lnum61" style="color: #606060"> 61:</span> } |
1 |
<span id="lnum62" style="color: #606060"> 62:</span>  |
1 |
<span id="lnum63" style="color: #606060"> 63:</span> $clientContext.Load($features) |
1 |
<span id="lnum64" style="color: #606060"> 64:</span> $clientContext.ExecuteQuery() |
1 |
<span id="lnum65" style="color: #606060"> 65:</span>  |
1 |
<span id="lnum66" style="color: #606060"> 66:</span>  |
1 |
<span id="lnum67" style="color: #606060"> 67:</span> $features.Remove($featureId, $<span style="color: #0000ff">false</span>) |
1 |
<span id="lnum68" style="color: #606060"> 68:</span> <span style="color: #0000ff">try</span> { |
1 |
<span id="lnum69" style="color: #606060"> 69:</span> $clientContext.ExecuteQuery() |
1 |
<span id="lnum70" style="color: #606060"> 70:</span> write-host <span style="color: #006080">"Feature deactivated"</span> |
1 |
<span id="lnum71" style="color: #606060"> 71:</span> } |
1 |
<span id="lnum72" style="color: #606060"> 72:</span> <span style="color: #0000ff">catch</span> { |
1 |
<span id="lnum73" style="color: #606060"> 73:</span> write-host <span style="color: #006080">"An error ocurred deactivating Feature. Error detail: $($_)"</span> |
1 |
<span id="lnum74" style="color: #606060"> 74:</span> } |
That’s all, hope it helps!!
Luis Manez
@luismanez
Deja un comentario