Search code examples
powershellscriptingactive-directoryexchange-server

Set-Msoluser : Access Denied. You do not have permissions to call this cmdlet


UPDATE

I have successfully connected to Office 365 Admin service and Exchange Online Services. I have tested the cmdlets such as Get-MsolUser and they work fine. However, when I try to run the command Set-MsolUser to change the Title, I get the Access Denied error as shown below. It's weird because I can manually go into Exchange and change any property I want but it won't let me run this command? Any way around this?

Script to update Office 365 user attributes

## Variables
$systemmessagecolor = "cyan"
$processmessagecolor = "green"
$savedcreds=$false                      ## false = manually enter creds, True = from file
$credpath = "c:\downloads\tenant.xml"   ## local file with credentials if required

## If you have running scripts that don't have a certificate, run this command once to disable that level of security
## set-executionpolicy -executionpolicy bypass -scope currentuser -force

Clear-Host

write-host -foregroundcolor $systemmessagecolor "Script started`n"

#install-module msonline
Import-Module -Name "C:\Temp\MsOnline" -Verbose
write-host -foregroundcolor green "MSOnline module loaded"

## Get tenant login credentials
$cred = Get-Credential


## Connect to Office 365 admin service
connect-msolservice -credential $cred
write-host -foregroundcolor $systemmessagecolor "Now connected to Office 365 Admin service"

## Start Exchange Online session
$EXOSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell -Credential $cred -Authentication Basic -AllowRedirection
import-PSSession $EXOSession -AllowClobber
write-host -foregroundcolor $processmessagecolor "Now connected to Exchange Online services`n"
write-host -foregroundcolor $systemmessagecolor "Script Completed`n"


# Load data from file.csv
$EXUsers = Import-csv file_path.csv


# Count variable for number of users update
$count = 0

# Go through each row that has user data in the CSV we just imported 
ForEach($User in $EXUsers)
{
    # Ppopulate hash table for Get-Msoluser splatting:
    $GetParams =
    @{
        UserPrincipalName     = $User.userPrincipalName
    }

    # Initialize hash table for Set-Msoluser splatting:
    $SetParams =
    @{
        UserPrincipalName     = $User.userPrincipalName
        Title                 = $User.title
    }

    # Get user and update.
    if ( Get-Msoluser @GetParams)
    {
         # Set User attributes
         Set-MsolUser @SetParams

         # Print that the user was updated 
         Write-Host -ForegroundColor Yellow "$User - User attributes have been updated." 

         # Update Count
         $count += 1    
     }
}

# Print the number of updated users
Write-Host $count "Users have been updated" -ForegroundColor Green

Error message:

Set-Msoluser : Access Denied. You do not have permissions to call this cmdlet.
At line:1 char:59
+ ... ncipalName "[email protected]" | Set-Msoluser -Title "Test Title"
+                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [Set-MsolUser], MicrosoftOnlineException
    + FullyQualifiedErrorId : Microsoft.Online.Administration.Automation.AccessDeniedException,Microsoft.Online.Administration.Automation.SetUser


Solution

  • SOLVED

    The access denied issue was solve by running the script in Exchange Management Shell

    Also these changes were made for the script to work properly:

    1. principleUserName -> Identity
    2. Get-MsolUser -> Get-Mailbox
    3. Set-MsolUser -> Set-User
    ## Variables
    $systemmessagecolor = "cyan"
    $processmessagecolor = "green"
    
    # Load data from file.csv
    $EXUsers = Import-csv file_path.csv
    
    # Count variable for number of users update
    $count = 0
    
    # Go through each row that has user data in the CSV we just imported 
    ForEach($User in $EXUsers)
    {
        # Ppopulate hash table for Get-Msoluser splatting:
        $GetParams =
        @{
            Identity = $User.Identity
        }
    
        # Initialize hash table for Set-Msoluser splatting:
        $SetParams =
        @{
            Identity = $User.Identity
            Title    = $User.Title
        }
    
        # Get user and update.
        if ( Get-Mailbox @GetParams)
        {
             # Set User attributes
             Set-User @SetParams
    
             # Print that the user was updated 
             Write-Host -ForegroundColor Yellow "$User - User attributes have been updated." 
    
             # Update Count
             $count += 1    
         }
    }
    
    # Print the number of updated users
    Write-Host $count "Users have been updated" -ForegroundColor Green