From a959dd9ee3b766723a9bcddf1e1c90106f962b26 Mon Sep 17 00:00:00 2001 From: Todd Klindt Date: Wed, 22 Jul 2020 08:52:36 -0500 Subject: [PATCH 01/37] Update GetListItem.cs examples Replaced alias of % with ForEach-Object. That makes it easier for beginners to understand what's going on. --- Commands/Lists/GetListItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/Lists/GetListItem.cs b/Commands/Lists/GetListItem.cs index c73ba2264..72b4f0aa1 100644 --- a/Commands/Lists/GetListItem.cs +++ b/Commands/Lists/GetListItem.cs @@ -43,7 +43,7 @@ namespace SharePointPnP.PowerShell.Commands.Lists Remarks = "Retrieves all list items from the Tasks list in pages of 1000 items", SortOrder = 7)] [CmdletExample( - Code = "PS:> Get-PnPListItem -List Tasks -PageSize 1000 -ScriptBlock { Param($items) $items.Context.ExecuteQuery() } | % { $_.BreakRoleInheritance($true, $true) }", + Code = "PS:> Get-PnPListItem -List Tasks -PageSize 1000 -ScriptBlock { Param($items) $items.Context.ExecuteQuery() } | ForEach-Object { $_.BreakRoleInheritance($true, $true) }", Remarks = "Retrieves all list items from the Tasks list in pages of 1000 items and breaks permission inheritance on each item", SortOrder = 8)] [CmdletExample( From 6049ba4d7dd728505233dc81c3c5d7e9ae1abef0 Mon Sep 17 00:00:00 2001 From: Paul Bullock Date: Mon, 10 Aug 2020 21:27:08 +0100 Subject: [PATCH 02/37] Added sample for azure automation --- .../Deploy-AzureAppOnly.ps1 | 96 ++++++++ .../Deploy-AzureAutomation.ps1 | 191 +++++++++++++++ .../Deploy-FullAutomation.ps1 | 225 ++++++++++++++++++ Samples/Connect.AzureAutomation/Readme.md | 93 ++++++++ .../test-connection-runbook.ps1 | 68 ++++++ 5 files changed, 673 insertions(+) create mode 100644 Samples/Connect.AzureAutomation/Deploy-AzureAppOnly.ps1 create mode 100644 Samples/Connect.AzureAutomation/Deploy-AzureAutomation.ps1 create mode 100644 Samples/Connect.AzureAutomation/Deploy-FullAutomation.ps1 create mode 100644 Samples/Connect.AzureAutomation/Readme.md create mode 100644 Samples/Connect.AzureAutomation/test-connection-runbook.ps1 diff --git a/Samples/Connect.AzureAutomation/Deploy-AzureAppOnly.ps1 b/Samples/Connect.AzureAutomation/Deploy-AzureAppOnly.ps1 new file mode 100644 index 000000000..ef82ee69a --- /dev/null +++ b/Samples/Connect.AzureAutomation/Deploy-AzureAppOnly.ps1 @@ -0,0 +1,96 @@ +<# +---------------------------------------------------------------------------- + +Deploys resources to Azure Automation, Installs PnP PowerShell, Creates an Azure AD App + +Created: Paul Bullock +Date: 10/08/2020 +Disclaimer: + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +.Synopsis + +.Example + +.Notes + + Default App Scopes: Sites.FullControl.All, Group.ReadWrite.All, User.Read.All + + References: + https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/initialize-pnppowershellauthentication?view=sharepoint-ps + https://docs.microsoft.com/en-us/powershell/module/az.automation/New-AzAutomationCredential?view=azps-4.4.0 + + ---------------------------------------------------------------------------- +#> + +[CmdletBinding()] +param ( + [Parameter(Mandatory = $true)] + [string] $Tenant, #yourtenant.onmicrosoft.com + + [Parameter(Mandatory = $true)] + [string] $SPTenant, # https://[thispart].sharepoint.com + + [Parameter(Mandatory = $false)] + [string] $AppName = "PnP-PowerShell Automation", + + [Parameter(Mandatory = $true)] + [string] $CertificatePassword, # <-- Use a nice a super complex password + + [Parameter(Mandatory = $false)] + [int] $ValidForYears = 2, + + [Parameter(Mandatory = $false)] + [string] $CertCommonName = "PnP-PowerShell Automation" +) +begin{ + + + Write-Host "Let's get started..." + + # Get the location of the script to copy the script locally + $location = Get-Location + + if(!$CertificatePassword){ + Write-Host " - Password generated for you..." + $CertificatePassword = [System.Guid]::NewGuid() + } + + if(!$CertCommonName){ + $CertCommonName = "pnp.$($Tenant)" + } + + # This cna be a one-time setup - no one needs to know the password, it can be easily replaced + # in the App and Automation Service if required + $securePassword = (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force) + +} +process { + + # ---------------------------------------------------------------------------------- + # Azure - Create Azure App and Certificate + # ---------------------------------------------------------------------------------- + Write-Host " - Registering AD app and creating certificate..." -ForegroundColor Cyan + + Initialize-PnPPowerShellAuthentication -ApplicationName $AppName -Tenant $Tenant -OutPath $location ` + -CertificatePassword $securePassword -ValidYears $ValidForYears ` + -CommonName $CertCommonName + + # Example Output: + # Pfx file : C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.pfx + # Cer file : C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.cer + # AzureAppId : c5beca65-0000-1111-2222-8a02cbbf4c4d + # Certificate Thumbprint : 78D0F76D900000C8B9F77E64903B6D7AEF55D233 + +} +end{ + + Write-Host "Script all done, enjoy! :)" -ForegroundColor Green +} \ No newline at end of file diff --git a/Samples/Connect.AzureAutomation/Deploy-AzureAutomation.ps1 b/Samples/Connect.AzureAutomation/Deploy-AzureAutomation.ps1 new file mode 100644 index 000000000..0cb3c2f9d --- /dev/null +++ b/Samples/Connect.AzureAutomation/Deploy-AzureAutomation.ps1 @@ -0,0 +1,191 @@ +<# +---------------------------------------------------------------------------- + +Deploys resources to Azure Automation, Installs PnP PowerShell, Creates an Azure AD App + +Created: Paul Bullock +Date: 10/08/2020 +Disclaimer: + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +.Notes + + Default App Scopes: Sites.FullControl.All, Group.ReadWrite.All, User.Read.All + + References: + https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/initialize-pnppowershellauthentication?view=sharepoint-ps + https://docs.microsoft.com/en-us/powershell/module/az.automation/New-AzAutomationCredential?view=azps-4.4.0 + + Due credit to sources, some learnings in the script came from: + https://github.com/OfficeDev/microsoft-teams-apps-requestateam + + ---------------------------------------------------------------------------- +#> + +[CmdletBinding()] +param ( + [Parameter(Mandatory = $true)] + [string] $Tenant, #yourtenant.onmicrosoft.com + + [Parameter(Mandatory = $true)] + [string] $SPTenant, # https://[thispart].sharepoint.com + + [Parameter(Mandatory = $true)] + [string] $CertificatePassword, # <-- Use a nice a super complex password + + [Parameter(Mandatory = $true)] + [string] $AzureAppId, + + [Parameter(Mandatory = $true)] + [string] $CertificatePath, # e.g. "C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.pfx" + + [Parameter(Mandatory = $false)] + [string] $AzureResourceGroupName = "pnp-powershell-automation-rg", + + [Parameter(Mandatory = $false)] + [string] $AzureRegion = "northeurope", + + [Parameter(Mandatory = $false)] + [string] $AzureAutomationName = "pnp-powershell-auto", + + [Parameter(Mandatory = $false)] + [switch] $CreateResourceGroup +) +begin{ + + + Write-Host "Let's get started..." + + # This cna be a one-time setup - no one needs to know the password, it can be easily replaced + # in the App and Automation Service if required + $securePassword = (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force) + +} +process { + + # ---------------------------------------------------------------------------------- + # Azure - Connect to Azure + # ---------------------------------------------------------------------------------- + Write-Host " - Connecting to Azure..." -ForegroundColor Cyan + Connect-AzAccount + + # ---------------------------------------------------------------------------------- + # Azure - Resource Group + # ---------------------------------------------------------------------------------- + + # Check if the Resource Group exists + if($CreateResourceGroup){ + Write-Host " - Creating Resource Group..." -ForegroundColor Cyan + New-AzResourceGroup -Name $AzureResourceGroupName -Location $AzureRegion + } + + + # ---------------------------------------------------------------------------------- + # Azure Automation - Creation + # ---------------------------------------------------------------------------------- + + # Validate this does not already exist + $existingAzAutomation = Get-AzAutomationAccount | Where-Object AutomationAccountName -eq $AzureAutomationName + if ($null -ne $existingAzAutomation) { + Write-Error " - Automation account already exists...aborting deployment script" # Stop the script, already exists + return #End the Script + } + + Write-Host " - Creating Azure Automation Account..." -ForegroundColor Cyan + + # Note: Not all regions support Azure Automation - check here for your region: + # https://azure.microsoft.com/en-us/global-infrastructure/services/?products=automation®ions=all + New-AzAutomationAccount ` + -Name $AzureAutomationName ` + -Location $AzureRegion ` + -ResourceGroupName $AzureResourceGroupName + + # ---------------------------------------------------------------------------------- + # Azure Automation - Add Modules + # ---------------------------------------------------------------------------------- + + # Add PnP Modules - July 2020 Onwards + New-AzAutomationModule ` + -AutomationAccountName $AzureAutomationName ` + -Name "SharePointPnPPowerShellOnline" ` + -ContentLink "https://devopsgallerystorage.blob.core.windows.net/packages/sharepointpnppowershellonline.3.23.2007.1.nupkg" ` + -ResourceGroupName $AzureResourceGroupName + + + # ---------------------------------------------------------------------------------- + # Azure Automation - Create variables + # ---------------------------------------------------------------------------------- + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "AppClientId" ` + -Encrypted $False ` + -Value $AzureAppId ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "AppAdTenant" ` + -Encrypted $true ` + -Value $Tenant ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "App365Tenant" ` + -Encrypted $true ` + -Value $SPTenant ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationCertificate ` + -Name "AzureAppCertificate" ` + -Description "Certificate for PnP PowerShell automation" ` + -Password $securePassword ` + -Path $CertificatePath ` + -Exportable ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName + + # In this example, we do not use the UserName part + $User = "IAamNotUsed" + $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $securePassword + New-AzAutomationCredential ` + -Name "AzureAppCertPassword" ` + -Description "Contains the password for the certificate" ` + -Value $Credential ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName ` + + # Add Azure Runbook + Write-Host " - Importing and publishing example runbook..." -ForegroundColor Cyan + + # Import automation runbooks + $exampleRunbookName = "test-connection-runbook" + + # Add the example runbook into Azure Automation + Import-AzAutomationRunbook ` + -Name $exampleRunbookName ` + -Path "./$($exampleRunbookName).ps1" ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName ` + -Type PowerShell + + # Publish runbooks + Publish-AzAutomationRunbook ` + -Name $exampleRunbookName ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName + + Write-Host "Finished adding example runbook" -ForegroundColor Green + +} +end{ + + Write-Host "Script all done, enjoy! :)" -ForegroundColor Green +} \ No newline at end of file diff --git a/Samples/Connect.AzureAutomation/Deploy-FullAutomation.ps1 b/Samples/Connect.AzureAutomation/Deploy-FullAutomation.ps1 new file mode 100644 index 000000000..87149fb9c --- /dev/null +++ b/Samples/Connect.AzureAutomation/Deploy-FullAutomation.ps1 @@ -0,0 +1,225 @@ +<# +---------------------------------------------------------------------------- + +Deploys resources to Azure Automation, Installs PnP PowerShell, Creates an Azure AD App + +Created: Paul Bullock +Date: 10/08/2020 +Disclaimer: + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +.Notes + + Default App Scopes: Sites.FullControl.All, Group.ReadWrite.All, User.Read.All + + References: + https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/initialize-pnppowershellauthentication?view=sharepoint-ps + https://docs.microsoft.com/en-us/powershell/module/az.automation/New-AzAutomationCredential?view=azps-4.4.0 + + Due credit to sources, some learnings in the script came from: + https://github.com/OfficeDev/microsoft-teams-apps-requestateam + + ---------------------------------------------------------------------------- +#> + + + +[CmdletBinding()] +param ( + [Parameter(Mandatory = $true)] + [string] $Tenant, #yourtenant.onmicrosoft.com + + [Parameter(Mandatory = $true)] + [string] $SPTenant, # https://[thispart].sharepoint.com + + [Parameter(Mandatory = $false)] + [string] $AppName = "PnP-PowerShell Automation", + + [Parameter(Mandatory = $true)] + [string] $CertificatePassword, # <-- Use a nice a super complex password + + [Parameter(Mandatory = $false)] + [int] $ValidForYears = 2, + + [Parameter(Mandatory = $false)] + [string] $CertCommonName = "PnP-PowerShell Automation", + + [Parameter(Mandatory = $false)] + [string] $AzureResourceGroupName = "pnp-powershell-automation-rg", + + [Parameter(Mandatory = $false)] + [string] $AzureRegion = "northeurope", + + [Parameter(Mandatory = $false)] + [string] $AzureAutomationName = "pnp-powershell-auto", + + [Parameter(Mandatory = $false)] + [switch] $CreateResourceGroup +) +begin{ + + + Write-Host "Let's get started..." + + # Get the location of the script to copy the script locally + $location = Get-Location + + if(!$CertificatePassword){ + Write-Host " - Password generated for you..." + $CertificatePassword = [System.Guid]::NewGuid() + } + + if(!$CertCommonName){ + $CertCommonName = "pnp.$($Tenant)" + } + + # This cna be a one-time setup - no one needs to know the password, it can be easily replaced + # in the App and Automation Service if required + $securePassword = (ConvertTo-SecureString -String $CertificatePassword -AsPlainText -Force) + +} +process { + + # ---------------------------------------------------------------------------------- + # Azure - Create Azure App and Certificate + # ---------------------------------------------------------------------------------- + Write-Host " - Registering AD app and creating certificate..." -ForegroundColor Cyan + + $result = Initialize-PnPPowerShellAuthentication -ApplicationName $AppName -Tenant $Tenant -OutPath $location ` + -CertificatePassword $securePassword -ValidYears $ValidForYears ` + -CommonName $CertCommonName + + + # Pfx file : C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.pfx + # Cer file : C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.cer + # AzureAppId : c5beca65-bb78-414b-bd95-8a02cbbf4c4d + # Certificate Thumbprint : 78D0F76D907FB9C8B9F77E64903B6D7AEF55D233 + + $generatedAppId = $result.AzureAppId + $generatedPfxCertPath = "$($location)\$($CertCommonName).pfx" + + # ---------------------------------------------------------------------------------- + # Azure - Connect to Azure + # ---------------------------------------------------------------------------------- + Write-Host " - Connecting to Azure..." -ForegroundColor Cyan + Connect-AzAccount + + # ---------------------------------------------------------------------------------- + # Azure - Resource Group + # ---------------------------------------------------------------------------------- + + # Check if the Resource Group exists + if($CreateResourceGroup){ + Write-Host " - Creating Resource Group..." -ForegroundColor Cyan + New-AzResourceGroup -Name $AzureResourceGroupName -Location $AzureRegion + } + + # ---------------------------------------------------------------------------------- + # Azure Automation - Creation + # ---------------------------------------------------------------------------------- + + # Validate this does not already exist + $existingAzAutomation = Get-AzAutomationAccount | Where-Object AutomationAccountName -eq $AppName + if ($null -ne $existingAzAutomation) { + Write-Error " - Automation account already exists...aborting deployment script" # Stop the script, already exists + return #End the Script + } + + Write-Host " - Creating Azure Automation Account..." -ForegroundColor Cyan + + # Note: Not all regions support Azure Automation - check here for your region: + # https://azure.microsoft.com/en-us/global-infrastructure/services/?products=automation®ions=all + New-AzAutomationAccount ` + -Name $AzureAutomationName ` + -Location $AzureRegion ` + -ResourceGroupName $AzureResourceGroupName + + # ---------------------------------------------------------------------------------- + # Azure Automation - Add Modules + # ---------------------------------------------------------------------------------- + + # Add PnP Modules - July 2020 Onwards + New-AzAutomationModule ` + -AutomationAccountName $AzureAutomationName ` + -Name "SharePointPnPPowerShellOnline" ` + -ContentLink "https://devopsgallerystorage.blob.core.windows.net/packages/sharepointpnppowershellonline.3.23.2007.1.nupkg" ` + -ResourceGroupName $AzureResourceGroupName + + + # ---------------------------------------------------------------------------------- + # Azure Automation - Create variables + # ---------------------------------------------------------------------------------- + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "AppClientId" ` + -Encrypted $False ` + -Value $generatedAppId ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "AppAdTenant" ` + -Encrypted $true ` + -Value $Tenant ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationVariable ` + -AutomationAccountName $AzureAutomationName ` + -Name "App365Tenant" ` + -Encrypted $true ` + -Value $SPTenant ` + -ResourceGroupName $AzureResourceGroupName + + New-AzAutomationCertificate ` + -Name "AzureAppCertificate" ` + -Description "Certificate for PnP PowerShell automation" ` + -Password $securePassword ` + -Path $generatedPfxCertPath ` + -Exportable ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName + + # In this example, we do not use the UserName part + $User = "IAamNotUsed" + $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $securePassword + New-AzAutomationCredential ` + -Name "AzureAppCertPassword" ` + -Description "Contains the password for the certificate" ` + -Value $Credential ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName ` + + # Add Azure Runbook + Write-Host " - Importing and publishing example runbook..." -ForegroundColor Cyan + + # Import automation runbooks + $exampleRunbookName = "test-connection-runbook" + + # Add the example runbook into Azure Automation + Import-AzAutomationRunbook ` + -Name $exampleRunbookName ` + -Path "./$($exampleRunbookName).ps1" ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName ` + -Type PowerShell + + # Publish runbooks + Publish-AzAutomationRunbook ` + -Name $exampleRunbookName ` + -ResourceGroupName $AzureResourceGroupName ` + -AutomationAccountName $AzureAutomationName + + Write-Host "Finished adding example runbook" -ForegroundColor Green + +} +end{ + + Write-Host "Script all done, enjoy! :)" -ForegroundColor Green +} \ No newline at end of file diff --git a/Samples/Connect.AzureAutomation/Readme.md b/Samples/Connect.AzureAutomation/Readme.md new file mode 100644 index 000000000..34534d970 --- /dev/null +++ b/Samples/Connect.AzureAutomation/Readme.md @@ -0,0 +1,93 @@ +# Connect to the SharePoint Online using Application Permissions + +This PowerShell sample demonstrates how to deploy and use the PnP PowerShell to connect to SharePoint Online +using App-Only within Azure Automation. This is useful for demonstrating connecting to SharePoint Online with App-Only permissions +as well as provisioning Azure Automation with the required modules. + +Applies to + +- Office 365 Multi-Tenant (MT) + +## Prerequisites + +- PnP PowerShell Module (Minimum 3.23.2007.1) +- Azure AD - Global Admin (for app consent) +- Azure PowerShell Module [https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-4.4.0](https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-4.4.0) + +## Scripts + +The following script samples as part of the solution: + +- Deploy-AzureAppOnly.ps1 - this uses the new cmdlet "Initialize-PnPPowerShellAuthentication" to create the certificate and create Azure AD app +- Deploy-AzureAutomation.ps1 - this creates an Azure Automation account, configures the account for hosting credentials, registering the PnP module and publishing a runbook +- Deploy-FullAutomation.ps1 - this is a combination of both above scripts in one run +- test-connection-runbook.ps1 - sample runbook that connects to SharePoint Online with a certificate and example connections to tenant level and site level + +### Note + +Not all regions support Azure Automation - check here for your region: [https://azure.microsoft.com/en-us/global-infrastructure/services/?products=automation®ions=all](https://azure.microsoft.com/en-us/global-infrastructure/services/?products=automation®ions=all) + +## Getting Started + +### Example 1: Creation of an Azure AD App + +```powershell + +./Deploy-AzureAppOnly.ps1 ` + -Tenant "yourtenant.onmicrosoft.com" ` + -SPTenant "yourtenant" ` + -AppName "PnP-PowerShell Automation" ` + -CertificatePassword "" ` + -ValidForYears 2 ` + -CertCommonName "PnP-PowerShell Automation" + +Note: It is recommended to use a better Certificate Password than above, nice and super complex + +``` + +### Example 2: Provisioning Azure Automation with PnP Module, credentials and publishing runbook + +```powershell + +./Deploy-AzureAutomation.ps1 ` + -Tenant "yourtenant.onmicrosoft.com" ` + -SPTenant "yourtenant" ` + -CertificatePassword "" ` + -AzureAppId "b80b83e9-2d52-4aa4-910a-099c296b36d4" ` + -CertificatePath "C:\Git\tfs\Script-Library\Azure\Automation\Deploy\PnP-PowerShell Automation.pfx" ` + -AzureResourceGroupName "pnp-powershell-automation-rg" ` + -AzureRegion "northeurope" ` + -AzureAutomationName "pnp-powershell-auto" ` + -CreateResourceGroup + +``` + +Notes: +- Use a better Certificate Password than above but the same as the one in example 1, nice and super complex +- The CertificatePath is the location where the certificate was stored locally in example 1 + +### Example 3: Combination Script of both Example 1 and 2 + +```powershell + +./Deploy-FullAutomation.ps1 ` + -Tenant "yourtenant.onmicrosoft.com" ` + -SPTenant "yourtenant" ` + -AppName "PnP-PowerShell Automation" ` + -CertificatePassword "" ` + -ValidForYears 2 ` + -CertCommonName "PnP-PowerShell Automation" ` + -AzureResourceGroupName "pnp-powershell-automation-rg" ` + -AzureRegion "northeurope" ` + -AzureAutomationName "pnp-powershell-auto" ` + -CreateResourceGroup +``` + +## Version history ## +Version | Date | Author(s) | Comments +---------| ---- | --------- | ---------| +1.0 | August 10th 2020 | Paul Bullock (CaPa Creative Ltd) | Initial release + + +## **Disclaimer** +THIS CODE IS PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. \ No newline at end of file diff --git a/Samples/Connect.AzureAutomation/test-connection-runbook.ps1 b/Samples/Connect.AzureAutomation/test-connection-runbook.ps1 new file mode 100644 index 000000000..bab028b08 --- /dev/null +++ b/Samples/Connect.AzureAutomation/test-connection-runbook.ps1 @@ -0,0 +1,68 @@ +<# ---------------------------------------------------------------------------- + +Example script connecting to SharePoint Online with a + App Only Certificate in Azure Automation + +Created: Paul Bullock +Date: 10/08/2020 +Disclaimer: + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------------------------------------------------------------------- #> + +[CmdletBinding()] +Param +() + +# Retrieves from the Azure Automation variables and certificate stores +# the details for connecting to SharePoint Online +$azureAutomateCreds = Get-AutomationPSCredential -Name 'AzureAppCertPassword' +$appId = Get-AutomationVariable -Name "AppClientId" +$appAdTenant = Get-AutomationVariable -Name "AppAdTenant" +$app365Tenant = Get-AutomationVariable -Name "App365Tenant" +$appCert = Get-AutomationCertificate -Name "AzureAppCertificate" + +# Addresses for the tenant +$adminUrl = "https://$app365Tenant-admin.sharepoint.com" +$baseSite = "https://$app365Tenant.sharepoint.com" + +# Site Template List + +try { + Write-Verbose "Running Script..." + + # Export the certificate and convert into base 64 string + $base64Cert = [System.Convert]::ToBase64String($appCert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12)) + + # Connect to the standard SharePoint Site + $siteConn = Connect-PnPOnline -ClientId $appId -CertificateBase64Encoded $base64Cert ` + -CertificatePassword $azureAutomateCreds.Password ` + -Url $baseSite -Tenant $appAdTenant -ReturnConnection + + # Connect to the SharePoint Online Admin Service + $adminSiteConn = Connect-PnPOnline -ClientId $appId -CertificateBase64Encoded $base64Cert ` + -CertificatePassword $azureAutomateCreds.Password ` + -Url $adminUrl -Tenant $appAdTenant -ReturnConnection + + # SharePointy Stuff here + Write-Verbose "Connected to SharePoint Online Site" + $web = Get-PnPWeb -Connection $siteConn + $web.Title + + # SharePointy Adminy Stuff here + Write-Verbose "Connected to SharePoint Online Admin Centre" + $tenantSite = Get-PnPTenantSite -Url $baseSite -Connection $adminSiteConn + $tenantSite.Title + +} +catch { + #Script error + Write-Error "An error occurred: $($PSItem.ToString())" +} \ No newline at end of file From 48922b9871b70dfbc72b929bfb7fc94540f0d502 Mon Sep 17 00:00:00 2001 From: Todd Klindt Date: Wed, 19 Aug 2020 09:45:06 -0500 Subject: [PATCH 03/37] Update AddField.cs Added some help text. Added how to create a column based on Managed Metadata. Also added a bit of text that says a field is also called a column, which is what it's called in the UI. --- Commands/Fields/AddField.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/Fields/AddField.cs b/Commands/Fields/AddField.cs index 8eeac7a66..bd85eef3d 100644 --- a/Commands/Fields/AddField.cs +++ b/Commands/Fields/AddField.cs @@ -10,7 +10,7 @@ namespace PnP.PowerShell.Commands.Fields { [Cmdlet(VerbsCommon.Add, "PnPField", DefaultParameterSetName = "Add field to list")] [CmdletHelp("Add a field", - "Adds a field to a list or as a site column", + "Adds a field (a column) to a list or as a site column. To add a column of type Managed Metadata use the Add-PnPTaxonomyField cmdlet", Category = CmdletHelpCategory.Fields, OutputType = typeof(Field), OutputTypeLink = "https://docs.microsoft.com/en-us/previous-versions/office/sharepoint-server/ee545882(v=office.15)", From 3193f1543be7ed23802e5fd77145a0481557b2a6 Mon Sep 17 00:00:00 2001 From: Veronique Lengelle <25181757+veronicageek@users.noreply.github.com> Date: Tue, 25 Aug 2020 17:14:41 +0100 Subject: [PATCH 04/37] Updated examples with *New-* Changed the examples to "New-PnPTeamsTeam" because they were using the "Get-*" --- Commands/Teams/NewTeamsTeam.cs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Commands/Teams/NewTeamsTeam.cs b/Commands/Teams/NewTeamsTeam.cs index 77c3b1092..f2cccd302 100644 --- a/Commands/Teams/NewTeamsTeam.cs +++ b/Commands/Teams/NewTeamsTeam.cs @@ -14,16 +14,12 @@ namespace PnP.PowerShell.Commands.Graph Category = CmdletHelpCategory.Teams, SupportedPlatform = CmdletSupportedPlatform.Online)] [CmdletExample( - Code = "PS:> Get-PnPTeamsTeam", - Remarks = "Retrieves all the Microsoft Teams instances", + Code = "PS:> New-PnPTeamsTeam -DisplayName "myPnPDemo1" -Visibility Private -AllowCreateUpdateRemoveTabs $false -AllowUserDeleteMessages $false", + Remarks = "This will create a new Team called "myPnPDemo1" and sets the privacy to Private, as well as preventing users from deleting their messages or update/remove tabs. The user creating the Team will be added as Owner.", SortOrder = 1)] [CmdletExample( - Code = "PS:> Get-PnPTeamsTeam -GroupId $groupId", - Remarks = "Retrieves a specific Microsoft Teams instance", - SortOrder = 2)] - [CmdletExample( - Code = "PS:> Get-PnPTeamsTeam -Visibility Public", - Remarks = "Retrieves all Microsoft Teams instances which are public visible", + Code = "PS:> New-PnPTeamsTeam -GroupId $groupId", + Remarks = "This will create a new Team from a Microsoft 365 Group using the Group ID", SortOrder = 2)] [CmdletMicrosoftGraphApiPermission(MicrosoftGraphApiPermission.Group_ReadWrite_All)] public class NewTeamsTeam : PnPGraphCmdlet @@ -137,4 +133,4 @@ protected override void ExecuteCmdlet() } } } -#endif \ No newline at end of file +#endif From c18e7f7dc58423162910264d0711b2dbe29e9396 Mon Sep 17 00:00:00 2001 From: Heinrich Ulbricht Date: Wed, 26 Aug 2020 15:57:31 +0200 Subject: [PATCH 05/37] #2587 fixing Configuration parameter not being optional by initializing it with reasonable default value --- .../Provisioning/Tenant/GetTenantTemplate.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Commands/Provisioning/Tenant/GetTenantTemplate.cs b/Commands/Provisioning/Tenant/GetTenantTemplate.cs index 743c1fe7f..c21e3e27e 100644 --- a/Commands/Provisioning/Tenant/GetTenantTemplate.cs +++ b/Commands/Provisioning/Tenant/GetTenantTemplate.cs @@ -51,19 +51,23 @@ public class GetTenantTemplate : PnPAdminCmdlet protected override void ExecuteCmdlet() { - - ExtractConfiguration extractConfiguration = null; + ExtractConfiguration extractConfiguration; if (ParameterSpecified(nameof(Configuration))) { extractConfiguration = Configuration.GetConfiguration(SessionState.Path.CurrentFileSystemLocation.Path); - if(!string.IsNullOrEmpty(SiteUrl)) + } + else + { + extractConfiguration = new ExtractConfiguration(); + } + + if (!string.IsNullOrEmpty(SiteUrl)) + { + if (extractConfiguration.Tenant.Sequence == null) { - if(extractConfiguration.Tenant.Sequence == null) - { - extractConfiguration.Tenant.Sequence = new OfficeDevPnP.Core.Framework.Provisioning.Model.Configuration.Tenant.Sequence.ExtractSequenceConfiguration(); - } - extractConfiguration.Tenant.Sequence.SiteUrls.Add(SiteUrl); + extractConfiguration.Tenant.Sequence = new OfficeDevPnP.Core.Framework.Provisioning.Model.Configuration.Tenant.Sequence.ExtractSequenceConfiguration(); } + extractConfiguration.Tenant.Sequence.SiteUrls.Add(SiteUrl); } if (ParameterSetName == PARAMETERSET_ASFILE) From 738be1972c71d005419c0b0ed559e4cbfa7db21c Mon Sep 17 00:00:00 2001 From: Heinrich Ulbricht Date: Wed, 26 Aug 2020 16:48:59 +0200 Subject: [PATCH 06/37] fixing scope name generation --- Commands/Base/TokenHandling.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/Base/TokenHandling.cs b/Commands/Base/TokenHandling.cs index 6bb277d98..9d2c62c5f 100644 --- a/Commands/Base/TokenHandling.cs +++ b/Commands/Base/TokenHandling.cs @@ -21,7 +21,7 @@ internal static string AcquireToken(string resource, string scope = null) if (scope == null) { // SharePoint or Graph V1 resource - var scopes = new[] { $"https://{resource}//.default" }; + var scopes = new[] { $"https://{resource.Replace("https://","").TrimEnd('/')}/.default" }; token = GenericToken.AcquireDelegatedTokenWithCredentials(PnPConnection.PnPManagementShellClientId, scopes, "https://login.microsoftonline.com/organizations/", PnPConnection.CurrentConnection.PSCredential.UserName, PnPConnection.CurrentConnection.PSCredential.Password); } else From d10e8688a4c7d0adaee46d2e128aef6c7023e894 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Thu, 3 Sep 2020 15:00:35 +0200 Subject: [PATCH 07/37] Use code from PnP-Site-Core in SetRequestAccessEmails to enable access requests --- Commands/Web/SetRequestAccessEmails.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Commands/Web/SetRequestAccessEmails.cs b/Commands/Web/SetRequestAccessEmails.cs index 0e3b482d7..c479f9530 100644 --- a/Commands/Web/SetRequestAccessEmails.cs +++ b/Commands/Web/SetRequestAccessEmails.cs @@ -64,10 +64,7 @@ protected override void ExecuteCmdlet() else { // Enable requesting access and set it to the default owners group - // Code can be replaced by SelectedWeb.EnableRequestAccess(); once https://github.com/SharePoint/PnP-Sites-Core/pull/2533 has been accepted for merge. - SelectedWeb.SetUseAccessRequestDefaultAndUpdate(true); - SelectedWeb.Update(); - SelectedWeb.Context.ExecuteQueryRetry(); + SelectedWeb.EnableRequestAccess(); } } } From 1f1c680533f88d770e02edf6b5f74d2294a33289 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Thu, 3 Sep 2020 16:45:07 +0200 Subject: [PATCH 08/37] Improve error messages when a valid certificate cannot be loaded from the given path --- Commands/Utilities/CertificateHelper.cs | 34 +++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/Commands/Utilities/CertificateHelper.cs b/Commands/Utilities/CertificateHelper.cs index 0d652fe82..9899e62b9 100644 --- a/Commands/Utilities/CertificateHelper.cs +++ b/Commands/Utilities/CertificateHelper.cs @@ -142,16 +142,30 @@ internal static X509Certificate2 GetCertificateFromPEMstring(string publicCert, internal static X509Certificate2 GetCertificateFromPath(string certificatePath, SecureString certificatePassword) { - var certFile = System.IO.File.OpenRead(certificatePath); - var certificateBytes = new byte[certFile.Length]; - certFile.Read(certificateBytes, 0, (int)certFile.Length); - var certificate = new X509Certificate2( - certificateBytes, - certificatePassword, - X509KeyStorageFlags.Exportable | - X509KeyStorageFlags.MachineKeySet | - X509KeyStorageFlags.PersistKeySet); - return certificate; + if (System.IO.File.Exists(certificatePath)) + { + var certFile = System.IO.File.OpenRead(certificatePath); + if (certFile.Length == 0) + throw new Exception($"The specified certificate path '{certificatePath}' points to an empty file"); + + var certificateBytes = new byte[certFile.Length]; + certFile.Read(certificateBytes, 0, (int)certFile.Length); + var certificate = new X509Certificate2( + certificateBytes, + certificatePassword, + X509KeyStorageFlags.Exportable | + X509KeyStorageFlags.MachineKeySet | + X509KeyStorageFlags.PersistKeySet); + return certificate; + } + else if (System.IO.Directory.Exists(certificatePath)) + { + throw new FileNotFoundException($"The specified certificate path '{certificatePath}' points to a folder", certificatePath); + } + else + { + throw new FileNotFoundException($"The specified certificate path '{certificatePath}' does not exist", certificatePath); + } } From 9a83bd249f06d1db25228a22e2601a0b277d724a Mon Sep 17 00:00:00 2001 From: Gautam Sheth Date: Mon, 7 Sep 2020 15:10:46 +0530 Subject: [PATCH 09/37] Added site script description --- Commands/SiteDesigns/GetSiteScript.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/SiteDesigns/GetSiteScript.cs b/Commands/SiteDesigns/GetSiteScript.cs index bd1c4f972..022aff5e9 100644 --- a/Commands/SiteDesigns/GetSiteScript.cs +++ b/Commands/SiteDesigns/GetSiteScript.cs @@ -35,7 +35,7 @@ protected override void ExecuteCmdlet() if (ParameterSpecified(nameof(Identity))) { var script = Tenant.GetSiteScript(ClientContext, Identity.Id); - script.EnsureProperties(s => s.Content, s => s.Title, s => s.Id, s => s.Version); + script.EnsureProperties(s => s.Content, s => s.Title, s => s.Id, s => s.Version, s => s.Description); WriteObject(script); } else if (ParameterSpecified(nameof(SiteDesign))) @@ -54,7 +54,7 @@ protected override void ExecuteCmdlet() else { var scripts = Tenant.GetSiteScripts(); - ClientContext.Load(scripts, s => s.Include(sc => sc.Id, sc => sc.Title, sc => sc.Version, sc => sc.Content)); + ClientContext.Load(scripts, s => s.Include(sc => sc.Id, sc => sc.Title, sc => sc.Version, sc => sc.Content, sc => sc.Description)); ClientContext.ExecuteQueryRetry(); WriteObject(scripts.ToList(), true); } From 19b7998414782ca721d7dcb1dcf0f90936ca5547 Mon Sep 17 00:00:00 2001 From: Koen Zomers Date: Wed, 9 Sep 2020 16:06:21 +0200 Subject: [PATCH 10/37] Adding placeholder for October 2020 release --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5e0098f5..152b1789f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). +## [3.26.2010.0] ** not yet released ** + +### Added + + +### Changed + + +### Contributors + + ## [3.25.2009.1] ### Changed From b91c5a63b25337cf69b565b5603040ab1e205ad2 Mon Sep 17 00:00:00 2001 From: Koen Zomers Date: Wed, 9 Sep 2020 16:09:09 +0200 Subject: [PATCH 11/37] Added Set-PnPTenant -EnableAutoNewsDigest option --- CHANGELOG.md | 4 ++-- Commands/Admin/SetTenant.cs | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152b1789f..b00719670 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [3.26.2010.0] ** not yet released ** ### Added - +- Added `Set-PnPTenant -EnableAutoNewsDigest` option to disable the automatic news digest mails sent to end users ### Changed ### Contributors - +- Koen Zomers [koenzomers] ## [3.25.2009.1] diff --git a/Commands/Admin/SetTenant.cs b/Commands/Admin/SetTenant.cs index 20d0edebe..79659200d 100644 --- a/Commands/Admin/SetTenant.cs +++ b/Commands/Admin/SetTenant.cs @@ -406,6 +406,9 @@ The only two characters that can be managed at this time are the # and % charact [Parameter(Mandatory = false, HelpMessage = "Boolean indicating if Azure Information Protection (AIP) should be enabled on the tenant. For more information, see https://docs.microsoft.com/microsoft-365/compliance/sensitivity-labels-sharepoint-onedrive-files#use-powershell-to-enable-support-for-sensitivity-labels")] public bool? EnableAIPIntegration; + [Parameter(Mandatory = false, HelpMessage = "Boolean indicating if a news digest should automatically be sent to end users to inform them about news that they may have missed. On by default. For more information, see https://aka.ms/autonewsdigest")] + public bool? EnableAutoNewsDigest; + protected override void ExecuteCmdlet() { ClientContext.Load(Tenant); @@ -972,6 +975,11 @@ protected override void ExecuteCmdlet() Tenant.EnableAIPIntegration = EnableAIPIntegration.Value; isDirty = true; } + if (EnableAutoNewsDigest.HasValue) + { + Tenant.EnableAutoNewsDigest = EnableAutoNewsDigest.Value; + isDirty = true; + } if (isDirty) { ClientContext.ExecuteQueryRetry(); From 0da8af35e0a293692040cf7798873f7a82a07f3e Mon Sep 17 00:00:00 2001 From: Koen Zomers Date: Wed, 9 Sep 2020 16:10:50 +0200 Subject: [PATCH 12/37] Added PR reference --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b00719670..f9c0a790a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [3.26.2010.0] ** not yet released ** ### Added -- Added `Set-PnPTenant -EnableAutoNewsDigest` option to disable the automatic news digest mails sent to end users +- Added `Set-PnPTenant -EnableAutoNewsDigest` option to disable the automatic news digest mails sent to end users [PR #2901](https://github.com/pnp/PnP-PowerShell/pull/2901) ### Changed From 271c528656ca39f216ccb2749cddf4b6736be13c Mon Sep 17 00:00:00 2001 From: Koen Zomers Date: Wed, 9 Sep 2020 16:29:00 +0200 Subject: [PATCH 13/37] Adding changelog entry --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152b1789f..1f53f4703 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ## [3.26.2010.0] ** not yet released ** ### Added - +- Added the description being shown of a Site Script when running `Get-PnPSiteScript` [PR #2895](https://github.com/pnp/PnP-PowerShell/pull/2895) ### Changed ### Contributors - +- Gautam Sheth [gautamdsheth] ## [3.25.2009.1] From 0b78bf44c2dc039a02052c8b89990283b398f1f9 Mon Sep 17 00:00:00 2001 From: Aimery THOMAS <7100077+a1mery@users.noreply.github.com> Date: Wed, 16 Sep 2020 16:22:01 +0200 Subject: [PATCH 14/37] Add example getting channel messages --- Commands/Teams/GetTeamsChannelMessage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/Teams/GetTeamsChannelMessage.cs b/Commands/Teams/GetTeamsChannelMessage.cs index e43124dce..fc88eb3ae 100644 --- a/Commands/Teams/GetTeamsChannelMessage.cs +++ b/Commands/Teams/GetTeamsChannelMessage.cs @@ -13,8 +13,8 @@ namespace PnP.PowerShell.Commands.Graph Category = CmdletHelpCategory.Teams, SupportedPlatform = CmdletSupportedPlatform.Online)] [CmdletExample( - Code = "PS:> Submit-PnPTeamsChannelMessage -Team MyTestTeam -Channel \"My Channel\" -Message \"A new message\"", - Remarks = "Sends \"A new message\" to the specified channel", + Code = "PS:> Get-PnPTeamsChannelMessage -Team 07d9dbfb-cbf2-4dc1-92c6-7921f5931b3d -Channel \"My Channel\"", + Remarks = "Gets all messages of the specified channel", SortOrder = 1)] [CmdletMicrosoftGraphApiPermission(MicrosoftGraphApiPermission.Group_ReadWrite_All)] public class GetTeamsChannelMessage : PnPGraphCmdlet From 189e5c85317d1c82981380c9bc5fd67c549a9cbd Mon Sep 17 00:00:00 2001 From: Gautam Sheth Date: Fri, 18 Sep 2020 12:37:41 +0530 Subject: [PATCH 15/37] Added support for DisableCustomAppAuthentication property --- Commands/Admin/SetTenant.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Commands/Admin/SetTenant.cs b/Commands/Admin/SetTenant.cs index 20d0edebe..851fd3574 100644 --- a/Commands/Admin/SetTenant.cs +++ b/Commands/Admin/SetTenant.cs @@ -405,6 +405,8 @@ The only two characters that can be managed at this time are the # and % charact [Parameter(Mandatory = false, HelpMessage = "Boolean indicating if Azure Information Protection (AIP) should be enabled on the tenant. For more information, see https://docs.microsoft.com/microsoft-365/compliance/sensitivity-labels-sharepoint-onedrive-files#use-powershell-to-enable-support-for-sensitivity-labels")] public bool? EnableAIPIntegration; + + public bool? DisableCustomAppAuthentication; protected override void ExecuteCmdlet() { @@ -972,6 +974,11 @@ protected override void ExecuteCmdlet() Tenant.EnableAIPIntegration = EnableAIPIntegration.Value; isDirty = true; } + if (DisableCustomAppAuthentication.HasValue) + { + Tenant.DisableCustomAppAuthentication = DisableCustomAppAuthentication.Value; + isDirty = true; + } if (isDirty) { ClientContext.ExecuteQueryRetry(); From 52d7cd3142532bfa09cbe0d67d8b6c97cdd27d2a Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Fri, 18 Sep 2020 18:05:49 +0200 Subject: [PATCH 16/37] Added Register-PnPManagementShellAccess cmdlet --- CHANGELOG.md | 6 ++ .../Base/RegisterPnPManagementShellAccess.cs | 37 +++++++++ Commands/Model/GenericToken.cs | 80 +++++++++++++++++-- Commands/Model/GraphToken.cs | 3 +- Commands/PnP.PowerShell.Commands.csproj | 1 + Commands/Properties/AssemblyInfo.cs | 4 +- .../Site/ApplyProvisioningTemplate.cs | 2 +- .../Tenant/ApplyTenantTemplate.cs | 4 +- version.txt | 2 +- 9 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 Commands/Base/RegisterPnPManagementShellAccess.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index b5e0098f5..4675991b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). +## [3.26.2010.0 - unreleased] + +### Added + +- Added Register-PnPManagementShellAccess cmdlets to register correct access required for the multi-tenant application PnP Management Shell which is used behind the scenes of the Provisioning Engine for certain actions towards SharePoint Online. + ## [3.25.2009.1] ### Changed diff --git a/Commands/Base/RegisterPnPManagementShellAccess.cs b/Commands/Base/RegisterPnPManagementShellAccess.cs new file mode 100644 index 000000000..a2dc165af --- /dev/null +++ b/Commands/Base/RegisterPnPManagementShellAccess.cs @@ -0,0 +1,37 @@ +using Microsoft.Identity.Client; +using OfficeDevPnP.Core; +using PnP.PowerShell.CmdletHelpAttributes; +using PnP.PowerShell.Commands.Model; +using System; +using System.Management.Automation; + +namespace PnP.PowerShell.Commands.Base +{ + [Cmdlet(VerbsLifecycle.Register, "PnPManagementShellAccess")] + [CmdletHelp("Registers the multi-tenant app PnP Management Shell for delegate access to the required environments", + Category = CmdletHelpCategory.TenantAdmin)] + [CmdletExample( + Code = "PS:> Register-PnPManagementShellAccess -SiteUrl https://yourtenant.sharepoint.com", + Remarks = "Will prompt you to authenticate and if needed will ask you to provide consent to specific required rights.", + SortOrder = 1)] + public class RegisterPnPManagementShellAccess : PSCmdlet + { + [Parameter(Mandatory = false)] + public AzureEnvironment AzureEnvironment = AzureEnvironment.Production; + + [Parameter(Mandatory = true)] + public string SiteUrl; + protected override void ProcessRecord() + { + var endPoint = GenericToken.GetAzureADLoginEndPoint(AzureEnvironment); + var uri = new Uri(SiteUrl); + var scopes = new[] { $"{uri.Scheme}://{uri.Authority}//.default" }; + + var application = PublicClientApplicationBuilder.Create(PnPConnection.PnPManagementShellClientId).WithAuthority($"{endPoint}/organizations/").WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient").Build(); + + var result = application.AcquireTokenInteractive(scopes).ExecuteAsync().GetAwaiter().GetResult(); + result = application.AcquireTokenInteractive(new[] { "https://graph.microsoft.com/.default" }).ExecuteAsync().GetAwaiter().GetResult(); + + } + } +} \ No newline at end of file diff --git a/Commands/Model/GenericToken.cs b/Commands/Model/GenericToken.cs index f12372571..0786e41db 100644 --- a/Commands/Model/GenericToken.cs +++ b/Commands/Model/GenericToken.cs @@ -11,6 +11,8 @@ using System.Threading.Tasks; using System.Security; using OfficeDevPnP.Core; +using System.Management.Automation; +using PnP.PowerShell.Commands.Base; namespace PnP.PowerShell.Commands.Model { @@ -181,11 +183,28 @@ public static GenericToken AcquireApplicationToken(string tenant, string clientI try { - tokenResult = confidentialClientApplication.AcquireTokenSilent(scopes, account.First()).ExecuteAsync().GetAwaiter().GetResult(); + tokenResult = confidentialClientApplication.AcquireTokenSilent(scopes, account.First()).WithForceRefresh(true).ExecuteAsync().GetAwaiter().GetResult(); } catch { - tokenResult = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync().GetAwaiter().GetResult(); + try + { + tokenResult = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync().GetAwaiter().GetResult(); + } + catch (MsalUiRequiredException msalEx) + { + if (msalEx.Classification == UiRequiredExceptionClassification.ConsentRequired) + { + if (clientId == PnPConnection.PnPManagementShellClientId) + { + throw new PSInvalidOperationException("Please provide consent to the PnP Management Shell application with 'Register-PnPManagementShellAccess' and follow the steps on screen."); + } + else + { + throw msalEx; + } + } + } } return new GenericToken(tokenResult.AccessToken); @@ -228,7 +247,24 @@ public static GenericToken AcquireApplicationToken(string tenant, string clientI } catch { - tokenResult = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync().GetAwaiter().GetResult(); + try + { + tokenResult = confidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync().GetAwaiter().GetResult(); + } + catch (MsalUiRequiredException msalEx) + { + if (msalEx.Classification == UiRequiredExceptionClassification.ConsentRequired) + { + if (clientId == PnPConnection.PnPManagementShellClientId) + { + throw new PSInvalidOperationException("Please provide consent to the PnP Management Shell application with 'Register-PnPManagementShellAccess' and follow the steps on screen."); + } + else + { + throw msalEx; + } + } + } } return new GenericToken(tokenResult.AccessToken); } @@ -267,7 +303,24 @@ public static GenericToken AcquireApplicationTokenInteractive(string clientId, s } catch { - tokenResult = publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync().GetAwaiter().GetResult(); + try + { + tokenResult = publicClientApplication.AcquireTokenInteractive(scopes).WithExtraScopesToConsent(new[] { "https://graph.microsoft.com/.default" }).ExecuteAsync().GetAwaiter().GetResult(); + } + catch (MsalUiRequiredException msalEx) + { + if (msalEx.Classification == UiRequiredExceptionClassification.ConsentRequired) + { + if (clientId == PnPConnection.PnPManagementShellClientId) + { + throw new PSInvalidOperationException("Please provide consent to the PnP Management Shell application with 'Register-PnPManagementShellAccess' and follow the steps on screen."); + } + else + { + throw msalEx; + } + } + } } return new GenericToken(tokenResult.AccessToken); } @@ -351,7 +404,24 @@ public static GenericToken AcquireDelegatedTokenWithCredentials(string clientId, } catch { - tokenResult = publicClientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().GetAwaiter().GetResult(); + try + { + tokenResult = publicClientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().GetAwaiter().GetResult(); + } + catch (MsalUiRequiredException msalEx) + { + if (msalEx.Classification == UiRequiredExceptionClassification.ConsentRequired) + { + if (clientId == PnPConnection.PnPManagementShellClientId) + { + throw new PSInvalidOperationException("Please provide consent to the PnP Management Shell application with 'Register-PnPManagementShellAccess' and follow the steps on screen."); + } + else + { + throw msalEx; + } + } + } } return new GenericToken(tokenResult.AccessToken); diff --git a/Commands/Model/GraphToken.cs b/Commands/Model/GraphToken.cs index 5a9b85412..3524c8fd5 100644 --- a/Commands/Model/GraphToken.cs +++ b/Commands/Model/GraphToken.cs @@ -5,6 +5,7 @@ using PnP.PowerShell.Commands.Utilities; using System; using System.Linq; +using System.Management.Automation; using System.Security; using System.Security.Cryptography.X509Certificates; @@ -39,7 +40,7 @@ public GraphToken(string accesstoken) : base(accesstoken) public static GraphToken AcquireApplicationToken(string tenant, string clientId, X509Certificate2 certificate, AzureEnvironment azureEnvironment) { var endPoint = GenericToken.GetAzureADLoginEndPoint(azureEnvironment); - return new GraphToken(GenericToken.AcquireApplicationToken(tenant, clientId, $"{endPoint}/{tenant}", new[] { $"{ResourceIdentifier}/{DefaultScope}" }, certificate).AccessToken); + return new GraphToken(GenericToken.AcquireApplicationToken(tenant, clientId, $"{endPoint}/{tenant}", new[] { $"{ResourceIdentifier}/{DefaultScope}" }, certificate).AccessToken); } /// diff --git a/Commands/PnP.PowerShell.Commands.csproj b/Commands/PnP.PowerShell.Commands.csproj index 7143da313..df26e5ec1 100644 --- a/Commands/PnP.PowerShell.Commands.csproj +++ b/Commands/PnP.PowerShell.Commands.csproj @@ -591,6 +591,7 @@ + diff --git a/Commands/Properties/AssemblyInfo.cs b/Commands/Properties/AssemblyInfo.cs index 0f8bd973d..093ba319b 100644 --- a/Commands/Properties/AssemblyInfo.cs +++ b/Commands/Properties/AssemblyInfo.cs @@ -51,8 +51,8 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] #if !PNPPSCORE -[assembly: AssemblyVersion("3.25.2009.1")] -[assembly: AssemblyFileVersion("3.25.2009.1")] +[assembly: AssemblyVersion("3.26.2010.0")] +[assembly: AssemblyFileVersion("3.26.2010.0")] #else [assembly: AssemblyVersion("4.0.0.0")] [assembly: AssemblyFileVersion("4.0.0.0")] diff --git a/Commands/Provisioning/Site/ApplyProvisioningTemplate.cs b/Commands/Provisioning/Site/ApplyProvisioningTemplate.cs index 7ef58fac8..f488cf499 100644 --- a/Commands/Provisioning/Site/ApplyProvisioningTemplate.cs +++ b/Commands/Provisioning/Site/ApplyProvisioningTemplate.cs @@ -394,7 +394,7 @@ protected override void ExecuteCmdlet() else { // No token... - throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Connect-PnPOnline -Graph -LaunchBrowser"); + throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Register-PnPManagementShellAccess"); } })) { diff --git a/Commands/Provisioning/Tenant/ApplyTenantTemplate.cs b/Commands/Provisioning/Tenant/ApplyTenantTemplate.cs index 49792244d..c92573131 100644 --- a/Commands/Provisioning/Tenant/ApplyTenantTemplate.cs +++ b/Commands/Provisioning/Tenant/ApplyTenantTemplate.cs @@ -319,7 +319,7 @@ protected override void ExecuteCmdlet() } if (accessToken == null) { - throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Connect-PnPOnline -Graph -LaunchBrowser"); + throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Register-PnPManagementShellAccess"); } } } @@ -353,7 +353,7 @@ protected override void ExecuteCmdlet() else { // No token... - throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Connect-PnPOnline -Graph -LaunchBrowser"); + throw new PSInvalidOperationException("Your template contains artifacts that require an access token. Please provide consent to the PnP Management Shell application first by executing: Register-PnPManagementShellAccess"); } })) { diff --git a/version.txt b/version.txt index 1bda19773..639fcf7a9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.25.2009.1 \ No newline at end of file +3.26.2010.0 \ No newline at end of file From fd1ec75e2ed3f7aa5b83206d99d6f940d70f8d2e Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Fri, 25 Sep 2020 19:28:57 +0200 Subject: [PATCH 17/37] Improve exception message when a provisioning template cannot be loaded from a file --- Commands/Provisioning/Site/ReadProvisioningTemplate.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Commands/Provisioning/Site/ReadProvisioningTemplate.cs b/Commands/Provisioning/Site/ReadProvisioningTemplate.cs index 3c674e8af..17a6e8495 100644 --- a/Commands/Provisioning/Site/ReadProvisioningTemplate.cs +++ b/Commands/Provisioning/Site/ReadProvisioningTemplate.cs @@ -113,6 +113,9 @@ internal static ProvisioningTemplate LoadProvisioningTemplateFromFile(string tem // Load the provisioning template file Stream stream = fileConnector.GetFileStream(templateFileName); + if (stream == null) + throw new FileNotFoundException($"File {templatePath} does not exist.", templatePath); + var isOpenOfficeFile = FileUtilities.IsOpenOfficeFile(stream); XMLTemplateProvider provider; From 2ebfb5ef0bc73f4d4ed7a3f5e0e122dc9c8abddc Mon Sep 17 00:00:00 2001 From: James May Date: Tue, 29 Sep 2020 21:33:56 +1000 Subject: [PATCH 18/37] Get-User: add Includes parameter --- Commands/Principals/GetUser.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Commands/Principals/GetUser.cs b/Commands/Principals/GetUser.cs index e1518c776..342378d5d 100644 --- a/Commands/Principals/GetUser.cs +++ b/Commands/Principals/GetUser.cs @@ -47,7 +47,7 @@ namespace PnP.PowerShell.Commands.Principals Remarks = "Returns all users who have been granted explicit access to the current site, lists and listitems", SortOrder = 7)] #endif - public class GetUser : PnPWebCmdlet + public class GetUser : PnPWebRetrievalsCmdlet { private const string PARAMETERSET_IDENTITY = "Identity based request"; private const string PARAMETERSET_WITHRIGHTSASSIGNED = "With rights assigned"; @@ -79,7 +79,7 @@ public class DetailedUser protected override void ExecuteCmdlet() { - var retrievalExpressions = new Expression>[] + DefaultRetrievalExpressions = new Expression>[] { u => u.Id, u => u.Title, @@ -102,10 +102,10 @@ protected override void ExecuteCmdlet() g => g.Title, g => g.LoginName) }; - + if (Identity == null) { - SelectedWeb.Context.Load(SelectedWeb.SiteUsers, u => u.Include(retrievalExpressions)); + SelectedWeb.Context.Load(SelectedWeb.SiteUsers, u => u.Include(RetrievalExpressions)); List users = new List(); @@ -120,7 +120,7 @@ protected override void ExecuteCmdlet() var usersWithDirectPermissions = SelectedWeb.SiteUsers.Where(u => SelectedWeb.RoleAssignments.Any(ra => ra.Member.LoginName == u.LoginName)); // Get all the users contained in SharePoint Groups - SelectedWeb.Context.Load(SelectedWeb.SiteGroups, sg => sg.Include(u => u.Users.Include(retrievalExpressions), u => u.LoginName)); + SelectedWeb.Context.Load(SelectedWeb.SiteGroups, sg => sg.Include(u => u.Users.Include(RetrievalExpressions), u => u.LoginName)); SelectedWeb.Context.ExecuteQueryRetry(); // Get all SharePoint groups that have been assigned access @@ -342,7 +342,7 @@ protected override void ExecuteCmdlet() } if (user != null) { - SelectedWeb.Context.Load(user, retrievalExpressions); + SelectedWeb.Context.Load(user, RetrievalExpressions); SelectedWeb.Context.ExecuteQueryRetry(); } WriteObject(user); From 2e14b25f5d8b2c7b2ff0b4a662c0500a51bba8a4 Mon Sep 17 00:00:00 2001 From: sakoo-ms <71460412+sakoo-ms@users.noreply.github.com> Date: Tue, 29 Sep 2020 10:57:41 -0700 Subject: [PATCH 19/37] Indicate planned deprecation of GrooveBlockOption We would like to inform the users not to use GrooveBlockOption because of its planned deprecation. --- Commands/Admin/SetTenantSyncClientRestriction.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/Admin/SetTenantSyncClientRestriction.cs b/Commands/Admin/SetTenantSyncClientRestriction.cs index 16d550336..b3424441a 100644 --- a/Commands/Admin/SetTenantSyncClientRestriction.cs +++ b/Commands/Admin/SetTenantSyncClientRestriction.cs @@ -41,7 +41,7 @@ public class SetTenantSyncClientRestriction : PnPAdminCmdlet [Parameter(Mandatory = false, HelpMessage = @"Blocks certain file types from syncing with the new sync client (OneDrive.exe). Provide as one string separating the extensions using a semicolon (;). I.e. ""docx;pptx""")] public List ExcludedFileExtensions; - [Parameter(Mandatory = false, HelpMessage = "Controls whether or not a tenant's users can sync OneDrive for Business libraries with the old OneDrive for Business sync client. The valid values are OptOut, HardOptin, and SoftOptin.")] + [Parameter(Mandatory = false, HelpMessage = "Controls whether or not a tenant's users can sync OneDrive for Business libraries with the old OneDrive for Business sync client. The valid values are OptOut, HardOptin, and SoftOptin. GrooveBlockOption is planned to be deprecated. Please refrain from using the parameter.")] public Enums.GrooveBlockOption GrooveBlockOption; protected override void ExecuteCmdlet() @@ -90,4 +90,4 @@ protected override void ExecuteCmdlet() } } } -#endif \ No newline at end of file +#endif From 2cabf85a51537641909f69a4a3017adcb7f12fcb Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 09:57:50 +0200 Subject: [PATCH 20/37] Small cleanup --- Commands/Admin/GetStorageEntity.cs | 2 +- Commands/Admin/GetTenantAppCatalogUrl.cs | 2 +- Commands/Admin/GetTenantSite.cs | 2 +- .../InitializePowerShellAuthentication.cs | 2 +- Commands/Model/SPOTenant.cs | 19 +++++++++++++++---- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Commands/Admin/GetStorageEntity.cs b/Commands/Admin/GetStorageEntity.cs index 8b7a654dc..23261120b 100644 --- a/Commands/Admin/GetStorageEntity.cs +++ b/Commands/Admin/GetStorageEntity.cs @@ -11,7 +11,7 @@ namespace PnP.PowerShell.Commands { - [Cmdlet(VerbsCommon.Get, "PnPStorageEntity", SupportsShouldProcess = true)] + [Cmdlet(VerbsCommon.Get, "PnPStorageEntity")] [CmdletHelp(@"Retrieve Storage Entities / Farm Properties from either the Tenant App Catalog or from the current site if it has a site scope app catalog.", Category = CmdletHelpCategory.TenantAdmin, SupportedPlatform = CmdletSupportedPlatform.Online)] diff --git a/Commands/Admin/GetTenantAppCatalogUrl.cs b/Commands/Admin/GetTenantAppCatalogUrl.cs index bf76f233e..860e77a7b 100644 --- a/Commands/Admin/GetTenantAppCatalogUrl.cs +++ b/Commands/Admin/GetTenantAppCatalogUrl.cs @@ -5,7 +5,7 @@ namespace PnP.PowerShell.Commands { - [Cmdlet(VerbsCommon.Get, "PnPTenantAppCatalogUrl", SupportsShouldProcess = true)] + [Cmdlet(VerbsCommon.Get, "PnPTenantAppCatalogUrl")] [CmdletHelp(@"Retrieves the url of the tenant scoped app catalog", Category = CmdletHelpCategory.TenantAdmin, SupportedPlatform = CmdletSupportedPlatform.Online)] diff --git a/Commands/Admin/GetTenantSite.cs b/Commands/Admin/GetTenantSite.cs index 64170c53b..b0e751dce 100644 --- a/Commands/Admin/GetTenantSite.cs +++ b/Commands/Admin/GetTenantSite.cs @@ -11,7 +11,7 @@ namespace PnP.PowerShell.Commands { - [Cmdlet(VerbsCommon.Get, "PnPTenantSite", SupportsShouldProcess = true)] + [Cmdlet(VerbsCommon.Get, "PnPTenantSite")] [CmdletHelp(@"Retrieve site information.", "Use this cmdlet to retrieve site information from your tenant administration.", Category = CmdletHelpCategory.TenantAdmin, SupportedPlatform = CmdletSupportedPlatform.SP2016 | CmdletSupportedPlatform.SP2019 | CmdletSupportedPlatform.Online, diff --git a/Commands/Base/InitializePowerShellAuthentication.cs b/Commands/Base/InitializePowerShellAuthentication.cs index cbc230fca..96936b738 100644 --- a/Commands/Base/InitializePowerShellAuthentication.cs +++ b/Commands/Base/InitializePowerShellAuthentication.cs @@ -250,7 +250,7 @@ protected override void ProcessRecord() record.Properties.Add(new PSVariableProperty(new PSVariable("AzureAppId", azureApp.AppId))); var waitTime = 60; - Host.UI.Write(ConsoleColor.Yellow, Host.UI.RawUI.BackgroundColor, $"Waiting {waitTime} seconds to launch consent flow in a browser window. This wait is required to make sure that Azure AD is able to initialize all required artifacts."); + Host.UI.Write(ConsoleColor.Yellow, Host.UI.RawUI.BackgroundColor, $"Waiting {waitTime} seconds to start the consent flow in a browser window. This wait is required to make sure that Azure AD is able to initialize all required artifacts."); Console.TreatControlCAsInput = true; diff --git a/Commands/Model/SPOTenant.cs b/Commands/Model/SPOTenant.cs index 01ebc1697..5c5074612 100644 --- a/Commands/Model/SPOTenant.cs +++ b/Commands/Model/SPOTenant.cs @@ -1,5 +1,4 @@ -#if !ONPREMISES -using Microsoft.Online.SharePoint.TenantAdministration; +using Microsoft.Online.SharePoint.TenantAdministration; using Microsoft.Online.SharePoint.TenantManagement; using Microsoft.SharePoint.Client; using System; @@ -37,6 +36,7 @@ public SPOTenant(Tenant tenant) this.provisionSharedWithEveryoneFolder = tenant.ProvisionSharedWithEveryoneFolder; this.signInAccelerationDomain = tenant.SignInAccelerationDomain; this.disabledWebPartIds = tenant.DisabledWebPartIds; + try { this.enableGuestSignInAcceleration = tenant.EnableGuestSignInAcceleration; @@ -339,6 +339,14 @@ public SPOTenant(Tenant tenant) { this.emailAttestationReAuthDays = 30; } + try + { + this.disableCustomAppAuthentication = tenant.DisableCustomAppAuthentication; + } + catch + { + this.disableCustomAppAuthentication = false; + } } public bool HideDefaultThemes => hideDefaultThemes; @@ -471,6 +479,8 @@ public SPOTenant(Tenant tenant) public Guid[] DisabledWebPartIds => disabledWebPartIds; + public bool DisableCustomAppAuthentication => disableCustomAppAuthentication; + private bool hideDefaultThemes; private long storageQuota; @@ -600,6 +610,7 @@ public SPOTenant(Tenant tenant) private int emailAttestationReAuthDays; private Guid[] disabledWebPartIds; + + private bool disableCustomAppAuthentication; } -} -#endif \ No newline at end of file +} \ No newline at end of file From fb96a9cbf5754d1291c2c77c7327e4c20308588e Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:27:11 +0200 Subject: [PATCH 21/37] Remove not yet available property --- Commands/Model/SPOTenant.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Commands/Model/SPOTenant.cs b/Commands/Model/SPOTenant.cs index 5c5074612..c14d5d68d 100644 --- a/Commands/Model/SPOTenant.cs +++ b/Commands/Model/SPOTenant.cs @@ -339,14 +339,6 @@ public SPOTenant(Tenant tenant) { this.emailAttestationReAuthDays = 30; } - try - { - this.disableCustomAppAuthentication = tenant.DisableCustomAppAuthentication; - } - catch - { - this.disableCustomAppAuthentication = false; - } } public bool HideDefaultThemes => hideDefaultThemes; From 3f1bab357e3f3288d8fcf81ce10acf02c9558c98 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:27:19 +0200 Subject: [PATCH 22/37] Updated changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f0c7937..0cfcf9645 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,12 +11,15 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Added `Set-PnPTenant -EnableAutoNewsDigest` option to disable the automatic news digest mails sent to end users [PR #2901](https://github.com/pnp/PnP-PowerShell/pull/2901) - Added `Register-PnPManagementShellAccess` cmdlet to register correct access required for the multi-tenant application PnP Management Shell which is used behind the scenes of the Provisioning Engine for certain actions towards SharePoint Online. - Added the description being shown of a Site Script when running `Get-PnPSiteScript` [PR #2895](https://github.com/pnp/PnP-PowerShell/pull/2895) +- Added -Includes to `Get-PnPUser` [PR #2939](https://github.com/pnp/PnP-PowerShell/pull/2939) ### Changed ### Contributors - Koen Zomers [koenzomers] - Gautam Sheth [gautamdsheth] +- Giacomo Pozzoni [jackpoz] +- James May [fowl2] ## [3.25.2009.1] From 204696d8812c56eaff3cd1f82f3b092ef1b0ea47 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:29:24 +0200 Subject: [PATCH 23/37] Updated --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cfcf9645..213ec1850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,12 +14,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Added -Includes to `Get-PnPUser` [PR #2939](https://github.com/pnp/PnP-PowerShell/pull/2939) ### Changed +- Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) ### Contributors - Koen Zomers [koenzomers] - Gautam Sheth [gautamdsheth] - Giacomo Pozzoni [jackpoz] - James May [fowl2] +- Aimery Thomas [a1mery] ## [3.25.2009.1] From 57c2c97f35340e102869136aea588b5fa2cfe922 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:41:17 +0200 Subject: [PATCH 24/37] Updated --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 213ec1850..c350b1779 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ### Changed - Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) +- Fixed possible token acquisition issue when extracting a tenant template. [PR #2874](https://github.com/pnp/PnP-PowerShell/pull/2874) ### Contributors - Koen Zomers [koenzomers] @@ -22,6 +23,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Giacomo Pozzoni [jackpoz] - James May [fowl2] - Aimery Thomas [a1mery] +- Heinrich Ulbricht [heinrich-ulbricht] ## [3.25.2009.1] From 51ef626b57da3c448929679bf7936aa29ad6a8ab Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:51:11 +0200 Subject: [PATCH 25/37] Updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c350b1779..98dc55caf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ### Changed - Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) - Fixed possible token acquisition issue when extracting a tenant template. [PR #2874](https://github.com/pnp/PnP-PowerShell/pull/2874) +- Fixed scenario when no configuration file provided with Get-PnPTenantTemplate throws an undefined error [PR #2873](https://github.com/pnp/PnP-PowerShell/pull/2873) ### Contributors - Koen Zomers [koenzomers] From 9afea6bc01ef0fee105159c0d87a0efd489aafc8 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:54:37 +0200 Subject: [PATCH 26/37] Fixed quotes in example --- Commands/Teams/NewTeamsTeam.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/Teams/NewTeamsTeam.cs b/Commands/Teams/NewTeamsTeam.cs index f2cccd302..aefdde7c9 100644 --- a/Commands/Teams/NewTeamsTeam.cs +++ b/Commands/Teams/NewTeamsTeam.cs @@ -14,8 +14,8 @@ namespace PnP.PowerShell.Commands.Graph Category = CmdletHelpCategory.Teams, SupportedPlatform = CmdletSupportedPlatform.Online)] [CmdletExample( - Code = "PS:> New-PnPTeamsTeam -DisplayName "myPnPDemo1" -Visibility Private -AllowCreateUpdateRemoveTabs $false -AllowUserDeleteMessages $false", - Remarks = "This will create a new Team called "myPnPDemo1" and sets the privacy to Private, as well as preventing users from deleting their messages or update/remove tabs. The user creating the Team will be added as Owner.", + Code = @"PS:> New-PnPTeamsTeam -DisplayName ""myPnPDemo1"" -Visibility Private -AllowCreateUpdateRemoveTabs $false -AllowUserDeleteMessages $false", + Remarks = @"This will create a new Team called ""myPnPDemo1"" and sets the privacy to Private, as well as preventing users from deleting their messages or update/remove tabs. The user creating the Team will be added as Owner.", SortOrder = 1)] [CmdletExample( Code = "PS:> New-PnPTeamsTeam -GroupId $groupId", From cabb590a8578d1eff4a10ab19b11e3a2a8fe6d07 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 10:56:00 +0200 Subject: [PATCH 27/37] Updated --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98dc55caf..d207bf62a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) - Fixed possible token acquisition issue when extracting a tenant template. [PR #2874](https://github.com/pnp/PnP-PowerShell/pull/2874) - Fixed scenario when no configuration file provided with Get-PnPTenantTemplate throws an undefined error [PR #2873](https://github.com/pnp/PnP-PowerShell/pull/2873) +- Fixed examples for `New-PnPTeamsTeam` [PR #2870](https://github.com/pnp/PnP-PowerShell/pull/2870) ### Contributors - Koen Zomers [koenzomers] @@ -25,6 +26,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - James May [fowl2] - Aimery Thomas [a1mery] - Heinrich Ulbricht [heinrich-ulbricht] +- Veronique Lengelle [veronicageek] ## [3.25.2009.1] From 50b96598e02352d2884bd1e49c1ca8dc1253da36 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 11:03:14 +0200 Subject: [PATCH 28/37] Updated --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d207bf62a..619cef0c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Fixed possible token acquisition issue when extracting a tenant template. [PR #2874](https://github.com/pnp/PnP-PowerShell/pull/2874) - Fixed scenario when no configuration file provided with Get-PnPTenantTemplate throws an undefined error [PR #2873](https://github.com/pnp/PnP-PowerShell/pull/2873) - Fixed examples for `New-PnPTeamsTeam` [PR #2870](https://github.com/pnp/PnP-PowerShell/pull/2870) +- Updated documentation for `Get-PnPField` [PR #2856](https://github.com/pnp/PnP-PowerShell/pull/2856) ### Contributors - Koen Zomers [koenzomers] @@ -27,6 +28,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Aimery Thomas [a1mery] - Heinrich Ulbricht [heinrich-ulbricht] - Veronique Lengelle [veronicageek] +- Todd Klindt [ToddKlindt] ## [3.25.2009.1] From 989e2c2c2ed18cec142c6a8fdea6344cbbede8ff Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 11:25:51 +0200 Subject: [PATCH 29/37] Updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 619cef0c2..d4d097b5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Fixed scenario when no configuration file provided with Get-PnPTenantTemplate throws an undefined error [PR #2873](https://github.com/pnp/PnP-PowerShell/pull/2873) - Fixed examples for `New-PnPTeamsTeam` [PR #2870](https://github.com/pnp/PnP-PowerShell/pull/2870) - Updated documentation for `Get-PnPField` [PR #2856](https://github.com/pnp/PnP-PowerShell/pull/2856) +- Updated documentation for `Get-PnPListItem` [PR #2806](https://github.com/pnp/PnP-PowerShell/pull/2806) ### Contributors - Koen Zomers [koenzomers] From bb51f2a7768519532da23e8bd8bb7e288b76a6bc Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 11:29:32 +0200 Subject: [PATCH 30/37] Updated --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4d097b5f..a3dcb2e54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Added `Register-PnPManagementShellAccess` cmdlet to register correct access required for the multi-tenant application PnP Management Shell which is used behind the scenes of the Provisioning Engine for certain actions towards SharePoint Online. - Added the description being shown of a Site Script when running `Get-PnPSiteScript` [PR #2895](https://github.com/pnp/PnP-PowerShell/pull/2895) - Added -Includes to `Get-PnPUser` [PR #2939](https://github.com/pnp/PnP-PowerShell/pull/2939) +- Added an sample for Azure Automation [PR #](https://github.com/pnp/PnP-PowerShell/pull/2835) ### Changed - Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) @@ -30,6 +31,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Heinrich Ulbricht [heinrich-ulbricht] - Veronique Lengelle [veronicageek] - Todd Klindt [ToddKlindt] +- Paul Bullock [pkbullock] ## [3.25.2009.1] From 789bd63581b4c93caf0e7213b747916f3777b8ff Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 5 Oct 2020 11:46:19 +0200 Subject: [PATCH 31/37] updated --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3dcb2e54..0de7540f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Added `Register-PnPManagementShellAccess` cmdlet to register correct access required for the multi-tenant application PnP Management Shell which is used behind the scenes of the Provisioning Engine for certain actions towards SharePoint Online. - Added the description being shown of a Site Script when running `Get-PnPSiteScript` [PR #2895](https://github.com/pnp/PnP-PowerShell/pull/2895) - Added -Includes to `Get-PnPUser` [PR #2939](https://github.com/pnp/PnP-PowerShell/pull/2939) -- Added an sample for Azure Automation [PR #](https://github.com/pnp/PnP-PowerShell/pull/2835) +- Added an sample for Azure Automation [PR #2835](https://github.com/pnp/PnP-PowerShell/pull/2835) +- Added -DisableCustomAppAuthentication to `Set-PnPTenant` [PR #2923](https://github.com/pnp/PnP-PowerShell/pull/2923) ### Changed - Fixed example for `Get-PnPTeamsChannel` [PR #2919](https://github.com/pnp/PnP-PowerShell/pull/2919) From f9851e0ffad61acc8e74900a6219bf319f937fd4 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Wed, 7 Oct 2020 10:39:55 +0200 Subject: [PATCH 32/37] Fixed potential issue with Connect-PnPOnline --- CHANGELOG.md | 2 ++ Commands/Base/ConnectOnline.cs | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0de7540f6..b3b34297b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - Fixed examples for `New-PnPTeamsTeam` [PR #2870](https://github.com/pnp/PnP-PowerShell/pull/2870) - Updated documentation for `Get-PnPField` [PR #2856](https://github.com/pnp/PnP-PowerShell/pull/2856) - Updated documentation for `Get-PnPListItem` [PR #2806](https://github.com/pnp/PnP-PowerShell/pull/2806) +- Improved certificate file handling and errors shown if the file does not exist, is empty or points to a folder [PR #2888](https://github.com/pnp/PnP-PowerShell/pull/2888) +- Fixed issue with where connecting with Connect-PnPOnline to an URL ending on a slash could cause an exception when using some cmdlets. ### Contributors - Koen Zomers [koenzomers] diff --git a/Commands/Base/ConnectOnline.cs b/Commands/Base/ConnectOnline.cs index 95c566929..2b9e93a36 100644 --- a/Commands/Base/ConnectOnline.cs +++ b/Commands/Base/ConnectOnline.cs @@ -651,6 +651,11 @@ protected override void ProcessRecord() /// protected void Connect() { + if (!string.IsNullOrEmpty(Url) && Url.EndsWith("/")) + { + Url = Url.Substring(0, Url.Length - 1); + } + PnPConnection connection = null; var latestVersion = PnPConnectionHelper.GetLatestVersion(); From e4178884bd77c570fbbaee6e860d98beb416cb0f Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 12 Oct 2020 09:19:00 +0200 Subject: [PATCH 33/37] Updated readme --- README.md | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index b0bac5ef0..99a1c7ddd 100644 --- a/README.md +++ b/README.md @@ -5,31 +5,19 @@ This solution contains a library of PowerShell commands that allows you to perfo ![SharePoint Patterns and Practices](https://devofficecdn.azureedge.net/media/Default/PnP/sppnp.png) -### Applies to ### -- Sharepoint Online (Multi Tenant & Dedicated) -- SharePoint 2019 on-premises -- SharePoint 2016 on-premises -- SharePoint 2013 on-premises +> **Important:** +> This repository will be retired by the end of 2020. As of the GA of the Cross-Platform [PnP.PowerShell](https://github.com/pnp/pnp.powershell) we will only maintain that version going forward. -### Prerequisites ### -In order to generate the Cmdlet help you need to have the Windows Management Framework v4.0 installed, which you can download from http://www.microsoft.com/en-us/download/details.aspx?id=40855 +![PnP PowerShell RoadMap](PnP_PowerShell_Roadmap.png) -If it is not [pre-installed on your operating system](https://docs.microsoft.com/powershell/scripting/wmf/overview#wmf-availability-across-windows-operating-systems), you can find installation instructions in the [WMF release notes.](https://docs.microsoft.com/powershell/scripting/wmf/overview#wmf-release-notes) -Check out the "Getting Started" section to make sure you have all requirements in place. +# I've found a bug, where do I need to log an issue or create a PR -### Latest Release Quick Download +Between now and the end of 2020 both [PnP-PowerShell](https://github.com/pnp/pnp-powershell) and [PnP.PowerShell](https://github.com/pnp/powershell) are actively maintained. Once the new PnP PowerShell becomes generally available (GA) we will stop mainting the old repository. -The latest release can be found on [this link](https://github.com/pnp/PnP-PowerShell/releases) +Given that the cross-platform PnP PowerShell is our future going forward we would prefer issues and PRs being created in the new https://github.com/pnp/powershell repository. If you want your PR to apply to both then it is recommend to create the PR in both repositories for the time being. ----------- -# Commands included # -[Navigate here for an overview of all cmdlets and their parameters](https://docs.microsoft.com/powershell/sharepoint/sharepoint-pnp/sharepoint-pnp-cmdlets?view=sharepoint-ps) - -# Installation # -There are two ways: - -## 1. Using the [PowerShell Gallery](https://www.powershellgallery.com) **(Recommended)** +# Installation Using the [PowerShell Gallery](https://www.powershellgallery.com) If you main OS is Windows 10, or if you have [PowerShellGet](https://github.com/powershell/powershellget) installed, you can run the following commands to install the PowerShell cmdlets: @@ -40,16 +28,8 @@ If you main OS is Windows 10, or if you have [PowerShellGet](https://github.com/ |SharePoint 2016|```Install-Module SharePointPnPPowerShell2016```| |SharePoint 2013|```Install-Module SharePointPnPPowerShell2013```| -*Notice*: if you install the latest PowerShellGet from Github, you might receive an error message stating ->PackageManagement\Install-Package : The version 'x.x.x.x' of the module 'SharePointPnPPowerShellOnline' being installed is not catalog signed. - -In order to install the cmdlets when you get this error specify the -SkipPublisherCheck switch with the Install-Module cmdlet, e.g. ```Install-Module SharePointPnPPowerShellOnline -SkipPublisherCheck -AllowClobber``` - -## 2. Downloading the Files directly - -You can download the setup files from the [releases](https://github.com/pnp/PnP-PowerShell/releases) section of the PnP PowerShell repository. These files will up be updated on a monthly basis. Run the install and restart any open instances of PowerShell to use the cmdlets. -### How to Update the Cmdlets +# How to Update the Cmdlets Every month a new release will be made available of the PnP PowerShell Cmdlets. If you earlier installed the cmdlets using the setup file, simply download the [latest version](https://github.com/pnp/PnP-PowerShell/releases/latest) and run the setup. This will update your existing installation. If you have installed the cmdlets using PowerShellGet with ```Install-Module``` from the PowerShell Gallery then you will be able to use the following command to install the latest updated version: From b3fbdc72c1941c52d990151c624d3662365fc4fc Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 12 Oct 2020 09:20:05 +0200 Subject: [PATCH 34/37] added roadmap image --- PnP_PowerShell_Roadmap.png | Bin 0 -> 118418 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 PnP_PowerShell_Roadmap.png diff --git a/PnP_PowerShell_Roadmap.png b/PnP_PowerShell_Roadmap.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbff7ab30cb24a25d222f2b1ab31207a1cb692c GIT binary patch literal 118418 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

