best practices
66 TopicsHow to re-enable Teams auto-update in Windows 365
In some Windows 365 Cloud PCs, the ability for the installed Teams client to automatically update has been affected along with the ability to check for updates. To rectify the problem, Teams Machine Wide Installer and the Teams client must be uninstalled, and then reinstalled. Reinstalling Teams can be a difficult task to accomplish if one doesn’t wish to disturb end users at work. Further complicating the matter is that the Teams client automatically installs only on user logon. To lower the complexity of fixing the problem while not impacting end users, we have written a Proactive Remediation package that takes end users into account. More information on Proactive Remediation Link to the Teams Fix - Proactive Remediation Package The detection script is checking to see if the Teams client is installed in the Users’ profile, which exists under c:\users\[user name]\appdata\local\Microsoft\Teams. If it is not found there, it will return non-compliant. The remediation script first checks to see if it has successfully run to completion before. If it has not, it then checks to see if a user is logged in and in an inactive state. If the user is logged in and active, the script exits, and Proactive Remediation will try again later. If the user is not logged in or active, the remediation process begins. The remediation script downloads the latest version of the Teams Machine Wide Installer MSI, uninstalls the Teams client, uninstalls the existing Machine Wide Installer installation, checks for a Registry Key than can cause issues with Teams client installations, then checks the user state again. If the user is not logged into their Cloud PC, the script will return compliant. Once the user logs back into their Cloud PC, the Machine Wide Installer will trigger the Teams client installation automatically. If the user is logged in but inactive, the remediation script creates a child PowerShell script, and XML file used to create a scheduled task, and registers the scheduled task that will initiate the Teams client installation when the user reconnects to their Cloud PC. All files are downloaded to C:\Windows\Temp. The amount of time that the scheduled task stays active is configurable in the Remediation script by modifying the $DateOffset variable. The child script checks for the existence of files it is supposed to remove, and this is done to ensure that the Teams client isn’t reinstalled every time the user connects. If the files exist, the script assumes it hasn’t successfully run before and launches the Teams client installer. Once the installation is complete, the script will attempt to delete the scheduled task. If the user doesn’t have administrative rights, it will not be able to remove the scheduled task and it will expire at its given time. The script will then remove the files used in this process. If the user does not reconnect to their Cloud PC by the time the scheduled task expires, the remediation script will run again and recreate the scheduled task. All the scripts in this solution generate their own logs to help admins troubleshoot issues. These logs are all written to C:\Windows\Temp. These logs are: Detection Script - Teams-MWI-detect.log Remediation Script - Teams-MWI-remediate.log Child Remediation Script - Teams-MWI-remediate-child.log The remediation script automates the whole process but if you want to manually fix this issue, you can do so by following these steps: On the Cloud PC, navigate to Settings > App > Apps and features. Search for Microsoft Teams. Uninstall Microsoft Teams and Teams Machine-Wide Installer. Download the latest version of Microsoft Teams from here. Open a command prompt and install the Teams client using the following command: msiexec.exe /I %Filepath to the downloaded Teams MSI% ALLUSERS=1 Restart the Cloud PC. The Teams client is now installed with automatic updates turned on.177KViews1like2CommentsOptimizing RDP Connectivity for Windows 365
Updated with RDP & Zscaler connectivity improvements August 2025 The use of VPN or Secure Web Gateway (SWG) client software or agents to provide tunneled access to on-premises resources in addition to providing protected internet access via a cloud based Secure Web Gateway (SWG) or a legacy VPN & on-premises proxy path is very commonly seen in Windows 365 and AVD deployments. This is especially the case when deployed in the recommended Windows 365 with Microsoft Hosted Network (MHN) model where the Cloud PC is located on a network with direct, open high-speed internet available. The more modern, cloud based SWG solutions fit perfectly with this modern Zero-Trust approach and generally perform at a higher level than traditional VPN software, where internet browsing is hairpinned through on-premises proxies and back out to the internet. As we have many Windows 365 customers using such solutions as part of their deployment, there are some specific configuration guidelines which are outlined in this post which Microsoft recommends are applied to optimize key traffic and provide the highest levels of user experience. What is the Problem? Many of these VPN/SWG solutions build a tunnel in the user context, which means that when a user logs in to their device, the service starts and creates the tunnels required to provide both internet and private access as defined for that user. With a physical device the tunnel is normally up and running before or shortly after the user sees their desktop on screen, meaning they can then quickly get on with their work without noticing its presence. However, as with any virtualized device which needs a remote connection to access, the above model poses several challenges: 1. Additional Latency Firstly, the remote desktop traffic is latency sensitive, in that delay to the traffic reaching its destination can easily translate into a poor user experience, with lag on actions and desktop display. Routing this traffic through a tunnel to an intermediary device to reach its destination adds latency and can restrict throughput regardless of how well configured or performing said device is. Modern SWG solutions tend to perform at a much higher levels than a traditional VPN/Proxy approach, but the highest level of experience is always achieved through a direct connection and avoiding any inspection or intermediary devices. Much like Teams media traffic, the RDP traffic in the Windows 365 case should be routed via the most optimal path between the two endpoints so as to deliver the very highest levels of performance, this is almost always the direct path via the nearest network egress. From a Cloud PC side this also means the traffic never leaves Microsoft’s managed network if directly egressed. 2. RDP Connection Drops An additional challenge comes from the use of user-based tunnels. As the user initiates a connection to the Cloud PC, the connection reaches the session host without issue and the user successfully sees the initial logon screen. However, once the user login starts, and the client software then builds the tunnels to the SWG/VPN for the user, the user then experiences a freeze of the login screen. The connection then drops, and we have to go through the reconnection process to re-establish the connection to the Cloud PC. Once this is complete, the user can successfully use the Cloud PC without further issue. Users however may also experience disconnects of the remote session if there is any issue with the tunnel, for example if the tunnel temporarily drops for some reason. Overall, this doesn’t provide a great user experience with the Cloud PC, especially on initial login. Why does this occur? It occurs because the tunnels built to route internet traffic to the SWG generally capture all internet bound traffic unless configured not to do so, a forced tunnel or ‘Inverse split tunnel’. This means the initial login works without issue but as soon as this tunnel is established upon user logon, the RDP traffic gets transferred into it and as it’s a new path, requires reconnecting. Equally, as the traffic is inside this tunnel, if the tunnel drops momentarily and needs to reconnect, this also causes the RDP session to require reconnecting inside the re-established tunnel. In the diagram below, you can see a simplified representation of this indirect connectivity approach with a forced tunnel in place. RDP traffic has to traverse the VPN/SWG resources before hitting the gateway handling the traffic. Whilst this is not a problem for less sensitive traffic and general web browsing, for latency critical traffic such as Teams and the RDP traffic, it is non-optimal. What’s the Solution? Microsoft strongly recommends implementing a forced tunnel exception for the critical RDP traffic which means that it does not enter the tunnel to the SWG or VPN gateway and is instead directly routed to its destination. This solves both of the above problems by providing a direct path for the RDP traffic and also ensuring it isn’t impacted by changes in the tunnel state. This is the same model as used by specific ‘Optimize’ marked Office 365 traffic such as Teams media traffic. On the Cloud PC side this also means this traffic never leaves Microsoft’s managed network. What exactly do I need to bypass from these tunnels? Previously, solving this problem meant significant complexity due to the large number of IP addresses required to configure optimization for this RDP traffic, we provided a script as part of this blog to assist with collecting and formatting these IPs. I'm pleased to share that Microsoft has invested in an extensive and complex piece of work to solve this challenge by building a new, upgraded global gateway infrastructure to allow it to be addressed from a single subnet. In addition to that simplification that we have planned so that this subnet should not see any regular change, abstracting customers from change as we scale the infrastructure and add new regions in future. As of February 2025, this work has now been completed and the old infrastructure decommissioned, this was all completed with zero downtime for our customers. This now allows RDP based traffic to now be covered by two single subnets rather than many hundred as previously was the case. There are further improvement works due to be delivered in the coming months for UDP based RDP to provide new dedicated and globally scaled TURN infrastructure. This post will be updated when this is complete and RDP connectivity is therefore in its final and complete, simplified and secured state. These temporary elements are: The WindowsVirtualDesktop service tag Is now up to date as of 19th March 2025 with all decommissioned IPs removed. 2. UDP based RDP via TURN now exclusively uses 51.5.0.0/16 as of August 2025. The new, dedicated subnet is in the WindowsVirtualDesktop service tag. More on this can be found in this post. This work will also vastly expand our global TURN relay availability. RDP based Connectivity bypass: As of August 2025, the critical traffic which carries RDP is contained within the following simplified endpoints: RDP Endpoints for Optimization Row Endpoint Protocol Port Purpose 1 *.wvd.microsoft.com TCP 443 Core TCP based RDP and other critical service traffic 2 40.64.144.0/20 TCP 443 Core TCP based RDP 3 51.5.0.0/16 UDP 3478 Core UDP based RDP via TURN Please see this article for more information on row 3 In some network equipment/software we can configure bypass using FQDNs and wildcard FQDNs alone, and we’d recommend that this method (row 1) is used in addition to the IP based rules if possible. However, some solutions do not allow the use of wildcard FQDNs so it’s common to see only IP addresses used for this bypass configuration. In this case you can use the newly simplified rows 2 & 3 in the table above, making sure row 1 is still accessible via the SWG/Proxy. There are also a small number of other endpoints which should be bypassed on the Cloud PC side: Other required VPN/SWG bypass requirements: Other endpoints for Optimization Row Endpoint Protocol Port Purpose 4 azkms.core.windows.net TCP 1688 Azure KMS - Traffic Needs to arrive from Azure public IPs 5 169.254.169.254 TCP 80 Azure Fabric communication 6 168.63.129.16 TCP 80 Azure Fabric communication These additional bypass requirements (4-6) are not RDP related but are required for the following reasons: Row 4 – This is Azure KMS activation which is a required endpoint for a Cloud PC and AVD Session Hosts. The traffic for this needs to arrive from an Azure public IP, if not then the connection will not be successful. Therefore it should not be sent via a 3 rd party internet egress such as via an SWG or proxy. IP addresses corresponding to the FQDN can be found via the link above if required. Rows 5 & 6 – These are critical IP addresses used to communicate to the Azure Fabric to operate the VM. We need to ensure these are not inadvertently sent in any VPN/SWG tunnel where they will not be then able to reach their destination in Azure. How do I implement the RDP bypass in common VPN/SWG solutions? Microsoft is working with several partners in this space to provide bespoke guidance and we’ll add detailed guidance for other solutions here as we get them confirmed. Already available however is Zscaler ZIA. Zscaler Client Connector The changes outlined above should make configuration in all scenarios vastly simpler moving forward. Due to some fantastic work to assist our mutual customers by our friends at Zscaler, as of February 2025 and version 4.3.2 of the Zscaler Client Connector, the majority of the mentioned Windows 365 and AVD traffic which requires optimization, including RDP can be bypassed with a single click configuration within a predefined IP based bypass! Zscaler ZIA Configuration Version 4.3.2 (Released Feb 2025) of the Zscaler Connector Client portal enables this feature. Ensure a recent version of the Client Connector is installed on both the Cloud PC (And Physical device if Zscaler is used there) to take advantage. In the Zscaler Client Connector Portal, select the new IP-Based, Predefined Application Bypass for Windows 365 & Azure Virtual Desktop. This contains preconfigured bypass for RDP and KMS traffic. 3. Add the following endpoints to the bypass configuration manually as they are not included in the automatic bypass. Endpoint Protocol Port Purpose 169.254.169.254 TCP 80 Azure Fabric communication 168.63.129.16 TCP 80 Azure Fabric communication Other VPN/SWG solutions Microsoft is currently working with other partners in this space to provide detailed guidance for other VPN/SWG solutions and will list them here as they are complete. Please let us know in the comments if you’d like us to list a particular solution and we’ll aim to prioritize based on feedback. In the interim, use rows 1-6 in the tables above to create manual bypasses from VPN/SWG/Proxy tunnels. This should be significantly simpler and have much lower change rates than previously due to the IP consolidation. FAQs: Q: In a Microsoft Hosted Network deployment, is there anything else I need to do? A: Unless the local Windows firewall is configured to block access to the endpoints noted, there should be nothing else required, the network the virtual NIC sits in has direct, high speed connectivity Microsoft’s backbone and the internet. Q: In an Azure Network Connection scenario, is there anything further I need to do? A: In this scenario, the recommended path for the traffic is directly out of the VNet into Microsoft’s backbone. Depending on the configuration it may require allowing the endpoints noted in this article through a firewall or NSG. The WindowsVirtualDesktop service tag or FQDN tag may help with automating rules in firewalls or configuring User Defined Routing. RDP traffic specifically should be sent direct into Microsoft’s backbone via a NAT Gateway or similar with no TLS inspection, avoiding putting load on NVAs such as Firewalls. Q: Do I need to configure the bypass on just the Cloud PC? A: RDP connectivity (Rows 1-3) is used identically on both the physical and cloud sides. It is strongly advised that the bypass is applied to both the Cloud PC and the connecting client if that also uses the SWG/VPN to connect. If both are using the same configuration profile then this should happen automatically. Rows 4-6 are only required on the cloud side. Q: How often do the IP addresses Change? A: Now the improvement work is complete we don’t anticipate regular change. You can monitor the WindowsVirtualDesktop service tag for changes if desired and we’re working on getting these requirements into the M365 Web Service longer term for monitoring and automation. Q: Can I add more than the RDP traffic to the bypass. A: Microsoft only provides IP addresses for the RDP connectivity at present. However if your solution is capable of configuration by FQDN alone, then you can add other service endpoints to your optimized path, these can be found on this Microsoft docs page. Q: Im using a true split tunnel, does this impact me? A: The above advice is for a forced tunnel scenario (inverse split tunnel) where the default path is via the tunnel and only defined exceptions are sent direct, which is often referred to as a split tunnel in common parlance and is the most commonly seen deployment model of such solutions. However a split tunnel in the technically accurate sense of the words, where the default path is the internet and only defined endpoints (such as corp server ranges/names) are sent down the tunnel, shouldn’t need such configuration as the RDP traffic should follow the default path to the internet. Q: Does this also optimize RDP shortpath? A: RDP Shortpath for Public Networks works to provide a UDP based RDP connection between the client and Cloud PC if enabled and achievable. This connection is in addition to the TCP based connection described above and the dynamic virtual channels such as graphics, input etc are switched into the UDP connection if deemed optimal. Row 3 above covers this traffic for connectivity via TURN relays. Please see this article for more information on this connectivity model. Q: Is this advice also shared in Microsoft’s official documentation? A: We’re currently working on uplifting the entire connectivity documentation for Windows 365 and the above will form part of this work in the coming months. We’ll share the official link in this blog when available. Q: Does this advice apply equally to AVD? A: Yes, both Windows 365 and AVD have exactly the same requirements in terms of the connectivity discussed in this blog.76KViews11likes21CommentsBest way to access Windows 365 Cloud PC from Mac?
Looking to find the best way to access a Windows 365 Cloud PC from a Mac. Clearly, I can access it by logging into the browser and running it there, but is there any way to use the Microsoft Remote Desktop for Mac app to make the connection more "native" to the Mac OS environment? Any other thoughts would be welcomed as well. Thank you,Solved25KViews0likes6CommentsWindows 365 Cloud PC Self-Service Automated Request Process
How to automate Windows 365 Cloud PC self-service requests (Windows 365, Azure Active Directory, Microsoft Forms, Power Automate, MS Graph) Contributors: Juan José Guirola Sr. (Next Generation Endpoint GBB for Americas) Bobby Chang (Power Platform GBB for Americas) Azim Manjee (Cloud Endpoint Technical Specialist) Windows 365 simplifies how organizations offer Cloud PCs to their employees. As a cloud-based service from Microsoft, Windows 365 provides a personal, secure streamed experience from any supported device. It comes with all the productivity, security, and collaboration benefits of Microsoft 365. Windows 365 removes the need to manage a complex infrastructure and it integrates with existing cloud-based networking investments such as Azure Active Directory, Microsoft Endpoint Manager, and more. As the workplace continues to shift toward hybrid work, Windows 365 gives more organizations the ability to issue a cloud-native, persistent Cloud PC that is available 24 hours a day, 7 days a week, all with the ease of assigning a license. This simplified approach to provisioning Cloud PCs opens up the potential for automation and self-service scenarios. With Windows 365, you can provide your employees with Cloud PCs on demand, and here, we’ll show you how. Prerequisites The following items are required to provide automated, self-service Cloud PC request of Windows 365 deployment in a production environment: (For personal development and sandbox/testing scenario, you can use the Microsoft 365 Developer Plan and Power Apps Developer Plan). Windows 365 Enterprise Licenses Windows 10 Enterprise or Windows 11 Enterprise Azure Active Directory (Azure AD) Premium (P1/P2) Azure AD native group (must NOT be a synced group) Microsoft Intune (previously known as Microsoft Endpoint Manager) Microsoft Forms Power Automate per flow plan Microsoft Graph (Windows 365 Cloud PC MS Graph API in beta) Working with Windows 365 Cloud PCs using the Microsoft Graph API Azure App Registration with the following permissions: CloudPC.Read.All. For enterprise production scenarios, we would recommend leveraging the Application Lifecycle Management (ALM) capabilities in Power Platform, in order to safely adopt future changes to your processes. However, this is outside of the scope of this blog post. Before you begin Before you set up automation and a self-service Cloud PC request process, identify and assign the target Azure AD group(s) for the Windows 365 Cloud PC license assignment and provisioning policy. In our scenario, we have three Azure AD Groups (one Azure AD group for each of our three business segments), for both license and provisioning policy assignments. To configure group license assignments, see Assign licenses to users by group membership in Azure Active Directory. For information about how to target the groups for provisioning policies, see Create Windows 365 Cloud PC provisioning policies. Once you have the group assignment, set up the self-service process starting with Microsoft Forms. Create the request intake form Establishing an intake process will not only allow your employees to request the Windows 365 Cloud PC on-demand, but also allow you to build in an approval process and a feedback loop once the license is provisioned and ready for access. For our scenario, we are using Microsoft Forms as the intake form for requesting a Cloud PC. If your organization needs additional requirements around data validations and user experience in the form, we recommend leveraging Power Apps instead. To create a form with Microsoft Forms, see the Microsoft Forms help and learning home page or Create a form with Microsoft Forms. The following are the key components of our example form: Purpose-specific title “Windows 365 Cloud PC Request Form” Four questions to identify the requesting employee’s business segment, the type of Cloud PC they require, their region, and their contact number (aka mobile number) Shared to people in the organization only, for security, tracking, and notification purposes Alt text: Example Windows 365 Cloud PC Request Form in Microsoft Forms. Register MS Graph in Azure AD Once the request form is complete, register MS Graph as an Enterprise application in Azure Active Directory. Log into the Azure portal with appropriate permissions for making application registrations. Global Administrator privileges will provide the permissions to make application registrations; there are other options by following the custom role details in this documentation Custom role permissions for app registration - Azure AD - Microsoft Entra | Microsoft Docs. In the Azure services portal, click Azure Active Directory > Azure Active Directory. Alt text: A screenshot of the Azure Active Directory blade in the Azure services portal. Select App registrations in the left navigation menu. Click New registration. Give the application a name, select Single Tenant for the supported account type, and then click Register. Alt text: A screenshot of the Register an application screen, showing the details that need to be identified for the new application. Note. Alt text: A screenshot of the recently created application overview with the Application (client) ID and Directory (tenant) ID details highlighted. Click API permissions in the left navigation menu. . Select Microsoft.Graph and choose Application permissions. Ensure the following permissions are added: CloudPC.Read.All User.Read User.Read.All Group.Read.All Mail.Send (optional for sending messages via Graph ) Alt text: A screenshot of the Select permissions setup. Once the permissions have been added, click Grant consent. Click Certificates & secrets in the left navigation menu, and then click New client secret. Important! Note this key and store it somewhere safe, like a key vault. This key will only be visible upon creation. Once you navigate away, you will be unable to expose the key again and will have to generate a new key. Create the Cloud PC provisioning process automation In this section, we will build the Power Automate flows that will orchestrate the self-service process. This decision flow illustrates the end-to-end process of adding the requestor to proper AD security group, prompting an approval process, and then notifying requestor of their Cloud PC readiness. Alt text: A flowchart depicting the process for the automated provisioning process. To begin, sign into Microsoft Power Automate with your Microsoft 365 organization credentials. From the left navigation menu, click + Create then: Click Automated cloud flow. Name the flow and choose the flow trigger, “When a new response is submitted” (Microsoft Forms) from list. Click Create. Alt text: A screenshot that shows the flow name and trigger selection options. In When a new response is submitted, select your form from the Form Id drop down, then: Click + New step. Search for “forms” in Choose an operation and select Get response details (Microsoft Forms) from Actions. For Get response details, select your form from the Form Id drop down and then select Response Id as Dynamic content. Alt text: A screenshot of the criteria for the Get response details step. Click on + New step (To add variable for the Object ID of the targeted group in Azure AD). In Choose an operation, type variable. Select Initialize variable from Actions. Type VARGroup ID details screen. Give it a name, e.g., VARGroupID and select “String” as Type. Click + New step (To add variable for the “id” attribute value of the Cloud PC). Choose an operation, type variable. Select Initialize variable from Actions. Give it a name, e.g. VARCloudPCID and select “String” as Type. Click on + New step (To add variable for the “status” provisioning value of the Cloud PC). Search for VAR in Choose an operation. Select Initialize variable. Give it a name (e.g. VARProvisioningStatus) and select “String” as Type. Click on + New step (To add variable for your tenant ID). Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., VARTenantGUID) and select “String” as Type. Tenant ID/Tenant GUID is required for authentication against the CloudPC Microsoft.Graph API. For information on getting your tenent ID, see How to find your Azure Active Directory tenent ID.For information on getting your tenent ID, see How to find your Azure Active Directory tenant ID. In the Value field, enter your Tenant ID. Click on + New step (To add variable for your Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., VARAppID) and select “String” as Type. (This AppID represents the App Registration Client GUID, which is required for authentication against the CloudPC Microsoft.Graph API). In the Value field, enter your App Registration Client ID. Click on + New step (To add variable for the “Secret,” which is your . Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., VARSecretID) and select “String” as Type. This is required for authentication against the CloudPC Microsoft.Graph API. Refer to Step 6 in the “Register MS Graph in Azure AD” section of this document. For additional protection, use Azure KeyVault to store and retrieve this client secret. Refer to Defining inputs and outputs for this variable action to obfuscate the secret during run time and from the logs. In the Value field, enter your Client Secret. At this point, we need to determine the automated actions, based on the “Business Segment” value provided by requestor. This can be accomplished by applying a Switch action. : Click on + New step. Search for “Switch” in Choose an operation and select Switch (Control). Next to On, select What Business Segment are you part of? from Dynamics content. Add as many “Cases” as needed to meet your specific needs. In our example, we have 3 Cases, which represent the 3 business segments: South Enterprise, LATAM, and Microsoft Federal. Within each Case, click Add an action Search for “variable” and select Set variable. Select VARGroupID from the Name drop down. Insert the Object ID of the desired targeted group for each “Case.” Note: The Object ID can be retrieved by viewing the group properties in Azure AD. Alt text: A screenshot of options for setting the Case variables. Click on + New step (This step will initiate the approval process) Search for “approval” in Choose an operation and select Start and wait for an approval. Select Approve/Reject – Everyone must approve from the Approval type drop down. Enter the email addresses for approvers in the Assigned to field. Fill in the remaining fields as desired. In our example, we elected to use values gathered from the requestor. Alt text: A screenshot of the available settings for the approval process in Start and wait for an approval. Click on + New step. This step will set up the execution process determined by approval outcome. Search for “Condition” in Choose an operation and select Condition control. Select Outcome under Dynamic content as the value. Choose is equal to and type “Approve” for the value. You will be presented with two sub processes, If yes and If no. Add necessary flows for each. Alt text: A screenshot of the If yes and If no sub-process flow setup options. For the If yes process: Click Add an action. Search for “Azure AD” in Choose an operation and select Get User. Select Responders’ Email for the User Id or Principal Name value. Click Add an action. Search for “Azure AD” in Choose an operation and select Add user to group. Select VARGroupID for Group Id and Id for User Id. Click Add an action. Search for “Send email” in Choose an operation and select Send an email (V2) Office 365 Outlook. Select VARGroupID for Group Id and Id for User Id. Rename to “Send an approved email.” Fill in all fields, as desired. Alt text: A screenshot of the Send an approval email setup. [Optional] If you want to added notification, click Add an action. You can add notification to your flow. In our example we are using Twilio, but you can choose to use other services. Follow your SMS provider’s instructions to properly configure in Power Automate Flow. Click Add an action. To pause the flow and allow the provisioning process to kick off in the backend, select Delay and configure the desired time. In our example, we’ve elected to delay the flow for 1 minute. Search for Delay in Choose an operation. Click Add an action. Important! To add the control to perform Graph API calls against tenant to monitor requestors Cloud PC provisioning status, search. In the Method field, select GET. Under URI, set it up exactly as illustrated below, placing the UserPrincipalName dynamic content inside the string: https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/cloudPCs?$filter=userPrincipalName eq '@{outputs('Get_user')?['body/userPrincipalName']}' and status eq 'Provisioning'&$count=true For Authentication, select Active Directory OAuth. Leave the authority as default. Enter your TenantID variable under Tenant, https://graph.microsoft.com under Audience, the AppID under Client ID, and the Secret in the Secret section. Alt text: Example setup for Graph API controls to monitor requestor Cloud PC provisioning status. Click Add an action, and search for “Parse JSON.” Under (note in the UI you will also see Parse User CPCs), select Body for the Content field and insert the body of the HTTP request response into the Schema field. Use the following schema: Alt text: A screenshot of completed content and schema details for Parse JSON. { "type": "object", "properties": { "@@odata.context": { "type": "string" }, "@@odata.count": { "type": "integer" }, "value": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "displayName": { "type": "string" }, "imageDisplayName": {}, "provisioningPolicyId": { "type": "string" }, "provisioningPolicyName": { "type": "string" }, "onPremisesConnectionName": { "type": "string" }, "servicePlanId": { "type": "string" }, "servicePlanName": { "type": "string" }, "status": { "type": "string" }, "userPrincipalName": { "type": "string" }, "lastModifiedDateTime": { "type": "string" }, "managedDeviceId": {}, "managedDeviceName": {}, "aadDeviceId": {}, "gracePeriodEndDateTime": {}, "servicePlanType": { "type": "string" }, "statusDetails": {} }, "required": [ "id", "displayName", "imageDisplayName", "provisioningPolicyId", "provisioningPolicyName", "onPremisesConnectionName", "servicePlanId", "servicePlanName", "status", "userPrincipalName", "lastModifiedDateTime", "managedDeviceId", "managedDeviceName", "aadDeviceId", "gracePeriodEndDateTime", "servicePlanType", "statusDetails" ] } } } } Note: You can also get this schema by using the Graph explorer to request from the same endpoint. Use the Generate from example button to generate the schema: Click Add action and search for “Apply to each.” In the Output field, select Value from our Parse JSON step. A Do until step should appear., If it doesn’t, click Add an action and search for “Do until.” Alt text: A screenshot of the Do until setup. In the Do until step, select the ProvisioningStatus variable is equal to string(‘provisioned’). Click and search for “Set Variable.” Configure the CPC-ID Variable to the ID of the item from the Parse JSON. Click Add an action and search for “HTTP.” Configure the HTTP using the same variables for TenantID, APpID, and Secret, as in the previous HTTP action, but using the following URI: https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/cloudPCs/@{variables('CPC-ID')} Example: Alt text: Example setup for monitoring Cloud PC. Click Add an action, search for “Parse JSON.” Select Body for the Content field and insert the following into the Schema field: { "type": "object", "properties": { "@@odata.context": { "type": "string" }, "id": { "type": "string" }, "displayName": { "type": "string" }, "imageDisplayName": { "type": "string" }, "provisioningPolicyId": { "type": "string" }, "provisioningPolicyName": { "type": "string" }, "onPremisesConnectionName": { "type": "string" }, "servicePlanId": { "type": "string" }, "servicePlanName": { "type": "string" }, "status": { "type": "string" }, "userPrincipalName": { "type": "string" }, "lastModifiedDateTime": { "type": "string" }, "managedDeviceId": { "type": "string" }, "managedDeviceName": { "type": "string" }, "aadDeviceId": { "type": "string" }, "gracePeriodEndDateTime": {}, "servicePlanType": { "type": "string" }, "statusDetails": {} } } Alt text: A screenshot of the Parse JSON schema. Click Add an action and search for “Set Variable.” Select ProvisioningStatus for the Name and configure the provisioning status variable to the status of the item from the Parse JSON. Click Add an action and search for “Delay.” Set a delay in an appropriate increment to recheck the status based on your typical Cloud PC provisioning time (e.g., 30 minutes is a normal time increment). In our example, we selected an increment of every 15 seconds. Consider throttling concerns to not overwhelm the API and cause timeouts. Once you’re past the Do Until scope, Click Add an action and search for “Send an Email.” Create your “successful” provisioning email. In our example, we use several variables and dynamic content to ensure clarity. You can also embed links to the different clients available to the employee for accessing their Cloud PC. Alt text: An example of a “successful” provisioning email setup. Click Add an action and search for “Send Text Message.” Create your “successful” provisioning SMS. In our example, we use several variables and dynamic content for clarity. Alt text: An example “successful” provisioning SMS message setup. Once you’re past the Apply to Each scope, Click Add an action, and search for “Terminate.” Set the Status to Successful. Return to the Approval Conditon to setup the rejection or If no process. Scroll up in the workflow to access this setup. Click Add an action and search for “Send Email.” Create and carefully word the rejection email. Alt text: An example of a rejection email setup. Click Add an action and search for Terminate. Set the Status as Cancelled. The entire Power Automate flow should look like the image below. Alt text: A Power Automatic flow diagram depicting the process described in this document. Once you’ve completed adding in steps to your automation flow, you’re ready to test the solution. Select Test and execute the steps described in the User experience section of this document. User experience Once the self-service experience is configured, the employee or requestor should be able to generate a request. The following is an example of what the user can expect during their request experience. The requestor completes the Self-service user request form. Alt text: An example of a completed self-service request form filled in by an employee. The flow kicks off based on information entered in the form by the requestor. The approval process begins. Alt text: An illustration of the approval process flow. The Approver gets an email and Microsoft Teams notification to approve, reject, or reassign the request. Alt text: An example of an approval request. Once approved or rejected, the flow continues to add the user to the proper Azure AD Group, which in turn will assign the proper Windows 365 license and the correct provisioning policy. Alt text: An illustration of the If yes and If no process flows. If the request is approved, the approval email and SMS text will be sent to the requestor informing them that the request was approved. If the request is rejected, the rejection email will be sent. Alt text: An example of an approval email. Alt text: An example of an approval text message. Power Automate will monitor the provisioning status as it changes from “provisioning” to “provisioned.” Once the Cloud PC status changes to “provisioned,” the requestor will receive an email and SMS text message informing them that their Cloud PC has been provisioned and is ready to access. Alt text: An example email message informing the requestor that their Cloud PC has been provisioned. Alt text: An example text message informing the requestor that their Cloud PC has been provisioned. Continue the conversation by joining us in the Microsoft 365 Tech Community! Whether you have product questions or just want to stay informed with updates on new releases, tools, and blogs, Microsoft 365 Tech Community is your go-to resource to stay connected.8.5KViews6likes2CommentsUnable to access Windows 365 settings in Endpoint Manager Admin Center
Dear community, I am having an issue accessing the Windows 365 settings in the Endpoint Manager Admin Center. When I follow the guide provided by Microsoft (https://learn.microsoft.com/en-us/windows-365/enterprise/assign-users-as-local-admin), I am unable to access the menu items due to a blocking banner. I have tried clicking the cross icon on the banner, but it takes me back to the home page (https://endpoint.microsoft.com/?ref=AdminCenter#home). Is anyone else facing this issue? Is there any workaround? I have contacted Microsoft support regarding this issue 2 weeks ago, but I haven't received any answer yet. I would greatly appreciate any help or guidance on how to resolve this issue. Best regards, TobiasSolved8.3KViews0likes12CommentsWindows 365 with ThinOS (Wyse5070)
Hello 🙂 i try to connect from wyse 5070 thinclient to windows 365. The login screen appears and i can connect to aad and see the possible w365 desktops. If i try to open it, i have to login again and the error "invalid code" appears. did anybody have had the same issue and a fix ? Best regards PascalSolved8KViews0likes15CommentsHow to Automate Windows 365 Cloud PC Last Login monitoring!
Automate Windows 365 Cloud PC Last Login monitoring! (Windows 365, Azure Active Directory, Power Automate, MS Graph) Contributors: Juan José Guirola Sr. (Next Generation Endpoint GBB for Americas) Bobby Chang (Power Platform GBB for Americas) Enterprises of all sizes are adopting and aligning Windows 365 to solve several business-critical scenarios. Organizations appreciate the simplicity of the solution, rapid deployment, and enhanced end user experience; offering the opportunity to include new solutions to their services catalog! Part of the simplicity of Windows 365 is that its management plane is Microsoft Intune. Leveraging the Windows 365 admin blade in Intune, administrators can perform the initial configuration of the service and perform on going monitoring of Cloud PCs deployed within the enterprise with several reports being made visible through the “Reports” blade, to include Device management, Endpoint Security, Endpoint Analytics, etc. We have recently introduced a new type of analytical report – Cloud PC utilization report (preview) – which brings visibility to Cloud PCs with low usage. This is a nice addition to the platform, and a much-needed report. For some organizations, that level of reporting will suffice. But if you are looking for a more custom report that aligns to the specific goals and needs of your organization, then keep reading. This blog will describe how to use the Microsoft Power Platform to automate the reporting of Windows 365 based on your specific criteria and receive notifications via email when the criteria is met. In our example, we are setting the criteria to report on Cloud PCs that have not been logged on to for 60 days or more. Let’s get started. Prerequisites The following items are required to automate the process and deploy in a production environment: (For personal development and sandbox/testing scenario, you can use the Microsoft 365 Developer Plan and Power Apps Developer Plan). Windows 365 Enterprise Licenses Azure Active Directory (Azure AD) Premium (P1/P2) Microsoft Endpoint Manager Power Automate per flow plan Microsoft Graph (Windows 365 Cloud PC MS Graph API in beta) Working with Windows 365 Cloud PCs using the Microsoft Graph API Azure App Registration with the following permissions: CloudPC.Read.All. For enterprise production scenarios, we would recommend leveraging the Application Lifecycle Management (ALM) capabilities in Power Platform, in order to safely adopt future changes to your processes. However, this is outside of the scope of this blog post. Register MS Graph in Azure AD If you have followed our previous BLOG – How to automate Windows 365 Cloud PC self-service requests – you may have already performed these steps. If so, please proceed to the next section of this BLOG. Register MS Graph as an Enterprise application in Azure Active Directory. Log into the Azure portal with appropriate permissions for making application registrations. Global Administrator privileges will provide the permissions to make application registrations; there are other options by following the custom role details in this documentation Custom role permissions for app registration - Azure AD - Microsoft Entra | Microsoft Docs. In the Azure services portal, click Azure Active Directory > Azure Active Directory. Figure 1: A screenshot of the Azure Active Directory blade in the Azure services portal. Select App registrations in the left navigation menu. Click New registration. Give the application a name, select Single Tenant for the supported account type, and then click Register. Figure 2 : A screenshot of the Register an application screen, showing the details that need to be identified for the new application. Note your Directory (tenant) ID and Application (client) ID GUIDs and then click on API Permissions. Figure 3: A screenshot of the recently created application overview with the Application (client) ID and Directory (tenant) ID details highlighted. Click API permissions in the left navigation menu. Click Add a Permission. Select Microsoft.Graph and choose Application permissions. Ensure the following permissions are added: CloudPC.Read.All User.Read User.Read.All Group.Read.All Mail.Send (optional for sending messages via Graph ) Figure 4: A screenshot of the Select permissions setup. Once the permissions have been added, click Grant consent. Click Certificates & secrets in the left navigation menu, and then click New client secret. Important! Note this secret key and store it somewhere safe, like a key vault. This key will only be visible upon creation. Once you navigate away, you will be unable to expose the key again and will have to generate a new key. Create the Cloud PC Last Login Monitoring automation! In this section, we will build the Power Automate flows that will orchestrate the Last Login monitoring reporting process. This decision flow illustrates the end-to-end process of retrieving Cloud PC attribute values from the Microsoft Graph leveraging the Windows 365 API and parse through the LastLoginResult value to compare against our criteria of 60 days or more. Figure 5: A flowchart depicting the process for reporting Cloud PC Last Login. To begin, sign into Microsoft Power Automate with your Microsoft 365 organization credentials. From the left navigation menu, click + Create then: Click Automated cloud flow. Name the flow and choose the flow trigger, “Recurrence” from list. Click Create. Set your desired Interval. Figure 6: A screenshot that shows the Recurrence trigger. Click on + New step (To add variable for the UPN). In Choose an operation, type variable. Select Initialize variable from Actions. Type Init VARUPN details screen. Give it a name, e.g., VARUPN and select “String” as Type. Click + New step (To add variable for the “lastLoginResult” attribute value of the Cloud PC). Choose an operation, type variable. Select Initialize variable from Actions. Give it a name, e.g. lastLoginResult and select “String” as Type. Click on + New step (To add variable for the “Composed_LastLoginResult_Value” of the Cloud PC). Search for VAR in Choose an operation. Select Initialize variable. Give it a name (e.g. Composed_LastLoginResult) and select “String” as Type. Click on + New step (To add variable for CurrentDateTime). Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., DateNow) and select “String” as Type. In the Value field, Add, Expression, in Fx type utcNow() Click on + New step (To add variable for DateDifference) Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., DateDiff) and select “Integer” as Type. Click on + New step (To add variable for the “Criteria,” which in our example is 60 day +). Choose an operation, type variable. Select Initialize variable from Actions. Give it a name (e.g., More than 60 days) and select “String” as Type. At this point, we need to determine the automated actions, based on the “LastLoginResult” value of the Cloud PC. This can be accomplished by parsing through each Cloud PC LastLoginRestult value and applying a “Condition” action. Let’s add a GET step to the flow to gather Cloud PC attribute value: Click Add an action. Important! To add the control to perform Graph API calls against tenant to gather Cloud PC attribute value, search for HTTP. In the Method field, select GET. Under URI, set it up exactly as illustrated below: https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/cloudPCs? $select=userprincipalname,id,displayName,managedDeviceName,Status,imageDisplayName,lastModifiedDateTime,lastRemoteActionResult,lastLoginResult For Authentication, select Active Directory OAuth. Leave the authority as default. Enter your Tenant ID under Tenant, https://graph.microsoft.com under Audience, the AppID under Client ID, and the Secret in the Secret section. For production scenarios, you should consider storing your secret in a Key Management solution, like Azure Key Vault If you are using Azure Key Vault, then you can first add the Get Secret action from the pre-built Azure Key Vault connector (https://learn.microsoft.com/en-us/connectors/keyvault/#actions) then securely pass your Secret into this step of your automation - Figure 7: Example setup for Graph API controls to gather Cloud PC attribute value. Hide your Secret from the Power Automate run history Click on the … to the right of the Power Automate HTTP action Select Settings Turn the toggles to On for “Secure Inputs” and “Secure Outputs” in order to not display your Secret in plain text on the logs or run history Click Add an action, and search for “Parse JSON.” Under Parse JSON, select Body for the Content field and insert the body of the HTTP request response into the Schema field. Use the following schema: Figure 8: A screenshot of completed content and schema details for Parse JSON. { "type": "object", "properties": { "@@odata.context": { "type": "string" }, "value": { "type": "array", "items": { "type": "object", "properties": { "userPrincipalName": { "type": "string" }, "managedDeviceName": { "type": "string" }, "id": { "type": "string" }, "displayName": { "type": "string" }, "imageDisplayName": { "type": "string" }, "status": { "type": "string" }, "lastModifiedDateTime": { "type": "string" }, "lastRemoteActionResult": {}, "lastLoginResult": {} }, "required": [ "id", "userPrincipalName", "displayName", "imageDisplayName", "managedDeviceName", "status", "lastModifiedDateTime", "lastRemoteActionResult", "lastLoginResult" ] } } } } Note: You can also get this schema by using the Graph explorer to request from the same endpoint. Use the Generate from example button to generate the schema. Click Add action and search for “Apply to each.” In the Output field, select Value from our Parse JSON step. Click Add an action and search for “Compose.” In the Compose step, enter rungraph for: {id} Figure 9: Compose control example. Click Add an action and search for “HTTP.” Configure the HTTP using the same variables for TenantID, APpID, and Secret, as in the previous HTTP action, but using the following URI: https://graph.microsoft.com/beta/deviceManagement/virtualEndpoint/cloudPCs/@{items('Apply_to_each_2')?['id']}? $select=userprincipalname,id,displayName,managedDeviceName,Status,imageDisplayName,lastModifiedDateTime,lastLoginResult Example: Figure 10: Example setup for retrieving lastLoginResult value for each specific Cloud PC. Follow the same steps as previously outlined to hide your Secrets from the run history (Click on … > Select Settings > Turn toggles to On for “Secure Inputs” and “Secure Outputs”) Click Add an action, search for “Parse JSON.” Select Body for the Content field and insert the following into the Schema field: { "type": "object", "properties": { "@@odata.context": { "type": "string" }, "value": { "type": "array", "items": { "type": "object", "properties": { "userPrincipalName": { "type": "string" }, "managedDeviceName": { "type": "string" }, "id": { "type": "string" }, "displayName": { "type": "string" }, "imageDisplayName": { "type": "string" }, "status": { "type": "string" }, "lastModifiedDateTime": { "type": "string" }, "lastRemoteActionResult": {}, "lastLoginResult": {} }, "required": [ "id", "userPrincialName", "displayName", "imageDisplayName", "managedDeviceName", "status", "lastModifiedDateTime", "lastRemoteActionResult", "lastLoginResult" ] } } } } Figure 11: A screenshot of the Parse JSON schema. Click Add an action and search for “Condition”. Select lastLoginResult under Parse JSON for the value. Select is not equal to for condition. Under Add dynamic content, type null as the expression. Figure 12: lastLoginResult Condition Expression. At this point we are ready to add logic to the flow based on meeting the criteria of the condition. If yes - Click Add an action and search for “Set variable”. Insert a Name (e.g. lastLoginResult) For Value, select lastLoginResult under Parse JSON2 as the Dynamic content Click Add an action and search for “Compose”. Select Compose as the Data Operation. Enter the following expression in Inputs field: split(variables('lastLoginResult-Value'),'"') Click Add an action and search for “Compose”. Select Compose as the Data Operation. Enter the following expression in Inputs field: outputs('Compose_3')?[3] Click Add an action and search for “Set Variable”. Select Set Variable. Give it a Name (e.g. Composed_LastLoginResult_Value) Click on Add dynamic content to add Value Select Outputs under Compose 4 Step. Click Add an action and search for “Set Variable”. Select Set Variable. Give it a Name (e.g. DateDiff) Click on Add dynamic content to add Value Select Expression and enter the following expression div(sub(ticks(variables('DateNow')),ticks(variables('Composed_LastLoginResult_Value'))),864000000000) Now that we’ve been able to extract the proper number of days since lastlogin, let’s send out the email notifications. Click Add an action and search for “Condition”. Select DateDiff variable as the value. Select is greater than as condition. Enter 60 as the value (or whatever aligns to your criteria) Click Add an action and search for “Send an email”. Select Send an email v2. Provide a name (e.g. More than 60 Days Email notification) Enter the necessary information to the fields as necessary for your environment. See below as an example. Figure 13: Sample email template. Once you’re past the Apply to Each scope, Click Add an action, and search for “Terminate.” Set the Status to Succeeded. Return to the initial criteria Conditon to setup the the If no process. Scroll up in the workflow to access this setup. Click Add an action and search for “Set variable.” Select Set Variable. Enter a name (e.g. lastLoginResult-Value) Value enter Blank The entire flow process should look like the image below. Once you’ve completed adding in steps to your automation flow, you’re ready to test the solution. You can run a manual test or wait till the schedule task kicks off. Finally, you should receive an email like the one below: Admin Email Notification NOTE: WE WILL UPDATE THIS ARTICLE IN THE NEAR FUTURE TO INCLUDE THE ADDITION OF UPDATING A TABLE IN POWER APPS AND A FRONT FACING APPLICATION WHERE ADMINS CAN TAKE ACTION TO RECLAIM WINDOWS 365 LICENSE! STAY TUNED!!! Continue the conversation by joining us in the Microsoft 365 Tech Community! Whether you have product questions or just want to stay informed with updates on new releases, tools, and blogs, Microsoft 365 Tech Community is your go-to resource to stay connected.7.8KViews1like15CommentsEnable RDP Shortpath for Windows 365 with Proactive Remediation
RDP Shortpath for Windows 365 is now in public preview, bringing the ability to lower latency and improve end-user experience on the Cloud PC. When this feature becomes generally available (GA) it will be enabled by default. But while its in preview, it needs to be enabled on the Cloud PCs. To enable RDP Shortpath, a single registry value needs to be set. Details about RDP Shortpath for Windows 365 can be found here. The registry value to set can be found here. You can use Endpoint Manager to enable this for some or all Cloud PCs with minimal effort. While this can be accomplished in several ways, below are the steps deploy a PowerShell script package using Proactive remediations, enabling IT Pros to see reports on its effectiveness. As RDP Shortpath can improve connectivity to Cloud PCs and Proactive remediations can improve your User Experience score in Endpoint Analytics, using Proactive remediations to deploy this script is a recommended practice to enhance IT Pros' ability to clearly understand the end-user experience of their users. We’ve updated the Windows 365 GitHub repository, creating an RDP Shortpath Proactive Remediation folder. The folder contains two scripts, a remediation script and a detection script to enable the registry value and enable reporting on its status, respectively. Both must be used within a script package in Proactive Remediations. Be aware that the scripts are not signed, which can cause the scripts to fail if your organization is blocking unsigned scripts from running. Before getting started, it is advisable to read the official documentation on this feature as there are caveats and requirements with its enablement. It is also recommended to test this feature on a small set of test systems before enabling it production-wide to ensure it works as intended. This can be done by manually changing the Registry Key as outlined in the following links. Use RDP Shortpath for public networks (preview) with Windows 365 Azure Virtual Desktop RDP Shortpath for public networks (preview) Let’s get started! Firstly, go to the Windows 365 GitHub repo and download the two scripts in the RDP Shortpath Proactive Remediation folder (The Windows 365 GitHub repository) Next, in the MEM portal, open the Reports Tab, then select Endpoint Analytics. Clicking on Endpoint analytics will make new options appear in the console. Click on Create Script Package. Fill out the fields, then click Next. Click the folder icons for the Detection and Remediation scripts. Select the appropriate scripts that were downloaded from our Windows 365 GitHub repo. Once the correct scripts are selected, click next. If you need to leverage Scope Tags, complete the fields as needed. If not needed, or fields completed successfully, click next. Finally, select an Azure AD Group that contains the Windows 365 Cloud PCs that need to be updated to use RDP Shortpath. Once that is complete, click Next. Review the selections and either go back and fix problems or click “Complete”. It will take some time for the data from the Windows 365 Cloud PCs to start populating the dashboard. Once data starts to become available, you can monitor the progress of the scripts. If you need more details about the actions of the scripts, Proactive Remediation provides a way to export the data to CSV. The added benefit to this action is it captures the output of the scripts, giving admins insight to what is happening on the endpoints during remediation. To retrieve this data, click on Device Status, then export. A ZIP file will be downloaded, and upon opening, there will be a CSV file. Once the CSV file is opened, admins can see the outputs from the scripts. Please let me know if this script package had been useful to your organization, if a bug has been found, or suggestions. If you’d like to improve this script, make a Pull Request on the repository. The goal for the repo is to have it be a community compilation, not just a place where I put scripts that I think will be useful.4.9KViews2likes1CommentWindows 365 Cloud PC Configuration Profiles and Policies
We are rolling out Autopilot devices as well as Cloud PC. Is it possible to separate the Cloud PC configuration profile with Autopilot devices that gets enrolled (including Config profile, Compliance policies, Apps deployment etc... )from those of Autopilot? As, I see that all are falling under the All devices categories and whatever CSP we are applying for Autopilot devices gets applied to Cloud PC since we login with the same credentials on both? Any suggestions, thoughts or am I clear what I am posting here?4.1KViews0likes5CommentsWindows 365 Cloud PC Fleet Wide Last Login
Hello, What is the best and most efficient way to run a report for the last login or connection time stamp for Windows 365 Cloud PC users? Can't seem to find anything in the reports. AAD Sign-in logs for Windows 365 Portal app? Thank youSolved3.8KViews0likes5Comments