Friday, 22 December 2017

How to find file and folder size using PowerShell

We can use the PowerShell cmdlet Get-Item to get file information including size of a file, we can also the the same command to get folder or directory information but it will return the size of folder as folder is determined by size of all the files that are inside the particular directory.

Find file size :

The below command returns the size of the given file as bytes.
$file = 'C:\Samples\Test.csv'
$size=(Get-Item $file).length
Write-Host "Size(Bytes): "$size -ForegroundColor Green

Get file size as KB, MB and GB :

We can use the function [System.Math]::Round to convert the byte value to desired unit like KB, MB and GB.
$file = 'C:\Samples\TestVideo.mp4'
$size = (Get-Item $file).length
$sizeKB = [System.Math]::Round((($size)/1KB),2)
$sizeMB = [System.Math]::Round((($size)/1MB),2) 
$sizeGB = [System.Math]::Round((($size)/1GB),2)
Write-Host "Size(KB): "$sizeKB -ForegroundColor Green
Write-Host "Size(MB): "$sizeMB -ForegroundColor Green
Write-Host "Size(GB): "$sizeGB -ForegroundColor Green

Find folder size :

You can’t directly find the size of a directory, but you can indirectly determine the size of a folder by getting files using the cmdlets Get-ChildItem and Measure-Object.
$folderInfo = Get-ChildItem C:\Scripts | Measure-Object -Property Length -Sum
$filesCount = $folderInfo.Count
$folderSize = $folderInfo.Sum
$folderSizeMB = [System.Math]::Round((($folderSize)/1MB),2) 
Write-Host "Folder Size(MB): "$folderSizeMB  "Total Files: "$filesCount -ForegroundColor Green
Note: The above command calculate folder size only using first level files , it will not include the nested folder files.

Find entire folder size with recursively :

To find actual directory size we need to query the Get-ChildItem with -Recurse parameter to et nested level of folder files.
$folderInfo = Get-ChildItem C:\Scripts -Recurse | Measure-Object -Property Length -Sum
$allfilesCount = $folderInfo.Count
$folderSize = $folderInfo.Sum
$folderSizeMB = [System.Math]::Round((($folderSize)/1MB),2) 
$folderSizeGB = [System.Math]::Round((($folderSize)/1GB),2) 
Write-Host "Folder Size(MB): "$folderSizeMB  "Total Files: "$filesCount -ForegroundColor Green
Write-Host "Folder Size(GB): "$folderSizeGB -ForegroundColor Green

Thursday, 21 December 2017

Connect Microsoft Graph API using PnP PowerShell

In this article I will show you how to connect Microsoft Graph and query user details using SharePoint PnP PowerShell Online module.

Prerequisites:

Before proceed we need to download and install the latest PnP PowerShell module. You can download latest released setup from GitHub. If your main OS is Windows 10, and if you have PowerShellGet installed, you can run the following command to install the PnP PowerShell module instead of download and install the setup:
Install-Module SharePointPnPPowerShellOnline -SkipPublisherCheck -AllowClobber -Force

Connect PnPOnline and Get Access Token:

To connect and query Microsoft Graph api end-point, first we need to get the access token with required permissions using Connect-PnPOnline and Get-PnPAccessToken cmdlets.
Connect-PnPOnline -Scopes "User.Read","User.ReadBasic.All"
$accessToken =Get-PnPAccessToken
You can refer Microsoft Grap Documentation to know more about required permissions for every end-point url.

Connect and Get data from Microsoft Graph Api :

Once you get the required access token you can easily query graph api using Invoke-RestMethod cmdlet by passing access token.

Example 1: The below command get the current user profile details.
$apiUrl = "https://graph.microsoft.com/v1.0/me"
$myPrfoile = Invoke-RestMethod -Headers @{Authorization = "Bearer $accessToken"} -Uri $apiUrl -Method Get
Example 2: The below command get all the Azure AD user details.
$apiUrl = "https://graph.microsoft.com/v1.0/users"
$users = Invoke-RestMethod -Headers @{Authorization = "Bearer $accessToken"} -Uri $apiUrl -Method Get
Note: You can also refer this document Microsoft Graph Api Permissions to know more about Delegated permissions and Application permissions (Admin Consent).

PnP-PowerShell Module Install - Authenticode Issuer Mismatch