hL?Q0+Yv18C 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%0A&Kvw&{bG-(Y?22P0i!>vO8 zF_bk!^2uopSVFGo`6m-L-!n>xs2*>O_ULn3`db1~JXSX9;Zr(py%MQ7_SoH|n^r~- zz#WEAg@=c;lBK7zvN{42+blQ`CE?-rKZeS=HS(L_6NDW;BgTC1>!*IMlZMv+AA z2vsow9p5<7C6g-N;Ynn~$H{N?EFUqGV~K&y9s3jDfIEaHf3;r|uhbv(5BqR9I;Zta z*q|OfDOgKQpR8=gnw*NT-0Q2llgB^Db|oD2yoICTtIER{Zz)(<%HHxOjcd6{;j(W; zMnt5c6FaQL-D7GyKiXtlFxbI!*es|rlh)a)$l#Lgfjw3SXU4`A@&CzY&e-6_BjYpbK7UNn2^O~+WPsi zL6#Sdpl!?y-3gWddiP^AIPmRuC&=^aT#?G%TI4R*%|j#Od-NwESnM`pC@~D}76?Ht zd>Kt5y<8E!snLQ*fao5W*1J>asZ>wqw+0@j{a2HjpIgWql4^momX+iQ^Wh(dp9k+u z5W=Fkr&_Ac4%PtGs@!xhv$$B6PO3H*bSo0HaoQQFrGG8q6w9Zd1~Lk z(9%a>=_3L|s#e>i9J>Q>ncb-OIU+;y=j&#XL7SdvMi&t=QZZL?uwk0;F6*<6R=BE| zt00##!&@{twFGlH?AI!|<_ZdCX1T(@0Z~jJMWrc~P*9!P(5Qn|1u*=~U_(M)SI8sg zxPnJ#HW^Kfq(RXiJO8It^Yb@)K75$TMq+^p5fS=L#Q>EIJFW*)oJMcI{kZI=xL2UX zNkEy-q3EWbNNta=e152cn7dR@089y%ZsO6zH3C@z0hu^(&ZDp3Ca`brrUR@Pb`Ulj zNZkMWZ`T>FJ|N=y&X}0egQCGs+`m(?P3OLwAlHd0&6To>ib2jCQp47t$w5^?#c&?`2S;`!#y+qr97V$KgH+rg@6hCZIUN6#A@6f5HzU3 z{ZGKUJ&XqZVWDBDA#g6)j;XhJ-*`l{4$%}#PZB-ngs-T-L_fm-!sy-hxA%v>Jtk*G z)AjcLLnQkt{H)VpJ7v6+8x+5Wn$}$R34+HMqtE>2_=B3Y%XjxlO+8;*TiZWTDTOyJ zzS*C_%%54M_}8&}qUX7()H_21gP-4&!D$#E;`jcv1#_+HjyMaDjNY*6odB6=C}RcU ztEza|ZERDipRYd%GM3`f<{FK?Ll^@Xszv$%`Q3wq!Z0vzK7PX9my_Mn(n4QUFSnEh z;AArAI}HCL_W9mR3j@_BrF7c8ScL5B_blO+qaSJhKGzmj=&(5kR-x)Z?G!#+S!-X? zo-(*|B^P)y=cTQ+NTOI(um{e-vMzXgKy|KcQ48D(j0FJ&Nj<$q%c>cpI^Nh9pV=*^ zOj?q}2s212|HFgUDj99^@&ex&;OXm(m?CaXs}eX$t;X9HPj?Q7WyU`~>e`#iPHOl) zQ6-LDHKLMokEpD)lt;_X+`H1TkpLeUm!rSYspFHsCzqvZIE?=DTlLU*^x483nRi@b z<-Csgm4&%9@h3wfq+N1AvlWa%s~3}z@tXf~pS7UL|WQD3rW8IEC~3)KNTo7AVWg2yJPHXC`Onn*X7R@e7x7<`@pAt z2Qs0lqgG{=5Ee#;J{c7vA&!ZO35qOON!9h5(#t3U7#&RSU^zVL&-wIxQ&G16?gVd{ z=37EEEGBNczF_Txl<-zYuyjcNlm+JX)+GWNNi)Vt9;=?;%iWnk6^&GsCj8W2>n=N7Q(Fa_=-QTHMBRQ!Y3MYNX%`9&?r3;?Qh?)=Pf~upVBM|+0 zK+(8TKslV`h1PA?O5g$we(znB|2^}q!Pihi&dGUAG%%5^8iqdwbBw%cQ~IsTmhBl9 zIAz4*-D%1Q4{=4e{4ZdAK@5^-Uy!{8wFOk~u}{N5V6h*u;GN(}vb$sC98 zGX}hz4JNHK~2udX-LA>SY>nulp*<=jw}unAqM`$7@ux zBW&^AwE)GLV1%5T`DN(`ETA8$e+xrLRg!8CPbZb@n(&9XrK@L{BH*2g;07E90ql7t z2Q≠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èl(#@%~`1ZR0kU2GGD|X>LY)G#-1zD4OO@7Y$ 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 Date: Mon, 12 Oct 2020 11:59:03 +0200 Subject: [PATCH 35/37] Modernization binaries for the October 2020 release --- .../SharePointPnP.Modernization.Framework.dll | Bin 851456 -> 851456 bytes .../SharePointPnP.Modernization.Framework.dll | Bin 830840 -> 830856 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Binaries/SharePointPnP.Modernization.Framework.dll b/Binaries/SharePointPnP.Modernization.Framework.dll index 6cd528dbfaa573901035bbae7727104fb7d37366..4c1019ef7199b6d164d70c5f3febe2464a29a7f1 100644 GIT binary patch delta 209 zcmZqpW8Cn^ctQuWhek_dcWXCeYd2GCH*;$@OKUgl)^4_+0*tq&w+gcDWtL*N)$S_9 z2E^>!U4=N*4+;F1JZx{({?oOCc}b#<`{Xt=&wm-OR1sEUn$FTf5nQ3NYTB-YUqpmsyhGX1l8p z8xXT^cNOALKP14lc+p>DM*IeP)UUP+0CW*|RMS5D5Kc`jU_6whQ_Aztb zWM^Ois${siefl?^w~WjN43^v5fA9!0fmqXL|KhP_2QnD+7!0->e&JDK+|Kxi=RYF= DU@%BO diff --git a/Binaries/release/SharePointPnP.Modernization.Framework.dll b/Binaries/release/SharePointPnP.Modernization.Framework.dll index f4724d2d98f86a03e6a4695e4e9ef5ebc9920af2..4b3804fa2a32c218db7e2a4b7e09824bdffe6473 100644 GIT binary patch delta 2526 zcmbtUdo)yQAD+Eu%nY_mF1Zd9nofkhCqyX}xs*~Um)z-;OXQL$GiKaIgM^w;&X6*> zCCa2!iU>tG5`~mh8X2kN5@+|FR_lD{&+mKJde-{=p7;0O*7JLxZv#};b803Fn@34J z#kL2_@17di46qVNKne-?0T2Zi1&&VwL^$Jg?y{m_l`+SSU7C?&+m3mWSVeK$#~Wp< zCx(gV7sCy(;h55i{>$Qut+Rn!Un#Wjw0cRC@?6_ANGypid*m@PX>?Uym>o3V`;}BU*;1hi z1f&=UL{Q-Q1_DAk4jAB!2nn~b%9w$a!YKj@BEN7-bY@su**h&T^Dtpsg4w0{HDOAb zDZDN*KCeqWyb?rUj%qxlwFZ5&7X}?5ifR-t1rWw19>VN)v~(PJ)48pT)MUXXRxmFY zJ$ug&j)ycr(E$Pm1E8e?d=3+u0I&!K=BFe=%fKHICqEh5NI(OO9!f7`K^g!bU_ncO zI!p7%F(3wJYDVEjwUcd4QZOk4T1A5rA(f9R+%sza!9^W|Ed9=T?EUHY>D*gGP z>6Mlpwb7%wG+eR&^LkRX_jA&`rnSdpZ37Df3rW`>Yq_JJ3Ho&P0h&1aUkNo+L zNY%A$+<%}b_HF7R(?5onNV$0+-YYV3@C`*#mI_m01V*T^iGc~#P|wI1af5O3An=*X z__LVN1v5H0Q-zQ-$1NSwSw(@h@K|S@xGc%(fKPBh1lh^ak!OR6|4; zF@!BR3;B??rX|e8eSw+SK`s^qKu~rq+O8|vL+s#i3NncHAewP(&p|n=RKx^E5CcPF zHw6hQ0MQ3$W%YgmKx;ElH7KGED3zvG;V zd_o#K8J zvB%p_Q0rr7%oh$jm*|;20I>iDxWEKd(5_H`NvLilN!)Ur+;nN%8vJHL%k z^^MSXdS(daYANf9E{rm_zXVWdK$mcKS0Cd!Ir1Yg|x@yPzOHS;|{jN&&Ifp^P-KCJTa@%RBUPtJuBmlxpc zVk_UEzDJH<75i;@iZiBu_>bj?dhA}VZs=Jx>knbx_|x;7^U8Ka zz8Yf6yi>7KX%T|QuJTn2p`&=YZkP#f0097IEEN8K-(Zz)k){~B5dklvBZ&o-vGN$J z9{mxAkjKgM5elB4maTUCS{PQsWhB6i_+lF8a4AINkS;^AbiFllu!f@4um5R?Pz|YW zzlgQ)-vk^DZ~W;ciLPQe0MUnaVKGny^BUa%1Tbg}pmwiS00K)e;Xknq_;-PRT+WXI zqkk+1k>6kn4519?%4Nua9xk2V$So2^%MHv&CD!tntk2Zd`&+gHvKc10F&`k1rqKMp zrdUnuvCf_ESFK0vfbM{yeU(oiRUFhWPC8^H<}^2eg{7xkb2Be{tK|h%qc{FU>!{ZRHK3Q{R|;iG{o6Kh zWsv!Pig9|L)%el64F_E28krJiP(mQ#Rk?MRUGBHO$8Q=YVaD7)ToTkr7~?SGEzB5& z8Mkp{kKyKOy-?U|E;WuRseYQ~JG*r*Z@ER-nRnIclNK|QFyrhmMH1Kk>jJO_j@)y; zG;qj8%2;YKqT|#BPXmS6wp$&IZEY)au1{`Sd^yJPDMwY@D&)Ib#`N1s-}8VS9x%_r zRwrpTrR@SWx!q?T6lY1YqulQ?;`WGZ=e22$m)J_Jn=9;gzZ1|NyI^&fG~cuttF>IC zJGDwHLo{AoJ6h-q%5dA7i*cBR&eIo;_b94FrHqE@r+2N~)rn6?sXixt^4+?LQLT@m zjdxnBM8;$21zBIsAB+b~$IL~zCC$R8()E7ZXCEp&uZS_A)ihuwH@lN_mc47Llym6J z2_F8O%9eAL^-d{ejm`-t1`qR;^!$SkWww2BV=JZ|@f7PRoNju#DC04`WvuEEPVgjo s=Hc{(>N;#q-}2oz!t-1sbaoU?)~O3@S(U7yr1#l+qEiJwoE{y20hx3cQUCw| delta 2629 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 From 6e7fca08092cc630e5253e08819bddb16cd2eff2 Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 12 Oct 2020 12:11:38 +0200 Subject: [PATCH 36/37] Fixed compilation issue --- Commands/Model/SPOTenant.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Commands/Model/SPOTenant.cs b/Commands/Model/SPOTenant.cs index c14d5d68d..3ae6b363e 100644 --- a/Commands/Model/SPOTenant.cs +++ b/Commands/Model/SPOTenant.cs @@ -1,4 +1,5 @@ -using Microsoft.Online.SharePoint.TenantAdministration; +#if !ONPREMISES +using Microsoft.Online.SharePoint.TenantAdministration; using Microsoft.Online.SharePoint.TenantManagement; using Microsoft.SharePoint.Client; using System; @@ -605,4 +606,5 @@ public SPOTenant(Tenant tenant) private bool disableCustomAppAuthentication; } -} \ No newline at end of file +} +#endif \ No newline at end of file From 1adf0ebc6465473f08de1d34a4494a4e1d51770a Mon Sep 17 00:00:00 2001 From: Erwin van Hunen Date: Mon, 12 Oct 2020 14:41:58 +0200 Subject: [PATCH 37/37] Fixes issue when running cmdlet from PowerShell ISE --- Commands/Base/InitializePowerShellAuthentication.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Commands/Base/InitializePowerShellAuthentication.cs b/Commands/Base/InitializePowerShellAuthentication.cs index 96936b738..101b11644 100644 --- a/Commands/Base/InitializePowerShellAuthentication.cs +++ b/Commands/Base/InitializePowerShellAuthentication.cs @@ -252,22 +252,14 @@ protected override void ProcessRecord() var waitTime = 60; Host.UI.Write(ConsoleColor.Yellow, Host.UI.RawUI.BackgroundColor, $"Waiting {waitTime} seconds to start the consent flow in a browser window. This wait is required to make sure that Azure AD is able to initialize all required artifacts."); - Console.TreatControlCAsInput = true; - for (var i = 0; i < waitTime; i++) { Host.UI.Write(ConsoleColor.Yellow, Host.UI.RawUI.BackgroundColor, "."); System.Threading.Thread.Sleep(1000); - // Check if CTRL+C has been pressed and if so, abort the wait - if (Host.UI.RawUI.KeyAvailable) + if (Stopping) { - var key = Host.UI.RawUI.ReadKey(ReadKeyOptions.AllowCtrlC | ReadKeyOptions.NoEcho | ReadKeyOptions.IncludeKeyUp); - if ((key.ControlKeyState.HasFlag(ControlKeyStates.LeftCtrlPressed) || key.ControlKeyState.HasFlag(ControlKeyStates.RightCtrlPressed)) && key.VirtualKeyCode == 67) - { - - break; - } + break; } } Host.UI.WriteLine();