Microsoft cloud engineer - SharePoint, Office 365, Azure, DotNet, Angular, JavaScript.
Microsoft cloud engineer - SharePoint, Office 365, Azure, DotNet, Angular, JavaScript.

PowerShell

VIDEO – How to Add Contact for other users with MS Graph API

Wanted to share a quick demo for how to query and create Exchange Contacts for another user in Office 365 tenant with MS Graph API.   Biggest challenge was permission grant in two places (1) MS Graph API in Azure Applications and (2) Exchange Folder grant Owner to user executing the MS Graph API.  Updated blog post with second video to execute Graph API from PowerShell for automation and scheduling.   Cheers

shades_smile

Video 1 – Graph Explorer Web GUI

Video 2 – Graph API from PowerShell

PowerShell – Grant Exchange Folder

$Session = New-PSSession -ConfigurationName "Microsoft.Exchange" -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session
Add-MailboxFolderPermission -Identity "george@spjeff.com:\Contacts" –User "spjeff@spjeff.com" –AccessRights "Owner"

PowerShell – Execute Graph API

# from https://blog.mastykarz.nl/building-applications-office-365-apis-any-platform/
# Config
$clientID = "34f34d49-86b7-4437-a332-6fecaf95a244"
$tenantName = "spjeff.onmicrosoft.com"
$ClientSecret = "secret-goes-here"
$Username = "spjeff@spjeff.com"
$Password = "password-goes-here"
# Access Token
$ReqTokenBody = @{
    Grant_Type    = "Password"
    client_Id     = $clientID
    Client_Secret = $clientSecret
    Username      = $Username
    Password      = $Password
    Scope         = "https://graph.microsoft.com/.default"
} 
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody
$TokenResponse

# Data call - READ
$apis = @(
'https://graph.microsoft.com/v1.0/me/contacts',
'https://graph.microsoft.com/v1.0/me',
'https://graph.microsoft.com/v1.0/users',
'https://graph.microsoft.com/v1.0/users/george@spjeff.com/contacts')
$apis |% {
    Write-Host $_ -Fore Yellow
    Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $_ -Method GET -Body $body -ContentType "text/plain"
}
# Data call - WRITE
$newcontact = '{"givenName": "Test","surname": "Contact","emailAddresses": [{"address": "test@contact.com","name": "Pavel Bansky"}],"businessPhones": ["+1 732 555 0102"]}'
$api = 'https://graph.microsoft.com/v1.0/users/george@spjeff.com/contacts'
Invoke-RestMethod -Headers @{Authorization = "Bearer $($Tokenresponse.access_token)"} -Uri $api -Method "POST" -Body $newcontact -ContentType "application/json"

Screenshots

2020-01-28_06-59-19
2020-01-28_07-01-09
image
image
image

References

    VIDEO – Toggle Required Fields OFF

    When making bulk data changes to SharePoint List or Library you may need to temporarily turn off Required fields.   Opening this can allow us to import records, apply changes, and modify metadata without prompting that required fields are missing.   PowerShell below can help disable all Required fields OFF.    Script generates a CSV snapshot of prior configuration during run.    CSV can be used to restore original configuration for which fields are Required.

    Cheers

    shades_smile

    VIDEO

    PowerShell Code

    [CmdletBinding()]
    param (
        [bool]$required,
        [string]$restoreFilename
    )
    # Module
    Import-Module "SharePointPnPPowerShellOnline" -ErrorAction "SilentlyContinue" | Out-Null
    # Config
    $appid = "APP ID HERE"
    $appsecret = "APP SECRET HERE"
    function Main() {
        # Connect
        Connect-PnPOnline -Url "https://tenant.sharepoint.com/" -AppId $appid -AppSecret $appsecret 
        $ctx = Get-PnPContext
        $list = Get-PnPList "Test"
        $list
        if ($restoreFilename) {
            # ENABLE Required Fields
            $csv = Import-Csv $restoreFilename
            $fields = Get-PnPField -List $list
            foreach ($row in $csv) {
                $row.Guid
                $f = $fields | ? { $_.Id -eq $row.Guid }
                $f.Required = $true
                $f.Update()
            }
            $ctx.ExecuteQuery()
        }
        else {
            # DISABLE Required Fields
            $coll = @()
            $guid = (New-Guid).ToString()
            $fields = Get-PnPField -List $list
            foreach ($f in $fields) {
                if ($f.Required) {
                    Write-Host "CHANGED FIELD $($f.Title) NOT REQUIRED"
                    $f.Required = $false
                    $f.Update()
                    $coll += $f.Id
                }
            }
            $ctx.ExecuteQuery()
            $coll | Export-Csv "PNPToggleRequiredField-$guid.csv"
        }
    }
    # Main
    Main
    

    GitHub Link

    References

    How to script SharePoint Prerequisite IIS Role

    When creating a new SharePoint 2013/2016/2019 server, the IIS web role needs to be installed with certain features enabled.   Below is PowerShell one liner to accomplish that.  Cheers. 

    shades_smile

    Code

    Add-WindowsFeature NET-HTTP-Activation,NET-Non-HTTP-Activ,NET-WCF-Pipe-Activation45,NET-WCF-HTTP-Activation45,Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-App-Dev,Web-Asp-Net,Web-Asp-Net45,Web-Net-Ext,Web-Net-Ext45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Health,Web-Http-Logging,Web-Log-Libraries,Web-Request-Monitor,Web-Http-Tracing,Web-Security,Web-Basic-Auth,Web-Windows-Auth,Web-Filtering,Web-Digest-Auth,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Mgmt-Tools,Web-Mgmt-Console,Web-Mgmt-Compat,Web-Metabase,WAS,WAS-Process-Model,WAS-NET-Environment,WAS-Config-APIs,Web-Lgcy-Scripting,Windows-Identity-Foundation,Xps-Viewer -verbose

    Screenshots

    image

    Delete ALL One-Time SPTimerJobs

    One time SharePoint timer jobs can often get “stuck” and fail to execute.   Clearing them all out manually in Central Admin is tedious.  PowerShell below will remove all “One-time” jobs with a one liner. Cheers.  

    shades_smile

    PowerShell Code

    Get-SPTimerJob |? {$_.Schedule.GetType().ToString() -eq "Microsoft.SharePoint.SPOneTimeSchedule"} | % {$_.Delete()}

    Screenshot

    image

    References

    © Copyright 2016
    @ SPJeff

    Return to Top ▲Return to Top ▲