Problem:

I am receiving the publisher check error when I try to install SharePoint Online PnP PowerShell module from PowerShell window using below command.
Install-Module SharePointPnPPowerShellOnline
Error message:
Install-Module SharePointPnPPowerShellOnline -Force
PackageManagement\Install-Package : Authenticode issuer 'CN=Microsoft Root Certificate Authority 2011, O=Microsoft
Corporation, L=Redmond, S=Washington, C=US' of the new module 'SharePointPnPPowerShellOnline' with version
'2.21.1712.2' is not matching with the authenticode issuer 'CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For
authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US' of the previously-installed module
'SharePointPnPPowerShellOnline' with version '2.20.1711.0'. If you still want to install or update, use
-SkipPublisherCheck parameter.
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 char:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package],
   Exception
    + FullyQualifiedErrorId : AuthenticodeIssuerMismatch,Validate-ModuleAuthenticodeSignature,Microsoft.PowerShell.Pac
   kageManagement.Cmdlets.InstallPackage

Cause:

I have searched through Google and I see some people receiving the same error while update PnP PowerShell using the command "Update-Module SharePointPnPPowerShell*" and the cause of error is due to new signing certificates where used in latest setup.

Solution:

I have fixed this problem by setting the parameter SkipPublisherCheck as AllowClobber.
Install-Module SharePointPnPPowerShellOnline -SkipPublisherCheck -AllowClobber
-or-
Install-Module SharePointPnPPowerShellOnline -SkipPublisherCheck -AllowClobber -Force
Complete PowerShell Console log:
PnP-PowerShell  Module Install Error Authenticode Issuer Mismatch

Wednesday, 20 December 2017

Set Auto Reply on a Mailbox in Office 365 using PowerShell

In this post I am going to share how to configure automatic reply or out-of-office message on a user's mailbox. We can use the Set-MailboxAutoReplyConfiguration cmdlet to configure automatic reply settings for a specific user mailbox and this cmdlet is available for both Exchange On-Premises and Exchange Online environment.

Before proceed, first we need to connect Exchange Online powershel module by running below commands:
$o365Cred = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $o365Cred -Authentication Basic -AllowRedirection
Import-PSSession $Session

Summary:


Set Automatic Reply for user's mailbox :

The below command configures Automatic Reply message to be sent on AlexW's mailbox.
Set-MailboxAutoReplyConfiguration -Identity "AlexW" -AutoReplyState Enabled -InternalMessage "Out of Office message for internal mails." -ExternalMessage "Out of Office message for external mails."
Once you run the above command the mailbox of AlexW will instantly start to send automatic reply for all incoming mails, instead if you want to send out of office message only for particular days, you need to set parameter -AutoReplyState as "Scheduled".

Set Automatic Reply in a specific time period :

If you want to configure to send auto reply message in a particular days like office holidays or when employees on leave, you need to set parameter -AutoReplyState as "Scheduled" along with "StartTime" and "EndTime".
Set-MailboxAutoReplyConfiguration -Identity "AlexW" -AutoReplyState Scheduled -StartTime "07/10/2018 01:00:00" -EndTime "7/15/2018 23:00:00" -InternalMessage "Internal out-of-office message"
Note: The parameters StartTime and EndTime are meaningful only when AutoReplyState is Scheduled. To set value for these two parameter, you need to use the short date format that's defined in the Regional Options settings on the computer where you're running the command.

Disable or Stop Auto Reply message :

Run the below command to disable or stop the out of office message.
Set-MailboxAutoReplyConfiguration -Identity "AlexW" -AutoReplyState Disabled
Run the below command if you want to clear or remove Internal/External message when you stop auto reply.
Set-MailboxAutoReplyConfiguration -Identity "AlexW" -AutoReplyState Disabled -InternalMessage "" -ExternalMessage ""

Disable Auto Reply message for External senders :

The Set-MailboxAutoReplyConfiguration cmdlet includes the parameter ExternalAudience, it specifies whether Automatic Replies are sent to external senders or not.

Valid values for ExternalAudience:
  • None - Don't sent message to any external senders.
  • Known - Send only to external senders that are specified in the Contact list of the mailbox.
  • All - Send to all external senders. This is the default value
 The below command enables auto reply for only internal senders by setting ExternalAudience value as "None".
