# Install PowerShell 7 and modules

Compare the recorded PowerShell 5.1/7 deployment choices and module-installation examples for Microsoft 365 administration. Version and installation observations belong to the captured environment.

!!!warning Source-derived reference
These notes were recovered from OneNote. Configuration, permissions and operating results have not been freshly verified. Confirm the applicable authority and environment before acting.
!!!

## Use Powershell 5.1 or 7?

When choosing your version you need to ask 1 question: **Q:** Does the .ps1 script need to run on a Windows endpoint (laptop/desktop)? IF **Yes**, your code must work in powershell 5.1

- Powershell 5.1(As at 20Jan2026) is still the default version of powershell that is shipped with Windows 11.
- For ease of deployment, where you can, you will want to stick with powershell 5.1 modules that are built-in to Windows.
- **Module Not Installed?**: If you have a script written for powershell 5.1 with functions from a powershell module that is not included with PS 5.1 on Windows, then you should install/deploy the module to the target endpoints before you deploy your script.

IF **No**, you should use powershell 7

- Powershell 7 can run on linux, MacOSX and Windows but it will require you to [download and install it](install-powershell-7-and-modules.md).
- Where possible use Powershell 7 because it is where MS is putting all of it's development energies.
- **AutoComplete:** has an auto complete that will reveal the available parameters for a function/command.

**EXE Powershell 5.1** powershell.exe

EXE Powershell 7 pwsh.exe

**WARNING:** DO NOT INSTALL POWERSHELL 7 FROM THE WINDOWS APP STORE

If pwsh.exe has been installed via the MS Windows App Store, the pwsh.exe will not run in a scheduled task.

## QUICK START: SUMMARY OF THE SECTIONS BELOW

You should be able to execute the code in this section and start using powershell 7 with M365.

