Tim D'Annecy


#Azure #PowerShell

After setting up a new Azure Subscription, you'll get errors in the Portal that say Resource Providers are enabled for Azure Services:

Resource provider 'Microsoft.BotService' not registered for the subscription

You might also get the following error message:

(Code: NoRegisteredProviderFound)

To fix these errors, you will need to enable the Resource Providers in Azure so that you can allow management from the Portal.

You can enable these Resource Providers one-by-one manually through the portal by navigating to the Subscription > Resource Providers and clicking the “Register” button, but this can take a long time if you want to enable all Resource Providers.

To add them quickly, you can run a one-line PowerShell command to enable all that are currently disabled.


#PowerShell #Outlook #Windows

I have multiple email accounts that I juggle to support other client tenants, but I keep one primary calendar in Outlook with my work account. Every morning, I go through my other account emails and manually copy over events into my primary calendar so that I don't get double booked. I'm sure there's a better way to manage my calendars, but this has been working for me so far.

This morning, however, I tried to copy a meeting from my alternate account into my primary calendar, but I got the following popup message:

Screenshot of Outlook error message

Microsoft Outlook: Copying meetings is not supported.

I'm running Outlook with a Microsoft 365 Apps for Enterprise license, version 2312 (Build 17126.20126 Click-to-Run) on the Current Channel. I'm running Windows 11 Business with a Windows 11 Enterprise subscription, Version 23H2, OS Build 22631.2861, with Windows Feature Experience Pack 1000.22681.1000.0

To fix this issue in Outlook and to be able to copy calendar entries across accounts, I needed to make a change in the Registry.

To make it easier and to give others the ability to deploy this org-wide, I wrote up a quick PowerShell script that changes the value.


#PowerShell #Exchange #M365

Similar to my post yesterday to get all SharePoint Sites for a user, I received another request today to generate a report of all Shared Mailboxes that a user has access to in Exchange Online.

Right now, there's no ability in the Exchange Admin center to list all Shared Mailboxes that a user can access.

To work around this limitation, I wrote a simple PowerShell script to get all Shared Mailboxes, check if the specified user has permissions, then output the report to a .csv file.


#SharePoint #PowerShell #ShareGate #M365

Today, I received a request to generate a report of all SharePoint Sites that a user has access to. Currently, the SharePoint admin center portal only has the ability to see which users are members of a group. There's no ability for the inverse: Which Sites does a user have access to?

To do this, I wrote a quick PowerShell script to iterate through all sites, checks if the user is a Member, then outputs the list of sites to a .csv.


#Powershell #Azure #Teams

A company I'm working with is located in multiple countries and has added Multi-Geo licenses for Microsoft 365. Recently, we rolled out Orchestry to streamline requests and approvals for creating new Teams on behalf of staff.

Currently, one of the shortcomings of Orchestry is the lack of support for Microsoft's multi-geo capabilities. If you have a tenant spanning more than one location, you will need to manually move Teams that were provisioned in Orchestry after they've been created. The lack of multi-geo support is not great—a SharePoint Administrator is required to run PowerShell commands to manually move the site to bring it under compliance with any GDPR or other data governance requirements.

This post will detail the steps for a workflow that allows you to provision Teams in Orchestry and have them automatically moved to the correct location using a webhook and an Azure Automation Runbook.


#Intune #PowerShell

A company I work with is using BioEdit, an old application that's used for DNA sequencing. They recently moved to Intune management for all of their devices and needed this app packaged up for deployment to all of their Windows devices.

I couldn't find any information about this app for deployment or installation, so I had to figure it out on the fly. I wrote this guide for anyone needing to deploy this app in Intune.


#Azure #AVD #PowerShell

Recently, a company I work with submitted a request to give users the ability to power off and deallocate their Azure Virtual Desktop VMs. They currently have the “Start VM on connect” feature enabled on the Host Pool, but there is no foolproof way to shutdown a VM and deallocate it at the same time. Users were clicking “Shutdown”, but this doesn't reduce the cost of the Azure bill and the company wanted to avoid having an Azure administrator make these power changes.

In general, regular users are not familiar with the Azure Portal and can't be expected to navigate through a series of blades to power off a VM. They also should not be expected to know the name of the Virtual Machine they're signed into to identify which resource they need to select.

To work around these issues, you can create a small shortcut on the Public Desktop in the AVD that sends a PowerShell command to deallocate the Virtual Machine. This solution works great for Personal desktop configurations because only one user is expected to be logged on at a time and no other users will be kicked off. Paired with the “Start VM on Connect” feature, users can have the ability to control their VM status and Azure will only allocate it when they need it.

This post will go through the steps for how you can implement this in your environment and give users the ability to power Azure VMs off and deallocate them at the same time.


#PowerShell #AzureAD

After a domain migration or other large organizational change, you may need to update hundreds of staff at the same time with manager information in Azure AD.

This can be a huge pain to do it through the GUI and there's an easier way to do it with PowerShell and a CSV file.


#Azure #PowerShell

A company I work with is looking to reduce the cost of their Azure environment. After a quick look, I noticed that they have a number of VMs that are running 24/7 and are not used all the time. Some of these VMs are user-facing and only need to be online during business hours during the week. Other VMs are used for batch jobs and are only used once or twice day. The rest of the time they sit idle, consuming resources and costing money.

Adding some logic to the VMs to start and stop them at certain times of the day can reduce your Azure spend and is easy to implement.


#Azure #PowerShell #Windows

If you’ve added a new session host to an existing Azure Virtual Desktop host pool, you might get a Windows Activation error watermark notifying you that the Windows license wasn’t found:

Screenshot of a Windows 10 desktop, showing a Windows activation error

Activate Windows. Go to Settings to activate Windows.

When I got the ticket from users complaining about the watermark, I started brainstorming. I thought I might be able to fix this issue several ways:

  1. License users with Microsoft 365 E5.

  2. Manually add an existing Windows license (only possible if you’re running a stock image of Windows, not the Azure-specific Windows Enterprise Multi-Session).

Since I don’t have those E5 licenses already and I’m running the multi-session OS, it would add cost to purchase and I would need to get approval.

Instead, I found that you can check the VM license by running this command in PowerShell (change the XXX values to match your Resource Group and VM name):

Import-Module AzCLI 
Get-AzVM -ResourceGroupName XXXresourcegroupXXX -Name XXXvirtualmachineXXX

After running that command, the string that you want to focus on is LicenseType. If it says Windows_Client, you are good to go and Azure will apply the license on the OS-level.

If it is null or displays as {}, that could be a cause for the Activation error. You can run this PowerShell command in the AzCLI (edit the XXX values to match your environment):

$rg = XXXresourcegroupXXX
$vm = XXXvirtualmachineXXX
$vm.LicenseType = ‘Windows_Client’

Get-AzVM -ResourceGroupName $rg -Name $vm | Update-AzVM 

I wish Azure had a built in Troubleshooting function or feature to “quick fix” this issue, but I couldn’t find one.

Putting this here for my notes when I have to fix this issue again.