Set-MailboxAutoReplyConfiguration -Identity "AlexW" -ExternalAudience "None" -AutoReplyState Scheduled -StartTime "07/10/2018 01:00:00" -EndTime "7/15/2018 23:00:00" -InternalMessage "Internal auto-reply message"

Get Automatic Reply Configuration :

Once you have configured the automatic reply settings you can get the latest setting by running below command.
Get-MailboxAutoReplyConfiguration -Identity "AlexW"
Run the below command if you want to get settings for all the mailbox users.
Get-Mailbox -ResultSize unlimited | Get-MailboxAutoReplyConfiguration

Monday, 18 December 2017

Create New Office 365 User Account using Powershell

Office 365 is not a single service and it is the brand name Microsoft uses for a group of cloud services along with new features in desktop Office suite. Azure Active Directory is the storage service for Office 365 user identities, we can easily create a new user account using the Azure AD powershell cmdlet New-MsolUser.

Note: Before proceed, Install and Configure Azure AD PowerShell and run the below command to connect Azure AD PowerShell module.
Import-Module MSOnline
$msolCred = Get-Credential
Connect-MsolService –Credential $msolCred

Summary:

Create new Office 365 user account :

Use the below command to create an individual user account without license subscription:
New-MsolUser -DisplayName "Steve Smith" -UserPrincipalName steves@contoso.com -Password "pass@word1" -FirstName Steve -LastName Smith
Note: The input -Password is the optional parameter if you don't specify a password, a random password will be assigned to the user account, and the password is visible in the results of the command.

Create new user account and assign license :

You don't need to assign a license when you create user account, but without license the new user can't access any of Office 365 services. Before proceed you need to get AccountSkuId of the license plan that you want to assign to new user, you can use the Get-MsolAccountSku cmdlet to get the available licensing plans ( AccountSkuId ) for your organization. For more info, see Get list of Office 365 licenses using Powershell.

The below command creates new Office 365 user account named "Steve Smith", set the Usage Location as United States and assign the license plan "contoso:ENTERPRISEPREMIUM".
New-MsolUser -DisplayName "Steve Smith" -UserPrincipalName steves@contoso.com -UsageLocation US -LicenseAssignment "contoso:ENTERPRISEPREMIUM" -FirstName Steve -LastName Smith
Note: The Usage Location is mandatory for the user when you assign license.

Create Bulk Office 365 user accounts from CSV file

Creating bulk user accounts is one of the important task for every Office 365 admin when multiple new employees join to organisation. In this case we can import user account details from CSV (Comma-Separated Value) file. Consider the CSV file NewOffice365Users.csv which contains user information with the column headers UserPrincipalName, FirstName, LastName, DisplayName, UsageLocation, AccountSkuId.

The below command creates user accounts by importing user details from the file "C:\NewOffice365Users.csv", and exports the results to "C:\NewAccountResults.csv".
Import-Csv "C:\NewOffice365Users.csv" | ForEach-Object {
New-MsolUser -DisplayName $_.DisplayName -UserPrincipalName $_.UserPrincipalName -UsageLocation $_.UsageLocation -LicenseAssignment $_.AccountSkuId -FirstName $_.FirstName -LastName $_.LastName 
} | Export-CSV "C:\\NewAccountResults.csv" -NoTypeInformation -Encoding UTF8
Note: We didn't given the input parameter -Password in above command, so a random password will be assigned to every user accounts, and new password will be available in the exported csv file "C:\NewAccountResults.csv".

Friday, 15 December 2017

Export Blocked Office 365 Users to CSV using PowerShell

Getting list of sign-in blocked Azure AD users is one of the important task for every Office 365 admin to decide whether we are spending our license for valid user accounts or not. We can use the Azure AD powershell cmdlet Get-MsolUser to find and get a list of Office 365 users who are blocked to login into Office 365 service (Ex: Mailbox, Teams, Planner, SharePoint, etc).

Note: Before proceed, Install and Configure Azure AD PowerShell

Summary:


Find and List Blocked Users :

The Get-MsolUser cmdlet returns all the Azure AD users and we can apply the Where filter with parameter BlockCredential to get only sign-in blocked users.
Get-MsolUser -All | Where {$_.BlockCredential -eq $True} | Select DisplayName,UserPrincipalName

