function GetSiteUrl([string] $webUrl) { $webUrl = $webUrl.ToLower() if ($webUrl.IndexOf("/sites/") -lt 0) { if ($webUrl.IndexOf("/", 8) -lt 0){ return $webUrl } return $webUrl.Substring(0, $webUrl.IndexOf("/", 8)) } else { if ($webUrl.IndexOf("/", $webUrl.IndexOf("/sites/") + 7) -lt 0){ return $webUrl; } return $webUrl.Substring(0, $webUrl.IndexOf("/", $webUrl.IndexOf("/sites/") + 7)); } } function GetAdminUrl([string] $webUrl) { $webUrl = $webUrl.ToLower() if ($webUrl.IndexOf("/", 8) -gt 0){ $webUrl = $webUrl.Substring(0, $webUrl.IndexOf("/", 8)) } $p1 = $webUrl.Substring(0, $webUrl.IndexOf(".")); $p2 = $webUrl.Substring($webUrl.IndexOf(".")); return $p1 + "-admin" + $p2; } try{ Write-Host " " Write-Host "Welcome to Infowise Ultimate Forms installation" -ForegroundColor Yellow Write-Host "*******************************************************************************************************" if(Get-Module -Name Microsoft.Online.SharePoint.PowerShell -ListAvailable){ } else { Write-Host 'SharePoint Online Management Shell is not installed' -ForegroundColor Red Write-Host 'Download and install it from https://www.microsoft.com/en-us/download/details.aspx?id=35588' Read-Host "Press Enter to exit..." exit } if(Get-Module -Name SharePointPnPPowerShellOnline -ListAvailable){ } else { Write-Host 'SharePoint PnP module is not installed' -ForegroundColor Red Write-Host 'Run PowerShell as Administrator and execute command: Install-Module SharePointPnPPowerShellOnline' Read-Host "Press Enter to exit..." exit } Write-Host "Please ensure that 'Custom script' is allowed in your SharePoint Administration:" Write-Host "https://docs.microsoft.com/en-us/sharepoint/allow-or-prevent-custom-script" -ForegroundColor Cyan Write-Host "Make sure you are running this utility as a Global Administrator" Write-Host "When prompted, enter the URL of the site where you want to install the app, and credentials for access" Write-Host "*******************************************************************************************************" Write-Host " " Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking Import-Module SharePointPnPPowerShellOnline -DisableNameChecking $webUrl = Read-Host 'Site URL (e.g. https://acme.sharepoint.com/sites/roadrunner)' $siteUrl = GetSiteUrl $webUrl $adminUrl = GetAdminUrl $webUrl $cred = Get-Credential Connect-SPOService -Url $adminUrl -Credential $cred Write-Host '* Connected to SharePoint' Set-SPOSite -Identity $siteUrl -DenyAddAndCustomizePages $false Write-Host '* Add and customize pages allowed' $webConnection = Connect-PnPOnline –Url $webUrl –Credentials $cred -ReturnConnection $siteConnection = Connect-PnPOnline –Url $siteUrl –Credentials $cred -ReturnConnection $tenantApps = Get-PnPApp $scApps = Get-PnPApp -Scope site $ufAppTenant = $tenantApps | Where Title -EQ "Infowise Ultimate Forms" $extAppTenant = $tenantApps | Where Title -EQ "Infowise Ultimate Forms Extensions" Write-Host '* Existing app installation checked' $location = Get-Location if($ufAppTenant.Count -eq 0){ $catRes = Get-SPOSiteCollectionAppCatalogs -Site $siteUrl if($catRes.Count -eq 0){ Write-Host '* Site collection app catalog does not exist' Add-SPOSiteCollectionAppCatalog -Site $siteUrl Write-Host '* Site collection app catalog created' -ForegroundColor Green } $ufApp = $scApps | Where Title -EQ "Infowise Ultimate Forms" if($ufApp.Count -eq 0){ Write-Host '* Site collection app existence checked' $WebClient = New-Object System.Net.WebClient $appLoc = -join($location, "\Infowise Ultimate Forms.app") $WebClient.DownloadFile("https://storage.infowisesolutions.com/apps/Infowise Ultimate Forms.app", $appLoc) Add-PnPApp -Path $appLoc -Scope Site -Connection $siteConnection Write-Host '* Main app uploaded to site collection catalog' } else{ Write-Host '* Main app already found in site collection catalog, version: ' $ufApp.AppCatalogVersion } Install-PnPApp -Identity 97F0DF41-7C13-4E98-8789-21DFAB66FB47 -Scope Site -Connection $webConnection Write-Host '* Main app installation started from site collection app catalog' } else { Install-PnPApp -Identity 97F0DF41-7C13-4E98-8789-21DFAB66FB47 -Connection $webConnection Write-Host '* Main app installation started from tenant app catalog' } if($extAppTenant -eq 0 -Or $extAppTenant.Deployed -ne $true){ $catRes = Get-SPOSiteCollectionAppCatalogs -Site $siteUrl if($catRes.Count -eq 0){ Write-Host '* Site collection app catalog does not exist' Add-SPOSiteCollectionAppCatalog -Site $siteUrl Write-Host '* Site collection app catalog created' } $extApp = $scApps | Where Title -EQ "Infowise Ultimate Forms Extensions" if($extApp.Count -eq 0){ $WebClient = New-Object System.Net.WebClient $extLoc = -join($location, "\Infowise Ultimate Forms Extensions.sppkg") $WebClient.DownloadFile("https://storage.infowisesolutions.com/apps/Infowise Ultimate Forms Extensions.sppkg", $extLoc) Add-PnPApp -Path $extLoc -Scope Site -Publish -Connection $siteConnection Write-Host '* Extensions app uploaded to site collection catalog' } else{ Write-Host '* Extensions app already found in site collection catalog, version: ' $extApp.AppCatalogVersion } Install-PnPApp -Identity DF0712F0-7FE6-44B3-8577-E9A008C6E1E3 -Scope Site -Connection $webConnection Write-Host '* Extensions app installation started from site collection app catalog' Read-Host "All Done! Press Enter to exit..." } else { Write-Host '* Extensions app already deployed on tenant' Read-Host "All done! Please allow the apps a few minutes to finish installation. Press Enter to exit the script" } } catch { Write-Host 'Error occurred:' $Error[0].ToString(); } # SIG # Begin signature block # MIITswYJKoZIhvcNAQcCoIITpDCCE6ACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2ZU+PguVKjDPuTrR7ZnOdpt8 # 7CygghDrMIIFaTCCBFGgAwIBAgIQDkpMmakyjkZtFcJjJ5dryzANBgkqhkiG9w0B # AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy # MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi # BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMDA1MDcwMDAw # MDBaFw0yMzA1MDcyMzU5NTlaMIGoMQswCQYDVQQGEwJDQTEQMA4GA1UEEQwHTTRT # IDNFMjEQMA4GA1UECAwHT250YXJpbzEQMA4GA1UEBwwHVG9yb250bzEhMB8GA1UE # CQwYMTkyMCBZb25nZSBTdCwgU3VpdGUgMjAwMR8wHQYDVQQKDBZJbmZvd2lzZSBT # b2x1dGlvbnMgTHRkMR8wHQYDVQQDDBZJbmZvd2lzZSBTb2x1dGlvbnMgTHRkMIIB # IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9wuKpCf/cdHjHdewGYl2QUog # 0hfkf5fWUaNwxmxl9/U/tMdJhMjAFD7MVXAZQ/F0DVEMUwESIfsZfQX+peflpqY0 # 5/8oxymvDd631W4cJ9I5f+cgUlu5MqlbwRocyU2XueB3ajYQMr2flEz5ul+6XQw2 # IF61CcgClXhVD2/YkT+f55ZBMw0osKo/5ZJUknMy5qu1AHkVlmZ4PqmarZvZWIBn # hW7UvvkKKh3/rk54gspCjqEVfWoBfwM+wlcSUQnWGRYhVuizozr6nzoesJaNhazQ # btfTjlIjThvAVqsNOxXw4jVATc5vpW5EOBXdwcY07XYLlJn1zMnLPSjKFdQILQID # AQABo4IBuDCCAbQwHwYDVR0jBBgwFoAUDuE6qFM6MdWKvsG7rWcaA4WtNA4wHQYD # VR0OBBYEFEwXLo1U+5I2ueVXVd8iUlFWVUNTMA4GA1UdDwEB/wQEAwIHgDAMBgNV # HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIBAQQEAwIE # EDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdodHRw # czovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYy # aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBQ29kZVNpZ25pbmdDQS5j # cmwwcwYIKwYBBQUHAQEEZzBlMD4GCCsGAQUFBzAChjJodHRwOi8vY3J0LnNlY3Rp # Z28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNydDAjBggrBgEFBQcwAYYX # aHR0cDovL29jc3Auc2VjdGlnby5jb20wJgYDVR0RBB8wHYEbc2FsZXNAaW5mb3dp # c2Vzb2x1dGlvbnMuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQB4ioZG23Xvs9bKzflh # M4nSYRFE+mKrBMYcMJA3VeFkuOMBoybHUJLEcRMith2hwkwcF5ViL4J4O9a0nO8T # jcYjN4DaiUiNBzEgh3C0WRL0sc6XVmwQbHlPc/OjauMta//0ZGt6NZISe+HlQiuD # id2LKDfcsEMSI5iN2kuxTZ8NQeqXP79P3n5dCCAbFaOVI2FGL2ixQyZx4LBdI0V8 # b6aPlHm/RG+VQywim7R8shq1JlZzc98WlWwkZ6mprFoLGlfzcbhyBZDJ1O7XZ8zA # z2e+dP6Tl3tquzyq0yOhwTWw4ZZ/lq6/d2ZpbYb067VUqEsvzD35AOiqVsWslVif # vmehMIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwF # ADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAw # DgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8G # A1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoX # DTI4MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVy # c2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVT # VCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24g # QXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYO # w9sIs9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH # 2jnGvDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGI # GGqQIjy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bI # cmfbIWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3 # XJq0tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xg # k97Exwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwy # hGNVicQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLix # P6Q5D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJ # SdhJWBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+x # UGUJ5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu # 6lzGKAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAW # gBSgEQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd # 8rIDZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAow # CDAGBgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2Eu # Y29tL0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEB # DAUAA4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3v # A0p+rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79 # Q2R+/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BB # C5gACiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97 # GA1FzZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOip # akyAvGp4z7h/jnZymQyd/teRCBaho1+VMIIF9TCCA92gAwIBAgIQHaJIMG+bJhjQ # guCWfTPTajANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg # VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlm # aWNhdGlvbiBBdXRob3JpdHkwHhcNMTgxMTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5 # WjB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAw # DgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAiBgNV # BAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEB # BQADggEPADCCAQoCggEBAIYijTKFehifSfCWL2MIHi3cfJ8Uz+MmtiVmKUCGVEZ0 # MWLFEO2yhyemmcuVMMBW9aR1xqkOUGKlUZEQauBLYq798PgYrKf/7i4zIPoMGYmo # bHutAMNhodxpZW0fbieW15dRhqb0J+V8aouVHltg1X7XFpKcAC9o95ftanK+ODtj # 3o+/bkxBXRIgCFnoOc2P0tbPBrRXBbZOoT5Xax+YvMRi1hsLjcdmG0qfnYHEckC1 # 4l/vC0X/o84Xpi1VsLewvFRqnbyNVlPG8Lp5UEks9wO5/i9lNfIi6iwHr0bZ+UYc # 3Ix8cSjz/qfGFN1VkW6KEQ3fBiSVfQ+noXw62oY1YdMCAwEAAaOCAWQwggFgMB8G # A1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQO4TqoUzox # 1Yq+wbutZxoDha00DjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIB # ADAdBgNVHSUEFjAUBggrBgEFBQcDAwYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRV # HSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V # U0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcB # AQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VS # VHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3Au # dXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEATWNQ7Uc0SmGk295qKoyb # 8QAAHh1iezrXMsL2s+Bjs/thAIiaG20QBwRPvrjqiXgi6w9G7PNGXkBGiRL0C3da # nCpBOvzW9Ovn9xWVM8Ohgyi33i/klPeFM4MtSkBIv5rCT0qxjyT0s4E307dksKYj # alloUkJf/wTr4XRleQj1qZPea3FAmZa6ePG5yOLDCBaxq2NayBWAbXReSnV+pbjD # bLXP30p5h1zHQE1jNfYw08+1Cg4LBH+gS667o6XQhACTPlNdNKUANWlsvp8gJRAN # GftQkGG+OY96jk32nw4e/gdREmaDJhlIlc5KycF/8zoFm/lv34h/wCOe0h5DekUx # wZxNqfBZslkZ6GqNKQQCd3xLS81wvjqyVVp4Pry7bwMQJXcVNIr5NsxDkuS6T/Fi # kyglVyn7URnHoSVAaoRXxrKdsbwcCtp8Z359LukoTBh+xHsxQXGaSynsCz1XUNLK # 3f2eBVHlRHjdAd6xdZgNVCT98E7j4viDvXK6yz067vBeF5Jobchh+abxKgoLpbn0 # nu6YMgWFnuv5gynTxix9vTp3Los3QqBqgu07SqqUEKThDfgXxbZaeTMYkuO1dfih # 6Y4KJR7kHvGfWocj/5+kUZ77OYARzdu1xKeogG/lU9Tg46LC0lsa+jImLWpXcBw8 # pFguo/NbSwfcMlnzh6cabVgxggIyMIICLgIBATCBkDB8MQswCQYDVQQGEwJHQjEb # MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgw # FgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENv # ZGUgU2lnbmluZyBDQQIQDkpMmakyjkZtFcJjJ5dryzAJBgUrDgMCGgUAoHgwGAYK # KwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB # BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU # UUwMGB/YWIgMpUfgr7ItFKB+5zcwDQYJKoZIhvcNAQEBBQAEggEAnNqk/IYYd54P # XFmFyZSF/O1/2drwLHRbyCiUnSWTiOSYWhvb1IOR8K174Ebrip4niYJBJ2pUv1C6 # E29OO3nd6FPQdFLrcM0xONStmJNGU+3EXWjsJexR7ry6DFLFFGPJOKXXH3fzLuRQ # gwXtUb2p5dhj93AZ9USHI2BdjRqJ04PdgtIwBDUTSlvlH5EYrxgBv1tE8gg3Vp1i # PLWdqwQU8NCM+xwdUwrGbqOItDNnNwIWh3XB/URrms3PrKLB6zr8ch764Pdg8D6S # oa6217IUXf9+nQMQix6HfsW4odWNg6llJxB1RBNgDfUIpw1T4Ko0F58y8ge6vkHh # 9OAIoI2zyg== # SIG # End signature block