**Step1:** Install Powershell 7 (Make sure you are using powershell 7.4 or higher.

``` powershell
winget install -e --id=Microsoft.PowerShell
```

**Step2:** Open powershell 7 Terminal as Administrator (The how-to for these steps are below)

**Step3:** Set Execution Policy for current User

``` powershell
Set-Executionpolicy -Scope CurrentUser -executionpolicy remotesigned -Force
```

PowerShellGet (using Install-Module) is being replaced by PSResourceGet (using Install-PSResource) Note: Powershell 7.4 and higher it comes with Microsoft.PowerShell.PSResourceGet

## WHY PSResourceGet?

PSResourceGet is much faster than PowerShellGet

**Step4: Set PSGallery as a trusted respository**

``` powershell
Set-PSResourceRepository -Name "PSGallery" -Trusted
```

**Step5:** Install Modules \#For "Microsoft.Graph\*"

Find-PSResource -Name "Microsoft.Graph\*" -Type Module \| Install-PSResource -Scope CurrentUser

\#For "Microsoft.Graph.Beta\*"

Find-PSResource -Name "Microsoft.Graph.Beta\*" -Type Module \| Install-PSResource -Scope CurrentUser

\#For "Microsoft.Entra\*"

Find-PSResource -Name "Microsoft.Entra\*" -Type Module \| Install-PSResource -Scope CurrentUser

\#For "Microsoft.Entra.Beta\*"

Find-PSResource -Name "Microsoft.Entra.Beta\*" -Type Module \| Install-PSResource -Scope CurrentUser

\#For "Microsoft.Entra.Beta\*"

Find-PSResource -Name "Install-Module Az\*" -Type Module \| Install-PSResource -Scope CurrentUser

\# For "ExchangeOnlineManagement" (no wildcard needed)

``` powershell
Install-PSResource -Name "ExchangeOnlineManagement" -Scope CurrentUser -NoClobber
```

Further module-installation examples follow below.

## INSTALLING POWERSHELL AND MODULES

**Powershell 7 Auto Complete:** Example of Auto complete from pwsh command line (Terminal):

type in Get-Date - **then hold Ctrl and press space** Ctrl+Space **and you will see all the available parameters**

[Screenshot retained for review](../../review/Review-status.md#asset-47fc0d6f4024030eb403)

**Modules: Installation Folder Locations for Powershell 5.1 and 7** **Scope "CurrentUser"**

- **Powershell 7**: …Documents\powershell\Modules
- **Powershell 5.1**: …Documents\WindowsPowerShell\Modules

Scope "AllUsers"

- **Powershell 7:**

C:\Program Files\PowerShell\Modules

- **Powershell 5.1** C:\Program Files\WindowsPowerShell\Modules

### STEP1: Install Powershell 7/pwsh.exe:

Use WinGet (Recommended By MS) [Install PowerShell on Windows - PowerShell \| Microsoft Learn](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-windows?view=powershell-7.5)

``` powershell
winget install -e --id=Microsoft.PowerShell
```

### STEP2: Open Powershell 7 as Administrator (See Screenshot)

- Open Terminal App
- Click the session type selector
- Hold the Ctrl key and Click Powershell (Ctrl+Click Powershell)

[Screenshot retained for review](../../review/Review-status.md#asset-82f8cb9606496c7d56f5)

### STEP3: Install Modules for Powershell 7

The source reports needing "AllowClobber" for MS Graph and Entra with Install-Module, but not for its other modules. Note that when using Install-PSResource, allowClobber is enabled by default. If you want to disable AllowClobber you need to use -NoClobber (See Install-PSResource -Name "ExchangeOnlineManagement" below for an example) Note: The install of the Az module gets it's own step below because it can be painful.

If need for powershell 5.1 Install-Module -Name "PowershellGet" -AllowClobber -Scope CurrentUser -Confirm:$false
Install-Module -Name "Microsoft.Graph*" -AllowClobber -Scope CurrentUser -Confirm:$false

``` powershell
Install-Module -Name "Microsoft.Graph.Beta*" -AllowClobber -Scope CurrentUser -Confirm:$false
```

``` powershell
Install-Module -Name "Microsoft.Entra*" -AllowClobber -Scope CurrentUser -Confirm:$false
```

``` powershell
Install-Module -Name "Microsoft.Entra.Beta*" -AllowClobber -Scope CurrentUser -Confirm:$false
```

``` powershell
Install-Module -Name "ExchangeOnlineManagement" -Scope CurrentUser -Confirm:$false
```

**For powershell 7.4+**

First you need to trust the PSGallery: Set-PSResourceRepository -Name "PSGallery" -Trusted

Note: Install-PSResource does not take wild cards so pipe the names in with Find-PSResource

\#NOTE: If you don't use the loop below you can end up install multiple versions of the same sub module.

\#THIS WILL END UP INSTALLING MULTIPLE VERSIONS OF EACH SUBMODULE.

\#The \* in the Name is a wild card to select all submodules, Microsoft.Graph.Authentication, Microsoft.Graph.User etc… \#When Find-PSResource is piped into Install-PSResource and the Name parameter ends with \*, then multiple versions of each submodule will be downloaded/installed.

\#Example(Don't use): ~~Find-PSResource -Name~~ ~~"Microsoft.Graph\*"~~ ~~-Type Module \| Install-PSResource -Scope CurrentUser~~

\#To download just the latest version of each submodule, the source uses the following. \#When Find-PSResource is piped into Install-PSResource without the \* in the Name parameter, then only the latest version of each submodule will be downloaded/installed.

#### INSTALL MODULES THAT HAVE AND INCLUDE THEIR SUBMODULES

\#PowerShell modules with submodules selected in this example. \#Only install "Az.\*" if you need it, it takes up 2GB.

``` powershell
$listOfMultiModulesWithSubmodules = @("Microsoft.Graph*","Microsoft.Graph.Beta*","Microsoft.Entra*","Microsoft.Entra.Beta*","Az.*")
$myModuleList = $listOfMultiModules | ForEach-Object {
```

``` powershell
$Module_Name = $_
```

$(Find-PSResource -Name "$(\$Module_Name)" -Type Module) \| Sort-Object Name \| Select-Object Name -Unique -ExpandProperty Name

}

\#INSTALL ALL MODULES and SUBMODULES THAT WERE FOUND BY Find-PSResource

$($myModuleList).Name \| Install-PSResource -Scope CurrentUser

#### INSTALL MODULES THAT HAVE NO SUBMODULES

``` powershell
$listOfSingleModules = @("PnP.PowerShell","ExchangeOnlineManagement","WindowsAutoPilotIntune","MicrosoftTeams","ImportExcel","Join-Object","MsrcSecurityUpdates","Pester","Microsoft365DSC","PSParseHTML")
```

``` powershell
$modulesWithNoSubmodules = $listOfSingleModules | foreach {
```

\$Module_Name = $_
Install-PSResource -Name "$(\$Module_Name)" -Scope CurrentUser }

\# For "ExchangeOnlineManagement" (no submodules to no wildcard needed)

``` powershell
Install-PSResource -Name "ExchangeOnlineManagement" -Scope CurrentUser -NoClobber
```

#### OTHER HELPFUL MODULES

Template for installing the modules: Windows Powershell 5.1

``` powershell
Install-Module -Name "Insert a Module name from the list below" -Scope CurrentUser -Confirm:$false
Windows Powershell 7
Install-PSResource -Name "Insert a Module name from the list below" -Scope CurrentUser -NoClobber
```

ImportExcel (A truly wonderful module that makes xlsx files from csv and it allows you to free top row and make bold, add filter.

MicrosoftTeams

PnP.PowerShell (For working with Sharepoint) Microsoft.Entra

WindowsAutoPilotIntune

Microsoft365DSC (Desired State Configuration (DSC). Allows you to save and compare M365 cloud configurations. Can compare current config with [ACSC](https://blueprint.asd.gov.au/tools/deployment-and-assessment/desired-state-configuration-setup/) DSC etc…)

Join-Object (See [Join-Object/README.md at master · ili101/Join-Object · GitHub](https://github.com/ili101/Join-Object/blob/master/README.md))

PSParseHTML

MsrcSecurityUpdates

Pester (Haven't used yet, but want to. It's a testing framework)

platyPS (Allows you to create PowerShell External Help in Markdown)

Array of the above list if you wanted to use it.

### STEP4: Install the Az Module

**(**[Install Azure PowerShell with PowerShellGet \| Microsoft Learn](https://learn.microsoft.com/bs-latn-ba/powershell/azure/install-az-ps?view=azps-0.10.0#install-the-azure-powershell-module)\*\*)\*\*

**Az** module is used for managing Azure Resources. For example, to get DNS records from Azure you need this module.

**The Pain:** This one can be a pain to install as it wasn't downloading the newest Az.Account. Then upgrading can also be painful (

If first time installing install with

3A) Open Powershell as Administrator 3B) Install-Module -Name Az -Repository PSGallery -MinimumVersion 15.2.0 -Force -Scope "CurrentUser"

OR

Find-PSResource -Name "Az.\*" -Type Module \| Install-PSResource -Scope CurrentUser

**Check for all installed Versions of Az**

``` powershell
Get-InstalledModule -Name Az -AllVersions | Select-Object -Property Name, Version
```

## HOW TO Uninstall Powershell Modules

## Uninstall approach recorded in the source

The author describes manually deleting module folders, explicitly noting that this is not the Microsoft-recommended method. This companion does not validate or recommend that deletion approach. The captured example targets folders matching `Microsoft.Graph*` beneath the user Documents/PowerShell/Modules directory.

**Example 2:** Uninstalling Az Goto: …Documents\powershell\Modules Delete all the folders that match "Az.\*"

You may also need to check and delete folders from these (scope "AllUsers") folders: C:\Program Files\PowerShell\Modules

C:\Program Files\WindowsPowerShell\Modules

**4. (Optional) Scan your C drive for other powershell module locations.**

Searching for the powershell modules on your computer using an app called **Everything** by [voidtools](https://www.voidtools.com/en-au/).

**Install using winget:** winget install -e --id=voidtools.Everything

## Related guidance

- [Topic overview](Introduction.md)
- [Source review status](../../review/Review-status.md)