Export Blocked Users to CSV :

Run the below command to export all the users who have been blocked to login into Office 365 services.
Get-MsolUser -All | Where {$_.BlockCredential -eq $True} |
Select DisplayName,UserPrincipalName, IsLicensed |
Export-CSV "C:\\Blocked_Users.csv" -NoTypeInformation -Encoding UTF8

Export Licensed and Blocked Users to CSV :

Normally we will block access to the users who are leaving office or terminated employees, once we blocked access to Office 365 service the next step is to remove existing license subscriptions from blocked users, so we need to get a list of users who are licensed and blocked to login into Office portal. Run the following command to export all the licensed users who have been blocked.
Get-MsolUser -All | Where {$_.IsLicensed -eq $True -AND $_.BlockCredential -eq $True} |
Select DisplayName,UserPrincipalName, BlockCredential |
Export-CSV "C:\\Blocked_Licensed_Users.csv" -NoTypeInformation -Encoding UTF8
Note: Checkout this post : Manage Office 365 License using Powershell to add a new license, remove an existing license and update existing license subscription using PowerShell command.

Wednesday, 13 December 2017

Generate Random Numbers within a Range using PowerShell

We may required to generate a random number to set ID or in some cases to set temporary password. In PowerShell we can easily generate random numbers using Get-Random cmdlet and we can also use this cmdlet to select objects randomly from a collection of objects.

Summary:

Example 1: Get a random number

If you run Get-Random command without parameters or input it will returns a 32-bit unsigned random integer between 0 (zero) and Int32.MaxValue (2,147,483,647).
PS C:\> Get-Random
475917250

Example 2: Get a random number between given range

To set the range, we need to use the parameters -Minimum and -Maximum. The below command return a random number between 1 and 100.
PS C:\> Get-Random -Minimum 1 -Maximum 100
27

Example 3: Get a random number from array of numbers

Instead of generating random number from a given range we can also get a random number from our own list of numbers.
PS C:\> Get-Random -InputObject 1, 2, 4, 8, 12, 16,20,24
16
We can also get more than one random numbers by setting the parameter -Count.
PS C:\> Get-Random -InputObject 1, 2, 4, 8, 12, 16,20,24 -Count 3
2
8
20

Example 4: Get a character from random ASCII code

The ASCII code of upper-case alphabetical characters starts from 65 (A) and ends in 90 (Z), and lower-case chars starts from 97 (a) and ends in 122 (z), so we can get random number within this range and convert it to alphabetical character.
$code = Get-Random -Minimum 65 -Maximum 90
$random_char = [char]$code
Write-Host $random_char -ForegroundColor 'Yellow'

Example 5: Generate random password from ASCII code

In some situation we may required to generate random password from ASCII values with standard format, we can easily achieve this by getting random chars within the range of ASCII code.
$randomPassword = ""
1..5 | ForEach { 
$code = Get-Random -Minimum 65 -Maximum 122
$randomPassword = $randomPassword + [char]$code
}
Write-Host $randomPassword -ForegroundColor 'Yellow'

Tuesday, 12 December 2017

Reset Office 365 User Password using PowerShell

As you know Office 365 user identities are stored in Azure Active Directory, we can use the Azure AD powershell cmdlet Set-MsolUserPassword to set password of a user. You may already used the Set-MsolUser cmdlet to update user properties but we can't use the same command to change password.

Note: Before proceed, Install and Configure Azure AD PowerShell and run the following command to connect Azure AD powershell module.
Import-Module MSOnline
$msolCred = Get-Credential
Connect-MsolService –Credential $msolCred

Summary:

Set Password for Single User:

Run the below command to change the password for a single O365 user.
Set-MsolUserPassword –UserPrincipalName "user@domain.com" –NewPassword "pass@word1" -ForceChangePassword $False
Note: If you are Help Desk admin and you are resetting one time password for your end-user, you need to set the parameter -ForceChangePassword as $True, it will force the users to change their password from the portal the next time they sign-in.

You can find whether an user's password is set or not by getting user's password last set time by using Get-MsolUser cmdlet.
Get-MSOLUser -UserPrincipalName "user@domain.com" | Select DisplayName,LastPasswordChangeTimestamp

Change Password for Multiple Users:

In some scenarios, you might want to set temporary password for set of new users who are created in recent days. We can get the recently created users using Get-MsolUser cmdlet. The below command set temporary password for bulk users who are created in last 7 days, you can change the no of days or the Where filter as per your need.
Get-MsolUser -All | Where-Object { $_.WhenCreated –gt ([System.DateTime]::Now).AddDays(-7)} |
Set-MsolUserPassword –NewPassword "pass@word1" -ForceChangePassword $True

Reset Bulk Office 365 Users Password from CSV file

In some scenarios, we may required to set password for bulk azure ad users by importing user identities from csv file. Consider the CSV file office365users.csv which contains every user's userPrincipalName in each row with the column header UserPrincipalName.
Import-Csv 'C:\office365users.csv' | ForEach-Object {
$upn = $_."UserPrincipalName"
$tempPwd = "pass@word1"
Set-MsolUserPassword -UserPrincipalName $upn –NewPassword $tempPwd -ForceChangePassword $True
}

Friday, 8 December 2017

Find list of active mailboxes in Office 365 with PowerShell

We can use the Exchange powershell cmdlet Get-MailboxStatistics (On-premises and Online) to check the Last logon time of an user's mailbox. In this post I am going share powershell commands to find and get a list of active users who are actively using their mailbox in Office 365 environment.

Before proceed, first we need to connect Exchange Online powershel module by running below commands:
$o365Cred = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $o365Cred -Authentication Basic -AllowRedirection
Import-PSSession $Session
You can find last logon time for a single user mailbox by running below command:
Get-MailboxStatistics -Identity "username@domain.com" | Select LastLogonTime
If you want to get last logon time for all the Office 365 mailbox users, first we need to get all mailbox details by using Get-Mailbox cmdlet and pipe the results to Get-MailboxStatistics.
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select-Object DisplayName,LastLogonTime

Find active mailboxes in last N days

To get active mailbox list we need to use Where filter in the output of Get-MailboxStatistics. The below powershell command find and retrieve all mailbox users who are logged-into their mailbox within last 7 days.
Get-Mailbox -RecipientType 'UserMailbox' -ResultSize Unlimited | Get-MailboxStatistics |
Where {$_.LastLogonTime –gt ([System.DateTime]::Now).AddDays(-7) } | Sort-Object LastLogonTime -Descending |
Format-Table DisplayName, LastLogonTime

Export list of active mailbox users to CSV file

The below command find and export list of active mailbox user names and their last logon time to CSV file.
Get-Mailbox -RecipientType 'UserMailbox' -ResultSize Unlimited | Get-MailboxStatistics |
Where {$_.LastLogonTime –gt ([System.DateTime]::Now).AddDays(-7) } | Sort-Object LastLogonTime -Descending |
Select DisplayName, LastLogonTime | Export-CSV "C:\\ActiveMailboxes.csv" -NoTypeInformation -Encoding UTF8
Note: Here I have used number of days as 7 to check logon activity, you can change this value (i.e 30 or 90 days) as per your need and you can also use the same commands for On-premise environment by properly connecting Exchange management powershell.

Wednesday, 6 December 2017

Add Bulk Users to Office 365 Group with PowerShell

As you know Microsoft is targeting Office 365 Group as base service for many of cloud services like Planner, Teams and etc. So now a days every admins getting frequent request to add new on-board users to Office 365 group, we can easily achieve this task with Exchange Online powershell cmdlet Add-UnifiedGroupLinks.

Before proceed run the below commands to connect Exchange Online Powershell session.
$365Logon = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $365Logon -Authentication Basic -AllowRedirection
Import-PSSession $Session
Run the below command to add single user into Office 365 group.
Add-UnifiedGroupLinks –Identity "O365Group" –LinkType Members  –Links username@domain.com
We have to set the parameter LinkType as Members to add user as member and other valid values are Owners and Subscribers.

The parameter Links accept multiple values, we need to provide users as comma (",") separated values to add multiple members (ex: user1@domain.com,user2@domain.com....). If the user names contain spaces or otherwise require quotation marks (ex: "username 1","username 2",...).

Add multiple members to O365 group:
Add-UnifiedGroupLinks –Identity "O365Group" –LinkType Members  –Links "user1@domain.com","user2@domain.com"

Add Bulk Users to Office 365 Group from CSV

For bulk import process the CSV file is the best choice of all time, you can use the below powershell commands to add bulk members to an office 365 group by importing user identities from csv file. Consider the csv file members.csv that includes the column header member which holds the user identity values in each row of the csv file.
Import-CSV "C:\members.csv" | ForEach-Object {
Add-UnifiedGroupLinks –Identity "O365Group" –LinkType Members  –Links $_.member
}

Find and list members of unified group:

Once we added user as member in O365 group, we can use Get-UnifiedGroupLinks cmdlet to get members. The below command lists all members of given group.
Get-UnifiedGroupLinks –Identity "O365Group" –LinkType Members -ResultSize Unlimited

Monday, 4 December 2017

Change Office 365 Group Email Address using PowerShell

Modifying name or display name of Office 365 Group is simple. However, if you want to rename primary email address this is simply not possible from Admin center, but we can easily change it using the Exchange Online Powershell cmdlet Set-UnifiedGroup.

Note: Before proceed, Connect Exchange Online Remote PowerShell.

Rename Primary E-mail Address of Office 365 Group

We need to use the attribute PrimarySmtpAddress in Set-UnifiedGroup cmdlet to change the primary mail address of an O365 group. The below command change the primary address to salesgroupnew@domain.com for the group named "Sales Group".
Set-UnifiedGroup -Identity "Sales Group" -PrimarySmtpAddress "salesgroupnew@domain.com"

Rename Group Alias or Email Alias

To update email alias we need to update the attribute alias. The below command rename the mail alias to salesgroupnew.
Set-UnifiedGroup -Identity "Sales Group" -Alias "salesgroupnew"

Add or Remove Secondary Email Addresses (or Proxy Addresses)

We can use the parameter EmailAddresses in Set-UnifiedGroup cmdlet to update proxy addresses of office 365 group. The EmailAddresses parameter specifies all the email addresses (proxy addresses) for the recipient, including the primary SMTP address.

Syntax to update email addresses:
Set-UnifiedGroup -Identity "o365group" -EmailAddresses @{Add="[<Type>]:<emailaddress1>","
[<Type>]:<emailaddress2>"...;Remove="[<Type>]:<emailaddress3>","[<Type>]:<emailaddress4>"...}
The optional value <Type> specifies the type of email address. Some of valid values are:
  • SMTP - The primary SMTP address (You can use this value only once in a command).
  • smtp - Other SMTP email addresses.
If you don't include a <Type> value for an email address, the value smtp (proxy address) is assumed.

Add proxy address:
Set-UnifiedGroup -Identity "Sales Group" -EmailAddresses @{Add="salesgroup1@domain.com",
"salesgroup2@domain.com"}
Remove proxy address:
Set-UnifiedGroup -Identity "Sales Group" -EmailAddresses @{Remove="salesgroup3@domain.com",
"salesgroup4@domain.com"}
To add or remove proxy addresses without affecting other existing values, use the following syntax.
Set-UnifiedGroup -Identity "Sales Group" -EmailAddresses @{Add="salesgroup1@domain.com",
"salesgroup2@domain.com"; Remove="salesgroup3@domain.com","salesgroup4@domain.com"}

Change both Primary and Secondary Email Address in single command

We can easily update both primary and proxy address in a single command by specifying valid <Type> values (SMTP - for primary address. smtp - for proxy address).The following command removes the primary address salesgroupold@domain.com and the proxy address salesgroup3@domain.com, and adds the primary address salesgroupnew@domain.com and the proxy address salesgroup1@domain.com.
Set-UnifiedGroup -Identity "Sales Group" -EmailAddresses @{Remove="SMTP:salesgroupold@domain.com",
"smtp:salesgroup3@domain.com"; Add="SMTP:salesgroupnew@domain.com","smtp:salesgroup1@domain.com"; }

Export Email Address details of Office 365 group

We can use the following command to find and list the email address details for the given office 365 group.
Get-UnifiedGroup -Identity "Sales Group" | Select PrimarySMTPAddress,Alias,EmailAddresses|FL
The below command export email address details of all the office 365 groups to csv file.
Get-UnifiedGroup -ResultSize Unlimited | Select DisplayName,PrimarySMTPAddress,Alias,EmailAddresses |
Export-CSV "C:\\O365GroupMailAddresses.csv" -NoTypeInformation -Encoding UTF8