<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Microsoft Mission Critical Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/bg-p/MicrosoftMissionCriticalBlog</link>
    <description>Microsoft Mission Critical Blog articles</description>
    <pubDate>Thu, 07 May 2026 23:05:10 GMT</pubDate>
    <dc:creator>MicrosoftMissionCriticalBlog</dc:creator>
    <dc:date>2026-05-07T23:05:10Z</dc:date>
    <item>
      <title>Databricks Lakebase: The operational database for AI agents and apps</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/databricks-lakebase-the-operational-database-for-ai-agents-and/ba-p/4516497</link>
      <description>&lt;H2&gt;Understanding the Evolution: From Lakehouse to Lakebase&lt;/H2&gt;
&lt;P&gt;The modern data landscape has long been characterized by a fundamental schism: Online Transaction Processing (OLTP) systems, designed for high-frequency, low-latency transactions in applications, and Online Analytical Processing (OLAP) systems, optimized for complex queries, reporting, and machine learning on vast datasets. This division historically necessitated intricate and often fragile Extract, Transform, Load (ETL) processes to move and synchronize data between these disparate environments, leading to increased complexity, data duplication, and governance challenges.&lt;/P&gt;
&lt;P&gt;Databricks Lakehouse architecture emerged to unify data warehousing and data lake f&lt;/P&gt;
&lt;P&gt;unctionalities for analytical workloads, offering the flexibility of data lakes with the performance and governance of data warehouses. However, a critical piece remained: native, high-performance OLTP capabilities directly within this unified environment. This is where Databricks Lakebase enters the picture, representing a significant evolution by bringing fully managed PostgreSQL OLTP capabilities directly into the Databricks Data Intelligence Platform.&lt;/P&gt;
&lt;P&gt;Lakebase addresses the need for a single, governed platform that can seamlessly handle both transactional and analytical workloads, thereby simplifying data architectures, reducing operational overhead, and accelerating the development of real-time applications and AI agents. By integrating OLTP at the core of the lakehouse, Databricks aims to create a truly unified data and AI platform.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;1.Visualizing the architectural shift: Lakebase integrates seamlessly within the Databricks Lakehouse ecosystem.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;The Architectural Innovation: Separation of Compute and Storage&lt;/H3&gt;
&lt;P&gt;At the heart of Databricks Lakebase's efficiency and scalability lies its innovative architecture, which fundamentally separates compute from storage. Unlike traditional monolithic databases where these components are tightly coupled, Lakebase decouples them, offering distinct advantages:&lt;/P&gt;
&lt;H4&gt;Elastic Scaling and Cost Efficiency&lt;/H4&gt;
&lt;P&gt;The transactional compute layer in Lakebase is serverless and ephemeral, meaning it can scale up or down dynamically based on demand. This includes the ability to scale to zero during periods of inactivity, significantly optimizing cost by ensuring you only pay for the compute resources actively used. Data, on the other hand, is persisted directly into low-cost, durable cloud object storage (e.g., Azure Blob Storage) using open formats like Delta Lake. This design not only reduces storage costs but also prevents vendor lock-in and allows other engines within the Databricks platform to access the data directly.&lt;/P&gt;
&lt;H4&gt;Open Data Formats and Interoperability&lt;/H4&gt;
&lt;P&gt;By storing data in open formats, Lakebase ensures high interoperability within the Databricks ecosystem and beyond. This approach eliminates the need for complex and time-consuming ETL processes to move transactional data to the analytical layer, as the data is inherently accessible to both. This foundational integration streamlines data pipelines and provides a unified view of data across all workloads.&lt;/P&gt;
&lt;H3&gt;Key Technical Capabilities and Features&lt;/H3&gt;
&lt;P&gt;Databricks Lakebase offers a rich set of features that make it a compelling solution for modern data architectures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PostgreSQL Compatibility:&lt;/STRONG&gt;&amp;nbsp;Lakebase provides full PostgreSQL semantics, including ACID transactions, indexing capabilities, and support for standard JDBC/psql clients. This familiarity allows developers to leverage existing skills and tools, minimizing the learning curve.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fully Managed Service:&lt;/STRONG&gt;&amp;nbsp;Databricks handles the complexities of provisioning, scaling, patching, backups, and ensuring high availability, freeing up development teams to focus on application logic rather than database administration.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Managed Change Data Capture (CDC):&lt;/STRONG&gt;&amp;nbsp;A crucial feature, managed CDC ensures that operational data in Lakebase remains synchronized with Delta Lake tables for analytical consumption. This continuous synchronization is vital for keeping BI models and AI applications updated with the freshest transactional data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Autoscaling (Lakebase Autoscaling):&lt;/STRONG&gt;&amp;nbsp;The latest iteration of Lakebase features intelligent autoscaling of compute resources. It dynamically adjusts Compute Units (CU) based on various metrics like CPU load, memory usage, and working set size, preventing performance bottlenecks and out-of-memory (OOM) issues. It also supports branching and instant restore, enhancing developer agility and operational resilience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Databricks Apps Synergy:&lt;/STRONG&gt;&amp;nbsp;Lakebase is designed to serve as the transactional backend for Databricks Apps, enabling the creation and deployment of interactive applications directly on the platform, leveraging governed data and powerful analytics.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Governance, Security, and Cost Efficiency with Lakebase&lt;/H2&gt;
&lt;P&gt;Adopting Databricks Lakebase brings significant benefits in terms of data governance, security, and overall cost management, aligning with the principles of a modern data intelligence platform.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;2.Reverse ETL with Lakebase simplifies data activation for operational analytics.&lt;/EM&gt;&lt;/img&gt;
&lt;H3&gt;Unified Governance through Unity Catalog&lt;/H3&gt;
&lt;P&gt;One of Lakebase's most powerful integrations is with Unity Catalog, Databricks' unified governance solution. This integration provides a single pane of glass for managing data assets across the entire Databricks Data Intelligence Platform. Lakebase databases can be registered as catalogs within Unity Catalog, extending its robust governance framework to operational data. This means:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Consistent Access Control:&lt;/STRONG&gt;&amp;nbsp;Policies defined for your lakehouse data automatically apply to Lakebase, ensuring uniform security and access management across both operational and analytical workloads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Centralized Auditing and Lineage:&lt;/STRONG&gt;&amp;nbsp;Unity Catalog provides comprehensive auditing capabilities and data lineage tracking for Lakebase assets, simplifying compliance and offering transparent insights into data flows.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Simplified Security Management:&lt;/STRONG&gt;&amp;nbsp;By unifying governance, organizations can reduce the complexity of managing security policies across disparate systems, enhancing overall data security posture.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Robust Security and Data Protection&lt;/H3&gt;
&lt;P&gt;Lakebase is designed with enterprise-grade security in mind, leveraging existing cloud infrastructure and Databricks' security features:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Network Integration:&lt;/STRONG&gt;&amp;nbsp;It integrates seamlessly with cloud networking services (e.g., Azure Private Link) for secure, private connectivity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Identity Management:&lt;/STRONG&gt;&amp;nbsp;Integration with enterprise identity providers (e.g., Microsoft Entra ID) ensures secure authentication and authorization.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Encryption:&lt;/STRONG&gt;&amp;nbsp;Data is encrypted at rest and in transit, protecting sensitive information throughout its lifecycle.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;High Availability and Disaster Recovery:&lt;/STRONG&gt;&amp;nbsp;As a fully managed service, Lakebase inherently provides features for high availability and point-in-time recovery, ensuring operational resilience.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Optimized Cost Efficiency&lt;/H3&gt;
&lt;P&gt;The architectural separation of compute and storage, coupled with advanced autoscaling capabilities, contributes to significant cost savings compared to traditional database architectures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Pay-as-you-go Compute:&lt;/STRONG&gt;&amp;nbsp;With serverless and autoscaling compute, you only pay for the resources consumed during active processing, with the ability to scale down to zero when idle.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Low-Cost Storage:&lt;/STRONG&gt;&amp;nbsp;Leveraging economical cloud object storage for data persistence drastically reduces storage costs.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reduced ETL Overhead:&lt;/STRONG&gt;&amp;nbsp;By eliminating the need for complex ETL pipelines between OLTP and OLAP, organizations save on infrastructure, development, and maintenance costs associated with data movement and transformation. This can lead to reported savings of 40-50% in many environments.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Lakebase in Action: Powering Real-Time Applications and AI Agents&lt;/H2&gt;
&lt;P&gt;Databricks Lakebase opens up new possibilities for building intelligent, data-driven applications that require both transactional capabilities and deep analytical insights. Its unified approach simplifies development and accelerates time-to-market for innovative solutions.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;Real-World Use Cases&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Personalized Recommendations:&lt;/STRONG&gt;&amp;nbsp;Build real-time recommendation engines that leverage fresh transactional data from Lakebase to provide immediate and highly relevant suggestions to users.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Customer Segmentation and Real-Time Updates:&lt;/STRONG&gt;&amp;nbsp;Maintain and update customer profiles and segments in real-time, enabling personalized experiences and targeted marketing campaigns.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Feature Stores for Machine Learning:&lt;/STRONG&gt;&amp;nbsp;Utilize Lakebase as a feature store to serve low-latency features to AI models, ensuring that predictions and decisions are based on the most current data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Stateful AI Agents:&lt;/STRONG&gt;&amp;nbsp;Develop AI agents that can maintain conversational state and interact dynamically with users, using Lakebase as a reliable backend for transactional data.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Order Processing Systems:&lt;/STRONG&gt;&amp;nbsp;Implement operational applications that require high-frequency reads, writes, and updates, such as order management or inventory systems, directly on the Databricks platform.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Interactive Workflow Tools:&lt;/STRONG&gt;&amp;nbsp;Create interactive data applications and dashboards that allow users to both view analytical insights and perform transactional updates within the same environment.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;A Practical Code Snippet&lt;/H3&gt;
&lt;P&gt;Developing with Lakebase feels familiar due to its PostgreSQL compatibility. Here’s a simple example demonstrating basic CRUD (Create, Read, Update, Delete) operations within a Lakebase table:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;-- Create a schema for your application

CREATE SCHEMA app AUTHORIZATION CURRENT_USER;

-- Create a table to store session data for an AI agent

CREATE TABLE app.sessions (

  session_id UUID PRIMARY KEY,

  user_id TEXT NOT NULL,

  state JSONB NOT NULL,

  created_at TIMESTAMPTZ DEFAULT now(),

  updated_at TIMESTAMPTZ

);


-- Create an index to optimize queries on agent status

CREATE INDEX ON app.sessions ((state-&amp;gt;&amp;gt;'agentStatus'));



-- Insert a new session record

INSERT INTO app.sessions(session_id, user_id, state)

VALUES (gen_random_uuid(), 'u-123', '{"agentStatus":"active","score":0.82}');


-- Update an existing session's state

UPDATE app.sessions SET state = jsonb_set(state, '{score}', '0.91'::jsonb), updated_at = now()

WHERE user_id='u-123';


-- Query active sessions

SELECT user_id, state-&amp;gt;&amp;gt;'score' as current_score FROM app.sessions WHERE (state-&amp;gt;&amp;gt;'agentStatus') = 'active';&lt;/LI-CODE&gt;
&lt;P&gt;This SQL snippet showcases how developers can interact with Lakebase using standard PostgreSQL syntax, enabling rapid application development within the Databricks environment.&lt;/P&gt;
&lt;H2&gt;The Lakebase Advantage: Performance and Reliability&lt;/H2&gt;
&lt;P&gt;Beyond its unified architecture, Lakebase is engineered for predictable performance and robust reliability, essential for mission-critical operational applications.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;The radar chart above provides an opinionated comparison of Databricks Lakebase against traditional OLTP systems across several key attributes. Lakebase demonstrates superior performance predictability, dynamic scalability, cost efficiency, and ease of management, coupled with strong data governance due to its integration with Unity Catalog. Traditional OLTP systems, while effective for their specific purposes, often score lower in these cloud-native, unified data platform metrics.&lt;/P&gt;
&lt;H3&gt;Reliability Features for Business Continuity&lt;/H3&gt;
&lt;P&gt;Lakebase integrates several critical reliability features that ensure business continuity and data integrity:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Branching:&lt;/STRONG&gt;&amp;nbsp;This feature allows developers to create isolated, production-like environments for testing changes without affecting the main operational database. It promotes safer development practices and faster iteration cycles.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Instant Restore and Point-in-Time Recovery (PITR):&lt;/STRONG&gt;&amp;nbsp;In the event of data corruption or accidental deletion, Lakebase enables quick restoration to a previous state, minimizing downtime and ensuring data resilience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;High Availability:&lt;/STRONG&gt;&amp;nbsp;As a managed service, Lakebase is designed for high availability, with automated failover mechanisms and robust infrastructure ensuring continuous operation.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Validation and Troubleshooting: Ensuring a Smooth Lakebase Experience&lt;/H2&gt;
&lt;P&gt;Successful implementation and ongoing operation of Databricks Lakebase rely on proper validation and an understanding of common troubleshooting steps. This section provides a framework for ensuring your Lakebase deployment meets performance and reliability expectations.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/UQynsu6qklw?si=v-k54HKAoLxaBiLN/1777658794119" data-video-remote-vid="https://youtu.be/UQynsu6qklw?si=v-k54HKAoLxaBiLN/1777658794119" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FUQynsu6qklw%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DUQynsu6qklw&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FUQynsu6qklw%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&lt;EM&gt;An introductory video to Lakebase, explaining its core functionality and benefits for data apps and AI agents.&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;Key Validation Steps&lt;/H3&gt;
&lt;P&gt;After provisioning and configuring your Lakebase instance, it's crucial to perform a series of validation tests:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Connectivity Verification:&lt;/STRONG&gt;&amp;nbsp;Confirm successful connections from your applications or development tools (e.g., psql, JDBC clients) to the Lakebase instance. Ensure that Unity Catalog registration is visible and properly configured for governance.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Performance Baseline:&lt;/STRONG&gt;&amp;nbsp;Conduct baseline QPS (Queries Per Second) tests and monitor latency under expected load conditions. Validate that autoscaling events occur as anticipated and that performance targets are met.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Data Synchronization (CDC):&lt;/STRONG&gt;&amp;nbsp;Test the end-to-end data flow by inserting/updating records in Lakebase and verifying their timely appearance in Delta Lake tables via managed CDC. If reverse synchronization (Delta to Lakebase) is configured, validate that as well.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Governance and Security Checks:&lt;/STRONG&gt;&amp;nbsp;Confirm that Unity Catalog permissions are correctly enforced for Lakebase assets and that audit logs accurately reflect data access and modification events. Verify network security configurations (e.g., Private Link) are functioning as intended.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Common Troubleshooting Scenarios&lt;/H3&gt;
&lt;P&gt;While Lakebase is designed for stability, understanding potential issues and their resolutions is key to efficient operation:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table style="width: 1078px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Problem Area&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Symptom&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Potential Cause(s)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Troubleshooting Step(s)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;High latency, slow queries, autoscaling not triggering as expected.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Inefficient queries, missing indexes, insufficient compute resources, working set exceeding memory.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Inspect query plans, add appropriate indexes, monitor CU utilization, review autoscaling logs, consider increasing initial compute capacity if persistently underperforming.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Data Sync (CDC)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Stale data in Delta Lake, sync job failures, data inconsistencies.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect Unity Catalog permissions, CDC configuration errors, network issues, regional feature limitations.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Verify Unity Catalog access for CDC process, check CDC job logs for errors, confirm network connectivity between Lakebase and Delta Lake, consult Databricks documentation for regional CDC availability.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Connectivity&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Unable to connect from application, authentication failures.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect connection strings, firewall rules blocking access, misconfigured private endpoints, invalid credentials/tokens.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Double-check connection parameters, review network security group (NSG) and firewall rules, validate Private Link configuration, ensure correct user/service principal credentials.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Governance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Unauthorized access, unexpected data visibility, audit log discrepancies.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incorrect Unity Catalog access policies, schema mismatches, misconfigured external locations.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Review and refine Unity Catalog grants on Lakebase catalogs and schemas, verify external location configurations, ensure consistent data object naming conventions.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Feature Limitations&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Specific PostgreSQL features or extensions not working.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Managed environment restrictions, unsupported extensions.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Consult Databricks documentation for supported PostgreSQL versions and extensions in Lakebase. Adapt application logic to use supported alternatives if necessary.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;By proactively monitoring and understanding these aspects, Cloud Solution Architects can ensure robust and efficient operation of Lakebase within their Databricks ecosystem.&lt;/P&gt;
&lt;H2&gt;Conclusion&lt;/H2&gt;
&lt;P&gt;Databricks Lakebase represents a pivotal advancement in data architecture, fundamentally reshaping how organizations approach operational and analytical workloads. By seamlessly integrating a fully managed PostgreSQL OLTP engine directly into the Databricks Data Intelligence Platform, Lakebase addresses the long-standing challenge of data fragmentation. This unification not only simplifies complex ETL processes and reduces operational overhead but also extends robust governance and security through Unity Catalog across the entire data estate. The innovative separation of compute and storage, coupled with intelligent autoscaling, delivers unparalleled cost efficiency and dynamic performance. For Cloud Solution Architects, Lakebase offers a compelling path to building scalable, real-time applications and sophisticated AI agents, leveraging fresh transactional data alongside comprehensive analytical insights—all within a single, consistent, and highly performant environment. This strategic evolution of the lakehouse architecture empowers enterprises to unlock new levels of agility, innovation, and data-driven decision-making.&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 18:23:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/databricks-lakebase-the-operational-database-for-ai-agents-and/ba-p/4516497</guid>
      <dc:creator>anishekkamal</dc:creator>
      <dc:date>2026-05-01T18:23:22Z</dc:date>
    </item>
    <item>
      <title>Service Principals in Microsoft Power Platform</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/service-principals-in-microsoft-power-platform/ba-p/4516482</link>
      <description>&lt;H4&gt;Shared Passwords Are a Ticking Time Bomb&lt;/H4&gt;
&lt;P&gt;Let’s be blunt: if your Power Platform automation runs on a shared service account password that three people know, you are one resignation away from every flow going dark, one password reset, one MFA change… That is all it takes.&lt;/P&gt;
&lt;P&gt;The fix? A &lt;STRONG&gt;service principal, &lt;/STRONG&gt;a non‑human application identity in &lt;STRONG&gt;Microsoft Entra ID&lt;/STRONG&gt; that authenticates with certificates, never logs in interactively, and keeps running no matter who leaves. In Power Platform, it shows up as an &lt;STRONG&gt;Application User&lt;/STRONG&gt; in Dataverse and can own flows, manage Power BI datasets, run Dataverse operations, and power your CI/CD pipelines.&lt;/P&gt;
&lt;P&gt;Unlike a traditional shared service account (which carries the risk of password expiration, MFA prompts breaking automation, and credentials being overshared), a service principal authenticates using certificates or client secrets, has no mailbox, no interactive login, and cannot be accidentally used by a person.&lt;/P&gt;
&lt;P&gt;For organizations running Power Automate flows, calling APIs, running Power Platform Pipelines or managing environments programmatically, service principals offer a fundamentally more secure, auditable, and manageable identity. They enable least-privilege access, integrate cleanly with Conditional Access policies, and eliminate the single point of failure that comes with tying critical automation to an individual employee's account. This lack of tether to an individual account means workloads do not need to be reassigned once someone leaves your organization. Put more simply, if your Power Platform workloads are still running under a named user or a shared "&lt;A href="mailto:svc_powerautomate@company.com" target="_blank" rel="noopener"&gt;svc_powerautomate@company.com&lt;/A&gt;" account, it's time to reconsider.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Microsoft Advisory: “Best practice is to use service principals as the preferred identity model for Power Automate wherever supported, because shared user‑based service accounts introduce security, audit, and operational risks.”&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.97533%" /&gt;&lt;col style="width: 97.9938%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this blog, we will highlight opportunities to strengthen your security posture across the Power Platform with Service Principals alongside ideas for when a Service Principal may not be applicable for your scenario.&lt;/P&gt;
&lt;H4&gt;Getting Started:&lt;/H4&gt;
&lt;P&gt;Setting up a service principal is straightforward. Everything is documented on Microsoft Learn:&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app" target="_blank" rel="noopener"&gt;Register an app in Entra ID — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/manage-application-users" target="_blank" rel="noopener"&gt;Manage application users — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-automate/service-principal-support" target="_blank" rel="noopener"&gt;Service principal owned flows — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;There are also many good blogs about step-by-step setup of the service principal, assigning permissions and assigning to an application user we won't be covering the setup here. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let's go into detail how you can utilize a Service Principal to secure your Power Platform workloads.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Where Service Principals Shine in the Power Platform&lt;/H4&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;⚡&lt;/STRONG&gt;&lt;STRONG&gt; Power Automate&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In Power Automate, service principals establish durable ownership and authentication for enterprise automation. Flows run under a non‑human application identity, eliminating dependency on individual users and preventing failures caused by password rotation, MFA enforcement, or user departure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Flow Ownership:&lt;/STRONG&gt;&lt;BR /&gt;Assign the service principal as the primary owner to ensure flows continue running regardless of personnel changes. Service Principal‑owned flows require either a Process license (~$150/flow/month, stackable up to 10 for 2.5M actions/day) or pay‑as‑you‑go billing via Azure.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Authentication:&lt;/STRONG&gt;&lt;BR /&gt;Service principals authenticate using client credentials, removing the standard 90‑day connection expiry. Only the client secret or certificate has an expiration, which can be configured (up to 24 months). For production workloads, store secrets in Azure Key Vault with rotation alerts.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dataverse Connector:&lt;/STRONG&gt;&lt;BR /&gt;Dataverse is the &lt;STRONG&gt;only standard connector with native service principal sign&lt;/STRONG&gt;‑&lt;STRONG&gt;in&lt;/STRONG&gt;. Selecting &lt;EM&gt;Connect with Service Principal&lt;/EM&gt; ensures all Dataverse actions execute under the application identity with full audit attribution.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Non&lt;/STRONG&gt;‑&lt;STRONG&gt;Service Principal&lt;/STRONG&gt;&lt;STRONG&gt; Connectors:&lt;/STRONG&gt;&lt;BR /&gt;Connectors such as SharePoint, Outlook, and Teams require delegated user context by design. Where app‑only execution is required, the HTTP connector can be used to call Microsoft Graph with application permissions, introducing a premium dependency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Service Principal‑Friendly&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;✓ Microsoft Dataverse (native SP sign‑in)&lt;/P&gt;
&lt;P&gt;✓ Custom connectors (app‑only OAuth)&lt;/P&gt;
&lt;P&gt;✓ HTTP via Graph API (app permissions)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;⚠ Requires User Context&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;⚠ SharePoint (standard connector)&lt;/P&gt;
&lt;P&gt;⚠ Outlook / Office 365&lt;/P&gt;
&lt;P&gt;⚠ Teams (many actions)&lt;/P&gt;
&lt;P&gt;⚠ Planner, OneDrive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-automate/service-principal-support" target="_blank" rel="noopener"&gt;Support for service principal owned flows - Power Automate | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗 &lt;A href="https://learn.microsoft.com/en-us/power-automate/dataverse/manage-dataverse-connections" target="_blank" rel="noopener"&gt;Manage connections to Dataverse — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;📱 Power Apps and Dataverse&lt;/H5&gt;
&lt;P&gt;Your Service Principal’s Application User executes Dataverse operations from flows triggered by model‑driven apps. Audit logs clearly separate automated changes from human activity. Assign custom security roles scoped to exact tables (skip System Admin), use separate Service Principalss per solution area, and know that canvas apps can trigger Service Principal‑backed flows behind the scenes.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/create-dataverseapplicationuser" target="_blank" rel="noopener"&gt;Create a Dataverse application user — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;📊 Power BI&lt;/H5&gt;
&lt;P&gt;This is where Service Principals quietly save organizations from one of the most common Power BI failures: &lt;STRONG&gt;dataset refresh breaking because the owner left&lt;/STRONG&gt;. Take over semantic model ownership via the REST API and refreshes never fail from expired tokens again.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Workspace access: add Service Principal as Member or Admin&lt;/LI&gt;
&lt;LI&gt;Semantic model ownership takeover via REST API&lt;/LI&gt;
&lt;LI&gt;Automated refresh from PowerShell, Logic Apps, Azure Data Factory, or custom apps&lt;/LI&gt;
&lt;LI&gt;XMLA endpoint access for model deployment and DAX queries (Premium/Fabric)&lt;/LI&gt;
&lt;LI&gt;App Owns Data embedding for external users without Power BI licenses&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Requirement:&lt;/STRONG&gt; Tenant admin enables “Service principals can use Fabric APIs”. Service Principal added to workspace. API refresh needs Premium, Premium Per User, or Fabric capacity.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.88273%" /&gt;&lt;col style="width: 98.179%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-bi/enterprise/service-premium-service-principal" target="_blank" rel="noopener"&gt;Automate Premium tasks with Service Principals — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-bi/connect-data/asynchronous-refresh" target="_blank" rel="noopener"&gt;Enhanced refresh REST API — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;🛠️ Application Lifecycle Management (ALM) with Pipelines&lt;/H4&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/power-platform/alm/pipelines" target="_blank" rel="noopener"&gt;Power Platform Pipelines&lt;/A&gt; are a built-in option for application lifecycle management native to the Power Platform. Pipelines bring ALM automation and continuous integration and continuous delivery (CI/CD) functionality into a native service that's designed to be usable by all members of your low-code team, regardless of technical capability. To learn how to set up pipelines in Power Platform, Microsoft has some fantastic &lt;A href="https://learn.microsoft.com/en-us/power-platform/alm/set-up-pipelines" target="_blank" rel="noopener"&gt;documentation&lt;/A&gt; as well as a &lt;A href="https://learn.microsoft.com/en-us/training/paths/simplify-power-platform-deployments/" target="_blank" rel="noopener"&gt;learning path on Learn.microsoft&lt;/A&gt; to guide you through the process.&lt;/P&gt;
&lt;P&gt;We can utilize Service Principals in Pipelines as well. By default, a pipeline deploys &lt;EM&gt;as the requesting maker,&lt;/EM&gt; meaning the maker needs elevated permissions to deploy to the target environment. Delegated deployments with Service Principals allow deployment without the maker needing elevated permissions in the downstream environment. The pipeline can run as a service principal (or pipeline stage owner), allowing makers to deploy without needing elevated permissions in target environments like production. Approvals may be required for security reasons, and can be automated or manual depending on your security requirements.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/power-platform/admin/powerplatform-api-create-service-principal" target="_blank" rel="noopener"&gt;PAC CLI: createserviceprincipal - Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;🛡️ Alternatives for Secure Workloads&lt;/H4&gt;
&lt;P&gt;While service principals offer an avenue to securing most workload scenarios on the Power Platform, they cannot cover all workload scenarios. In these cases, there are alternative approaches.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview" target="_blank" rel="noopener"&gt;Azure Logic Apps&lt;/A&gt; support system-assigned and user-assigned &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/authenticate-with-managed-identity?tabs=consumption" target="_blank" rel="noopener"&gt;managed identities&lt;/A&gt;, allowing workflows to authenticate directly to Azure resources without storing or managing any login credentials. This can offer an option when your workload can live outside Power Automate.&lt;/P&gt;
&lt;P&gt;Some teams opt to retain shared service accounts. This is not best practice, but when undertaken, there are steps to harden these accounts. Dedicated Entra Conditional Access policies to enforce MFA, restricting sign in locations and devices can provide additional protection. For password rotation, Azure Key Vault centralizes credential storage and enables automatic secret rotation, reducing the risk of stale or exposed passwords.&lt;/P&gt;
&lt;P&gt;Each of these approaches can be layered or combined with service principals depending on your organization's risk tolerance, licensing constraints, and connector support limitations.&lt;/P&gt;
&lt;P&gt;🔗&lt;A href="https://learn.microsoft.com/en-us/entra/architecture/govern-service-accounts" target="_blank" rel="noopener"&gt;Governing Entra service accounts — Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;All Your Options at a Glance&lt;/H4&gt;
&lt;P&gt;Not sure which approach fits? Here is every option compared — from the gold standard to the fallback you hope to leave behind:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Option&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;MS Rec?&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Key Benefit&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Main Tradeoff&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Security&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Process License&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Gold standard. Certificate auth, clean audit.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;~$150/flow/mo. Solutions required.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Flow Groups&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes (GA May ’26)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;1 license across up to 25 flows.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Shared 250K/day action pool.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SP + Pay-as-you-go&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Available today. No upfront cost.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Variable cost. Azure sub needed.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Hybrid: SP + SA&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pragmatic&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SP owns; SA for delegated connectors.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SA still exists for connections.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Med‑High&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Hardened SA Only&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;No&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Simplest and no migration needed.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Interactive login risk. MS discourages.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Low&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Logic Apps + MI&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes (diff product)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Zero credentials. Consumption billing.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Full platform migration required.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Highest&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;⚠ All costs are approximate and vary by enterprise agreement. Verify with your Microsoft representative.&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Microsoft‑validated:&lt;/STRONG&gt; The dedicated service account fallback is a supported approach, not a workaround. Any alternative to service principals would need to be designed and accepted at the customer’s own risk.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 2.1306%" /&gt;&lt;col style="width: 97.8385%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Summary&lt;/H4&gt;
&lt;P&gt;Service principals replace shared, user‑based accounts with a non‑human application identity that is secure, auditable, and resilient. Eliminating password risk, improving governance, and ensuring Power Platform workloads continue running independent of employee lifecycle events&lt;/P&gt;
&lt;P&gt;across the entire platform. The result is higher security, operational stability, and governance consistency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;The Bottom Line&lt;/H4&gt;
&lt;P&gt;Service principals are not optional polish. They are how Microsoft expects you to run enterprise automation in 2026. One Entra ID app registration. Four products. Zero shared passwords.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Blocking interactive admin logins is correct.&lt;/STRONG&gt; No supported scenario requires it.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.88273%" /&gt;&lt;col style="width: 98.179%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Hybrid model when needed.&lt;/STRONG&gt; Service Principals where supported, hardened service accounts where not. Both documented by Microsoft.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 2.06792%" /&gt;&lt;col style="width: 97.9938%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✓ Start with pay‑as‑you‑go.&lt;/STRONG&gt; Pilot a batch. Measure costs. Then commit. No upfront purchase needed.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 1.85288%" /&gt;&lt;col style="width: 98.1162%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Authors: &lt;/STRONG&gt;Sheldon Dsouza + Marc Lotorto | &lt;STRONG&gt;Contributors: &lt;/STRONG&gt;Rasha Al-Silmi, Ahmed Shaalan, Josh Flicker&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;All guidance aligned with Microsoft Learn and validated by Microsoft Advisory, April 2026&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 17:18:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/service-principals-in-microsoft-power-platform/ba-p/4516482</guid>
      <dc:creator>Shdsouza</dc:creator>
      <dc:date>2026-05-01T17:18:09Z</dc:date>
    </item>
    <item>
      <title>The Journey of Copilot: From Setup to Mastery for Azure SAP customers</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/the-journey-of-copilot-from-setup-to-mastery-for-azure-sap/ba-p/4516485</link>
      <description>&lt;H3&gt;&lt;STRONG&gt;Introduction: &lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;GitHub Copilot integrates as an extension or plugin within developer tools commonly used in SAP and Azure scenarios, such as Visual Studio, Visual Studio Code, and other supported IDEs. These tools are often used alongside SAP development (e.g., ABAP, CAP, or integrations with S/4HANA and Azure services).&lt;/P&gt;
&lt;P&gt;Before you begin, ensure you have access to Copilot, through an organizational license (common in enterprise environments).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Install GitHub Copilot&lt;/STRONG&gt;&lt;/H3&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 1: Install Required Extensions&lt;/STRONG&gt;&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Visual Studio Code&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Go to &lt;STRONG&gt;Extensions&lt;/STRONG&gt; (Ctrl + Shift + X)&lt;/LI&gt;
&lt;LI&gt;Install the following extensions:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot Chat&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub Copilot for Azure&lt;/STRONG&gt; (Microsoft extension)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/OL&gt;
&lt;P&gt;When installing the Azure extension, it may prompt you to install additional Azure tools, &lt;STRONG&gt;accepting all required components&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 2: Sign in and Authenticate&lt;/STRONG&gt;&lt;/H5&gt;
&lt;OL&gt;
&lt;LI&gt;Sign in to your &lt;STRONG&gt;GitHub account&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Sign in to your &lt;STRONG&gt;Azure account&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Complete authentication in the browser&lt;/LI&gt;
&lt;LI&gt;Return to VS Code&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Both logins are required:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub → enables Copilot&lt;/LI&gt;
&lt;LI&gt;Azure → enables Azure resource access and tools&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 3: Enable and Verify Setup&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Copilot Chat&lt;/STRONG&gt; (Ctrl + Alt + I)&lt;/LI&gt;
&lt;LI&gt;Check that Copilot is active&lt;/LI&gt;
&lt;LI&gt;Verify Azure integration by typing a test prompt:&lt;/LI&gt;
&lt;LI&gt;What Azure resources are deployed and running in my subscription?&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you get a response → setup is successful&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Step 4: Configure Azure Context (Important for SAP)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Set your &lt;STRONG&gt;Azure tenant / subscription (Entra ID)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Ensure correct environment for:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;SAP on Azure (S/4HANA, SAP NetWeaver)&lt;/LI&gt;
&lt;LI&gt;SAP BTP extensions&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Optional: Enable &lt;STRONG&gt;Agent Mode&lt;/STRONG&gt; for automation tasks (deployments, scripts)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Get Started in Your SAP Development Environment&lt;/STRONG&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Open your preferred IDE (Visual Studio, VS Code, or Eclipse with SAP tooling)&lt;/LI&gt;
&lt;LI&gt;Access the &lt;STRONG&gt;Copilot chat or assistant panel&lt;/STRONG&gt; within the IDE&lt;/LI&gt;
&lt;LI&gt;Sign in with your GitHub account (and organizational account if required)&lt;/LI&gt;
&lt;LI&gt;Start using Copilot in your SAP development scenarios&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Use Copilot for SAP Workloads&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Inline suggestions&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Get real-time code suggestions for SAP-related languages (e.g., JavaScript, Java, ABAP extensions, CAP models)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Ask questions in chat&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Understand existing logic, SAP APIs, or integration patterns (e.g., “Explain this service” or “How does this SAP function work?”)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate and improve code&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Create boilerplate logic, unit tests, and integration code faster&lt;/LI&gt;
&lt;LI&gt;Identify performance or design improvements in existing SAP code&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Enhance with SAP Context&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Provide &lt;STRONG&gt;additional context&lt;/STRONG&gt; (files, APIs, or SAP objects) to improve suggestions&lt;/LI&gt;
&lt;LI&gt;Optionally connect Copilot to &lt;STRONG&gt;SAP data or services&lt;/STRONG&gt; using enterprise integrations&lt;/LI&gt;
&lt;LI&gt;Use Copilot to support:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;SAP BTP extensions&lt;/LI&gt;
&lt;LI&gt;S/4HANA integrations&lt;/LI&gt;
&lt;LI&gt;Fiori/UI5 development and APIs&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;Once you start interacting with Copilot, it acts as an AI assistant within your SAP development workflow, helping you write code faster, understand existing logic, and accelerate innovation across your SAP and Azure landscape.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;The Hidden Layer: Network Configuration for SAP Customers&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;As you begin using GitHub Copilot within your SAP development and integration environment, you may notice performance differences, especially when working within corporate networks. In most cases, Copilot connects securely to GitHub services over the internet using HTTPS, without requiring additional setup. However, in SAP enterprise environments where strict governance, security policies, and compliance controls are in place, network traffic is often routed through proxies, firewalls, or VPNs.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;What You Need to Know&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Copilot may require additional configuration when operating behind corporate proxies or firewalls&lt;/LI&gt;
&lt;LI&gt;Proxy settings can be configured:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Directly within your IDE&lt;/LI&gt;
&lt;LI&gt;Or through environment variables such as HTTP_PROXY and HTTPS_PROXY&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Authentication to enterprise proxies may require:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Basic credentials&lt;/LI&gt;
&lt;LI&gt;Or enterprise mechanisms such as Kerberos-based authentication&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;Enterprise Considerations for SAP Landscapes&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Organizations may require custom SSL certificates for secure outbound connections&lt;/LI&gt;
&lt;LI&gt;Network security policies may restrict access to external services&lt;/LI&gt;
&lt;LI&gt;Required Copilot and GitHub endpoints must be allowed to ensure connectivity&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Why This Matters for SAP Customers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In SAP environments especially those involving S/4HANA, SAP BTP, or hybrid/on‑premise systems network security is tightly controlled. Proper configuration ensures that Copilot can securely interact with external services while still complying with enterprise security standards. Once configured correctly, Copilot integrates seamlessly into your SAP development workflow, enabling secure, reliable, and high‑performance AI-assisted development within your governed enterprise environment.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Configure Network Settings (if required) for Azure SAP Environments&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;In Azure‑hosted SAP landscapes (such as S/4HANA on Azure, SAP BTP, or hybrid environments), network configuration plays a critical role in enabling GitHub Copilot securely. Network setup is primarily required in enterprise environments where security controls such as proxies, firewalls, VPNs, or Azure networking policies are enforced.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Default Behavior&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;GitHub Copilot connects securely over HTTPS&lt;/LI&gt;
&lt;LI&gt;No additional configuration is required in open network environments&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Proxy &amp;amp; Enterprise Network Configuration&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If your Azure SAP environment uses controlled outbound access:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Configure proxy settings:
&lt;UL&gt;
&lt;LI&gt;HTTP_PROXY&lt;/LI&gt;
&lt;LI&gt;HTTPS_PROXY&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Directly within your IDE (Visual Studio, VS Code)&lt;/LI&gt;
&lt;LI&gt;Or via environment variables:&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Supported authentication methods:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Basic authentication&lt;/LI&gt;
&lt;LI&gt;Kerberos (common in enterprise identity setups)&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Additional considerations:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Ensure required GitHub/Copilot endpoints are &lt;STRONG&gt;allowed&lt;/STRONG&gt; in Azure firewall or network security groups&lt;/LI&gt;
&lt;LI&gt;Install &lt;STRONG&gt;custom SSL certificates&lt;/STRONG&gt; if your organization uses SSL inspection&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;Visual Studio typically inherits &lt;STRONG&gt;Windows/Azure VM proxy settings&lt;/STRONG&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Troubleshooting Network Issues in Azure SAP Scenarios&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;If Copilot stops responding or behaves inconsistently, the issue is often related to enterprise network controls in Azure or hybrid SAP architectures.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Common Causes&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Proxy or firewall blocking outbound connectivity&lt;/LI&gt;
&lt;LI&gt;SSL certificate validation failures&lt;/LI&gt;
&lt;LI&gt;VPN or private network restrictions (ExpressRoute / private endpoints)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;Quick Diagnostics: &lt;/STRONG&gt;Test connectivity from your Azure VM or development machine:&lt;/H6&gt;
&lt;P&gt;curl --verbose https://copilot-proxy.githubusercontent.com/_ping&lt;/P&gt;
&lt;H6&gt;&lt;STRONG&gt;If using a proxy: &lt;/STRONG&gt;curl --verbose -x http://PROXY:PORT -i -L https://copilot-proxy.githubusercontent.com/_ping&lt;/H6&gt;
&lt;P&gt;HTTP 200 → Connectivity is working&lt;/P&gt;
&lt;P&gt;Errors → Network blocking or configuration issue&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Recommended Troubleshooting Steps&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Verify proxy settings are correctly configured&lt;/LI&gt;
&lt;LI&gt;Check SSL certificates and trust chain&lt;/LI&gt;
&lt;LI&gt;Review Azure firewall, NSG, or proxy rules&lt;/LI&gt;
&lt;LI&gt;Validate required endpoints are reachable&lt;/LI&gt;
&lt;LI&gt;Enable verbose logs or diagnostics in your IDE for deeper analysis&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Best Practice for Azure SAP Customers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Adopt a structured troubleshooting approach:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Validate connectivity&lt;/LI&gt;
&lt;LI&gt;Trace the network path (proxy, firewall, DNS)&lt;/LI&gt;
&lt;LI&gt;Fix configuration issues systematically&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This aligns with the governance and operational discipline already used in SAP and Azure environments.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Outcome: A Confident Copilot User in Azure SAP&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;By following this approach, you move beyond basic usage and gain full control of Copilot within your enterprise landscape.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;You will be able to:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Deploy and use Copilot across Azure SAP environments&lt;/LI&gt;
&lt;LI&gt;Integrate it securely within enterprise networking constraints&lt;/LI&gt;
&lt;LI&gt;Troubleshoot issues with confidence using systematic diagnostics&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;GitHub Copilot is no longer a black box, it becomes a trusted, secure, and intelligent AI assistant seamlessly integrated into your Azure and SAP development ecosystem. As you adopt it into your workflow, development becomes faster, cleaner, and more efficient. More importantly, you gain a reliable partner that enhances productivity and supports innovation, ensuring that you are no longer coding alone, but collaborating with AI to deliver better outcomes.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Reference links:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension" target="_blank" rel="noopener"&gt;https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/visualstudio/ide/visual-studio-github-copilot-get-started?view=visualstudio" target="_blank" rel="noopener"&gt;Get Started with GitHub Copilot - Visual Studio (Windows) | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/developer/github-copilot-azure/get-started?pivots=visual-studio-code" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/developer/github-copilot-azure/get-started?pivots=visual-studio-code&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/concepts/network-settings" target="_blank" rel="noopener"&gt;Network settings for GitHub Copilot - GitHub Docs&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://docs.github.com/en/copilot/how-tos/troubleshoot-copilot/troubleshoot-network-errors" target="_blank" rel="noopener"&gt;Troubleshooting network errors for GitHub Copilot - GitHub Docs&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://community.sap.com/t5/artificial-intelligence-blogs-posts/github-copilot-for-sap-abap-in-vs-code-setup-guide-for-on-premise-teams/ba-p/14365497" target="_blank" rel="noopener"&gt;GitHub Copilot for SAP ABAP in VS Code: Setup Guid... - SAP Community&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 01 May 2026 17:17:14 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/the-journey-of-copilot-from-setup-to-mastery-for-azure-sap/ba-p/4516485</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-05-01T17:17:14Z</dc:date>
    </item>
    <item>
      <title>VDI, Teams, and what’s changing in 2026: VBSS becomes VMSS, and eCDN lands in the core license</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/vdi-teams-and-what-s-changing-in-2026-vbss-becomes-vmss-and-ecdn/ba-p/4515981</link>
      <description>&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Audience:&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Mission Critical customers running Microsoft Teams on&amp;nbsp;virtualized&amp;nbsp;desktop platforms (Citrix, AVD, Windows 365, VMware/Omnissa&amp;nbsp;Horizon).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;TL;DR:&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Two Teams-on-VDI changes are converging:&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is already in Public Preview today&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as the successor to VBSS in the new VDI solution for Teams (&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;Microsoft Learn&amp;nbsp;-&amp;nbsp;Screen sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;), and&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;is now included in Teams&amp;nbsp;core&amp;nbsp;license&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;. This post previews the guidance our Support for Mission Critical (SfMC)&amp;nbsp;Cloud Solution Architects&amp;nbsp;(CSAs) are already walking customers through&amp;nbsp;-&amp;nbsp;because the cost of finding these issues in production is always higher than finding them in a pilot.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Why&amp;nbsp;we’re&amp;nbsp;flagging this now&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SfMC exists to get ahead of changes like these. The&amp;nbsp;SfMC CSA&amp;nbsp;role is built on a simple&amp;nbsp;principle:&amp;nbsp;be a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;trusted advisor&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;embedded alongside the customer team, not a reactive support line.&amp;nbsp;SfMC CSAs&amp;nbsp;work hand-in-hand with platform, network, security and service-ownership teams to build a deep&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;“know-me”&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;picture of the customer&amp;nbsp;-&amp;nbsp;their gold-image strategy, their VDI vendors, their peering topology, their CAB cadence, the history of what was tried and what didn’t stick. That context is the reason a readiness review lands in weeks, not months:&amp;nbsp;your SfMC CSA&amp;nbsp;isn’t&amp;nbsp;starting from&amp;nbsp;zero,&amp;nbsp;they’re&amp;nbsp;starting from knowing the estate.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Goodbye VBSS, hello VMSS&amp;nbsp;-&amp;nbsp;and&amp;nbsp;it’s&amp;nbsp;here now&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Teams on VDI&amp;nbsp;has&amp;nbsp;used&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Video Based Screen Sharing (VBSS)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for years&amp;nbsp;-&amp;nbsp;an efficient, encoded video stream for screen shares. That approach is being replaced by&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Virtual Machine Screen Sharing (VMSS)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as part of Microsoft’s&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This&amp;nbsp;isn’t&amp;nbsp;a future roadmap item&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is available in Public Preview today&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;across Azure Virtual Desktop, Windows 365,&amp;nbsp;Citrix&amp;nbsp;and Amazon&amp;nbsp;WorkSpaces, with&amp;nbsp;Omnissa&amp;nbsp;following. Microsoft’s guidance and support matrix is live on Microsoft Learn:&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;New VDI solution for Teams&amp;nbsp;-&amp;nbsp;Screen sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;. If you have&amp;nbsp;users on&amp;nbsp;a pilot ring on VDI, you can light this up now, simply by activating Public Preview for them.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;Spot the screen sharing stream no longer being offloaded to client side slimcore&lt;/img&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Support depends on three things moving together: the Teams client on the session host, the&amp;nbsp;virtualization&amp;nbsp;vendor’s&amp;nbsp;optimization&amp;nbsp;component&amp;nbsp;(Citrix HDX / AVD Multimedia Redirection / VMware-Omnissa&amp;nbsp;Media Optimization), and the endpoint client (Windows App, Citrix Workspace App, Horizon Client). Where any one of those lags, screen share quietly falls back to a lesser modality&amp;nbsp;-&amp;nbsp;&lt;STRONG&gt;users&amp;nbsp;don’t&amp;nbsp;raise&amp;nbsp;tickets,&amp;nbsp;they just tolerate worse quality&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Because VMSS is already in preview,&amp;nbsp;there’s&amp;nbsp;a real window to get this right before it becomes the default path. On Mission Critical engagements,&amp;nbsp;SfMC CSAs are already sitting with customer teams on&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VMSS readiness reviews&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: confirming client and plugin versions across the gold-image estate, rebuilding CQD dashboards so the baseline survives the cutover, and flagging any inline network appliance that still assumes the old VBSS flow. The “know-me” picture the&amp;nbsp;SfMC CSA&amp;nbsp;has built up makes that work fast&amp;nbsp;-&amp;nbsp;they already know which plugin versions the desktop team is running and which CAB window the next image refresh lands in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;is now in the core Teams&amp;nbsp;license&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;-&amp;nbsp;previously a paid add-on&amp;nbsp;-&amp;nbsp;is now included in&amp;nbsp;the&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Teams&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;core&amp;nbsp;license.&amp;nbsp;It’s&amp;nbsp;a WebRTC-based peer-to-peer mesh that offloads large-scale town halls and live events from the corporate WAN by peering video between clients on the same site.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If the business case for the add-on&amp;nbsp;never&amp;nbsp;cleared, that objection is gone. But “included”&amp;nbsp;doesn’t&amp;nbsp;mean “working”.&amp;nbsp;The failure mode we see is consistent: customers enable&amp;nbsp;eCDN&amp;nbsp;because “it’s free now”,&amp;nbsp;but the peering never works&amp;nbsp;-&amp;nbsp;because the client-to-client path is blocked by security controls nobody remembers adding. The town hall runs, the WAN still&amp;nbsp;saturates,&amp;nbsp;the CIO asks why the thing that was supposed to fix it&amp;nbsp;didn’t.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;Example eCDN portal dashboard&lt;/img&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;The VDI infrastructure question&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Both changes elevate something that has always mattered but rarely been tested:&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VDI-to-VDI network reachability&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;. The new Teams client needs to talk to&amp;nbsp;Microsoft&amp;nbsp;365 media endpoints (usually already open)&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;and&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;to other VDI instances on the same site for&amp;nbsp;eCDN&amp;nbsp;peering.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That second requirement is where customers are consistently caught out. Most VDI builds treat each session host as an island&amp;nbsp;-&amp;nbsp;east-west traffic between session hosts is blocked by NSG, hypervisor&amp;nbsp;firewall, or micro-segmentation policy, because it was never needed. With&amp;nbsp;eCDN&amp;nbsp;in the box,&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;it is now needed&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;and the blocks are often in places the&amp;nbsp;virtualization&amp;nbsp;team&amp;nbsp;doesn’t&amp;nbsp;own.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is where&amp;nbsp;working&amp;nbsp;hand-in-hand&amp;nbsp;with the customer team pays off. The&amp;nbsp;SfMC&amp;nbsp;CSA&amp;nbsp;convenes the platform, network, and security owners, translates the platform change into each team’s language, and makes sure nothing falls through the gaps between them. The specific hostnames, IP ranges, UDP/TCP port requirements, and&amp;nbsp;peering-group configuration are all on Microsoft Learn (links below)&amp;nbsp;-&amp;nbsp;the&amp;nbsp;hard work&amp;nbsp;is&amp;nbsp;operationalizing&amp;nbsp;them against&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;your&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;estate, and&amp;nbsp;that’s&amp;nbsp;the work your&amp;nbsp;SfMC CSA&amp;nbsp;is built to drive.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;two or more&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;of these apply to your estate, book the conversation with your&amp;nbsp;SfMC CSA&amp;nbsp;now:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Client version sprawl&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;multiple Teams versions in flight across gold images, or a long tail of unpatched Citrix Workspace App / Windows App / Horizon Client.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Missing or partial CQD data&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;gaps in building/subnet mapping, “unknown” network location for a meaningful share of streams, dashboards still filtered on legacy VBSS modality tags.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Recent east-west&amp;nbsp;firewall&amp;nbsp;changes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;new micro-segmentation rollout, zero-trust project, or NSG rule consolidation in the last 12 months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Recent live-event pain&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;WAN saturation, buffering, or&amp;nbsp;join&amp;nbsp;failures&amp;nbsp;on&amp;nbsp;the last town hall.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;No&amp;nbsp;eCDN&amp;nbsp;subnet map&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;, or a map that predates your current site/subnet topology.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Proxy or TLS-inspection changes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;forcing&amp;nbsp;Teams&amp;nbsp;media through an inspection device rather than bypassing it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;VPN&amp;nbsp;full-tunnel&amp;nbsp;without&amp;nbsp;eCDN&amp;nbsp;VPN exclusion&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="8" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Upcoming&amp;nbsp;large&amp;nbsp;broadcast&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;in the next 90 days.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;Closing thought&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;VMSS is in Public Preview today and&amp;nbsp;eCDN&amp;nbsp;is already in your Teams&amp;nbsp;license. The window to pilot,&amp;nbsp;validate&amp;nbsp;and harden is open right now&amp;nbsp;-&amp;nbsp;and it closes the moment either of these becomes the default path for your users.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;That’s what&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Support for Mission Critical&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is built for:&amp;nbsp;Cloud Solution Architects&amp;nbsp;working shoulder-to-shoulder with your team as trusted advisors, investing the time to genuinely know your estate&amp;nbsp;-&amp;nbsp;your platforms, your people, your change windows, your risks&amp;nbsp;-&amp;nbsp;so that when a shift like VMSS or&amp;nbsp;eCDN&amp;nbsp;arrives, the remediation plan is already half-written. Not a&amp;nbsp;ticket-shop. A partnership.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;you’re&amp;nbsp;running Teams on VDI at scale and you&amp;nbsp;haven’t&amp;nbsp;had the VMSS +&amp;nbsp;eCDN&amp;nbsp;conversation with your SfMC&amp;nbsp;CSA&amp;nbsp;yet&amp;nbsp;-&amp;nbsp;that’s&amp;nbsp;the next call to book.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:120,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-10"&gt;References&amp;nbsp;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="9" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams&amp;nbsp;-&amp;nbsp;Screen sharing (VMSS, Public Preview)&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/vdi-2#screen-sharing&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="10" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;New VDI solution for Teams (overview)&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/vdi-2" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/vdi-2&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="11" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Teams for VDI&amp;nbsp;-&amp;nbsp;install requirements&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoftteams/teams-client-vdi-requirements-deploy" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoftteams/teams-client-vdi-requirements-deploy&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="12" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft&amp;nbsp;eCDN&amp;nbsp;networking requirements&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/ecdn/technical-documentation/network-requirements" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/ecdn/technical-documentation/network-requirements&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="13" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;eCDN&amp;nbsp;peering groups and restrictions&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/ecdn/how-to/set-up-peering-groups" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/ecdn/how-to/set-up-peering-groups&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="14" data-aria-level="1"&gt;&lt;EM&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft 365 URLs and IP address ranges&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;-&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/urls-and-ip-address-ranges" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;https://learn.microsoft.com/en-us/microsoft-365/enterprise/urls-and-ip-address-ranges&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559738&amp;quot;:60,&amp;quot;335559739&amp;quot;:60,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 30 Apr 2026 07:50:02 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/vdi-teams-and-what-s-changing-in-2026-vbss-becomes-vmss-and-ecdn/ba-p/4515981</guid>
      <dc:creator>jchristie</dc:creator>
      <dc:date>2026-04-30T07:50:02Z</dc:date>
    </item>
    <item>
      <title>Enterprise Security Assessment: A Strategic Lens for Mission Critical Environments</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enterprise-security-assessment-a-strategic-lens-for-mission/ba-p/4515991</link>
      <description>&lt;H2&gt;Understanding Enterprise Security at Scale&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;Understanding security posture at scale requires more than isolated control reviews or point‑in‑time assessments. The Enterprise Security Assessment (ESA) helps organizations understand their security posture across Azure, Microsoft 365, and hybrid environments from a true enterprise perspective. Instead of assessing individual services or workloads in isolation, ESA provides a &lt;STRONG&gt;single, enterprise‑wide view of security&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;By examining identity, data security, endpoints, threat protection, and cloud infrastructure together, ESA helps uncover gaps that often span multiple teams and platforms. This broader perspective enables clearer prioritization, stronger alignment across security teams, and a more resilient foundation for long‑term security improvement.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;ESA complements other Microsoft assessments, such as workload‑specific reviews, by connecting the bigger picture - to align security priorities across teams and platforms, fostering a more cohesive and resilient security approach.&lt;/P&gt;
&lt;H2&gt;From Standard Engagement to Strategic Partnership&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;An &lt;STRONG&gt;Enterprise Security Assessment&lt;/STRONG&gt; is typically delivered as a focused engagement designed to establish an enterprise‑wide view of security posture. At Microsoft, we begin by reviewing &lt;STRONG&gt;Secure Score insights&lt;/STRONG&gt;, analyzing a defined set of core security datasets, and correlating those signals across Azure and Microsoft 365.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;For many organizations, this approach works well. Collecting and evaluating these datasets provides a high‑level understanding of security posture, highlights common gaps, and identifies priority improvement areas. In standard enterprise environments, ESA delivers actionable insights with minimal disruption and sets a solid foundation for security improvements.&lt;/P&gt;
&lt;H3&gt;How ESA Evolves in Mission‑Critical Environments&lt;/H3&gt;
&lt;P class="lia-align-justify"&gt;In large or mission‑critical environments, security is often distributed across multiple teams and tools. Operational constraints, regulatory requirements, and business dependencies introduce complexity that standard assessments cannot fully capture.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;For mission‑critical customers, ESA goes beyond a baseline review and becomes more consultative. This typically includes:&lt;/P&gt;
&lt;P&gt;📝&lt;STRONG&gt; Structured discovery sessions&lt;/STRONG&gt; across multiple security domains&lt;/P&gt;
&lt;P&gt;🤝&lt;STRONG&gt; Deep‑dive workshops&lt;/STRONG&gt; with specialized teams&lt;/P&gt;
&lt;P&gt;🎯&lt;STRONG&gt; Validation of findings &lt;/STRONG&gt;against real‑world operating models&lt;/P&gt;
&lt;P&gt;🔄&lt;STRONG&gt; Iterative analysis&lt;/STRONG&gt; to validate findings against real operational conditions&lt;/P&gt;
&lt;P&gt;This ensures recommendations reflect how security is actually managed, not just how it is documented.&lt;/P&gt;
&lt;H3&gt;Why Going Deeper Matters to Customers&lt;/H3&gt;
&lt;P class="lia-align-justify"&gt;For organizations operating at scale, this consultative ESA approach delivers significantly more than a standard readout:&lt;/P&gt;
&lt;UL class="lia-align-justify"&gt;
&lt;LI&gt;A realistic, enterprise‑wide &lt;STRONG&gt;understanding of security posture&lt;/STRONG&gt;, grounded in actual configurations and operating models&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear visibility &lt;/STRONG&gt;into cross‑team &lt;STRONG&gt;dependencies and systemic risks&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Prioritized recommendations&lt;/STRONG&gt; aligned to existing licenses, third‑party tools, and regulatory requirements&lt;/LI&gt;
&lt;LI&gt;A realistic, &lt;STRONG&gt;phased security roadmap focused on adoption&lt;/STRONG&gt;, not theory&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-align-justify"&gt;The result is a clear starting point for security improvements that teams can execute with confidence.&lt;/P&gt;
&lt;H2&gt;A Continuous Improvement Model&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;ESA is not a one‑time exercise. For most customers, it becomes the foundation for ongoing security maturity.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;Once a baseline is established, future ESAs are faster and more efficient, allowing organizations to track progress, validate improvements, and maintain alignment as environments evolve. Over time, ESA functions as an annual enterprise security health check, supported by follow‑up reviews and continuous improvement.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;In mission‑critical environments, this means:&lt;/P&gt;
&lt;UL class="lia-align-justify"&gt;
&lt;LI&gt;The &lt;STRONG&gt;first ESA requires deeper engagement investment&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Building &lt;STRONG&gt;cross-team alignment takes time&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Future assessments become smoother and more efficient&lt;/STRONG&gt; once a baseline is established&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-align-justify"&gt;Over time, ESA functions as an enterprise security health check that supports continuous improvement. It works best when treated as a &lt;STRONG&gt;starting point for continuous improvement&lt;/STRONG&gt;, and Enterprise Security Alignment.&lt;/P&gt;
&lt;H2&gt;What Customers Gain from an Enterprise Security Assessment&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A true enterprise view&lt;/STRONG&gt;&lt;BR /&gt;Visibility across identity, data, devices, cloud workloads, and threat signals - without losing sight of critical details.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A customized security roadmap&lt;/STRONG&gt;&lt;BR /&gt;Recommendations aligned to existing licenses, third‑party tools, hybrid footprints, and regulatory requirements - making adoption realistic, not aspirational.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;Momentum and measurability&lt;/STRONG&gt;&lt;BR /&gt;Many organizations track progress using dashboards or scorecards to measure improvement and sustain focus over time.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;Repeatability&lt;/STRONG&gt;&lt;BR /&gt;Once a baseline is established, future ESAs become easier and more efficient - serving as a regular health check rather than a brand‑new effort.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="lia-align-justify"&gt;&lt;STRONG&gt;A consultative model&lt;/STRONG&gt;&lt;BR /&gt;ESA delivers far more value than a one‑time assessment by fostering collaboration, shared understanding, and long‑term alignment.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;A Foundation for Continuous Improvement&lt;/H2&gt;
&lt;P class="lia-align-justify"&gt;Enterprise security is complex, especially at scale. In &lt;STRONG&gt;mission‑critical environments&lt;/STRONG&gt;, security success depends on embracing complexity, aligning teams, and moving beyond a standard assessment playbook.&lt;/P&gt;
&lt;P class="lia-align-justify"&gt;An Enterprise Security Assessment is more than a snapshot. It’s an opportunity to build alignment, inform strategy, and create a &lt;STRONG&gt;resilient security foundation&lt;/STRONG&gt; that evolves with the organization.&lt;/P&gt;</description>
      <pubDate>Wed, 29 Apr 2026 21:34:39 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/enterprise-security-assessment-a-strategic-lens-for-mission/ba-p/4515991</guid>
      <dc:creator>lakprasad</dc:creator>
      <dc:date>2026-04-29T21:34:39Z</dc:date>
    </item>
    <item>
      <title>SharePoint Automatic Version History Cleanup (Intelligent Versioning)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-automatic-version-history-cleanup-intelligent/ba-p/4514011</link>
      <description>&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What is SharePoint Automatic Version History Cleanup?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint Automatic Version History Cleanup&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is a feature in Microsoft 365 (SharePoint Online and OneDrive) that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;automatically manages and prunes file version history&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;based on the age of versions and file activity. It is part of the “Version History Limits” functionality that gives admins control over how many versions to keep and for how long. When this&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;mode is enabled (often referred to as&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Intelligent Versioning&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;), SharePoint will no longer&amp;nbsp;retain&amp;nbsp;every single version up to the static limit indiscriminately. Instead, it will&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“thin out” older versions over time&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, keeping a higher density of recent versions and progressively fewer versions as they age. This ensures that most day-to-day edits&amp;nbsp;remain&amp;nbsp;recoverable, while redundant or stale versions from long ago are cleaned up.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Crucially, automatic cleanup&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;does not require administrators or users to manually&amp;nbsp;delete&amp;nbsp;versions or set specific limits&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for each library. In the traditional model (Manual versioning), admins or site owners had to configure each library to keep a fixed number of versions (with a minimum of 100) and&amp;nbsp;possibly specify&amp;nbsp;a time-based deletion for older versions. In contrast, the Automatic setting uses built-in logic to manage versions&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;dynamically&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Microsoft’s internal testing and customer feedback guided this feature to address the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;major pain point of runaway version storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;while&amp;nbsp;maintaining&amp;nbsp;“strong recoverability” for files.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Key characteristics of Automatic (Intelligent) Versioning:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Time-based retention algorithm:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;It looks at the age of each version and the file’s edit frequency to decide which versions to keep. Recent changes are kept in detail,&amp;nbsp;whereas&amp;nbsp;older changes are pruned, keeping only periodic snapshots.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Dynamic, ongoing cleanup:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;As new versions are created, older ones are evaluated and trimmed automatically in the background. This is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;not a one-time job&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, but a continuous policy&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;is applied&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;to the library.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Wider recovery window with fewer versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Users still have access to versions spanning a long&amp;nbsp;time period&amp;nbsp;(e.g.&amp;nbsp;many months or years), but without the full count of every minor change. The system preserves&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;important restore points&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(like the first version of each week or day), assuming those are more valuable for recovery than every tiny edit.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Storage space optimization:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;By cutting down on redundant older versions, organizations see dramatic storage savings. Microsoft reports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;up to a 96% reduction in version storage over a 6-month period&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;using automatic trimming, compared to keeping all versions under a 500-count limit.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Still protective of current versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;The most recent versions (within the last days or weeks) are&amp;nbsp;generally all&amp;nbsp;retained. The&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;current&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;file version is never&amp;nbsp;deleted&amp;nbsp;by the system, and recent version history&amp;nbsp;remains&amp;nbsp;robust for auditing and quick rollback needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Applies to Office documents (and more):&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Intelligent versioning is particularly beneficial for Office files (Word, Excel, PowerPoint) that save&amp;nbsp;frequently, but it works for any files in SharePoint/OneDrive.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How the Automatic Cleanup Algorithm Works&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;When&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic version limit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is in effect, SharePoint uses a built-in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;tiered retention algorithm&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;based on version age. In simple terms,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;the older a version is, the less&amp;nbsp;frequently&amp;nbsp;it’s&amp;nbsp;kept&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Here is a summary of the default intelligent retention logic:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Age of File Version&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Retention by Automatic Cleanup&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;0–30 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep all versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Every saved version from the last&amp;nbsp;30 days&amp;nbsp;is preserved&amp;nbsp;(upto&amp;nbsp;500 versions). This ensures you can track all recent changes in detail.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;31–60 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep hourly versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;For versions in this range, the system prunes away some duplicates, aiming to&amp;nbsp;retain&amp;nbsp;roughly one&amp;nbsp;version per hour of edit activity. In practice, if multiple versions were saved within the same hour, only the latest from that hour might be kept.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;61–180 days&amp;nbsp;old (2–6 mo.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep daily versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Versions older than two months get further thinned out to about one per day, preserving a daily snapshot of the&amp;nbsp;file’s&amp;nbsp;state.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Over&amp;nbsp;180 days&amp;nbsp;old&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep weekly versions.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Very old&amp;nbsp;versions (beyond ~6 months) are trimmed to approximately one per week,&amp;nbsp;maintaining&amp;nbsp;a weekly snapshot over&amp;nbsp;long periods.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This tiered approach means that if a file is actively edited,&amp;nbsp;you’ll&amp;nbsp;have&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all of&amp;nbsp;its versions from the past month&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, then a representative sampling of versions as you go back in time (hourly→daily→weekly). In effect, the algorithm removes redundant intermediate saves that are&amp;nbsp;likely low-value&amp;nbsp;(e.g.&amp;nbsp;dozens of near-identical saves due to auto-save in&amp;nbsp;a short period) while&amp;nbsp;still keeping&amp;nbsp;a timeline of the document’s evolution. If a file&amp;nbsp;hasn’t&amp;nbsp;been edited in a long time, its last saved versions will remain available at least until they hit the weekly or daily thresholds.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Maximum Number of Versions:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Even under Automatic mode,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint will not keep more than 500 versions of a file&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. This is a hard cap that&amp;nbsp;remains&amp;nbsp;in place for now. If a file continues to be edited very heavily over months or years, hitting 500 versions, the oldest versions will be trimmed to honor the cap. In practice, however, most files are unlikely to hit 500 retained versions under the automatic algorithm, because many interim versions would already be pruned by age. The 500 limit&amp;nbsp;mainly serves&amp;nbsp;as a safety net.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Expiration Labels in Version History UI:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Once you switch a library or site to Automatic limits, you may notice in the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version History&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;view that older versions get an “expiration date” label. These dates&amp;nbsp;indicate&amp;nbsp;when a given version is scheduled to be removed by the algorithm. For example, a version might show “Expires on 5/10/2026”, meaning the system will automatically&amp;nbsp;delete&amp;nbsp;it on that date (unless it gets preserved longer due to other rules).&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;The most recent version is never assigned&amp;nbsp;an expiration&amp;nbsp;date&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(it does not expire at all), and very new versions may show “Never&amp;nbsp;expires” until they age beyond the no-trim window.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Example of Automatic Cleanup in Action&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Imagine a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;project plan (Excel file)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that multiple team members edit daily over the course of&amp;nbsp;the year. Under the old policy (500 versions, no&amp;nbsp;expiration), if the team saves changes&amp;nbsp;frequently, they might hit 500 versions in a few months, after which SharePoint starts dropping the oldest versions on each new save. If the editing is less frequent, they might not hit 500 for a long time, but&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;versions (even trivial ones) from throughout the year remain, eating storage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic version cleanup enabled&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, SharePoint will keep every version for the first&amp;nbsp;30 days&amp;nbsp;of rapid collaboration, then automatically trim and compress the version history:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After a few months,&amp;nbsp;you’ll&amp;nbsp;still have&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;complete daily snapshots&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;of how the file looked each day, but not every single save from, say, 4 months ago.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After a year, you might have weekly snapshots&amp;nbsp;remaining&amp;nbsp;from the early months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;The team can restore the file to any week in the past year, or any day in the past 6 months, or any hour in the past&amp;nbsp;60 days, etc., giving ample recovery points.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;The storage used by this&amp;nbsp;file’s&amp;nbsp;version history will be dramatically lower than it would be under the old scheme (potentially just a few dozen versions&amp;nbsp;retained&amp;nbsp;instead of hundreds). In Microsoft’s example, automatic trimming yields&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;~96% storage reduction&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for versions over six months.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;From the user perspective,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;nothing special needs to be done&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;— version cleanup happens behind the scenes. Users still go to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version History&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on a document and see a list of versions, but with fewer ultra-fine-grained ones as they get older. Admins benefit by not having to constantly&amp;nbsp;monitor&amp;nbsp;or manually&amp;nbsp;delete&amp;nbsp;old versions to free space.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Configuring Automatic Version History Cleanup in SharePoint Online&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Setting up Automatic version cleanup requires adjusting your SharePoint Online&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;versioning settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;at the&amp;nbsp;appropriate level.&amp;nbsp;Here’s&amp;nbsp;how to configure it:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Organization-Level Default Setting (SharePoint Admin Center)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;To enable intelligent version management across your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;tenant&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;navigate to&amp;nbsp;your&amp;nbsp;SharePoint admin center&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version history limits.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Once this is saved,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint Online will use Automatic (intelligent) version limits by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on any&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;new&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;libraries created in your tenant. Existing sites and libraries, however,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;do not retroactively change&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;just by toggling this setting. They will continue with their current versioning settings until you update them (see below).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Verifying the setting:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;It may take some time for the new setting to propagate. You can confirm that&amp;nbsp;it’s&amp;nbsp;in effect by creating a new document library on a site (after enabling Automatic) and checking the library’s version settings or testing with a file.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If for any reason you need to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;switch back&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to manual settings globally, you can do so similarly in the Admin Center by choosing the manual&amp;nbsp;option&amp;nbsp;and specifying the number of versions and&amp;nbsp;expiration&amp;nbsp;days (if any). By&amp;nbsp;default&amp;nbsp;that might revert to 500 versions, no&amp;nbsp;expiration. You can also manage this via PowerShell (see next section).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Site-Level and Library-Level Configuration&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;There are scenarios where you might not want to use the organization’s default for every site or library. SharePoint allows breaking the inheritance:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Site-level limits:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;A SharePoint site (site collection) can have its own&amp;nbsp;version&amp;nbsp;history policy that overrides the&amp;nbsp;tenant by&amp;nbsp;default for all libraries in that site. However, as of now,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft’s UI does not&amp;nbsp;provide&amp;nbsp;a direct way to&amp;nbsp;set&amp;nbsp;site-level versioning in the admin center&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. You must use PowerShell cmdlets to configure a&amp;nbsp;site’s&amp;nbsp;setting. For example, to enable Automatic mode on a specific site (if the tenant default is not already automatic), you would run:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;This flags that site to use automatic version limits for new libraries. (Add the -ApplyToExistingDocumentLibraries&amp;nbsp;switch if you want to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;apply it to all current libraries on that site&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as well. Otherwise, existing libraries&amp;nbsp;remain&amp;nbsp;as they were, and only newly created libraries on that site use the new policy.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Library-level limits:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Site owners or admins can configure individual document libraries to have their own version limit settings, overriding both site and org defaults for that library. This is done either through the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Library Settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;in the SharePoint site UI or via PowerShell. In the&amp;nbsp;library’s&amp;nbsp;settings page (under&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“Versioning settings”&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;), modern SharePoint should expose fields for the version limit and&amp;nbsp;expiration&amp;nbsp;if the admin has allowed that. For example, you might set one specific library to manual 100 versions, while the rest of the site follows Automatic, or vice versa, depending on needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;In PowerShell, you can use Set-SPOListVersionPolicy&amp;nbsp;to manage a specific&amp;nbsp;library’s&amp;nbsp;policy. For instance, to turn on Automatic for one library:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Or to set a manual limit on a library (say 200 versions, no&amp;nbsp;expiration):&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;You can also specify a time limit (ExpireVersionsAfterDays) in combination with the version count if needed.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Keep in mind that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;lowering version&amp;nbsp;limits on&amp;nbsp;an existing library does not instantly&amp;nbsp;delete&amp;nbsp;all the extra versions above the new threshold&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Instead, SharePoint will trim them&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;gradually&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as new versions are added, to avoid large sudden deletions. According to Microsoft, if you reduce a library’s limit from 500 to 300, the next time someone edits a file that has, say, 500 versions, the system will purge up to 20 of the oldest versions on that save, then another 20 on the next save, and so on until the file complies with the 300 limit. This process prevents performance issues from mass deletion. (If you want immediate cleanup of a huge backlog of versions, consider using the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;trim job&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;approach&amp;nbsp;below.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Using PowerShell for Tenant-Level Settings&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For completeness, note that you can enable or disable the automatic versioning feature across the tenant via PowerShell as well. The relevant property is&amp;nbsp;EnableAutoExpirationVersionTrim&amp;nbsp;on the tenant:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;To&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;enable Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;globally (equivalent to selecting Automatic in Admin Center):&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;This turns on the new “intelligent” version limits at the org level. After running this, you would typically also specify what you want the manual limits to&amp;nbsp;be,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;in case&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;you switch back or for any site still using manual. By&amp;nbsp;default&amp;nbsp;when turning on auto, SharePoint sets the global&amp;nbsp;MajorVersionLimit&amp;nbsp;to 500 and&amp;nbsp;ExpireVersionsAfterDays&amp;nbsp;to 0 (no time limit) behind the scenes.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;To&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;disable Automatic&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and revert to manual, you might run:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;(This example sets a manual policy of 500 versions, no&amp;nbsp;expiration. Adjust the numbers as&amp;nbsp;needed, and&amp;nbsp;note the UI minimums of 100 versions /&amp;nbsp;30 days&amp;nbsp;if&amp;nbsp;setting&amp;nbsp;via&amp;nbsp;UI.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;There are also PowerShell cmdlets to apply settings in bulk to sites. For example, you can iterate through all site collections and activate intelligent versioning for each one using a loop with Set-SPOSite&amp;nbsp;-EnableAutoExpirationVersionTrim&amp;nbsp;$true, as&amp;nbsp;demonstrated&amp;nbsp;in the SharePoint Diary blog. Use caution with such&amp;nbsp;scripts, and&amp;nbsp;run them in batches or during off-hours if you have many sites.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Trimming Existing Version History (On-Demand Cleanup Jobs)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Enabling Automatic mode will govern the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retention of new versions going forward&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. But what about&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;old versions that already&amp;nbsp;exist&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;from&amp;nbsp;before you changed the setting? Those will not magically disappear the moment you switch modes. For example, if a library had 400 versions of a file and you turned on auto (or lowered the manual limit to 100), those 400 will still be there until new edits trigger the algorithm to clean up gradually. In some&amp;nbsp;cases&amp;nbsp;you might want to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;immediately&amp;nbsp;reclaim storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by clearing out old versions in bulk, according to the new policy or other criteria. This is where SharePoint’s&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Trimming Jobs&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;come in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;On-demand trimming&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;allows admins to explicitly remove versions from existing files in a site or library. Microsoft provides PowerShell cmdlets to&amp;nbsp;queue&amp;nbsp;these jobs, which run asynchronously on the server to&amp;nbsp;delete&amp;nbsp;versions matching certain filters. There are three types of trim operations you can choose from:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Manual&amp;nbsp;expiration&amp;nbsp;trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Delete&amp;nbsp;versions older than a specified date threshold (e.g., remove all versions older than 180 days).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Manual count-based trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Delete&amp;nbsp;the oldest versions exceeding a specified count (e.g., keep the latest 100 versions and remove the rest).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Automatic trim:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Apply the same&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;intelligent algorithm&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to existing versions. This will simulate what the Automatic mode would have done and remove the excess versions accordingly (older ones may be outright&amp;nbsp;deleted&amp;nbsp;or assigned&amp;nbsp;expiration&amp;nbsp;dates depending on their age).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;To use these,&amp;nbsp;you’d&amp;nbsp;run commands like:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Trim versions older than&amp;nbsp;180 days&amp;nbsp;on an entire site&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOSiteFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Identity https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;DeleteBeforeDays&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;180&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Trim to a count limit of 100 on a specific doc library&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOListFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Site https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;List&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;"&amp;lt;LibraryName&amp;gt;"&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;MajorVersionLimit&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;100&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;# Example: Apply the automatic algorithm to trim versions on a site&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;New-SPOSiteFileVersionBatchDeleteJob&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Identity https:&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;//&amp;lt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;siteURL&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;-&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;Automatic&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;These jobs permanently&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;delete&amp;nbsp;the matching versions&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(bypassing the recycle bin, so they cannot be recovered once trimmed). Microsoft therefore strongly recommends running a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“What-if” analysis&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;first: you can generate a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Storage Report&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for a site or library and then simulate the trim to see how many versions would be&amp;nbsp;deleted&amp;nbsp;and how much space saved. This helps&amp;nbsp;validate&amp;nbsp;that you&amp;nbsp;won’t&amp;nbsp;accidentally remove something critical. The “What-if” process involves an auditing cmdlet (New-SPOSiteFileVersionExpirationReportJob) that produces a CSV of versions and their would-be deletion status under given rules, which you can review.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Trimming jobs run in the background and can take a significant amount of time for large libraries (possibly hours&amp;nbsp;or days), particularly if thousands of versions are being evaluated. They tend to run during off-peak hours automatically. You can check the status of a job via PowerShell or the SharePoint admin center (there’s&amp;nbsp;a page listing&amp;nbsp;version&amp;nbsp;trim jobs&amp;nbsp;and their progress).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Important:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Always inform site owners before trimming&amp;nbsp;versions, and&amp;nbsp;ideally take a backup or export of version history if the content is&amp;nbsp;mission-critical. Once a version is&amp;nbsp;deleted&amp;nbsp;by a trim job,&amp;nbsp;it’s&amp;nbsp;gone for good (unless you restore the entire site from a backup). Trimming is irreversible and bypasses the recycle bin&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN data-fontsize="12"&gt;1&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Best Practices for Managing Version History in SharePoint Online&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For IT administrators and power users managing SharePoint, here are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;best practices and considerations&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;to get the most out of version history while avoiding pitfalls:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Adopt Automatic Versioning for Most Scenarios:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Microsoft and real-world experience&amp;nbsp;indicate&amp;nbsp;that the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Automatic (Intelligent) mode is&amp;nbsp;optimal&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for&amp;nbsp;the majority of&amp;nbsp;use cases. It&amp;nbsp;greatly reduces&amp;nbsp;storage bloat while preserving the ability to recover recent and important versions. Make this your organization’s default unless you have a compelling reason not to. Many organizations have switched this on tenant-wide to curb runaway storage growth from versioning.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Use Manual Limits Where Necessary:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;There may be cases where a manual policy fits better. For example, a compliance-sensitive library might be&amp;nbsp;required&amp;nbsp;to keep&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;all&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;versions for at least 7 years, or conversely you might have a library of large video files where you only want the last 5 versions to save space. In such cases, set a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;specific manual limit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(with or without&amp;nbsp;expiration)&amp;nbsp;appropriate to&amp;nbsp;the scenario. For instance, you might configure 50 versions for a library with huge files, or “200 versions or 2 years” for a regulatory archive library.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Document these&amp;nbsp;deviations&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;so you remember why they differ from the default.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Don’t&amp;nbsp;Go Below 100 Versions/30 Days (UI Enforced Minimum):&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;SharePoint&amp;nbsp;Online’s&amp;nbsp;interface&amp;nbsp;won’t&amp;nbsp;let you set extremely low limits – the rationale is to prevent administrators from accidentally setting a policy that could wipe out too much version history. Under the hood you can technically force lower values via APIs, but Microsoft strongly&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;recommends against&amp;nbsp;using less than 100 versions or trimming earlier than&amp;nbsp;30 days&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Such aggressive limits could result in losing important recent edits and defeat the purpose of having version history. Stick to reasonable values that align with your recovery needs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Educate Users on Versioning Impact:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Ensure that site owners and users understand that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;versioning consumes storage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. They should know that frequent saves (especially with AutoSave turned on) will generate many versions. This&amp;nbsp;isn’t&amp;nbsp;to discourage saving (the answer is not to turn off versioning!), but to reinforce why your organization manages versions the way it does. Users can also manually&amp;nbsp;delete&amp;nbsp;unnecessary versions from a file’s history if they know certain drafts or changes are not needed – though anything they&amp;nbsp;delete&amp;nbsp;manually goes to recycle bin for a period in case they made a mistake.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Leverage Reporting Tools:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Take advantage of the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Version Storage Usage report&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that Microsoft provides. This report can be run per site to see which libraries or files are consuming the most space via version history.&amp;nbsp;It’s&amp;nbsp;useful for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;identifying&amp;nbsp;hotspots&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(e.g., a single file with 800+ versions taking 10 GB) and can guide you in applying proper limits or cleaning up. Before doing a large trim, always run the “what-if” analysis report to gauge impact.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Plan for Retention and Compliance:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Be aware that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;retention policies and legal&amp;nbsp;holds&amp;nbsp;override version trimming&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If a SharePoint site or an item is subject to a retention policy (through Microsoft Purview Compliance Center) or placed on eDiscovery hold, then&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;no versions can be permanently&amp;nbsp;deleted&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by any limit until that retention period is over. (Microsoft’s documentation explicitly&amp;nbsp;states:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;“For items under a retention policy or hold, the document library’s versioning limits are ignored.”&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) This means your storage might continue to grow in those compliance scenarios.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Best practice:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;coordinate with your compliance officers – if certain sites need infinite retention, you might leave their version limits looser (or just accept that storage will climb). Conversely, if you implement trimming, ensure it&amp;nbsp;doesn’t&amp;nbsp;conflict with any data retention requirements. The good news is that if a trim job&amp;nbsp;encounters&amp;nbsp;a version that is under retention/hold, it&amp;nbsp;won’t&amp;nbsp;delete&amp;nbsp;it; it will tag&amp;nbsp;an expiration&amp;nbsp;date and then keep extending it until the hold is released, thereby not violating compliance.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="7" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Monitor Critically Important Documents:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;For content that is extremely sensitive or business-critical (e.g., an annually updated Policy document, or a legal contract file with tracked changes), you might want to keep more versions than usual or at least be&amp;nbsp;very cautious&amp;nbsp;with automated deletion. You can opt such libraries out of automatic trimming by&amp;nbsp;setting&amp;nbsp;a manual&amp;nbsp;policy, or&amp;nbsp;simply&amp;nbsp;monitor&amp;nbsp;their&amp;nbsp;version&amp;nbsp;history over time. Generally, Automatic mode is safe for even critical docs (since it preserves a broad range of history), but&amp;nbsp;it’s&amp;nbsp;wise to verify. If a particular version must be&amp;nbsp;retained&amp;nbsp;indefinitely (beyond what the algorithm would do), consider&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;declaring the&amp;nbsp;document&amp;nbsp;a record&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;or using a retention label on that version, which would prevent its deletion.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="8" data-aria-level="1"&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Conclusion&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint’s Automatic Version History Cleanup (Intelligent Versioning) is a powerful feature that brings much-needed automation to version management. It&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;keeps your SharePoint Online storage lean&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by removing redundant older versions while still providing a rich history of recent changes for recovery and audit purposes. By understanding how this feature works and following best practices — enabling it tenant-wide, adjusting specific libraries as needed, and considering organization-specific compliance requirements — IT administrators can significantly reduce storage costs and maintenance overhead.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With a sensible versioning strategy in place,&amp;nbsp;you’ll&amp;nbsp;ensure that users have the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;file history they need, when they need it, without letting “version sprawl” overwhelm your SharePoint environment&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. By configuring automatic cleanup and using the tools Microsoft provides (like reports and trim jobs), managing version history becomes a set-and-forget policy rather than a constant manual cleanup effort. This lets you and your users enjoy the benefits of versioning (easy recovery from mistakes, audit trails of changes)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;without the downsides of unchecked growth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;in your content databases.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;With SharePoint Automatic Version History Cleanup, you can&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;strike the right balance&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;between data retention and storage efficiency – keeping your collaboration environments both agile and&amp;nbsp;compliant.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 23 Apr 2026 14:04:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-automatic-version-history-cleanup-intelligent/ba-p/4514011</guid>
      <dc:creator>jeresmith</dc:creator>
      <dc:date>2026-04-23T14:04:22Z</dc:date>
    </item>
    <item>
      <title>Breaking the Shackles of Legacy Portals: Power Pages as Enterprise SaaS</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/breaking-the-shackles-of-legacy-portals-power-pages-as/ba-p/4512636</link>
      <description>&lt;H2&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;It's time to stop building "Portals" and start deploying Enterprise SaaS.&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For years, enterprise teams building web portals have been&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;shackled by rigid Dynamics 365 schemas and heavy, template-driven UIs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; Traditional Power Apps Portals&amp;nbsp;required&amp;nbsp;developers to follow the portal's own schema structure—page templates, web forms, lists, content snippets—and inherit data models dictated by D365 modules. That era is over. Power Pages has evolved into&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;a secure, enterprise-grade, low-code SaaS platform for creating, hosting, and administering business websites&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;—and as of early 2026, two milestone GA releases have removed the last remaining constraints.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Here are six ways those shackles are broken: &lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;H5 aria-level="4"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;&lt;EM&gt;🎨 1. UI Liberation with Single-Page Applications — Now GA&amp;nbsp;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Single-Page Application support in Power Pages reached General Availability on February 8, 2026&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;, starting with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;site version 9.8.1.x and later&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Developers can now build fully custom,&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;client-side&amp;nbsp;rendered&amp;nbsp;web applications&amp;nbsp;using&amp;nbsp;React,&amp;nbsp;Angular, or&amp;nbsp;Vue&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and deploy them directly to Power Pages using the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Platform CLI&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. This is not a workaround or a bolt-on—Microsoft describes this GA release as making the SPA experience&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;"production ready".&amp;nbsp;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What this means in practice:&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;the traditional portal constructs—ASP.NET and Liquid templates, web forms, lists—become optional implementation details, not architectural constraints&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;. &lt;/SPAN&gt;&lt;/STRONG&gt;Your UI is completely custom and API-driven, calling&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Pages Web APIs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for all data operations. The GA release also resolved issues where Power Pages platform styles could override custom&amp;nbsp;CSS, and&amp;nbsp;included updated guidance for authentication configuration and local development setup. Developers can run SPAs locally with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;full authentication and Web API access&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; enabling&amp;nbsp;JavaScript&amp;nbsp;hot&amp;nbsp;reload&amp;nbsp;and local debugging without deploying changes to the portal on every iteration.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;At this point, the traditional portal schema becomes&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;an implementation&amp;nbsp;option—not a constraint.&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;(Ensure your Power Platform CLI is on the latest version for full&amp;nbsp;capabilities.)&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;🗄️ 2. Data Model Autonomy — Your Entities, Your Rules&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Power Pages connects to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Microsoft Dataverse&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, but you are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;no longer forced to borrow a Dynamics 365 schema&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Teams can design their own data model from scratch—whether it has five tables or hundreds&amp;nbsp;with&amp;nbsp;complex relationships—tailored to the business domain.&amp;nbsp;Those custom Dataverse tables serve the SPA directly via Web APIs,&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;without&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;needing to build model-driven or canvas apps.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This is a fundamental departure. The platform uses the same shared business data stored in Dataverse that other Power Platform components can&amp;nbsp;leverage, but your portal is no longer tethered to any pre-existing Dynamics module. You own your entity model entirely. The result:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;headless CMS flexibility&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;backed by the security and reliability of Dataverse, without the overhead of a CRM schema you&amp;nbsp;didn't&amp;nbsp;ask for.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;☁️ 3. Fully Managed Platform — No Infrastructure Burdens&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Goodbye, custom web hosting and plumbing&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Power Pages is a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;fully managed SaaS platform&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;—Microsoft handles provisioning, hosting, CDN, scaling, and availability. Authentication is built in, with full support for enterprise identity providers including&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Entra ID&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Microsoft Entra External ID&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; along with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;table permissions and web roles enforcement on every API call&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Organizations can also allow anonymous access or configure private sites as needed.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Even advanced backend needs are now covered natively.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Server Logic in Power Pages reached General Availability on April 1, 2026&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, delivering native server-side JavaScript execution with the maturity, governance, and extensibility&amp;nbsp;required&amp;nbsp;for enterprise production workloads. Alongside GA, Microsoft announced two enhancements that reinforce enterprise readiness:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;Governance control to disable external calls&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;— administrators can restrict outbound connectivity from the Server Logic layer to&amp;nbsp;comply with&amp;nbsp;internal policies and regulatory requirements.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;Support for unbound Dataverse custom actions&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;— enabling deeper integration with existing business logic layers.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The result? Teams focus&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;only &lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;on business logic, integrations, and user experience&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. As Hope Bradford, Senior Director of IT at Kelly Staffing,&amp;nbsp;stated:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;"&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;Power Pages lets us build personalized client experiences without managing complex infrastructure while maintaining enterprise trust and security.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;"&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Kelly Staffing's Helix UX portal&lt;/STRONG&gt;&lt;/SPAN&gt;, built on Power Pages, Dataverse, and Power Automate, now handles&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;over 38,000 client interactions per day&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;EM&gt;&lt;STRONG&gt;🛡️ 4. Enterprise-Grade Security and Telemetry&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Security and governance are&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;first-class citizens&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on the platform. The 2025–2026 release wave introduced enterprise-grade controls for Power Pages including&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;role-based access and authentication through Entra,&amp;nbsp;Data Loss Prevention (DLP) rules for external data access,&amp;nbsp;IP-based restrictions,&amp;nbsp;maintenance mode options, &lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;and&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;built-in diagnostics and monitoring dashboards&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt;&lt;/STRONG&gt; Across the broader Power Platform, Microsoft is investing in enterprise&amp;nbsp;observability—the April 2026 update introduced&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;alerting and data metrics in Power Platform Monitor&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(covering metrics such as app open success rate, time to interactive, data request success rate, and data request latency), enabling IT teams to&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;define health thresholds, receive proactive notifications, and take guided action.&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This level of governance—audit, monitoring, diagnostics—traditionally&amp;nbsp;required&amp;nbsp;significant custom engineering. Now it is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;out of the box&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="4"&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;💲 5. Scalable, Usage-Based Licensing&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;One of the most significant licensing shifts:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Power Pages became its own product,&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;decoupling from&amp;nbsp;Power Apps licensing entirely&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt; Both&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;internal and external users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;now fall under the same licensing model, making Power Pages&amp;nbsp;viable&amp;nbsp;for internal use cases like HR services and request management—not just external portals.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The model is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;usage-based (Monthly Active Users)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;purchased&amp;nbsp;as capacity packs per site:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Authenticated Users (Pre-paid):&amp;nbsp;$200&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per site/month for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;100 users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Anonymous Users (Pre-paid):&amp;nbsp;$75&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per site/month for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;500 users&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Authenticated Users (Pay-As-You-Go):&amp;nbsp;$4.00&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;per user/site/month, on-demand&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Anonymous Users (Pay-As-You-Go):&amp;nbsp;$0.30&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;per user/site/month, on-demand&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Each&amp;nbsp;authenticated-user&amp;nbsp;subscription plan includes&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;2 GB database capacity and 16 GB file capacity&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; &lt;/SPAN&gt;For applications serving&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;t&lt;SPAN class="lia-text-color-20"&gt;ens of thousands of users&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;,&lt;/SPAN&gt; this capacity-based model is strategically superior to per-user or per-app seat licenses. Pay-as-you-go costs&amp;nbsp;roughly&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;twice&amp;nbsp;as much&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;as pre-paid capacity packs but suits&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;seasonal or unpredictable usage&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;&amp;nbsp;patterns&lt;/STRONG&gt;&lt;/SPAN&gt; (e.g., tax season, annual HR enrollment).&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Tradeoff to consider:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&amp;nbsp;&lt;/SPAN&gt;Pre-paid packs require upfront commitment and do not roll over month to month, so organizations with highly variable traffic must carefully model usage to avoid over- or under-provisioning.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;EM&gt;⚠️ Pricing disclaimer: The figures above are illustrative examples sourced from publicly available Microsoft documentation. Actual costs may vary based on customer type (enterprise vs. corporate), volume commitments, negotiated agreements, and account structure. Final pricing is&amp;nbsp;determined&amp;nbsp;through Microsoft account teams and contracts.&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="4"&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;⚡ 6. Rapid Modernization with AI-Assisted Development&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Power Pages now integrates directly with&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;AI-assisted development workflows&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/SPAN&gt; Microsoft announced the public preview of the&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Power Pages plugin for GitHub Copilot CLI and Claude Code&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;on February 24, 2026, providing an AI-assisted workflow for creating, deploying, and managing modern SPA sites on Power Pages. Developers can scaffold pages, configure data&amp;nbsp;access, and wire up logic using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;natural language commands&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, dramatically reducing the time to modernize large enterprise applications.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SPAs are deployed using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power &lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Platform CLI commands&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; and the entire development loop is designed to be streamlined for professional developers. This means that even large, complex in-house enterprise applications—hundreds of tables, complex relationships, tens of thousands of users—can be remodeled on Power Pages far more efficiently than legacy approaches&amp;nbsp;required. You migrate your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;own custom model into Dataverse&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, build your SPA, wire up integrations, and the platform handles everything else.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0,&amp;quot;335572071&amp;quot;:12,&amp;quot;335572072&amp;quot;:0,&amp;quot;335572073&amp;quot;:4278190080,&amp;quot;469789798&amp;quot;:&amp;quot;single&amp;quot;}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H5 aria-level="3"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;The Bottom Line&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you are still managing custom Azure websites,&amp;nbsp;maintaining&amp;nbsp;SQL servers, or stitching together bespoke PaaS stacks for internal business tools,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;you are carrying unnecessary operational weight&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; &lt;/SPAN&gt;Power Pages is no longer just a D365 portal. It is a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;fully managed, enterprise-grade SaaS platform&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;that gives you&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;total UI freedom&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(SPA support: GA since February 2026),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;native server-side logic&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(GA since April 2026),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;your own data architecture&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;without D365 schema dependencies,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;built-in security and governance&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;,&lt;/STRONG&gt;&lt;/SPAN&gt; and a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;licensing model that scales to enterprise volumes&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-20"&gt;.&lt;/SPAN&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The industry is underestimating this shift. The shackles are off.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Deploy,&amp;nbsp;don't&amp;nbsp;build.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 20 Apr 2026 13:20:06 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/breaking-the-shackles-of-legacy-portals-power-pages-as/ba-p/4512636</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-04-20T13:20:06Z</dc:date>
    </item>
    <item>
      <title>LTRDisplay Control - End-to-End Implementation and Usage Guide</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/ltrdisplay-control-end-to-end-implementation-and-usage-guide/ba-p/4510615</link>
      <description>&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;1. Executive Summary&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;LTRDisplay&lt;/STRONG&gt; is a Power Apps Component Framework (PCF) control for model‑driven apps that helps users browse &lt;STRONG&gt;Long Term Retention (LTR)&lt;/STRONG&gt; data in a familiar grid‑and‑form experience.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;A class="lia-external-url" href="https://github.com/SweetsNSavories/LTRDisplay/tree/copilot/vscode-mmljoag6-9sjb/solution" target="_blank"&gt;GitHub SourceCode&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The control is designed for &lt;STRONG&gt;archive‑first usage in Dataverse&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fetch retained records with a selected view clause&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Replay cached data without refetching&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Open row details inside the same control&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Review audit changes and related records&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Minimize retained query calls through user‑local caching and lazy loading&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This document provides:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Purpose and business value&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Solution design and architecture&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Import and validation steps&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Full user manual&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Repository fork and customization workflow&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2. Purpose of the Control&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;2.1 Problem Statement&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Retention data is valuable for:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Investigation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Support&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Compliance&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Historical analysis&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;However, users often require:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fast browsing of retained records&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Predictable filtering and navigation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Minimal load on retained query infrastructure&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;A form‑like experience for details, audit, and related data&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;2.2 LTRDisplay Objectives&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;LTRDisplay addresses these needs by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Surfacing retained records directly in a model‑driven form&lt;/LI&gt;
&lt;LI&gt;Reusing Dataverse views/forms metadata for familiarity&lt;/LI&gt;
&lt;LI&gt;Introducing cache‑first interaction patterns&lt;/LI&gt;
&lt;LI&gt;Supporting drill‑down across related records in one panel&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3. Solution Design&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.1 Runtime Design&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Main runtime behavior:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Archive‑focused mode by default&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Selected view drives retained fetch clause&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Grid renders from cached projection&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related records load only on explicit user action&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Detail form and tabs render from metadata and selected row payload&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.2 Core Components&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;PCF shell:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/index.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;App state orchestration:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/App.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Grid and local filtering:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/DynamicGrid.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Metadata‑driven detail form:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/components/DynamicForm.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Dataverse access layer:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/services/LtrService.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;View/Form XML parsing:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplayControl/utils/XmlParser.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.3 Cache Model&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Per‑user browser cache stores:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;View datasets&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Entity record dictionary by record id&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related datasets&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Forms metadata&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Relationship metadata&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;This enables:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Show Cached behavior without server refetch&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Faster row‑open and navigation experience&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Reduced retained query consumption&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.4 UX and Interaction Model&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Fetch Archive button:&lt;/STRONG&gt; calls retained fetch and updates cache&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Show Cached button:&lt;/STRONG&gt; reads cache and applies local filtering&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Column filter flyouts:&lt;/STRONG&gt; local filtering against projected rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Detail tabs:&lt;/STRONG&gt;&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Summary&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Record Data&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Audit History&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Related&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Form switcher:&lt;/STRONG&gt; choose available main forms for selected entity&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Chrome toggle arrows:&lt;/STRONG&gt; hide/show header and command bar behavior&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;3.5 Security Intent&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay Main Form is intended for &lt;STRONG&gt;System Administrator users&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Role‑based form visibility should restrict exposure to non‑admin users&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4. Solution Packaging and Import&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.1 Distributed Artifacts&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Latest packaged solution files:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_unmanaged_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Unpacked inspection artifacts:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;exports/unpacked_managed&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;exports/unpacked_unmanaged&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.2 Import in Power Platform (Recommended Managed Path)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Open target environment in Maker Portal&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Go to &lt;STRONG&gt;Solutions&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Select &lt;STRONG&gt;Import solution&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Upload&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;solution/LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Complete import and publish customizations&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;4.3 Post‑Import Validation Checklist&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Validate the following:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay Main Form exists and is enabled&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;SystemUser form maps to&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;ltr_LTRDisplay.LTRDisplayControl&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;System Administrator can open the form&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Non‑admin users do not get the admin‑targeted form&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fetch Archive returns retained rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Show Cached replays cached rows&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Record Data, Audit History, and Related tabs operate as expected&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5. User Manual – Walkthrough&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 1 – Open form with control visible&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;The form opens with &lt;STRONG&gt;Explorer – LTR&lt;/STRONG&gt; and action controls.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 2 – Toggle form chrome for focus&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Use the arrow controls to hide/show header and command bar.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 3 – Start retained fetch&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Click &lt;STRONG&gt;Fetch Archive&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;During loading, controls can be temporarily disabled.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG style="color: rgb(53, 152, 219); font-size: 28px;"&gt;Step 4 – Review fetched grid data&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Rows appear in the grid after retained fetch completes.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 5 – Apply local column filter&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Open a column filter, enter a value, and apply the filter.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 6 – Open a row into detail context&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Select a grid row to open detail section and tabs.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 7 – Use form switcher&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Open the detail form dropdown and choose alternate form layouts when available.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 8 – Inspect Record Data tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Review key‑value field output.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 9 – Inspect Audit History tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Review: Changed by, Changed on, Operation, Old and&amp;nbsp;New value.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;Step 10 – Use Related tab&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Select relationship and click &lt;STRONG&gt;Load&lt;/STRONG&gt; to fetch related rows lazily.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;6. Fork and Customize the Repository&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.1 Fork and Clone&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Fork the repository in GitHub&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Clone your fork locally&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Create a feature branch for your changes&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.2 Local Build Setup&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;From repository root:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;npm install npm run build&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.3 Typical Customization Areas&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Most teams customize:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;App‑level behavior and UX flow&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/App.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Grid columns and filter behavior&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/DynamicGrid.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Detail tabs and rendering&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;components/DynamicForm.tsx&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Dataverse query strategy&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;services/LtrService.ts&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Styling and branding&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="lia-text-color-20"&gt;css/LTRDisplayControl.css&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.4 Push Changes to Dataverse (Development Loop)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Use your existing PAC workflow in the target environment.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;Typical sequence:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;npm run build &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;pac pcf push --publisher-prefix ltr --incremental &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;pac solution publish&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.5 Export and Repackage&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-21"&gt;After validation in environment:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;Export managed and unmanaged solution zips&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;Update:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;LTRDisplay_managed_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;LTRDisplay_unmanaged_latest.zip&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;If needed, unpack for review under:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;exports/unpacked_managed&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-21"&gt;exports/unpacked_unmanaged&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;STRONG&gt;6.6 Recommended Contribution Workflow&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep changes scoped by feature branch&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Run build before each push&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Capture screenshots for changed UX behavior&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Update docs in docs folder together with code&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Submit PR with:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Short validation checklist&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Test evidence&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;7. Operational Notes and Best Practices&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Use managed package for consumer installation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep unmanaged package for internal customization scenarios&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Treat retained fetches as expensive&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Prefer cache replay when possible&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Keep related loading on‑demand to control query volume&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Preserve role‑based visibility for admin‑focused forms&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;8. Conclusion&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;LTRDisplay provides a practical archive exploration interface for Dataverse model‑driven apps with a strong focus on:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Usability&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Cache efficiency&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Operational control&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;By combining:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Managed distribution&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;Clear import validation&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN class="lia-text-color-20"&gt;A straightforward customization model&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-20"&gt;Teams can adopt it quickly and evolve it safely for enterprise needs.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 14 Apr 2026 14:00:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/ltrdisplay-control-end-to-end-implementation-and-usage-guide/ba-p/4510615</guid>
      <dc:creator>PravinT</dc:creator>
      <dc:date>2026-04-14T14:00:42Z</dc:date>
    </item>
    <item>
      <title>Getting Started with GitHub Copilot SDK</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/getting-started-with-github-copilot-sdk/ba-p/4510059</link>
      <description>&lt;P&gt;GitHub Copilot has been a staple in developer workflows for a while — it suggests code, completes functions, and generally keeps you from looking up that one syntax for the hundredth time. But what if you could take that same intelligence and embed it directly into your own applications? That's exactly what the GitHub Copilot SDK lets you do.&lt;/P&gt;
&lt;P&gt;Launched in technical preview in January 2026 and entering public preview on April 2nd, 2026, the SDK gives you programmatic access to Copilot's agentic engine. It's the same runtime that powers the Copilot CLI — just exposed as a library you can import into your own code, in your language of choice.&lt;/P&gt;
&lt;H2&gt;What Is the GitHub Copilot SDK?&lt;/H2&gt;
&lt;P&gt;The SDK is a multi-language library — Python, TypeScript, Go, .NET, and Java — that lets your application talk directly to Copilot's agent runtime. You don't have to build your own orchestration layer, manage model contexts, or figure out tool invocation protocols from scratch. All of that is handled for you.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Three core concepts are worth understanding upfront:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;CopilotClient&lt;/STRONG&gt; — your main entry point. It manages the connection to the Copilot CLI running in server mode.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Sessions&lt;/STRONG&gt; — hold a persistent conversational context, meaning the agent remembers what's been said across multiple turns and can handle genuinely stateful workflows.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tools&lt;/STRONG&gt; — regular Python functions you register with the session. The agent calls them autonomously when it needs to interact with the outside world: query a database, hit an API, read a file.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For Python, getting started is a single command:&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;pip install github-copilot-sdk&lt;/LI-CODE&gt;
&lt;P&gt;You'll also need the Copilot CLI (https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli) installed and accessible in your PATH, plus Python 3.11 or higher.&lt;/P&gt;
&lt;P&gt;Read this on how to setup: &lt;A class="lia-external-url" href="https://github.com/github/copilot-sdk/tree/main/python" target="_blank"&gt;copilot-sdk/python&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;Sending Your First Message&lt;/H2&gt;
&lt;LI-CODE lang="python"&gt;import asyncio

from copilot import CopilotClient

from copilot.session import PermissionHandler

async def main():

    async with CopilotClient() as client:

        async with await client.create_session(

            on_permission_request=PermissionHandler.approve_all,

            model="gpt-5",

        ) as session:

            done = asyncio.Event()

            def on_event(event):

                if event.type.value == "assistant.message":

                    print(event.data.content)

                elif event.type.value == "session.idle":

                    done.set()

            session.on(on_event)

            await session.send("Explain the difference between a list and a tuple in Python.")

            await done.wait()

asyncio.run(main())&lt;/LI-CODE&gt;
&lt;P&gt;A couple of things to notice. The `async with` pattern handles all setup and teardown — no manual cleanup required. The `on_permission_request` parameter is required for every session; it's a handler the SDK calls before the agent executes any tool, allowing you to approve or deny the action. `PermissionHandler.approve_all` is the simplest option and perfect for getting started, but in production you'll want something more selective. More on that below.&lt;/P&gt;
&lt;H2&gt;Giving Your Agent Real Capabilities&lt;/H2&gt;
&lt;P&gt;Text in, text out is fine. But the real value of the SDK is that you can give the agent *tools* — functions it can call to interact with real systems. The `@define_tool` decorator makes this clean using Pydantic for parameter validation:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;import asyncio

from pydantic import BaseModel, Field

from copilot import CopilotClient, define_tool

from copilot.session import PermissionHandler

class GetPriceParams(BaseModel):

    ticker: str = Field(description="Stock ticker symbol, e.g. MSFT")

@define_tool(description="Fetch the current stock price for a given ticker")

async def get_stock_price(params: GetPriceParams) -&amp;gt; str:

    # Replace with a real API call

    return f"The current price of {params.ticker} is $150.00"

async def main():

    async with CopilotClient() as client:

        async with await client.create_session(

            on_permission_request=PermissionHandler.approve_all,

            model="gpt-5",

            tools=[get_stock_price],

        ) as session:

            done = asyncio.Event()

            def on_event(event):

                if event.type.value == "assistant.message":

                    print(event.data.content)

                elif event.type.value == "session.idle":

                    done.set()

            session.on(on_event)

            await session.send("What's the current price of Microsoft stock?")

            await done.wait()

asyncio.run(main())&lt;/LI-CODE&gt;
&lt;P&gt;When the prompt arrives, the agent works out that it should call `get_stock_price` with `ticker="MSFT"`, runs your function, and folds the result into its response. You don't wire up the function-calling logic yourself — the SDK handles dispatch, parameter parsing, and return value handling. Your job is just writing the function.&lt;/P&gt;
&lt;H2&gt;Streaming Responses in Real Time&lt;/H2&gt;
&lt;P&gt;If you're building anything interactive, waiting for a complete response before displaying anything feels slow. Setting `streaming=True` and listening for `assistant.message_delta` events fixes that immediately:&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;async with await client.create_session(

    on_permission_request=PermissionHandler.approve_all,

    model="gpt-5",

    streaming=True,

) as session:

    done = asyncio.Event()

    def on_event(event):

        match event.type.value:

            case "assistant.message_delta":

                print(event.data.delta_content or "", end="", flush=True)

            case "session.idle":

                done.set()

    session.on(on_event)

    await session.send("Write a Python function that validates an email address.")

    await done.wait()&lt;/LI-CODE&gt;
&lt;P&gt;Each chunk arrives as a `delta_content` string. Print it directly for a terminal UI, or accumulate chunks if you need the full response as a single string.&lt;/P&gt;
&lt;H2&gt;A Few Things Worth Knowing Before You Build&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Billing&lt;/STRONG&gt;: Every prompt counts against your GitHub Copilot subscription's premium request quota. If you're building automated workflows that fire off many requests — think CI pipelines or scheduled jobs — monitor usage. The SDK also supports BYOK (Bring Your Own Key), so you can plug in your own API keys from OpenAI, Azure AI Foundry, or Anthropic, which is a good option if you already have model deployments or want to separate usage billing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Stability&lt;/STRONG&gt;: The SDK is in public preview. It follows semantic versioning, so breaking changes come with a major version bump, but check the release notes between upgrades.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Permissions&lt;/STRONG&gt;: For anything beyond experiments, replace `PermissionHandler.approve_all` with a custom handler. The SDK lets you inspect each tool request by kind — `shell`, `write`, `read`, `url`, `custom-tool` — and return `approved` or `denied` per request. That's where your security posture lives.&lt;/P&gt;
&lt;H2&gt;If You Want to Start — Start Here&lt;/H2&gt;
&lt;P&gt;One thing I've found working is that the best way to help customers adopt a technology is to actually use it yourself first. The Copilot SDK is a good candidate for that approach.&lt;/P&gt;
&lt;P&gt;On the internal side, there are a handful of workflows that translate really well to agents.&lt;/P&gt;
&lt;P&gt;Customer health reviews, for example — instead of manually pulling data from multiple tools before a call, you could build an agent that gathers recent Azure consumption,&lt;/P&gt;
&lt;P&gt;Copilot seat usage, and open support tickets, then produces a plain-language summary. Account preparation used to mean 30 minutes of tab-switching; an agent with the right custom tools can reduce that to a prompt.&lt;/P&gt;
&lt;P&gt;Incident prep is another one. When a customer hits an issue and needs a root cause summary fast, an agent that can read recent deployment logs, scan for known patterns, and draft a timeline is genuinely useful — both internally and as something you can walk through with the customer.&lt;/P&gt;
&lt;P&gt;Building these tools yourself also gives you hands-on credibility when the architecture conversation comes up. You've already worked through the permission model, you've thought about BYOK, and you know where the rough edges are. That context matters more than any slide.&lt;/P&gt;
&lt;H2&gt;How to Help Customers Get Started&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Most enterprise customers land in one of two places: they see Copilot as a developer IDE tool and haven't thought about embedding it in applications, or they've heard about agentic AI and don't know what a framework like this actually handles versus what they need to build themselves.&lt;/P&gt;
&lt;P&gt;The clearest entry point is to start with a specific, bounded use case — not "let's build an AI agent" but "your support team answers the same 40 questions every week; let's route those through an agent that queries your internal knowledge base." That scope is small enough to deliver in a few days, concrete enough to measure, and immediately demonstrates how custom tools connect to real systems.&lt;/P&gt;
&lt;P&gt;A few things worth surfacing early in the architecture conversation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;BYOK vs. Copilot subscription&lt;/STRONG&gt;: Customers with existing Azure AI Foundry or OpenAI contracts can connect their own models. A quick win for enterprises who already have model deployments and don't want to provision Copilot seats for non-developer workloads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Permission governance&lt;/STRONG&gt;: The `on_permission_request` handler is where the security conversation lives. For customers in regulated industries, showing that every tool action can be audited and restricted at the code level — not just policy — tends to land well.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;MCP integration&lt;/STRONG&gt;: Customers with existing tool ecosystems (Jira, ServiceNow, internal APIs) can expose those as MCP servers rather than rewriting everything as custom tools. Worth raising early to avoid unnecessary rework.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Customer Use Cases&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;DevOps and platform engineering&lt;/STRONG&gt; — Agents that validate infrastructure-as-code before deployment, flag security misconfigurations, or triage incidents by reading runbooks and change logs. These are high-value because they touch production workflows and have clear, measurable ROI.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Internal knowledge and support&lt;/STRONG&gt; — An agent over internal documentation — wikis, policies, architecture decisions — that answers employee questions without requiring someone to search three separate systems. Especially valuable for large organizations where institutional knowledge is fragmented.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Developer productivity&lt;/STRONG&gt; — Automating pull request summaries, generating release notes from commit history, or flagging potential issues in code changes. These compound fast: save 10 minutes per PR across a 500-developer org and you notice it quickly.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Reporting and operations&lt;/STRONG&gt; — Generating weekly status reports, customer-facing summaries, or executive briefings by pulling from live data sources. The agent handles gathering and formatting; the human handles the judgment call.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The common thread is that the best use cases aren't about replacing people. They're about removing the repetitive connective tissue between tasks — so that your team, and your customers' teams, spend more time on the work that actually requires their expertise.&lt;/P&gt;
&lt;H2&gt;Where to Go from Here&lt;/H2&gt;
&lt;P&gt;The official SDK repo (&lt;A href="https://github.com/github/copilot-sdk" target="_blank"&gt;https://github.com/github/copilot-sdk&lt;/A&gt;) has a Python cookbook with practical recipes, active documentation, and an Issues page that the team monitors closely. Session hooks, MCP server integration, and the system message API are all worth exploring once you're comfortable with the basics.&lt;/P&gt;
&lt;P&gt;The hardest part is usually just the first 20 lines. Once the client is running and you've got a session sending messages, the rest clicks pretty quickly — and that first working agent is a compelling starting point for the customer conversation too.&lt;/P&gt;
&lt;P&gt;The GitHub Copilot SDK is available in public preview at (&lt;A href="https://github.com/github/copilot-sdk" target="_blank"&gt;https://github.com/github/copilot-sdk&lt;/A&gt;). Python 3.11+ required.&lt;/P&gt;
&lt;H2&gt;Recommended Resources for Deeper Insights&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Building%20AI%20agents%20with%20GitHub%20Copilot%20SDK" target="_blank"&gt;Building AI agents with GitHub Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Advanced%20features%20of%20GitHub%20Copilot%20SDK" target="_blank"&gt;Advanced features of GitHub Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Integrating%20custom%20tools%20with%20Copilot%20SDK" target="_blank"&gt;Integrating custom tools with Copilot SDK&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://ithy.com/?query=Security%20best%20practices%20for%20GitHub%20Copilot%20SDK%20applications" target="_blank"&gt;Security best practices for GitHub Copilot SDK applications&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 09 Apr 2026 21:43:21 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/getting-started-with-github-copilot-sdk/ba-p/4510059</guid>
      <dc:creator>anishekkamal</dc:creator>
      <dc:date>2026-04-09T21:43:21Z</dc:date>
    </item>
    <item>
      <title>Migrating Azure Data Factory and Synapse Pipelines to Fabric Data Factory</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/migrating-azure-data-factory-and-synapse-pipelines-to-fabric/ba-p/4510051</link>
      <description>&lt;P&gt;Migrating data pipelines from Azure Data Factory (ADF) and Azure Synapse Pipelines to&amp;nbsp;&lt;STRONG&gt;Microsoft Fabric Data Factory&lt;/STRONG&gt; represents a significant modernization opportunity and a catalyst for accelerating AI innovation across the enterprise. With Fabric Data Factory, customers can unify their data estate, streamline data engineering workflows, and more effectively leverage real-time analytics, generative AI, and machine learning at scale.&lt;/P&gt;
&lt;P&gt;This article outlines the key technical considerations for a successful migration from ADF/Synapse pipelines to Fabric Data Factory.&lt;/P&gt;
&lt;H2&gt;Fabric Data Factory vs. ADF and Synapse Pipelines: What’s Different?&lt;/H2&gt;
&lt;P&gt;Fabric Data Factory is officially described by &lt;SPAN style="color: rgb(30, 30, 30);"&gt;Microsoft as &lt;EM&gt;the next generation of Azure Data Factory, built to handle your most complex data integration challenges with a simpler, more powerful approach&lt;/EM&gt;. &lt;/SPAN&gt;It retains ADF’s core engine capabilities while introducing major improvements enabled by Fabric’s unified, AI-centric platform including OneLake, expanded activities and native Copilot experiences.&lt;/P&gt;
&lt;P&gt;A fundamental shift is the move to a fully managed SaaS model, with several important differences:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;No infrastructure management&lt;/STRONG&gt;: Fabric eliminates Azure Integration Runtimes entirely. Compute is managed automatically within a Fabric capacity. For on‑premises connectivity, the On‑Premises Data Gateway (OPDG) replaces ADF’s Self‑Hosted Integration Runtime.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;No publish step&lt;/STRONG&gt;: Pipelines are authored directly in the Fabric portal and can be saved or executed immediately, removing the separate publish step required in ADF.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Simplified data connections&lt;/STRONG&gt;: Traditional Linked Services and Datasets are replaced by Connections and inline data properties within activities, reducing configuration complexity.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;New native activities&lt;/STRONG&gt;: Fabric introduces capabilities not available in ADF/Synapse pipelines, including Office 365 Outlook email, Teams messaging, semantic model refresh, Fabric notebooks, Invoke SSIS (preview), and Lakehouse maintenance (preview).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Enhanced CI/CD&lt;/STRONG&gt;: Built‑in deployment pipelines support cherry‑picking, individual item promotion, Git integration, and SaaS‑native CI/CD beyond ADF’s ARM template–based approach.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AI Copilot&lt;/STRONG&gt;: Fabric Data Factory includes Copilot to assist with pipeline creation and management, a capability not available in ADF or Synapse pipelines.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For more details see: &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/compare-fabric-data-factory-and-azure-data-factory" target="_blank"&gt;Differences between Data Factory in Fabric and Azure - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;Common Migration Challenges and Recommended Mitigations&lt;/H2&gt;
&lt;P&gt;Migrating to Fabric Data Factory introduces new choices and challenges. While the move to Fabric offers substantial benefits, success depends on understanding key differences, migration challenges and planning accordingly. The table below summarizes the most important considerations to help guide a smooth and successful transition.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-21 lia-border-style-solid" border="1" style="border-width: 1px;"&gt;&lt;caption&gt;Table 1. Migration Challenges and Mitigation&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Challenge&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;&lt;STRONG&gt;Recommended Mitigation&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Feature Gaps&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Some ADF/Synapse features (e.g., SSIS IR, Managed VNets, certain triggers) are not yet fully supported in Fabric.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Delay migration of affected pipelines or redesign using Fabric‑native alternatives. Monitor updates via the &lt;A href="https://roadmap.fabric.microsoft.com" target="_blank"&gt;https://roadmap.fabric.microsoft.com&lt;/A&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Mapping Data Flows&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;ADF Mapping Data Flows don’t directly map to Fabric equivalents.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Rebuild using Dataflow Gen2, Fabric Warehouse SQL, or Spark notebooks. Validate transformation logic and data types post‑migration.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Trigger Redesign&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric lacks centralized trigger management; scheduling must be defined at the pipeline level.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Recreate triggers per pipeline and apply standardized naming conventions and documentation to maintain operational clarity.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Global Parameters&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;ADF Global Parameters must be converted to Fabric Variable Libraries.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Use Microsoft’s conversion guidance and account for differences in data types and runtime usage patterns. See &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/" target="_blank"&gt;Convert Azure Data Factory Global Parameters to Fabric Variable Libraries&lt;/A&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Dynamic Connections&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric does not support dynamic linked service properties in the same way as ADF.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Parameterize connection objects within pipeline activities using dynamic content.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment Performance&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Some environments report slower execution of deployment pipelines in Fabric.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Break deployments into smaller logical units and validate performance during pilot phases prior to production rollout.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;&lt;STRONG&gt;Capacity Planning&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Fabric uses a fixed‑capacity compute model instead of ADF’s elastic pay‑as‑you‑go runtime.&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-21"&gt;
&lt;P&gt;Right‑size Fabric capacity based on peak load testing and continuously monitor usage with tools such as the &lt;A href="https://learn.microsoft.com/en-us/fabric/onelake/" target="_blank"&gt;Fabric Capacity Estimator&lt;/A&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Migration Tooling&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Migration Assistant:&lt;/STRONG&gt; Microsoft Fabric includes a built‑in Migration Assistant for both ADF and Synapse pipelines, designed specifically to support pipeline migrations. To assess migration readiness, open your ADF/Synapse pipeline instance, go to the authoring canvas, and select Migrate to Fabric (Preview) &amp;gt; Get started (Preview).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As shown in the assessment summary below, pipelines are grouped into migration readiness categories such as Ready, Needs Review, Coming Soon, and Unsupported. This classification gives engineering teams early visibility into potential migration risks by highlighting activities or configurations that may behave differently in Fabric and require validation or adjustment after migration (&lt;STRONG&gt;Needs review&lt;/STRONG&gt;), features that are not currently supported in Fabric but are planned for future availability (&lt;STRONG&gt;Coming soon&lt;/STRONG&gt;), or not available in Fabric and will require redesign or re‑implementation (&lt;STRONG&gt;Unsupported&lt;/STRONG&gt;).&lt;/P&gt;
&lt;P&gt;In enterprise environments with large pipeline estates, this insight is critical for avoiding unexpected failures or delays during migration.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After completing the assessment, you can proceed with the migration wizard and mount your ADF pipelines into Microsoft Fabric.&lt;/P&gt;
&lt;P&gt;Mounting does not migrate your ADF pipelines to Fabric Data Factory at this stage. Instead, it creates a reference to your existing instances within the Fabric workspace without consuming Fabric capacity. After mounting, run pipelines side by side to validate behavior and results.&lt;/P&gt;
&lt;P&gt;Once the side by side has been validated, select Migrate to Fabric button to proceed with connection mapping and the actual migration to Fabric Data Factory.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After completing the migration process, you will be presented with the&amp;nbsp;&lt;STRONG&gt;Migration Results&lt;/STRONG&gt; page. This view provides a summary of all selected pipeline resources along with their migration status and corresponding Fabric resource names. Successfully migrated pipelines are now available as Fabric‑native items within the workspace, while any errors or unmapped dependencies are flagged for further review.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For Synapse Analytics pipelines, you transition directly into the Fabric Data Factory experience (assess-&amp;gt;map-&amp;gt;migrate flow) rather than mounting first to reference Synapse pipelines externally.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For detailed migration steps, follow this link: &lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/how-to-assess-your-azure-data-factory-to-fabric-data-factory-migration" target="_blank"&gt;Assess your Azure Data Factory and Synapse pipelines for migration to Fabric - Azure Data Factory | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShell automation tool:&lt;/STRONG&gt;&amp;nbsp;Microsoft provides a PowerShell upgrade utility to accelerate migration from Azure Data Factory to Fabric Data Factory. Using the &lt;STRONG&gt;Microsoft.FabricPipelineUpgrade&lt;/STRONG&gt; module, you can translate a large subset of ADF pipeline JSON into Fabric‑native definitions, giving you a fast, scalable starting point for migration. The tool covers common patterns such as Copy, Lookup, Stored Procedure, and standard control flow. Manual follow‑up is still required for edge cases (custom connectors, complex expressions, and some data flow scenarios).&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang=""&gt;Import-AdfFactory -SubscriptionId &amp;lt;your Subscription ID&amp;gt; -ResourceGroupName &amp;lt;your Resource Group Name&amp;gt; -FactoryName &amp;lt;your Data Factory Name&amp;gt; -PipelineName "pipeline1" -AdfToken $adfSecureToken | ConvertTo-FabricResources | Export-FabricResources -Region &amp;lt;region&amp;gt; -Workspace &amp;lt;workspaceId&amp;gt; -Token $fabricSecureToken&lt;/LI-CODE&gt;
&lt;P&gt;For step‑by‑step guidance, see: &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/migrate-pipelines-powershell-upgrade-module-tutorial" target="_blank"&gt;Detailed Tutorial for PowerShell-based Migration of Azure Data Factory Pipelines to Fabric - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;Open‑Source Migration Tooling&lt;/H5&gt;
&lt;P&gt;In addition to Microsoft‑supported migration utilities, the Fabric Toolbox provides a set of open‑source tools designed to assist with migration planning, readiness analysis, and pipeline translation from ADF and Synapse to Fabric Data Factory.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Data Factory Migration Assistant PowerShell&lt;/STRONG&gt;: An open‑source tool from the Fabric Toolbox that supports migration from both Azure Data Factory and Synapse ARM templates and built as a browser‑based single‑page application (SPA). &lt;A href="https://github.com/microsoft/fabric-toolbox/tree/main/tools/FabricDataFactoryMigrationAssistant" target="_blank"&gt;https://github.com/microsoft/fabric-toolbox/tree/main/tools/FabricDataFactoryMigrationAssistant&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Assessment Tool&lt;/STRONG&gt;: An open‑source command‑line utility used to connect to and scan workspaces in order to extract inventory data and assess migration scope by creating a structured export of assets for planning and analysis.&amp;nbsp;&lt;BR /&gt;&lt;A href="https://github.com/microsoft/fabric-toolbox/tree/main/tools/fabric-assessment-tool" target="_blank"&gt;https://github.com/microsoft/fabric-toolbox/tree/main/tools/fabric-assessment-tool&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;When to Use What?&lt;/H2&gt;
&lt;P&gt;Organizations typically adopt one of three migration strategies when transitioning ADF or Synapse pipelines to Fabric Data Factory:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Lift‑and‑Shift to accelerate transition timelines with minimal pipeline refactoring.&lt;/LI&gt;
&lt;LI&gt;Modernization to re‑architect orchestration logic and fully leverage Fabric‑native analytics and AI capabilities.&lt;/LI&gt;
&lt;LI&gt;Hybrid to balance migration velocity with targeted modernization of high‑value or low‑parity workloads.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The appropriate migration paths should be aligned with business priorities, existing integration patterns, and the desired pace of platform transformation, and is largely determined by the feature parity between existing ADF/Synapse assets and their Fabric Data Factory equivalents.&lt;/P&gt;
&lt;P&gt;A range of migration tooling options are available depending on migration scope and pipeline complexity:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Built-In Fabric UI Assistant – Migrate to Fabric&lt;/STRONG&gt;: Use this assistant to assess pipeline readiness across both ADF and Synapse environments, mount existing ADF pipelines into a Fabric workspace, perform side‑by‑side validation, or migrate supported Synapse pipelines directly into Fabric Data Factory experience.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShell Upgrade Tool (Microsoft‑supported)&lt;/STRONG&gt;: Use this for bulk ADF migrations at scale, repeatable upgrades, and CI/CD‑driven pipeline conversion with a supported path.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Data Factory Migration Assistant PowerShell (Open Source)&lt;/STRONG&gt;: Use for early analysis, connector mapping, and generating a migration starting point outside the Fabric UI.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Fabric Assessment Tool (Open Source)&lt;/STRONG&gt;: Use before migration to understand scope, inventory, dependencies, and readiness across your Fabric and data estate.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Manual migration&lt;/STRONG&gt;: best suited for complex, low‑parity pipelines and provides an opportunity to modernize architecture using Fabric’s native capabilities, delivering long‑term benefits in maintainability, performance, and cost.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Key Considerations for a Smooth Transition&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Before migrating, it’s important to understand the architectural differences between Azure Data Factory or Synapse pipelines and Fabric Data Factory. &amp;nbsp;Reviewing these differences early helps determine which pipeline components can be reused, translated, or redesigned for Fabric‑native execution.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Start by prioritizing low‑risk, high‑parity pipelines that can be migrated with minimal redesign.&lt;/LI&gt;
&lt;LI&gt;Mounting existing ADF pipelines into Fabric enables gradual migration and side‑by‑side testing, allowing teams to validate compatibility before using conversion tools or replatforming workloads.&lt;/LI&gt;
&lt;LI&gt;For larger environments, the &lt;EM&gt;Microsoft.FabricPipelineUpgrade&lt;/EM&gt; PowerShell module or Open-Source tools can be used to migrate pipelines at scale while mapping linked services to Fabric connections.&lt;/LI&gt;
&lt;LI&gt;Where possible, leverage Fabric‑native capabilities such as Copilot for pipeline authoring, and code fix, deployment pipelines for CI/CD, and OneLake shortcuts to access external data without duplication.&lt;/LI&gt;
&lt;LI&gt;It’s also recommended to validate migrated pipelines under production‑like workloads to confirm performance and reliability before cutover.&lt;/LI&gt;
&lt;LI&gt;For complex or large‑scale enterprise migrations, engaging Microsoft partners can help accelerate modernization efforts while minimizing operational risk. &lt;A href="https://www.microsoft.com/en-us/microsoft-fabric/partners" target="_blank"&gt;Partners | Microsoft Fabric&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For detailed best practices guidance, refer to:&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/migration-best-practices" target="_blank"&gt;Migration Best Practices for Azure Data Factory to Fabric Data Factory - Microsoft Fabric | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Summary&lt;/H2&gt;
&lt;P&gt;Migrating from Azure Data Factory or Synapse pipelines to Microsoft Fabric Data Factory represents a key step toward building a unified, AI‑ready analytics platform. By leveraging the built‑in migration assessment and associated tooling, organizations can perform pipeline‑level compatibility analysis, identify unsupported activities or configuration dependencies, and implement a phased modernization strategy aligned with workload readiness.&lt;/P&gt;
&lt;P&gt;Successful transitions require a clear understanding of the architectural shift from ADF/Synapse’s PaaS to Fabric’s SaaS‑managed model, where compute is fully managed within the Fabric capacity, traditional Integration Runtimes are no longer required, and datasets and linked services are replaced with connection‑based configurations defined inline within pipeline activities.&lt;/P&gt;
&lt;P&gt;By adopting Fabric‑native capabilities such as deployment pipelines for CI/CD, Copilot‑assisted pipeline authoring, and OneLake, organizations can standardize pipeline lifecycle management, enable governed access to shared data assets across domains, and support multi‑cloud integration through virtualized data access allowing pipelines to operate on distributed datasets without duplicating or relocating data across Lakehouse, Data Warehouse, and Real‑Time Analytics workloads within a unified Fabric workspace.&lt;/P&gt;</description>
      <pubDate>Thu, 09 Apr 2026 19:36:15 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/migrating-azure-data-factory-and-synapse-pipelines-to-fabric/ba-p/4510051</guid>
      <dc:creator>claudiodasilva</dc:creator>
      <dc:date>2026-04-09T19:36:15Z</dc:date>
    </item>
    <item>
      <title>Chaos Engineering vs. STAF for SAP: Resilience Validation vs. Functional Assurance</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/chaos-engineering-vs-staf-for-sap-resilience-validation-vs/ba-p/4507483</link>
      <description>&lt;H3&gt;&lt;STRONG&gt;Introduction:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;As SAP environments transition to cloud platforms such as Azure, one strategic question consistently surfaces:&lt;/P&gt;
&lt;P&gt;“STAF proves SAP works, Chaos Engineering proves it survives. Why do we need both?”&lt;/P&gt;
&lt;P&gt;The short answer: STAF and Chaos Engineering serve different purposes and treating them as interchangeable can expose SAP production environments to unseen risk.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;A Quick Comparison for Mission Critical SAP Engagements&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;In the world of SAP on Azure, reliability and resilience are non-negotiable. Two powerful approaches. Chaos Engineering for SAP and SAP Testing Automation Framework (STAF) help ensure mission-critical workloads remain robust. But what sets them apart, and how do they complement each other?&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Why This Matters&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;SAP workloads often underpin core business processes. Downtime or misconfiguration can lead to significant operational and financial impact. While both Chaos Engineering and STAF aim to improve system reliability, they do so in very different ways.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Chaos Engineering for SAP&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Chaos Engineering is about &lt;STRONG&gt;proactively testing resilience&lt;/STRONG&gt; by introducing controlled failures into your environment. Using tools like &lt;STRONG&gt;Azure Chaos Studio&lt;/STRONG&gt;, engineers simulate real-world disruptions such as VM shutdowns, DNS failures, or network latency, to validate how SAP systems recover under stress.&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Benefits:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Identifies hidden weaknesses in architecture.&lt;/LI&gt;
&lt;LI&gt;Improves operational resilience through real-world failure scenarios.&lt;/LI&gt;
&lt;LI&gt;Enables &lt;STRONG&gt;game days&lt;/STRONG&gt; and &lt;STRONG&gt;BCDR drills&lt;/STRONG&gt; for mission-critical workloads.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;STAF focuses on &lt;STRONG&gt;automating high availability (HA) and configuration compliance testing&lt;/STRONG&gt; for SAP clusters on Azure. It uses &lt;STRONG&gt;Ansible playbooks and Python modules&lt;/STRONG&gt; to execute controlled failover scenarios like node crashes or process termination and generates auditable reports.&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Benefits:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Speeds up deployment readiness.&lt;/LI&gt;
&lt;LI&gt;Reduces manual testing effort.&lt;/LI&gt;
&lt;LI&gt;Validates HA configurations against best practices.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;Side-by-Side Comparison&lt;/STRONG&gt;&lt;/H6&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-18" border="1" style="width: 680px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Aspect&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering for SAP&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Primary Goal&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Validate resiliency under unpredictable conditions&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Automate HA and configuration compliance testing&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Scope&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Infrastructure-level stress and failure injection&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;SAP cluster failover and HA validation&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Approach&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Simulate real-world outages (VM shutdown, DNS failure)&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Controlled failover scenarios (node crash, process kill)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Tools Used&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Azure Chaos Studio&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Ansible playbooks + Python modules&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Observability insights, recovery behavior reports&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Auditable HTML compliance reports&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Use Case&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;BCDR drills, game days, proactive risk identification&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Pre-go-live readiness, periodic HA audits&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;&lt;STRONG&gt;Complementarity&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Tests resilience beyond planned scenarios&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-18"&gt;
&lt;P&gt;Ensures HA configuration meets best practices&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;STRONG&gt;When to Use Each&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;STAF&lt;/STRONG&gt; → Before go-live or during periodic audits to validate HA setup.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering&lt;/STRONG&gt; → For resilience testing under unexpected failures and operational stress.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Takeaway&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;These approaches are &lt;STRONG&gt;complementary&lt;/STRONG&gt;, not competing. Use STAF for structured HA validation and compliance. Use Chaos Engineering for real-world resilience testing and operational confidence.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Next Steps&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Explore &lt;STRONG&gt;Azure Chaos Studio&lt;/STRONG&gt; for chaos experiments.&lt;/LI&gt;
&lt;LI&gt;Download &lt;STRONG&gt;STAF&lt;/STRONG&gt; from GitHub and integrate it into your SAP deployment pipeline.&lt;/LI&gt;
&lt;LI&gt;Combine both for a comprehensive resiliency strategy.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The two concepts of STAF and Chaos Engineering are not alternatives but complements to each other. While the former tests the accuracy of the SAP system and the business processes involved in its functionality, the latter tests the system in the real world with failures to confirm its ability to cope with such failures in the cloud environment of Azure.&lt;/P&gt;
&lt;P&gt;Therefore, the use of the STAF concept alone gives us the confidence that the SAP system works as expected, but the addition of Chaos Engineering gives us the confidence that the system will still work even when things go wrong.&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Ref links:&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;&lt;STRONG&gt;SAP Testing Automation Framework (STAF):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sap/automation/testing-framework" target="_blank" rel="noopener"&gt;About SAP Testing Automation Framework | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sap/automation/testing-framework-high-availability" target="_blank" rel="noopener"&gt;SAP Testing Automation Framework High Availability Testing | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/anukarnam/SAPTesting-Automation-Framework-" target="_blank" rel="noopener"&gt;anukarnam/SAPTesting-Automation-Framework-: The SAP Test Automation Framework is a set of tools and solutions developed to simplify and automate the process of testing SAP systems and other associated third-party applications. It helps to overcome the challenges associated with manual testing by offering strong automation solutions.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Chaos Engineering – Resilience &amp;amp; Failure Readiness:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/chaos-studio/chaos-studio-overview" target="_blank" rel="noopener"&gt;What is Azure Chaos Studio? - Azure Chaos Studio | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/chaos-studio/chaos-studio-chaos-engineering-overview" target="_blank" rel="noopener"&gt;Understand chaos engineering and resilience with Chaos Studio - Azure Chaos Studio | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/sapapplications/using-azure-chaos-studio-to-fortify-sap-systems-testing-and-resiliency/4387503" target="_blank" rel="noopener"&gt;Using Azure Chaos Studio to Fortify SAP Systems Testing and Resiliency | Microsoft Community Hub&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2026 13:38:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/chaos-engineering-vs-staf-for-sap-resilience-validation-vs/ba-p/4507483</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-04-01T13:38:38Z</dc:date>
    </item>
    <item>
      <title>Legacy SharePoint Authentication (IDCRL) Is Retiring — What to Do Before May 1, 2026</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/legacy-sharepoint-authentication-idcrl-is-retiring-what-to-do/ba-p/4499131</link>
      <description>&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Audience:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;SharePoint admins, M365 admins, and anyone running automations that access SharePoint Online/OneDrive. This post explains&amp;nbsp;what’s&amp;nbsp;changing, how to detect legacy sign-ins, and the practical steps to move to modern authentication (OAuth) before the cutoff dates.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft is turning off a legacy SharePoint sign-in method called&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL &lt;STRONG&gt;(Identity Client Run Time Library)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If you only access SharePoint and OneDrive through the browser or Microsoft 365 apps, you’re probably fine—but if you run scripts, Power BI refreshes, Power Automate flows, or third-party tools that store a username/password, you’ll want to update those connections to&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Modern Authentication (OAuth/OpenID Connect)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;now to avoid outages.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;TL:&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;DR&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;(What you need to know)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Who’s&amp;nbsp;most affected:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Any non-interactive connection that stores a SharePoint&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;username/password&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(scripts, scheduled jobs, Power BI refreshes, Power Automate flows, and third-party tools).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;What’s&amp;nbsp;changing:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Microsoft is retiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;legacy SharePoint authentication (IDCRL)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint Online and OneDrive for Business.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;What to do:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Move those connections to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(OAuth/OpenID Connect) using supported connectors, modules, or app registrations.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Key dates:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(legacy logins blocked by default),&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(last day an admin extension can keep legacy auth temporarily allowed), and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(IDCRL fully retired and cannot be re-enabled).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Quick checklist&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Inventory:&lt;/STRONG&gt; list SharePoint connections you own (scripts, Power BI, Power Automate, third-party tools).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Spot legacy auth: &lt;/STRONG&gt;saved passwords, “Basic” auth, or PowerShell -Credential/SharePointOnlineCredentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Migrate: &lt;/STRONG&gt;switch to Modern Authentication (OAuth) using supported connectors/modules.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Test:&lt;/STRONG&gt;&amp;nbsp;run&amp;nbsp;the script/refresh/flow end-to-end and confirm it still works.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Wingdings" data-listid="21" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Wingdings&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Finish early:&lt;/STRONG&gt; complete updates ahead of&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and no later than&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What Is IDCRL and Why Is It Going Away?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL (Identity Client Run Time Library)&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is an older SharePoint sign-in approach used by some legacy apps and scripts. In plain terms,&amp;nbsp;it’s&amp;nbsp;the “just pass a username and password” style of authentication. While most interactive sign-ins moved to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;years ago, some behind-the-scenes tools still use IDCRL—often without the person who set them up realizing it.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Why is Microsoft&amp;nbsp;retiring&amp;nbsp;it?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Because password-based legacy flows are harder to protect and&amp;nbsp;don’t&amp;nbsp;align well with today’s security controls.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Modern Authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;uses&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OpenID Connect and OAuth 2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with short-lived tokens (not stored passwords) and works cleanly with protections like&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MFA&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and Conditional Access. This is part of Microsoft’s broader “secure by default” direction—and it reduces risk for both individual accounts and the organization.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;From Microsoft’s guidance, the main shift&amp;nbsp;is&amp;nbsp;stop&amp;nbsp;sending passwords to&amp;nbsp;SharePoint and&amp;nbsp;start&amp;nbsp;acquiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth access tokens&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;via the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft identity platform&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. For custom solutions, that typically means using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MSAL&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(Microsoft Authentication Library) and either an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;interactive sign-in&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(delegated permissions) or an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;app-only&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;approach (application permissions) depending on your scenario.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Key Dates and Impact on Users&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here’s&amp;nbsp;the timeline Microsoft shared for SharePoint Online and OneDrive for Business:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is when&amp;nbsp;remaining&amp;nbsp;legacy (IDCRL) logins will be&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;blocked by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If customers need&amp;nbsp;additional&amp;nbsp;time to complete migration, tenant admins can temporarily allow legacy authentication again &lt;STRONG&gt;(extension)&amp;nbsp;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;until April 30, 2026&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;.&amp;nbsp;Then, on&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, IDCRL is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;fully retired&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;cannot be re-enabled&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In other words,&amp;nbsp;anything still&amp;nbsp;connected&amp;nbsp;with an embedded username/password is likely to break. The risk is concentrated in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;custom&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;integrations and automations (scripts, refreshes,&amp;nbsp;flows,&amp;nbsp;vendor tools) that still rely on legacy auth.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How Do I Know If&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;I’m&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;Using Legacy Authentication?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you only access SharePoint/OneDrive through the browser, Microsoft 365 apps, or standard Microsoft connectors,&amp;nbsp;you’re&amp;nbsp;typically already using&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. A simple rule of thumb:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;if a script, dataset, flow, or tool stores a SharePoint username/password, plan to modernize it&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. For the most common patterns and what to switch to, see&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;How to Transition to Modern Authentication (Action Plan)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;below.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Check Microsoft Purview audit logs (recommended)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you want a definitive answer (beyond “does this script store a password?”), review your tenant’s activity in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;events.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Open the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview portal&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and go to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="16" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Audit search&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for an appropriate time range (start with the last&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;30–60 days&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Under &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Activities (operation&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;s name)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, select&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Submit the search, review results, then&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;export&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(download) the results for deeper filtering in Excel.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;What to look for in the export&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;results, focus on the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;user/account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;time pattern&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and any available&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;client/app details&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(for example, user agent, application name, or client IP) to pinpoint&amp;nbsp;what’s&amp;nbsp;generating the legacy sign-ins.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Look for patterns that match automation&lt;/STRONG&gt;: recurring events (hourly/daily), service accounts, or sign-ins that line up with scheduled refreshes/flows. Then map those timestamps back to&amp;nbsp;likely owners:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power BI datasets&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power Automate&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;flows, scripts, or vendor tools.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If your export includes &lt;STRONG&gt;client/app identifiers&lt;/STRONG&gt;, note any&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;unexpected apps&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;accessing SharePoint; those are the best candidates to&amp;nbsp;validate&amp;nbsp;and migrate first.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="17" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Cross-check suspicious entries&lt;/STRONG&gt; with your inventory (scripts, Power BI datasets, Power Automate flows, vendor tools) and then update the matching connection to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Not sure whether something you own is using legacy auth? A good starting point is to check how the connection was set up: if it relies on a stored password, plan to update it.&amp;nbsp;If&amp;nbsp;you’re&amp;nbsp;still unsure, reach out to IT support or the vendor/developer of the tool—many providers have already published “modern auth” upgrade steps.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How to Transition to Modern Authentication (Action Plan)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If you own anything that connects to SharePoint behind the scenes, the goal is simple:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;move every connection to Modern Authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;test it end-to-end&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;well before the cutoff. Below are the most common “legacy” patterns and what to switch to.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Common legacy scenarios (and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;modern&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;&amp;nbsp;replacement)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;1) PowerShell scripts or custom code that pass a username/password&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If you’re using older SharePoint Online PowerShell patterns like &lt;STRONG&gt;-Credential, &lt;/STRONG&gt;&lt;STRONG&gt;Get-Credential &lt;/STRONG&gt;or&amp;nbsp;&lt;STRONG&gt;SharePointOnlineCredentials&lt;/STRONG&gt;, plan to update.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Use updated modules that default to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;or&amp;nbsp;use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;PnP PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with interactive sign-in or an Entra app (certificate/client ID) rather than stored credentials.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Additionally&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;according to&amp;nbsp;Microsoft’s announcement in the M365 admin center (MC1188595), the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft.Online.SharePoint.PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;module (&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;version 16.0.26712.12000 or newer&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) supports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;app-only authentication with a certificate&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Entra app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(instead of legacy username/password patterns), using Connect-SPOService.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For custom apps, adopt token-based auth via&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MSAL&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and&amp;nbsp;supported&amp;nbsp;SharePoint libraries.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Example:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559685&amp;quot;:360,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;$appID = "1e499dc4-1988-48ef-8f4f-9756f4f04548" # This is your Entra App ID 
$tenant = "9cfc52cb-53da-4154-67e9-b20b170b7ba3" # This is your Tenant ID 
$thumbprint = "6EAD7303b5C7E27Dc4245989AD554642940BA093" # This is certificate thumbprint 
$cert = Get-ChildItem Cert:\LocalMachine\My\$thumbprint 
Connect-SPOService -Url 'https://contoso-admin.sharepoint.com' -Certificate $cert -ClientId $appID -TenantId $tenant &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335557856&amp;quot;:16777215,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;2) &lt;STRONG&gt;Power BI reports&lt;/STRONG&gt; that connect to SharePoint using “Basic” credentials&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;In Power BI Desktop, open&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Data source settings&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint connections and switch the authentication method to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft (Organizational) Account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;/&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth2&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;After updating,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;re-publish&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and confirm scheduled refresh still works.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;3) &lt;STRONG&gt;Power Automate flows &lt;/STRONG&gt;(or workflows) that store a username/password&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Prefer the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;official SharePoint connector&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(modern auth by default) over custom HTTP calls with stored credentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="14" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;For custom connectors, use an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Azure AD app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and configure&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth&amp;nbsp;2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;so the flow uses tokens, not passwords.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;4) &lt;STRONG&gt;Third-party tools&lt;/STRONG&gt; (migration/sync/reporting) that use “other user” or stored credentials&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Update the tool to the latest version and confirm it supports&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;for SharePoint Online.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="15" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run a full test (connect, read/write, scheduled jobs) well before the cutoff dates.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;A few best practices while&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;you’re&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;&amp;nbsp;updating&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Don’t&amp;nbsp;delay:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Modernize your connections&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;before mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(when legacy logins are blocked by default), and no later than&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Extension (if needed):&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;If you need more time, tenant admins can temporarily allow legacy authentication&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;until April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Treat this as short-term mitigation while your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;complete&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;migration and validation—not a long-term solution.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Use official solutions:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Where possible, use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft’s supported clients and connectors&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(like updated SharePoint PowerShell modules,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power BI’s OAuth login&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Power&amp;nbsp;Automate&amp;nbsp;SharePoint actions&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) instead of hard-coding credentials.&amp;nbsp;These default options&amp;nbsp;are already used by&amp;nbsp;modern auth and will help ensure access continues.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Improve security:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Embrace modern authentication to&amp;nbsp;benefit&amp;nbsp;from&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;better security&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(support for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;MFA&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, conditional access, etc.) and to&amp;nbsp;eliminate&amp;nbsp;reliance on outdated passwords or legacy API calls.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Get help if needed:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;If&amp;nbsp;you’re&amp;nbsp;unsure how to update a specific application or script, contact your IT support team or the vendor/developer of the tool.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;PowerShell: temporarily allow legacy authentication (extension)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If an extension is&amp;nbsp;required, tenant admins can use SharePoint Online PowerShell to temporarily allow legacy authentication by setting&amp;nbsp;AllowLegacyAuthProtocolsEnabledSetting&amp;nbsp;and&amp;nbsp;LegacyAuthProtocolsEnabled&amp;nbsp;to $true.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Set-SPOTenant -AllowLegacyAuthProtocolsEnabledSetting $true 
Set-SPOTenant -LegacyAuthProtocolsEnabled $true  &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;201341983&amp;quot;:0,&amp;quot;335559739&amp;quot;:120,&amp;quot;335559740&amp;quot;:300}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Recommendation:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Block time now to inventory and modernize your SharePoint connections, then run a full end-to-end test. Doing this early helps you avoid last-minute troubleshooting when a refresh, script, or workflow suddenly fails.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Next steps (recommended)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run a Purview audit search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(last 30–60 days) and&amp;nbsp;identify&amp;nbsp;the owners of each recurring legacy sign-in.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Prioritize and modernize the highest-impact items first (scheduled Power BI refreshes, production automations, service accounts, and vendor tools), then test end-to-end.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="28" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If you must use the temporary extension, set a firm internal deadline to turn it back off and complete migration before&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Helpful Resources and Support&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For further reading and technical guidance, please see the following official resource:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;A href="https://devblogs.microsoft.com/microsoft365dev/migrating-from-idcrl-authentication-to-modern-authentication-in-sharepoint/" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Microsoft 365 Developer Blog –&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Migrating from IDCRL to Modern Authentication in SharePoint&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;– Explains the retirement decision and provides developer-oriented steps for migrating code and scripts to MSAL/OAuth.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Conclusion and call to action&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;IDCRL retirement is one of those changes&amp;nbsp;that is&amp;nbsp;easy to miss until something breaks—because the impact shows up in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;background jobs&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, not in day-to-day browser use. The good news is that the fix is straightforward:&amp;nbsp;identify&amp;nbsp;anything still using stored credentials and move it to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication (OAuth)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;well before the deadline.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Inventory:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;list&amp;nbsp;every script, dataset, flow, and vendor tool that connects to SharePoint/OneDrive.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Modernize:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;replace embedded usernames/passwords with OAuth via supported connectors, updated modules, or an Entra app registration.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="29" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Test:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;run each workload end-to-end (including scheduled runs) and confirm it behaves as expected.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Timeline reminder:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;legacy logins are blocked by default in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, extensions (if used) run through&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and IDCRL is fully retired on&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Q&amp;amp;A&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: Will this impact end users who only use SharePoint in a browser or the Microsoft 365 apps?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Typically, no. Most interactive sign-ins already use modern authentication. The main risk is with background processes that still send stored usernames/passwords.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q:&amp;nbsp;What’s&amp;nbsp;most likely to break?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Anything non-interactive that connects to SharePoint/OneDrive using embedded credentials—PowerShell scripts, scheduled jobs, Power BI refreshes configured with “Basic” credentials, Power Automate flows/custom connectors that store passwords, and some third-party tools.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: How can I confirm whether my tenant is still using IDCRL?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft Purview audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and search for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Export the results and look for recurring patterns (service accounts, scheduled times, consistent client/app details) to&amp;nbsp;identify&amp;nbsp;the source.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What happens in mid-February 2026 vs. May 1, 2026?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: In&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mid-February 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, legacy (IDCRL) logins are&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;blocked by default&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;—so legacy-dependent workloads may start failing unless updated (or temporarily re-enabled).&amp;nbsp;On&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, IDCRL is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;fully retired&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;and cannot be re-enabled.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: We need more time—what does the “extension” do?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: It temporarily allows legacy authentication again&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;through April 30,&amp;nbsp;2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;while&amp;nbsp;you&amp;nbsp;complete migration. You can enable it with:&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Set-SPOTenant&amp;nbsp;-AllowLegacyAuthProtocolsEnabledSetting&amp;nbsp;$true&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Set-SPOTenant&amp;nbsp;-LegacyAuthProtocolsEnabled&amp;nbsp;$true&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;Use this as a short-term mitigation and set a firm plan to turn it back off after you modernize.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q:&amp;nbsp;What’s&amp;nbsp;the recommended modern auth approach for PowerShell?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Use modern modules and token-based sign-in (OAuth). For automation, use an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Entra app registration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with a certificate (app-only) where&amp;nbsp;appropriate. The updated&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft.Online.SharePoint.PowerShell&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;module (v16.0.26712.12000+) also supports Connect-SPOService&amp;nbsp;with certificate-based app-only authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What should I do for Power BI datasets that connect to SharePoint?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: In Power BI Desktop, update the SharePoint data source authentication to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;Microsoft (Organizational) Account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;/&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth2&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, then republish and&amp;nbsp;validate&amp;nbsp;that scheduled refresh succeeds.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Q: What about Power Automate flows or custom connectors?&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;A: Prefer the built-in&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint connector&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;(modern auth by default). If&amp;nbsp;you’re&amp;nbsp;using custom HTTP actions or custom connectors, update them to use&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;OAuth 2.0&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;with an Entra app registration rather than stored credentials.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Admin email template (notify owners&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;identified&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;in Purview)&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H1&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Use the template below to contact the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;user/account&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;you found in your&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;audit export. Copy/paste it into Outlook, then fill in the placeholders (timestamps, site, and any client details) so the recipient can quickly&amp;nbsp;identify&amp;nbsp;the workload.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Subject:&amp;nbsp;Action&amp;nbsp;required: Update a SharePoint/OneDrive connection using legacy authentication (IDCRL)&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Hi &amp;lt;Name&amp;gt;,&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;We’re&amp;nbsp;reaching out because Microsoft is&amp;nbsp;retiring&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;legacy SharePoint authentication (IDCRL)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. Our audit review&amp;nbsp;indicates&amp;nbsp;a legacy sign-in associated with your account. If the underlying workload&amp;nbsp;isn’t&amp;nbsp;updated, it may fail when legacy authentication is blocked/retired.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What we&amp;nbsp;observed&amp;nbsp;(from Microsoft Purview audit)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;User/account: &amp;lt;UPN or service account&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Activity:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;IDCRLSuccessSignIn&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Timestamp(s): &amp;lt;YYYY-MM-DD HH:MM TZ&amp;gt; (add 2–3 examples if recurring)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;SharePoint site (if known): &amp;lt;site URL&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="30" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Client details (if available): &amp;lt;client/app, user agent, IP&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;What we need from you&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="31" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Please confirm&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;what workload&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;is generating this sign-in (for example: Power BI dataset refresh, Power Automate flow, PowerShell script, scheduled job, or a third-party tool).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Segoe UI,Times New Roman" data-listid="31" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;you’re&amp;nbsp;not the owner, please reply with the correct owner/contact (a team name or distribution list is fine).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Timeline&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Mid-February 2026:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;legacy logins blocked by default&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;May 1, 2026:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;IDCRL fully retired (cannot be re-enabled)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false,&amp;quot;335559739&amp;quot;:0}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="32" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Note:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;if an extension is used, it is temporary and runs through&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;April 30, 2026&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233279&amp;quot;:false}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;How we&amp;nbsp;can help&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;We can&amp;nbsp;help update the connection to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;modern authentication (OAuth)&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. In many cases this is as simple as re-authenticating with “Microsoft (Organizational) Account”/OAuth (Power BI), using the SharePoint connector (Power Automate), or updating scripts to use an Entra app registration with certificate-based authentication.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Please reply by: &amp;lt;target response date&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Thanks,&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Your name&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Team/Role&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;&amp;lt;Contact info&amp;gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Tip:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Consider including 2–3 sample timestamps from the export (especially recurring ones) and, if you have it, the dataset/flow name or server/job name that matches the schedule. If you&amp;nbsp;don’t&amp;nbsp;get a response, follow up with the&amp;nbsp;user’s&amp;nbsp;manager or the&amp;nbsp;owning&amp;nbsp;team for the workload, and consider using the temporary extension only as a short-term mitigation while ownership is confirmed.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Mar 2026 20:15:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/legacy-sharepoint-authentication-idcrl-is-retiring-what-to-do/ba-p/4499131</guid>
      <dc:creator>mikeleemsft</dc:creator>
      <dc:date>2026-03-03T20:15:00Z</dc:date>
    </item>
    <item>
      <title>SharePoint and OneDrive Site User ID Mismatch Explored</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-and-onedrive-site-user-id-mismatch-explored/ba-p/4496476</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;SharePoint / OneDrive request access dialog&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In this post, we walk through why users who look ‘healthy’ on the surface can still experience issues, and we cover practical ways to prevent and fix them across identity lifecycle management, rehire scenarios, tenant changes, and operational hygiene.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Who this is for&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Microsoft 365 / SharePoint admins troubleshooting unexpected &lt;EM&gt;Access denied&lt;/EM&gt; issues in SharePoint or OneDrive.&lt;/LI&gt;
&lt;LI&gt;Identity admins managing offboarding, rehiring, account restores, or account recreation in Microsoft Entra ID.&lt;/LI&gt;
&lt;LI&gt;Migration teams performing tenant-to-tenant migrations, domain changes, or identity consolidation.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-BackgroundDesign" class="lia-anchor"&gt;&lt;/a&gt;Background Design Explained&lt;/H1&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;When a user is created in Microsoft Entra ID, there is no guarantee that the User Principal Name (UPN) is unique so there is a unique id (historically known as PUID) that is created and passed to SharePoint. When a user is granted permission to a SharePoint or OneDrive Site or file explicitly the user information is added to a hidden list User Information List (UIL) that&amp;nbsp;stores basic details&amp;nbsp;about the users.&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;For users that are given permission via Office 365 Group, Security group, sharing link, the user profile information is not added until the first time the user interacts with the site or file.&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The users unique id, UPN, and other user information will be added to the UIL.&lt;/P&gt;
&lt;PRE class="lia-indent-padding-left-30px"&gt;&lt;SPAN class="lia-text-color-20"&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;The User Information List (UIL) is maintained&amp;nbsp;per site collection&amp;nbsp;and is separate from Microsoft Entra ID and SharePoint User Profile Service.&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;As part of authorization, the unique id that is found in the UIL is evaluated to the unique id that is passed via the authentication token and if they do not match then the authorization fails and the user receives “Access Denied”.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Scenario:&lt;/STRONG&gt; Taylor Smith (UPN &lt;A href="mailto:taylor.smith@contoso.com" target="_blank" rel="noopener"&gt;&lt;EM&gt;taylor.smith@contoso.com&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;)&amp;nbsp; has &lt;/EM&gt;confidential SharePoint/OneDrive access. Sometime after Taylor leaves the company, a new user joins the company with the same name and is assigned the same UPN. &amp;nbsp;The new Taylor should not inherit the former Taylor’s access or content. SharePoint prevents this by checking a unique identifier via the User Information List (UIL), ensuring only matching IDs can access content.&lt;/P&gt;
&lt;H1&gt;&lt;a id="community--1-Considerations" class="lia-anchor"&gt;&lt;/a&gt;Considerations for users removed from Entra ID&lt;/H1&gt;
&lt;P&gt;It’s common to notice users removed from Entra ID still showing up in SharePoint or OneDrive. SharePoint intentionally retains these accounts in the site’s User Information List to preserve:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Document meta data such as “Created By” or “Modified By” information&lt;/LI&gt;
&lt;LI&gt;Audit and compliance records&lt;/LI&gt;
&lt;LI&gt;Legacy permission references&lt;/LI&gt;
&lt;LI&gt;Sharing and version history integrity&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;As a result, terminated or mail-disabled users may still appear in:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Site People lists (e.g., _layouts/15/people.aspx)&lt;/LI&gt;
&lt;LI&gt;Group‑connected site membership views&lt;/LI&gt;
&lt;LI&gt;SharePoint user pickers&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This visibility is expected and &lt;STRONG&gt;not&lt;/STRONG&gt; a security risk because:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A disabled or deleted Entra ID&amp;nbsp;account&amp;nbsp;cannot authenticate&lt;/LI&gt;
&lt;LI&gt;SharePoint permissions are not re‑granted&lt;/LI&gt;
&lt;LI&gt;The presence of the user record does not re‑enable access&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-PreventativeMeasures" class="lia-anchor"&gt;&lt;/a&gt;Preventive Measures to Avoid Site User ID Mismatches&lt;/H1&gt;
&lt;P&gt;Preventing Site ID mismatches is largely about identity management. The goal is to avoid situations where a SharePoint site has one ID for a user and Entra ID has another. Here are strategies to minimize the chances of a mismatch occurring:&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Identity lifecycle best practices&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Avoid reusing a former employee’s UPN&lt;/STRONG&gt;: If possible, do not create a new account with the same username. If you must reuse, ensure you’ve cleaned up the old account’s SharePoint presence (see next points) before the new user starts using SharePoint.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Rehire scenarios&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Leverage account restores when rehiring&lt;/STRONG&gt;: If an employee returns within Entra ID’s 30-day soft-delete window, restore the original account in Entra ID instead of creating a new one. This way, the user’s PUID is the same, and no mismatch will occur because as far as SharePoint is concerned it’s the same account. If outside the 30 days, restoration isn’t possible then extra cleanup will be needed.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Educate and coordinate with HR/IT for re-hires&lt;/STRONG&gt;: Often, IT might not realize that creating a returning employee’s account from scratch can cause access issues. Train staff on Site ID mismatches so they know to restore the old account when possible or run diagnostics/cleanup quickly after creating a new account. A standard operating procedure for &lt;EM&gt;rehired employee account setup&lt;/EM&gt; that includes checking for SharePoint conflicts is valuable.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Change UPNs by renaming, not recreating&lt;/STRONG&gt;: If you need to change a user’s UPN (for example, after a name change or domain change), &lt;STRONG&gt;rename the existing account&lt;/STRONG&gt; (&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/howto-troubleshoot-upn-changes" target="_blank" rel="noopener"&gt;Plan and troubleshoot User Principal Name changes in Microsoft Entra ID&lt;/A&gt;) rather than delete and create new. Entra ID allows updating the UPN of a user. SharePoint will typically update the user info entry’s UPN on next sync. This way, the user’s PUID stays consistent. &lt;EM style="color: rgb(30, 30, 30);"&gt;Documentation:&lt;/EM&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/upn-changes" target="_blank" rel="noopener"&gt;How UPN changes affect OneDrive - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-external-url" style="font-style: normal; font-weight: 400; background-color: rgb(255, 255, 255);" href="https://learn.microsoft.com/en-us/sharepoint/change-your-sharepoint-domain-name" target="_blank" rel="noopener"&gt;Change your SharePoint domain name - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Tenant/domain changes&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Gracefully handle corporate domain transitions&lt;/STRONG&gt;: In tenant-to-tenant migrations or domain swaps (such as consolidating two Entra ID tenants), be aware of PUIDs. Use migration tools that map old IDs to new ones or plan to run the fixes post-migration if users receive new IDs. If user/profile mapping isn’t available, treat it like bulk rehiring.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-14"&gt;&lt;STRONG&gt;Operational hygiene&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement a UPN reuse delay or alteration&lt;/STRONG&gt;: Some organizations choose to alter the UPN of departing users for a period to prevent accidental reuse (for example, rename jdoe@company.com to jdoe_deactivated@company.com) before deletion. If your policies allow, avoiding UPN reuse entirely is the simplest way to prevent identity confusion.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maintain documentation of user’s site access&lt;/STRONG&gt;: Knowing which sites a user previously accessed makes it easier to clean up conflicts and restore access for legitimate rehires. Centralized, group-based permission management can also simplify re-permissioning once the mismatch is fixed. We have seen this accomplished in the following ways:
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/microsoft_graph_data_connect_for_sharepo/links-about-microsoft-graph-data-connect-for-sharepoint/4069045" target="_blank" rel="noopener" data-lia-auto-title="Microsoft Graph Data Connect for SharePoint" data-lia-auto-title-active="0"&gt;Microsoft Graph Data Connect for SharePoint&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Custom scripts and Tools&lt;/LI&gt;
&lt;LI&gt;Third Party Tools&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear SharePoint user info on departure (if feasible)&lt;/STRONG&gt;: For users who are permanently gone, you can remove them from SharePoint site collections, so old UIL entries don’t linger and later conflict with a reused UPN. This cleanup can be part of an offboarding checklist when appropriate. The cleanup will be 2 steps:&amp;nbsp;
&lt;OL&gt;
&lt;LI&gt;Locate which sites a user previously had access to:
&lt;UL&gt;
&lt;LI&gt;If the user has been deleted from Entra then the use of custom scripts will be needed to identify sites that the user previously had access to. &amp;nbsp;Example Script &lt;A class="lia-external-url" href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-FindAccess-SPO.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-FindAccess-SPO.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;If the user still exists in Entra, use the SharePoint Data Access Governance reports to locate sites accessible for a given user. &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/data-access-governance-site-permissions-users-report" target="_blank" rel="noopener"&gt;Data access governance reports - get site permission report for given users&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Once you have a list of sites that the user has accessed, you will need to remove them from that site.
&lt;UL&gt;
&lt;LI&gt;Create a script utilizing remove-spouser (&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/sharepoint/remove-users#remove-people-from-the-userinfo-list" target="_blank" rel="noopener"&gt;Remove users from SharePoint&lt;/A&gt;) for&amp;nbsp;all sites that the user had access to previously.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Process for guest users&lt;/STRONG&gt;: If you remove guest users, consider also cleaning them from site permissions if they might be re-invited later.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-Cleanup" class="lia-anchor"&gt;&lt;/a&gt;Cleanup Site User ID Mismatches&lt;/H1&gt;
&lt;P&gt;Once there is a user encountering a Site User ID Mismatch then you will have to do a cleanup reactively. &amp;nbsp;Review the article and use the tools outlined to address the OneDrive site as well as critical sites.&lt;/P&gt;
&lt;P&gt;If you do not need an inventory of sites, the user had access to previously to facilitate restoring access to those files/sites then you could do a cleanup of the user through script. The following is an example of such a script: &amp;nbsp;&lt;/P&gt;
&lt;P&gt;If a user encounters a Site User ID Mismatch, follow these steps to resolve the issue:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Review the article "&lt;A href="https://learn.microsoft.com/en-us/troubleshoot/sharepoint/sharing-and-permissions/fix-site-user-id-mismatch" target="_blank" rel="noopener"&gt;Fix site user ID mismatch in SharePoint or OneDrive&lt;/A&gt;" for guidance on addressing mismatches. Use the tools outlined in the article to fix issues with the OneDrive site and any other critical sites.&lt;/LI&gt;
&lt;LI&gt;If you do not need an inventory of sites the user previously accessed, proceed with cleaning up the user using a script. Refer to &lt;A href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-SPOUserRemover.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-SPOUserRemover.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt; for details that could be used. Use this option if restoring access to those files or sites is not required.&lt;/LI&gt;
&lt;LI&gt;If you need an inventory of sites that the user previously had access to provide access later, then you will need a script or report of the permission inventory for the site prior to removing the user from the site.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Users can then move forward with sharing or resharing content/sites to the new user instance, which will write a new entry to the user information list, with the correct unique ID, allowing access.&lt;/P&gt;
&lt;H1&gt;&lt;a id="community--1-Summary" class="lia-anchor"&gt;&lt;/a&gt;Summary&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;User Site ID mismatches occur when a user is recreated with the same UPN but a different underlying identity, leading to SharePoint or OneDrive access issues.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;SharePoint authorizes access using a unique ID (PUID) stored per site in the User Information List (UIL), not just the users' UPN.&lt;/LI&gt;
&lt;LI&gt;Disabled or deleted users may still appear in SharePoint by design to preserve audit history and document ownership—this is not a security issue.&lt;/LI&gt;
&lt;LI&gt;Prevention focuses on avoiding UPN reuse through process changes.&lt;/LI&gt;
&lt;LI&gt;Resolution options depend on the scenario: admins can either remove the old user entry directly if access history is not needed, or inventory and clean up affected sites before resharing content to the new account, so the correct ID is written.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;a id="community--1-FurtherReading" class="lia-anchor"&gt;&lt;/a&gt;Further Reading&lt;/H1&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/troubleshoot/sharepoint/sharing-and-permissions/fix-site-user-id-mismatch" target="_blank" rel="noopener"&gt;Fix site user ID mismatch in SharePoint or OneDrive - SharePoint&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/remove-users" target="_blank" rel="noopener"&gt;Remove users from SharePoint&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://gist.github.com/joerodgers/a0655669d9184b31ee0b027a73997435" target="_blank" rel="noopener"&gt;This script will create a report containing OD4B sites and the value of the AadObjectId stored in SharePoint and Azure Active Directory. This data can be used to help detect Site ID mismatches of OD4B site owners. · GitHub&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/mikelee1313/SPO-Sharing-Scripts/blob/main/Readme-SPOUserRemover.md" target="_blank" rel="noopener"&gt;SPO-Sharing-Scripts/Readme-SPOUserRemover.md at main · mikelee1313/SPO-Sharing-Scripts · GitHub&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Mar 2026 17:00:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/sharepoint-and-onedrive-site-user-id-mismatch-explored/ba-p/4496476</guid>
      <dc:creator>Tania Menice</dc:creator>
      <dc:date>2026-03-03T17:00:50Z</dc:date>
    </item>
    <item>
      <title>Finding and Remediating EWS App Usage Before Retirement</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/finding-and-remediating-ews-app-usage-before-retirement/ba-p/4497659</link>
      <description>&lt;P&gt;In this post, we wanted to share a practical walk-through of discovering which Azure AD app registrations are still using Exchange Web Services (EWS), plus what the Kiosk/Frontline license changes mean as you plan your move to Microsoft Graph.&lt;/P&gt;
&lt;P&gt;Microsoft has announced that Exchange Online EWS blocking with start on October 1, 2026. If you have line-of-business apps, third-party tools, or automation that still depends on EWS, you need two things: (1) an inventory of what’s using EWS today, and (2) a migration plan to supported alternatives – typically Microsoft Graph.&lt;/P&gt;
&lt;H1&gt;What’s changing (and why you should care now)&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/exchange/retirement-of-exchange-web-services-in-exchange-online/3924440" target="_blank"&gt;&lt;STRONG&gt;EWS retirement in Exchange Online&lt;/STRONG&gt;&lt;/A&gt;: Microsoft will start blocking EWS requests to Exchange Online on &lt;STRONG&gt;October 1, 2026&lt;/STRONG&gt;. The guidance is to migrate integrations to &lt;STRONG&gt;Microsoft Graph&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/exchange/update-to-ews-access-for-kiosk--frontline-worker-licensed-users/4474299" target="_blank"&gt;&lt;STRONG&gt;EWS access changes for Kiosk / Frontline licenses&lt;/STRONG&gt;&lt;/A&gt;: Starting at the &lt;STRONG&gt;end of June 2026&lt;/STRONG&gt;, Microsoft will start blocking EWS access for users &lt;STRONG&gt;without license rights to EWS&lt;/STRONG&gt; (for example, certain Kiosk and Frontline Worker license types). This can cause EWS-based integrations for such licensed users to fail &lt;EM&gt;before&lt;/EM&gt; the broader October retirement date.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Even if you plan to complete your Graph migration well ahead of October 2026, the end-of-June 2026 licensing-related blocks mean you should validate whether any users with those licenses assigned use EWS. That’s where the &lt;A href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting" target="_blank"&gt;Exchange-App-Usage-Reporting&lt;/A&gt; script is useful: it helps you find app registrations with EWS permissions and correlate them with recent sign-in activity so you can prioritize remediation.&lt;/P&gt;
&lt;H4&gt;Start here: check your Message Center first&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-ogsc="rgb(36, 36, 36)"&gt;The first thing you can do is to check your tenant&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ogsc="rgb(0, 120, 215)"&gt;&lt;A href="https://go.microsoft.com/fwlink/p/?linkid=2070717" data-outlook-id="2caf9581-3d88-449d-9d8b-b13052e2ad6e" data-ogsc="rgb(0, 120, 215)" target="_blank"&gt;Message Center&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN data-ogsc="rgb(36, 36, 36)"&gt;&amp;nbsp;(you need either Global Admin or Privacy Reader roles) and search for "Update active Exchange Web Services Applications" in Inbox or Archive. If you do not have such messages, you&amp;nbsp;&lt;EM&gt;likely&lt;/EM&gt;&amp;nbsp;do not have EWS usage in your tenant and are not impacted by this deprecation. We started to send EWS usage messages to all tenants in late December 2025.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H1&gt;What the Exchange-App-Usage-Reporting script does&lt;/H1&gt;
&lt;P&gt;The script is designed to answer a practical question: &lt;EM&gt;Which Azure AD app registrations in my tenant have EWS permissions, and are they still being used?&lt;/EM&gt; At a high level, it:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Discovers application registrations that have permissions associated with Exchange/EWS-related access.&lt;/LI&gt;
&lt;LI&gt;Queries sign-in activity for those applications to determine active applications.&lt;/LI&gt;
&lt;LI&gt;Queries audit logs for EWS activity within the tenant.&lt;/LI&gt;
&lt;LI&gt;Outputs report files that you can sort and share with app owners.&lt;/LI&gt;
&lt;LI&gt;Outputs a user license report to help identify kiosk or frontline workers.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1&gt;How the script complements the Microsoft 365 admin center EWS usage report&lt;/H1&gt;
&lt;P&gt;For customers in our WW service, the &lt;A href="https://learn.microsoft.com/microsoft-365/admin/activity-reports/ews-usage?view=o365-worldwide" target="_blank"&gt;Microsoft 365 admin center EWS usage report&lt;/A&gt; is a great starting point because it summarizes EWS activity across your tenant and breaks down which EWS SOAP actions are being called and their volumes over time. That helps you quantify overall EWS dependency and spot the heaviest EWS workloads.&lt;/P&gt;
&lt;P&gt;Where teams often get stuck is turning that usage signal into an actionable remediation plan (for example, identifying the exact Entra ID app registration/service principal, determining whether it is still actively used, and finding the people and mailboxes affected). Exchange-App-Usage-Reporting script is intended to bridge that gap by adding identity and operational context around EWS usage by:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;App registration and ownership context: identifies Entra ID app registrations/service principals with EWS-related permissions so you can immediately pivot from “an app is calling EWS” to “this is the app object to remediate,” then route it to the right owner/team.&lt;/LI&gt;
&lt;LI&gt;Recency and “is it still used?” signals: correlates apps to sign-in activity so you can prioritize the apps that are actively authenticating today versus stale registrations that may be safe to validate/decommission.&lt;/LI&gt;
&lt;LI&gt;Authentication + permission model visibility: helps you distinguish whether usage is tied to application permissions versus delegated patterns, which matters for choosing the right Microsoft Graph migration approach and designing least-privilege access.&lt;/LI&gt;
&lt;LI&gt;Mailbox population risk (Kiosk/Frontline): adds a user license report so you can quickly identify whether the EWS-dependent workflow touches mailboxes that may lose EWS access earlier (end of June 2026).&lt;/LI&gt;
&lt;LI&gt;Exportable, app-centric worklists: produces CSVs you can sort/share (for example, by last sign-in) to drive an engineering backlog: confirm owner, confirm scenario, map EWS operations to Graph endpoints, and track progress to zero.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;In practice, use the admin center report to understand &lt;EM&gt;what&lt;/EM&gt; EWS operations are happening and at what scale, then use this script to determine &lt;EM&gt;which&lt;/EM&gt; app registrations are responsible, &lt;EM&gt;who&lt;/EM&gt; owns them, &lt;EM&gt;whether&lt;/EM&gt; they’re still active, and &lt;EM&gt;which&lt;/EM&gt; mailbox/license populations are most likely to experience impact first.&lt;/P&gt;
&lt;P&gt;Customers with tenants that are not in our WW cloud should rely heavily on the script as admin center reports are not available.&lt;/P&gt;
&lt;H1&gt;Step-by-step: run the script and generate the report&lt;/H1&gt;
&lt;H2&gt;1) Download the code&lt;/H2&gt;
&lt;P&gt;The repository for this solution can be found &lt;A href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting/archive/refs/heads/main.zip" target="_blank"&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Note: The following permissions are required for the application:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AuditLogsQuery.ReadAll&lt;/STRONG&gt; to query the audit logs for EWS activity&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Application.Read.All&lt;/STRONG&gt; to locate app registrations&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AuditLogs.Read.All&lt;/STRONG&gt; to query sign-in activity&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Directory.Read.All&lt;/STRONG&gt; to query user license information&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Read &lt;A class="lia-external-url" href="https://github.com/jmartinmsft/Exchange-App-Usage-Reporting/blob/main/Create%20an%20App%20registration.md" target="_blank"&gt;this &lt;/A&gt;to create the Entra Admin Center application for the script.&lt;/P&gt;
&lt;H2&gt;2) Get active applications&lt;/H2&gt;
&lt;P&gt;Open a PowerShell session and change to the folder where you downloaded the script. You may need to unblock the files (for example, by using &lt;EM&gt;Unblock-File&lt;/EM&gt;) before execution. Run the script with the following example syntax:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application -Operation GetEwsActivity&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The output provides a list of applications with EWS permissions and the last sign-in for the associated service principal. A CSV file called App-SignInActivity-yyyyMMddhhmm will be created in the specified output path.&lt;/P&gt;
&lt;H2&gt;3) Get sign-in activity report for an application&lt;/H2&gt;
&lt;P&gt;Use the output from the previous step to get the sign-in activity for an application (you need to run this step for each application). Depending on the size of your tenant, you may also need to adjust the StartDate, EndDate, and have the Interval be 1 hour.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d&amp;nbsp; -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application -Operation GetAppUsage -QueryType SignInLogs -Name TJM-EWS-SoftDelete-Script -AppId 86277a5c-d649-46fc-8bf6-48e2a684624b -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date).AddDays(-14) -Interval 8&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The output provides a list of users that have signed into the application in the specified period requested. A CSV file called &amp;lt;AppId&amp;gt;-SignInEvents-yyyyMMddhhmm will be created in the specified output path.&lt;/P&gt;
&lt;H2&gt;4) Get user license information (Kiosk and Frontline identification)&lt;/H2&gt;
&lt;P&gt;For those organizations that have users with licenses that may be impacted by the upcoming enforcement in June, a report of user licenses can also be generated to help identify potential impact. The output from the previous step can be used to generate this license report. A single CSV file with the results from each application can also be merged into a single user license report.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.\Find-EwsUsage.ps1 -OutputPath C:\Temp\Output -OAuthCertificate 8865BEC624B02FA0DE9586D13186ABC8BE265917 -CertificateStore CurrentUser -OAuthClientId 7a305061-1343-49c3-a469-378de4dbd90d&amp;nbsp; -OAuthTenantId 9101fc97-5be5-4438-a1d7-83e051e52057 -PermissionType Application &lt;/EM&gt;&lt;EM&gt;-Operation GetUserLicenses -AppUsageSignInCsv C:\Temp\Output\86277a5c-d649-46fc-8bf6-48e2a684624b-SignInEvents-20260203122538.csv&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;How to interpret the output (and prioritize fixes)&lt;/H1&gt;
&lt;P&gt;Once you have the output files, sort by “last sign-in”. Apps with recent activity are your highest priority because they’re more likely to break production workloads when EWS is blocked. Apps with no sign-in data may be dormant, misconfigured, or retired—treat these as “needs validation,” not automatically “safe to ignore.”&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Identify the owner&lt;/STRONG&gt; of each app registration (or the business system it belongs to).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Confirm the workload&lt;/STRONG&gt;: mailbox access patterns (read, send, calendar, contacts, etc.) and whether it uses application or delegated access.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Check mailbox populations&lt;/STRONG&gt; the app touches—especially if any are assigned Kiosk / Frontline licenses that may lose EWS access at the end of June 2026.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Choose the migration target&lt;/STRONG&gt;: Microsoft Graph API equivalents, supported Exchange Online features, or a vendor upgrade that removes EWS dependency.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H1&gt;Don’t miss the Kiosk / Frontline Worker EWS blocks (end of June 2026)&lt;/H1&gt;
&lt;P&gt;Recommended validation playbook:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use the script output to build a shortlist of actively used EWS-enabled apps.&lt;/LI&gt;
&lt;LI&gt;For each app, determine which mailboxes it accesses (application access policies, RBAC, service accounts, shared mailboxes, or user populations).&lt;/LI&gt;
&lt;LI&gt;Cross-check those mailboxes’ license assignments for Kiosk / Frontline SKUs that may not include EWS rights.&lt;/LI&gt;
&lt;LI&gt;Run a controlled test (non-production where possible) to confirm whether the integration depends on EWS for those mailboxes and whether the vendor has a Graph-based update available.&lt;/LI&gt;
&lt;LI&gt;Evaluate if adding a different type of license for specific users is needed (for example, adding an Exchange Online Plan 1 or 2, which can still use EWS until October deprecation.)&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;Remediation options (what to do when you find an EWS dependency)&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Upgrade or reconfigure the product: Many vendors have already moved to Microsoft Graph. Engage the vendor and request their Graph migration guidance and timelines.&lt;/LI&gt;
&lt;LI&gt;Refactor custom code: Map EWS operations (mail, calendar, contacts) to Microsoft Graph endpoints and re-test auth flows, throttling, and permissions. More information on mappings can be found &lt;A href="https://learn.microsoft.com/en-us/graph/migrate-exchange-web-services-api-mapping" target="_blank"&gt;here&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Reduce blast radius: If an app truly must remain temporarily, scope it tightly using least-privilege permissions and (where applicable) scope the mailbox it has access to using RBAC—then treat it as a short-term exception with an expiration date.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;Quick checklist&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;Run Exchange-App-Usage-Reporting and identify apps with recent EWS sign-in activity.&lt;/LI&gt;
&lt;LI&gt;Track down app owners and document which mailboxes/workloads each app touches.&lt;/LI&gt;
&lt;LI&gt;Assess exposure to the end-of-June 2026 licensing-related EWS blocks (Kiosk/Frontline).&lt;/LI&gt;
&lt;LI&gt;Prioritize migrations to Microsoft Graph and validate functionality end-to-end.&lt;/LI&gt;
&lt;LI&gt;Re-run the report periodically to confirm EWS usage is trending to zero.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 26 Feb 2026 22:18:04 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/finding-and-remediating-ews-app-usage-before-retirement/ba-p/4497659</guid>
      <dc:creator>thejimmartin</dc:creator>
      <dc:date>2026-02-26T22:18:04Z</dc:date>
    </item>
    <item>
      <title>Azure SRE Agent Architecture and Creation: Practical Benefits for SAP on Azure Customers</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-sre-agent-architecture-and-creation-practical-benefits-for/ba-p/4497625</link>
      <description>&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Introduction&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;SRE Agent is an AI-powered service designed to support site reliability engineering practices through automation and intelligent decision-making. It reduces operational toil, improves uptime, and delivers consistent results by seamlessly integrating with Azure services and external systems to perform operational tasks with limited manual intervention.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Azure SRE Agent reduces operational toil by automating routine and repetitive tasks, allowing teams to concentrate on&amp;nbsp;high impact&amp;nbsp;initiatives. Operational work&amp;nbsp;frequently&amp;nbsp;involves managing diverse Azure resources in combination with&amp;nbsp;on-premises&amp;nbsp;environments, often requiring orchestration across multiple tools. SRE Agent delivers an&amp;nbsp;AI driven&amp;nbsp;platform that unifies these systems and automates operational workflows from start to finish.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;How Azure SRE Agent Architecture and Creation Benefit SAP on Azure Customers:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The SRE Agent&amp;nbsp;architecture is particularly well suited for SAP workloads, which are inherently&amp;nbsp;mission&amp;nbsp;critical&amp;nbsp;and span multiple Azure services, including&amp;nbsp;compute,&amp;nbsp;storage, networking, databases, and monitoring. By creating an Azure SRE Agent and associating it with SAP&amp;nbsp;related resource groups, customers gain a unified operational control plane that continuously analyzes telemetry from Azure Monitor, logs, and metrics to&amp;nbsp;identify&amp;nbsp;issues&amp;nbsp;impacting&amp;nbsp;SAP availability, performance, and stability.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Through automated diagnostics,&amp;nbsp;root&amp;nbsp;cause&amp;nbsp;analysis, and guided or&amp;nbsp;approval-based&amp;nbsp;remediation, Azure SRE Agent significantly reduces manual troubleshooting during SAP incidents. In addition, its support for scheduled health checks, configuration validation, and compliance audits aligns closely with SAP best practices and change&amp;nbsp;controlled environments, enabling customers to transition from reactive operations to a proactive, automated, and scalable model that improves uptime and operational confidence at scale.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Centralized Azure&amp;nbsp;Service&amp;nbsp;Management Capabilities:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This diagram illustrates Azure SRE Agent as the centralized automation and intelligence layer that manages Azure resources through Azure CLI and REST APIs, providing a unified control plane for operational tasks across the platform. From this single point, the agent connects to five core service domains: Compute (such as Virtual Machines, App Service, Container Apps, AKS,&amp;nbsp;Functions&amp;nbsp;and more), Storage (including Blob storage, file shares, managed disks, and storage accounts), Networking (covering&amp;nbsp;Vnets, load balancers, application gateways, and network security groups), Databases (Azure SQL, Cosmos DB, PostgreSQL, MySQL, and Redis), and Monitoring &amp;amp; Management (Azure Monitor, Log Analytics, Application Insights, and Azure Resource Manager). Together, the layout shows how Azure SRE Agent enables consistent, automated, and scalable operations across diverse Azure services from a single,&amp;nbsp;AI-driven&amp;nbsp;management layer.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Creating an SRE Agent in the Azure Portal:&lt;/SPAN&gt; &lt;/STRONG&gt;&lt;/H4&gt;
&lt;H4&gt;&lt;SPAN data-contrast="auto"&gt;Access the Azure portal and complete the following steps to create an SRE Agent.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;From Home → Create a resource,&amp;nbsp;search&amp;nbsp;for “sre agent” in the Azure Marketplace. The results clearly highlight Azure SRE Agent (Preview) as an official Microsoft Azure service, confirming that it is provisioned like any other native Azure resource rather than an external tool or addon.&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Please select the Azure subscription in which the agent will be deployed and&amp;nbsp;confirm&amp;nbsp;the available Azure SRE Agent (Preview) plan.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In the Basics step, select the subscription and resource group where the Azure SRE Agent will be created. You then provide agent specific details, including the agent's name and the Azure region in which the agent will be deployed and operated. This configuration ensures that the SRE Agent is established as a first-class Azure resource, governed, scoped, and managed using the same Azure constructs as any other native service.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;In this step, you define the level of access the agent will have over the Azure resource groups it manages, ensuring alignment with your organization’s security and governance requirements.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Two permission levels are available:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Reader:&lt;/STRONG&gt; The agent has&amp;nbsp;read only&amp;nbsp;access to the assigned resource groups. It can&amp;nbsp;observe&amp;nbsp;resource state, analyze telemetry, and generate insights, but any remediation actions require temporary elevation using the user’s permissions after explicit approval.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Privileged:&lt;/STRONG&gt; The agent is granted&amp;nbsp;permission&amp;nbsp;to execute approved actions directly on detected resources and resource types within its assigned resource groups. This enables faster, more automated remediation while still&amp;nbsp;operating&amp;nbsp;within Azure RBAC controls and&amp;nbsp;approval of&amp;nbsp;workflows.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This screen confirms that the Azure SRE Agent (Preview) has been successfully deployed in the Azure Portal. The banner “Your deployment is complete” indicates that all required resources were provisioned without errors and that the agent is now active in the selected subscription and resource group.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This screen shows the Azure portal search experience after the Azure SRE Agent has been successfully deployed. By typing “my” in the top search bar, the portal surfaces both services and resources associated with the user’s subscription. Under the Resources section, the newly created Azure SRE Agent instance (for example,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mysreapp&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) appears, confirming that the agent is now registered.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Below&amp;nbsp;screen shows the Azure SRE Agent chat interface for the deployed agent (&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;mysreapp&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;) within the Azure portal. It&amp;nbsp;represents&amp;nbsp;the primary interaction surface where&amp;nbsp;users engage with Azure SRE Agent using natural language to&amp;nbsp;monitor, diagnose, and remediate issues across the Azure resources associated with the agent.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;On the left navigation pane, users can manage chat threads, review activities, access the&amp;nbsp;agent&amp;nbsp;builder,&amp;nbsp;monitor&amp;nbsp;health and insights, and configure settings. The main panel displays a new chat thread with a prompt inviting the user to ask a question or execute a command. The&amp;nbsp;quick action&amp;nbsp;buttons (such as App Services, Container Apps&amp;nbsp;and&amp;nbsp;AKS) provide guided entry points to common operational scenarios, helping users get started quickly without needing to remember specific commands.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Once the chat window opens,&amp;nbsp;Azure SAP&amp;nbsp;customers can begin interacting with the Azure SRE Agent using natural language to&amp;nbsp;monitor&amp;nbsp;and manage their SAP landscapes on Azure. To get started, try questions such as:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;What can you help me&amp;nbsp;with&amp;nbsp;my SAP systems?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Which SAP subscriptions, resource groups, or&amp;nbsp;SAP related&amp;nbsp;resources are you managing?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;What alerts should I configure for my SAP workload (for example, SAP HANA, ASCS, or application servers)?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Show me a comparison of successful requests versus errors for&amp;nbsp;SAP dependent&amp;nbsp;applications across all subscriptions.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;If you are troubleshooting a specific SAP issue, you can ask more targeted questions, for example:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Why is my SAP system or SAP HANA database slow?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Why is my SAP application or central services instance not responding?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Can you investigate issues with my SAP workload?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Can you retrieve key metrics (such as CPU, memory, disk I/O, or HANA latency) for my SAP resources?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Conclusion:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Azure SRE Agent empowers SAP customers with a centralized,&amp;nbsp;AI driven&amp;nbsp;operations&amp;nbsp;layer&amp;nbsp;built&amp;nbsp;for managing complex,&amp;nbsp;SAP landscapes on Azure. By integrating natively with Azure and using standard management interfaces, the agent delivers continuous,&amp;nbsp;end-to-end&amp;nbsp;visibility across the&amp;nbsp;compute, storage, networking, database, and monitoring layers that underpin SAP workloads. This unified operational view enables teams to detect and understand issues affecting SAP availability, performance, and stability faster and with greater confidence.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;By combining automated diagnostics, intelligent&amp;nbsp;root cause&amp;nbsp;analysis, and guided or&amp;nbsp;approval-based&amp;nbsp;remediation, Azure SRE Agent dramatically reduces manual effort and accelerates incident resolution.&amp;nbsp;Built-in&amp;nbsp;support for proactive health checks, configuration validation, and compliance auditing aligns with SAP best practices and&amp;nbsp;change controlled&amp;nbsp;environments, allowing customers to move beyond reactive firefighting.&amp;nbsp;&lt;/SPAN&gt; &lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Reference links:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sre-agent/troubleshoot-azure-app-service?source=recommendations" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Tutorial: Troubleshoot an App Using Azure SRE Agent and Azure App Service Preview | Microsoft Learn&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sre-agent/billing?source=recommendations" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Billing for Azure SRE Agent Preview | Microsoft Learn&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/sre-agent/incident-management?source=recommendations&amp;amp;tabs=azmon-alerts" target="_blank"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Incident Management in Azure SRE Agent Preview | Microsoft Learn&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 26 Feb 2026 19:08:02 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/azure-sre-agent-architecture-and-creation-practical-benefits-for/ba-p/4497625</guid>
      <dc:creator>AnuradhaKarnam</dc:creator>
      <dc:date>2026-02-26T19:08:02Z</dc:date>
    </item>
    <item>
      <title>Accelerating AKS Upgrades with Fleet Manager: Finding the Right Balance</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/accelerating-aks-upgrades-with-fleet-manager-finding-the-right/ba-p/4497133</link>
      <description>&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Upgrading Azure Kubernetes Service (AKS) clusters at scale can be time-consuming, especially when managing multiple environments and clusters. Azure Fleet Manager provides powerful controls to orchestrate these upgrades efficiently. However, with this flexibility comes important design considerations and trade-offs that platform teams must understand.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Disclaimer:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This article draws on publicly available documentation as of February 2026 and is intended to provide insight into how Fleet Manager manages AKS upgrades, along with the key factors to consider when defining an effective upgrade strategy.&lt;/P&gt;
&lt;P&gt;The views expressed in this article are those of the author and do not necessarily reflect the official policy or position of Microsoft. The author is a Microsoft employee.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;At the heart of AKS Fleet Manager upgrades are three foundational concepts: &lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;update runs&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;update stages&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;update groups&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Update run&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: An update run&amp;nbsp;represents&amp;nbsp;an update being applied to a collection of AKS clusters, consisting of the update goal and sequence. The update goal describes the desired updates (for example, upgrading to Kubernetes version 1.28.3). The update sequence describes the exact order to apply the update to multiple member clusters, expressed using stages and groups. If unspecified, all the member clusters are updated one by one sequentially. An update run can be stopped and started.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="Arial" data-listid="3" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Arial&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Update stage&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: Update runs are divided into stages, which are applied sequentially. For example, a first update stage might update test environment member clusters, and a second update stage would then later update production environment member clusters. A wait time can be specified to delay between the application of&amp;nbsp;subsequent&amp;nbsp;update stages.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="•" data-font="Arial" data-listid="3" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Arial&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;•&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Update group&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: Each update stage&amp;nbsp;contains&amp;nbsp;one or more update groups, which are used to select the member clusters to be updated. Within an update stage, updates are applied to all the different update groups in parallel; within an update group, member clusters update sequentially. Each member cluster of the fleet can only be&amp;nbsp;part&amp;nbsp;of one update group.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Image Source – Azure Portal- &amp;gt; AKS Fleet Manager -&amp;gt; Upgrade Groups Explanation&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;The Approach&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;To reduce the overall time&amp;nbsp;required&amp;nbsp;to complete AKS upgrades across all clusters, there are two primary levers available:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Reduce the number of update stages&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, since stages are upgraded sequentially.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Increase the number of update groups within a stage&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, as update groups are upgraded in parallel. Each update stage can&amp;nbsp;contain&amp;nbsp;up to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;50 update groups&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, allowing as many as&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;50 AKS clusters to be upgraded concurrently&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;While both approaches can significantly speed up the upgrade process, each introduces its own risks that must be carefully considered.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Finding the right Balance&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Reducing Update Stages: Speed at the Cost of Safety&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Reducing the number of update stages typically means grouping AKS clusters from multiple environments—such as dev, test, and production—into one or two stages. Although this can shorten the overall upgrade timeline, it is&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;not recommended&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This approach severely limits the time available to&amp;nbsp;validate&amp;nbsp;application behavior in lower environments before rolling changes into higher-risk environments like production. Microsoft best practices explicitly recommend keeping the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;first update stage small&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, with a minimal number of update groups. This helps&amp;nbsp;contain&amp;nbsp;the blast radius if a regression is introduced.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;It’s&amp;nbsp;also important to note that&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;AKS does not currently support rollback after an upgrade&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. If a regression occurs, the only remediation&amp;nbsp;option&amp;nbsp;is to provision a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;new AKS cluster running the&amp;nbsp;previous&amp;nbsp;version&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, which can be both time-consuming and operationally expensive.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Increasing Update Groups: Parallelism with Capacity Risks&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;An alternative—and&amp;nbsp;generally safer—approach is to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;increase the number of update groups starting from the second update stage onward&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. This allows more clusters to be upgraded in parallel, reducing the overall upgrade duration while still preserving a controlled validation phase.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;However, parallel upgrades come with their own challenges. Running multiple AKS upgrades simultaneously increases the risk of failures due to&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;capacity constraints&amp;nbsp;in an Availability Zone&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, particularly when node pools rely on VM SKUs with limited availability. The risk grows even further when node pools are configured with a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;higher Max Surge value&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, as more nodes are created concurrently during upgrades.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;At the time of writing this blog, there is one important limitation to be aware of:&lt;/SPAN&gt;&amp;nbsp;&lt;BR /&gt;&lt;SPAN data-contrast="auto"&gt;If&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;even a single AKS cluster upgrade fails&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, the&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;entire Fleet upgrade run is halted&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;. There is an open feature request to introduce a configurable&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;safe-failure threshold&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;, which would allow the upgrade process to continue even if a limited number of cluster upgrades fail:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;👉&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://github.com/Azure/AKS/issues/5338" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;https://github.com/Azure/AKS/issues/5338&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Conclusion: Designing a Thoughtful Upgrade Strategy&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;While Azure Fleet Manager makes it possible to significantly reduce&amp;nbsp;the overall duration for&amp;nbsp;AKS upgrade, doing so safely requires thoughtful planning. The key is to strike the right balance between:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Reducing overall upgrade duration&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by increasing parallelism, and&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Minimize&amp;nbsp;risk and disruption&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;by preserving adequate validation stages and respecting capacity constraints.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Successful AKS upgrade strategies are rarely one-size-fits-all. They require close collaboration,&amp;nbsp;environmental&amp;nbsp;awareness, and a clear understanding of both platform limitations and operational risk. With the right design, Fleet Manager can be a powerful enabler for fast, safe, and scalable AKS upgrades.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For some&amp;nbsp;additional&amp;nbsp;resources, check out the following:&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559685&amp;quot;:0,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/kubernetes-fleet/overview" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;https://learn.microsoft.com/en-us/azure/kubernetes-fleet/overview&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559685&amp;quot;:0,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/kubernetes-fleet/concepts-update-orchestration" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;https://learn.microsoft.com/en-us/azure/kubernetes-fleet/concepts-update-orchestration&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:1,&amp;quot;335551620&amp;quot;:1,&amp;quot;335559685&amp;quot;:0,&amp;quot;335559737&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:259}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 26 Feb 2026 20:11:11 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/accelerating-aks-upgrades-with-fleet-manager-finding-the-right/ba-p/4497133</guid>
      <dc:creator>manandak</dc:creator>
      <dc:date>2026-02-26T20:11:11Z</dc:date>
    </item>
    <item>
      <title>Create an Organizational Assets Library (including Multi-Geo &amp; Information Barriers guidance)</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/create-an-organizational-assets-library-including-multi-geo/ba-p/4496135</link>
      <description>&lt;H2&gt;Overview&amp;nbsp;&lt;/H2&gt;
&lt;P&gt;This guide walks through a practical approach to setting up SharePoint Online (SPO) Organizational Assets Libraries (OAL). It includes optional guidance for more complex tenants—such as Multi-Geo and Information Barriers (IB) - because those scenarios are often under-documented.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What you’ll accomplish: &lt;/STRONG&gt;Create and register Organizational Assets Libraries so templates, fonts, and brand images are available in Office apps, with notes for Multi-Geo, Information Barriers, Brand Center, and Copilot integration where applicable.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Applies to: &lt;/STRONG&gt;Standard (single-geo) tenants, Multi-Geo tenants, tenants with Information Barriers, and environments using Brand Center and/or Copilot features for organizational assets.&lt;/P&gt;
&lt;H2&gt;Quick start (standard single-geo tenant)&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;Create a SharePoint site to host Organizational Assets Libraries (often the Brand Center site).&lt;/LI&gt;
&lt;LI&gt;Create three document libraries (typical): &lt;STRONG&gt;ImageAssets&lt;/STRONG&gt;, &lt;STRONG&gt;DocumentAssets&lt;/STRONG&gt; (templates), &lt;STRONG&gt;FontAssets&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Grant your intended audience &lt;STRONG&gt;Read&lt;/STRONG&gt; access (commonly &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; via the site’s Visitors group).&lt;/LI&gt;
&lt;LI&gt;Enable the &lt;STRONG&gt;SharePoint Online Public CDN&lt;/STRONG&gt; (tenant setting).&lt;/LI&gt;
&lt;LI&gt;Add a &lt;STRONG&gt;Public CDN origin&lt;/STRONG&gt; for each library path (one origin per library).&lt;/LI&gt;
&lt;LI&gt;Upload approved assets (images, templates, fonts) into their respective libraries.&lt;/LI&gt;
&lt;LI&gt;Register each library with &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt; (repeat per library).&lt;/LI&gt;
&lt;LI&gt;Validate registration and end-user experience, then allow up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; for Office apps to reflect changes.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;If you’re Multi-Geo or using Information Barriers:&lt;/STRONG&gt; follow the same flow, but repeat per geo and complete registration while the site is in &lt;STRONG&gt;Open&lt;/STRONG&gt; IB mode (details below).&lt;/P&gt;
&lt;H2&gt;Key constraints and gotchas&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Multi-Geo:&lt;/STRONG&gt; plan a repeatable &lt;STRONG&gt;per-geo pattern&lt;/STRONG&gt; (typically &lt;STRONG&gt;one Org Assets site + matching libraries per geo&lt;/STRONG&gt;) and keep naming consistent.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Information Barriers (IB):&lt;/STRONG&gt; &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt; cannot be run when the target site is segmented—create and register libraries first (site in &lt;STRONG&gt;Open&lt;/STRONG&gt; mode), then segment if needed.&lt;/LI&gt;
&lt;LI&gt;The “&lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt;” principal may be hidden by default, but it’s still commonly used for broad read access.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Brand Center:&lt;/STRONG&gt; many orgs host Org Assets Libraries in the Brand Center site; if Brand Center is created after libraries exist, it typically detects and uses them automatically.&lt;/LI&gt;
&lt;LI&gt;A &lt;STRONG&gt;public CDN&lt;/STRONG&gt; must be enabled to support Organizational Assets Libraries.&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;The “&lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt;” principal may be hidden by default, but it’s still commonly used for broad read access.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Brand Center:&lt;/STRONG&gt; many orgs host Org Assets Libraries in the Brand Center site; if Brand Center is created after libraries exist, it typically detects and uses them automatically.&lt;/LI&gt;
&lt;LI&gt;A &lt;STRONG&gt;public CDN&lt;/STRONG&gt; must be enabled to support Organizational Assets Libraries.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Implementation steps&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Prerequisites:&lt;/STRONG&gt; SharePoint Online Management Shell access (or equivalent), permission to manage tenant settings, and the ability to create sites and libraries in each geo.&lt;/P&gt;
&lt;OL&gt;
&lt;LI class="lia-align-left"&gt;Create a site to host your Organizational Assets Libraries (many orgs use a communication site). For ease of support, keep the site name, library names, and structure consistent over time.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-align-left lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; A Communication site is recommended, but a Team site can also work.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Example site URLs:&lt;/STRONG&gt; In a standard tenant you’ll have one site; in Multi-Geo you’ll typically use one per geo.&lt;/P&gt;
&lt;UL class="lia-indent-padding-left-30px"&gt;
&lt;LI class="lia-indent-padding-left-30px" style="list-style-type: none;"&gt;
&lt;UL class="lia-indent-padding-left-30px"&gt;
&lt;LI class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Primary geo:&lt;/STRONG&gt; https://contoso.sharepoint.com/sites/BrandCenter&lt;/LI&gt;
&lt;LI class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;EUR geo:&lt;/STRONG&gt; https://contosoEUR.sharepoint.com/sites/BrandCenter&lt;/LI&gt;
&lt;LI class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;APC geo:&lt;/STRONG&gt; https://contosoAPC.sharepoint.com/sites/BrandCenter&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;If your tenant uses Information Barriers, keep each site in &lt;STRONG&gt;Open&lt;/STRONG&gt; IB mode while creating the Org Assets Libraries. You can segment the site later (if required) after libraries are created.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Configure a public CDN (required)&lt;/H3&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;To use Brand Center and Organizational Assets Libraries, configure SharePoint Online to use a &lt;STRONG&gt;Public CDN&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Set-SPOTenantCdnEnabled -CdnType Public -Enable $true&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Example output:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Public CDN enabled locations:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;SITES/BRANDCENTER/FONTS&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;*/MASTERPAGE (configuration pending)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;*/STYLE LIBRARY (configuration pending)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;*/CLIENTSIDEASSETS (configuration pending)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Note: You will see the new CDN is in a &lt;STRONG&gt;&lt;EM&gt;pending&lt;/EM&gt;&lt;/STRONG&gt; state until complete. This will take some time.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;Wait for the CDN to finish provisioning. Re-run the status/list commands until “pending” entries clear.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Get-SPOTenantCdnEnabled -CdnType Public
Get-SPOTenantCdnOrigins -CdnType Public&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Add CDN origins for each library&lt;/H3&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;Add allowed CDN origins for each asset library path (typically one origin per library).&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Add-SPOTenantCdnOrigin -OriginUrl sites/BrandCenter/ImageAssets -CdnType Public
Add-SPOTenantCdnOrigin -OriginUrl sites/BrandCenter/TemplateAssets -CdnType Public
Add-SPOTenantCdnOrigin -OriginUrl sites/BrandCenter/FontAssets -CdnType Public&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Set permissions (required for broad consumption)&lt;/H3&gt;
&lt;OL start="6"&gt;
&lt;LI&gt;To ensure most users can consume the assets, grant &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; (often abbreviated as EEEU) &lt;STRONG&gt;Read&lt;/STRONG&gt; access (commonly via the site’s Visitors group).&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Example: add &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; to the Visitors group of the Organizational Assets site.&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Connect-SPOService -Url 'https://contoso-admin.sharepoint.com'
$tenant = "9cfc42cb-51da-4055-87e9-b20a170b6ba3"
$site = Get-SPOSite -Identity "https://contoso.sharepoint.com/sites/BrandCenter"
$group = Get-SPOSiteGroup $site -Group "BrandCenter Visitors"
Add-SPOUser -LoginName ("c:0-.f|rolemanager|spo-grid-all-users/" + $tenant) -Site $site -Group $group.Title&lt;/LI-CODE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; Organizational Assets Libraries respect SharePoint security trimming. If you need a narrower audience, grant &lt;STRONG&gt;Read&lt;/STRONG&gt; to the appropriate groups instead of tenant-wide access. In many environments, &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; is required during &lt;EM&gt;registration&lt;/EM&gt; (&lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt;) so Office can enumerate the library—test and confirm in your tenant before removing broad access.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Create libraries and upload assets&lt;/H3&gt;
&lt;OL start="7"&gt;
&lt;LI&gt;Create a document library for each asset type you plan to publish (for example: images, Office templates, fonts).&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;For example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="8"&gt;
&lt;LI&gt;Upload your assets into the appropriate libraries.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="9"&gt;
&lt;LI&gt;Register each library using &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt;. For this to work, &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; must already have access to the site (for example, via the Visitors group).&lt;/LI&gt;
&lt;/OL&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Office Template Library Example:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Add-SPOOrgAssetsLibrary -LibraryUrl 'https://contoso.sharepoint.com/sites/BrandCenter/DocumentAssets' -OrgAssetType OfficeTemplateLibrary&lt;/LI-CODE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Image Document Library Example:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Add-SPOOrgAssetsLibrary -LibraryUrl 'https://contoso.sharepoint.com/sites/BrandCenter/ImageAssets' -OrgAssetType ImageDocumentLibrary&lt;/LI-CODE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Font Document Library Example:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Add-SPOOrgAssetsLibrary -LibraryUrl 'https://contoso.sharepoint.com/sites/BrandCenter/FontAssets' -OrgAssetType OfficeFontLibrary -CdnType Public&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="10"&gt;
&lt;LI&gt;&lt;STRONG&gt;Optional:&lt;/STRONG&gt; Enable Copilot support for an image library (only applicable to &lt;STRONG&gt;ImageDocumentLibrary&lt;/STRONG&gt;).&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang=""&gt;Set-SPOOrgAssetsLibrary -LibraryUrl 'https://contoso.sharepoint.com/sites/BrandCenter/ImageAssets' -OrgAssetType ImageDocumentLibrary -CopilotSearchable $true&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Multi-Geo mini runbook (recommended pattern)&lt;/H3&gt;
&lt;P&gt;Use this as a simple tracking sheet so each geo ends up with a complete, consistent setup.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Geo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Site URL&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Libraries&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;CDN origins added&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Libraries registered&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Primary&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://&amp;lt;tenant&amp;gt;.sharepoint.com/sites/&amp;lt;BrandCenterOrAssetsSite&amp;gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ImageAssets / DocumentAssets / FontAssets&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;EUR&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://&amp;lt;tenant&amp;gt;EUR.sharepoint.com/sites/&amp;lt;BrandCenterOrAssetsSite&amp;gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ImageAssets / DocumentAssets / FontAssets&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;APC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://&amp;lt;tenant&amp;gt;APC.sharepoint.com/sites/&amp;lt;BrandCenterOrAssetsSite&amp;gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ImageAssets / DocumentAssets / FontAssets&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Yes/No&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;col style="width: 20.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Naming standard (strongly recommended):&lt;/STRONG&gt; keep the same site path and the same library names in every geo (for example, always &lt;STRONG&gt;ImageAssets&lt;/STRONG&gt;, &lt;STRONG&gt;DocumentAssets&lt;/STRONG&gt;, &lt;STRONG&gt;FontAssets&lt;/STRONG&gt;). This minimizes per-geo scripting differences and reduces support effort.&lt;/P&gt;
&lt;H3&gt;Wrap-up&lt;/H3&gt;
&lt;P&gt;At this point, each geo should have its own site, libraries, CDN origins, and registered Organizational Assets Libraries. From here, focus on governance (who can publish/approve assets), naming standards, and ongoing lifecycle management (retire old templates/fonts and keep branding current).&lt;/P&gt;
&lt;H2&gt;Validate configuration&lt;/H2&gt;
&lt;H3&gt;Admin checks (PowerShell)&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Confirm the Public CDN is enabled.&lt;/LI&gt;
&lt;LI&gt;Confirm CDN origins include one entry per assets library path.&lt;/LI&gt;
&lt;LI&gt;List registered Org Assets Libraries and verify each URL + type is present.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang=""&gt;Get-SPOTenantCdnEnabled -CdnType Public
Get-SPOTenantCdnOrigins -CdnType Public
Get-SPOOrgAssetsLibrary&lt;/LI-CODE&gt;
&lt;H3&gt;End-user checks (Office apps)&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;In &lt;STRONG&gt;PowerPoint&lt;/STRONG&gt;/&lt;STRONG&gt;Word&lt;/STRONG&gt;, confirm organizational templates appear in the template picker (if you registered an OfficeTemplateLibrary).&lt;/LI&gt;
&lt;LI&gt;In Office font lists, confirm your org fonts appear (if you registered an OfficeFontLibrary).&lt;/LI&gt;
&lt;LI&gt;For image libraries, confirm approved brand images appear in supported pickers; if you enabled &lt;STRONG&gt;-CopilotSearchable&lt;/STRONG&gt;, confirm images are discoverable as expected.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Timing:&lt;/STRONG&gt; New registrations and updates can take up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; to appear in Office apps. If you updated content, run &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; for each changed library, then wait for propagation.&lt;/P&gt;
&lt;H3&gt;Updating content in existing Org Assets Libraries&lt;/H3&gt;
&lt;P&gt;If you already have Organizational Assets Libraries registered and you need to publish updated templates, fonts, or images, use the process below. The high-level flow is: &lt;STRONG&gt;update content&lt;/STRONG&gt; → &lt;STRONG&gt;run Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; (per library) → &lt;STRONG&gt;wait for propagation&lt;/STRONG&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Replace or update content in each library.&lt;/STRONG&gt; Upload the new versions of templates/fonts/images into the appropriate library (and remove/retire older versions if needed).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If Multi-Geo applies, repeat per geo.&lt;/STRONG&gt; Update the matching libraries in each geo’s site so users in each geo get the same (or intentionally regional) set of assets.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Run Set-SPOOrgAssetsLibrary for each updated library.&lt;/STRONG&gt; Execute the cmdlet against the library URL to refresh the configuration after content changes (run it once per library you updated).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Wait for Office app propagation.&lt;/STRONG&gt; Allow up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; for updates to begin showing in Office apps.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Set-SPOOrgAssetsLibrary -LibraryUrl 'https://contoso.sharepoint.com/sites/BrandCenter/DocumentAssets' -OrgAssetType OfficeTemplateLibrary&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Notes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;If your site is segmented by &lt;STRONG&gt;Information Barriers&lt;/STRONG&gt;, confirm the cmdlet behavior in your environment before making changes, and prefer performing registration/updates while the site is in &lt;STRONG&gt;Open&lt;/STRONG&gt; mode when possible.&lt;/LI&gt;
&lt;LI&gt;For &lt;STRONG&gt;image libraries&lt;/STRONG&gt;, if you are using Copilot integration settings (for example &lt;STRONG&gt;-CopilotSearchable&lt;/STRONG&gt;), keep the setting consistent when you run &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Make sure the intended audience still has &lt;STRONG&gt;Read&lt;/STRONG&gt; access to the site/library; otherwise users may not see updates due to security trimming.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Please note:&lt;/STRONG&gt; After registering (or updating) your assets libraries, it can take up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; before changes become available in Office apps.&lt;/P&gt;
&lt;P&gt;Once fully enabled, Office apps will surface your templates and fonts. Below is an example.&lt;/P&gt;
&lt;H3&gt;Example of interacting with Org Assets from M365 Apps&lt;/H3&gt;
&lt;P&gt;Org Fonts from PowerPoint:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;From SharePoint:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;From Office Apps:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;&amp;nbsp;&lt;/H1&gt;
&lt;H1&gt;Troubleshooting tips&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;If &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt; fails, confirm the site is not segmented by Information Barriers (Open mode during setup).&lt;/LI&gt;
&lt;LI&gt;If assets don’t appear in Office apps, wait for propagation (up to 24 hours) and re-check that the library was registered successfully.&lt;/LI&gt;
&lt;LI&gt;If CDN commands show “pending”, allow time for provisioning and re-run the status command.&lt;/LI&gt;
&lt;LI&gt;If users can’t see assets, verify the site/library permissions include &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt; (or the intended audience group).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Guidance: Using the SharePoint Online Public CDN&lt;/H2&gt;
&lt;P&gt;Enabling the &lt;STRONG&gt;SharePoint Online Public CDN&lt;/STRONG&gt; is a &lt;STRONG&gt;required and supported configuration&lt;/STRONG&gt; for Organizational Assets Libraries, Brand Center, and related Office experiences. While the word &lt;EM&gt;“public”&lt;/EM&gt; can sound concerning, it’s important to understand &lt;STRONG&gt;what is (and is not) exposed&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;We take great care to protect the data that runs your business. Data stored in the &lt;STRONG&gt;Microsoft 365 CDN&lt;/STRONG&gt; is encrypted both in transit and at rest, and access to data in the &lt;STRONG&gt;Microsoft 365 SharePoint CDN is secured by Microsoft 365 user permissions and token authorization&lt;/STRONG&gt;. Requests for data in the Microsoft 365 SharePoint CDN must be referred (redirected) from your Microsoft 365 tenant or an authorization token won't be generated. See: &lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/content-delivery-networks?view=o365-worldwide#is-my-data-safe" target="_blank" rel="noopener"&gt;Content delivery networks - Microsoft 365 Enterprise | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;H3&gt;What “Public CDN” actually means&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Only explicitly approved library paths are cached&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;The CDN does &lt;STRONG&gt;not&lt;/STRONG&gt; expose your entire tenant.&lt;/LI&gt;
&lt;LI&gt;Administrators must &lt;STRONG&gt;explicitly register CDN origins&lt;/STRONG&gt; (specific library paths).&lt;/LI&gt;
&lt;LI&gt;If a library is not registered as a CDN origin, it is &lt;STRONG&gt;not served via the CDN&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H3&gt;No new content types are exposed&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;The CDN is intended for &lt;STRONG&gt;static, non-sensitive assets&lt;/STRONG&gt; such as:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Brand images&lt;/LI&gt;
&lt;LI&gt;Office templates&lt;/LI&gt;
&lt;LI&gt;Fonts&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;It is &lt;STRONG&gt;not designed&lt;/STRONG&gt; for documents containing confidential or regulated data.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Why Microsoft requires a Public CDN for Org Assets?&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Performance and reliability&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Office clients worldwide retrieve assets faster using geographically distributed edge caching.&lt;/LI&gt;
&lt;LI&gt;This avoids repeated downloads from SharePoint origin sites.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Consistent Office app experiences&lt;/STRONG&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;PowerPoint, Word, Excel, and Copilot rely on CDN-backed delivery to surface:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Templates&lt;/LI&gt;
&lt;LI&gt;Fonts&lt;/LI&gt;
&lt;LI&gt;Brand images&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;Without a public CDN, these features may not function correctly or at all.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H2&gt;Best practices&lt;/H2&gt;
&lt;P&gt;Use the practices below to keep Organizational Assets Libraries reliable, secure, and easy for end users to adopt. Where relevant, notes call out additional considerations for Multi-Geo, Information Barriers, Brand Center, and Copilot.&lt;/P&gt;
&lt;H3&gt;Governance and ownership checklist&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Owners/publishers:&lt;/STRONG&gt; named group who can add/change assets (limited membership).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Approvals:&lt;/STRONG&gt; defined review/approval step before publishing new templates/fonts/images.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Versioning/retention:&lt;/STRONG&gt; how you retire old assets and prevent outdated branding from appearing in pickers.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Rollback plan:&lt;/STRONG&gt; how to revert a bad template/font/image quickly.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Change communication:&lt;/STRONG&gt; how you notify users about new/updated assets and expected timing (up to 24 hours).&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI&gt;Assign clear owners (typically Brand/Comms) and a small admin group (typically IT) for each geo’s library and site.&lt;/LI&gt;
&lt;LI&gt;Decide what is “approved” vs “draft” content, and enforce it with a simple publishing process (for example, a review checklist or an approvals flow).&lt;/LI&gt;
&lt;LI&gt;Version and retire assets deliberately: keep one “current” template set and archive old assets to prevent users from picking outdated branding.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Information architecture and naming&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Keep library names and structures consistent across geos (same library names, same folder conventions) to simplify support and documentation.&lt;/LI&gt;
&lt;LI&gt;Use descriptive filenames users can recognize in pickers (for example, “Contoso_Proposal_Template_v3”).&lt;/LI&gt;
&lt;LI&gt;Prefer a small number of clearly defined libraries by asset type (images, templates, fonts) rather than many small libraries.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Permissions and access&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Ensure your intended audience has at least &lt;STRONG&gt;Read&lt;/STRONG&gt; access to the site and libraries; Organizational Assets still follow SharePoint security trimming.&lt;/LI&gt;
&lt;LI&gt;If you use broad access (for example, &lt;STRONG&gt;Everyone except external users&lt;/STRONG&gt;), document it and pair it with tight contributor permissions so only approved publishers can change assets.&lt;/LI&gt;
&lt;LI&gt;Avoid breaking inheritance in ways that make troubleshooting difficult—keep permissions simple and predictable whenever possible.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;CDN configuration&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Plan CDN changes ahead of time: enabling and provisioning can take time, and changes may not be immediate.&lt;/LI&gt;
&lt;LI&gt;Register only the origins you need (one per assets library path) and keep them consistent across environments.&lt;/LI&gt;
&lt;LI&gt;After changes, allow for propagation time before validating in Office apps.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Multi-Geo and Brand Center&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Use a repeatable pattern: &lt;STRONG&gt;one site + matching libraries per geo&lt;/STRONG&gt;, with the same structure and operational runbook.&lt;/LI&gt;
&lt;LI&gt;Be aware Brand Center is created in the &lt;STRONG&gt;primary geo&lt;/STRONG&gt;; confirm how your org wants to manage global vs regional assets.&lt;/LI&gt;
&lt;LI&gt;Document which assets are global (shared everywhere) vs regional (geo-specific) to avoid confusion for publishers and users.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Information Barriers (IB) sequencing&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Create and register Org Assets Libraries &lt;STRONG&gt;before&lt;/STRONG&gt; segmenting the site when IB is enabled (create while the site is in &lt;STRONG&gt;Open&lt;/STRONG&gt; mode, then segment later if required).&lt;/LI&gt;
&lt;LI&gt;After segmentation, re-validate that the right audience can still read the libraries (and that publishers can still manage content).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Copilot readiness (image libraries)&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Use consistent, high-quality metadata for images (titles, descriptions, and tags). Copilot search quality depends heavily on this.&lt;/LI&gt;
&lt;LI&gt;If enabling image tagging integration, standardize on a tagging vocabulary (for example, brand terms, campaigns, departments, regions) so results are predictable.&lt;/LI&gt;
&lt;LI&gt;Only enable Copilot searchable settings on libraries where content is approved and intended for broad reuse.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Q&amp;amp;A&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;Q: What is an Organizational Assets Library (OAL)?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; It’s a SharePoint document library (or set of libraries) that you register so Office apps can surface approved templates, fonts, and images to users directly within the app experience.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Do I need SharePoint Brand Center to use OAL?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; No. You can use Organizational Assets Libraries without Brand Center. Brand Center can make asset management more accessible,&amp;nbsp; for example, allowing SharePoint sites to use organizational branding, but OAL can be configured on its own.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Why is a “Public CDN” required, and is it safe?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Office experiences rely on CDN-backed delivery for performance and reliability. “Public CDN” does not mean your whole tenant is exposed—only the specific library paths you register as CDN origins are cached. Access is still governed by Microsoft 365 authentication, token authorization, and SharePoint permissions.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Can I use this guide in a standard (single-geo) tenant?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Yes. In a standard tenant you usually create one site and one set of libraries. The Multi-Geo guidance is only needed if your tenant is Multi-Geo (in which case you’ll typically repeat the pattern per geo).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: How do Information Barriers (IB) affect setup?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; If a site is segmented, &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt; cannot register the library. Create the site and register the libraries while the site is in &lt;STRONG&gt;Open&lt;/STRONG&gt; mode, then segment afterward if required.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Why does “Everyone except external users” (EEEU) matter?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; In many environments, EEEU is required during library &lt;EM&gt;registration&lt;/EM&gt; so Office can enumerate the library. However, OAL still respects SharePoint security trimming. If broad internal availability is the goal, a common pattern is to grant EEEU &lt;STRONG&gt;Read&lt;/STRONG&gt; (often via the Visitors group) so Office apps can surface the assets to most internal users. If you need a narrower audience, use a group instead.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: How long until assets show up (or update) in Office apps?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; It can take up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; for new registrations &lt;EM&gt;or updates&lt;/EM&gt; to propagate. If you replaced content in an existing library, run &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; for each updated library, then allow time for Office apps to refresh.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: How do I update content in an existing Org Assets Library?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Replace the files in the library (and repeat across geos if applicable), then run &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; against each library you updated. After that, allow up to &lt;STRONG&gt;24 hours&lt;/STRONG&gt; for the updated assets to start showing in Office apps.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Do I need to run Set-SPOOrgAssetsLibrary every time I replace files?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; If you want Office apps to reliably pick up changes, run &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; after you update content (especially when publishing new/updated templates, fonts, or images). Treat it as the “refresh” step, then wait for propagation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: When should I enable Copilot support (CopilotSearchable) for an image library?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Enable it only for libraries that contain approved, broadly reusable images and have strong metadata (title/description/tags). This helps ensure search results are on-brand and reduces the chance of surfacing unreviewed content.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Can I undo this later?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Yes. You can unregister an Organizational Assets Library using SharePoint Online PowerShell (for example, &lt;STRONG&gt;Remove-SPOOrgAssetsLibrary&lt;/STRONG&gt;) and remove CDN origins if you no longer need them. Plan governance so you can retire assets cleanly without disrupting users.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Q: Users can’t see the assets (or updates)—what should I check first?&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt; Start with (1) permissions to the site/library (security trimming), (2) successful registration via &lt;STRONG&gt;Add-SPOOrgAssetsLibrary&lt;/STRONG&gt;, (3) if you’re expecting an update, confirm you ran &lt;STRONG&gt;Set-SPOOrgAssetsLibrary&lt;/STRONG&gt; for that library, (4) CDN provisioning status and configured origins, and (5) propagation time (up to 24 hours).&lt;/P&gt;
&lt;H2&gt;Additional Reading&lt;/H2&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/organization-assets-library" target="_blank" rel="noopener"&gt;Create an organization assets library - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/connect-organizational-asset-libraries-to-copilot" target="_blank" rel="noopener"&gt;Connect organizational asset libraries to Copilot for an on-brand experience - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/connect-organizational-asset-libraries-to-copilot" target="_blank" rel="noopener"&gt;Connect organizational asset libraries to PowerPoint for an on-brand experience - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/copilot/microsoft-365/microsoft-365-copilot-search-image-tagging-integration" target="_blank" rel="noopener"&gt;Set up and connect organizational asset library (OAL) with image tagging to Copilot search | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/powershell/module/microsoft.online.sharepoint.powershell/add-spoorgassetslibrary?view=sharepoint-ps" target="_blank" rel="noopener"&gt;Add-SPOOrgAssetsLibrary (Microsoft.Online.SharePoint.PowerShell) | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/brand-center-overview" target="_blank" rel="noopener"&gt;SharePoint Brand Center - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/sharepoint/enable-enterprise-brand-images-powerpoint-copilot" target="_blank" rel="noopener"&gt;How to Enable Enterprise Brand Images with PowerPoint Copilot - SharePoint in Microsoft 365 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/office-365-cdn-quickstart?view=o365-worldwide" target="_blank" rel="noopener"&gt;Office 365 Content Delivery Network (CDN) Quickstart - Microsoft 365 Enterprise | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/use-microsoft-365-cdn-with-spo?view=o365-worldwide" target="_blank" rel="noopener"&gt;Use Office 365 Content Delivery Network (CDN) with SharePoint Online - Microsoft 365 Enterprise | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/content-delivery-networks?view=o365-worldwide#is-my-data-safe" target="_blank" rel="noopener"&gt;Content delivery networks - Microsoft 365 Enterprise | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/microsoft-365/enterprise/multi-geo-capabilities-in-onedrive-and-sharepoint-online-in-microsoft-365?view=o365-worldwide" target="_blank" rel="noopener"&gt;Multi-Geo Capabilities in OneDrive and SharePoint - Microsoft 365 Enterprise | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/purview/information-barriers-sharepoint" target="_blank" rel="noopener"&gt;Use Information Barriers with SharePoint | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Feb 2026 14:53:27 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/create-an-organizational-assets-library-including-multi-geo/ba-p/4496135</guid>
      <dc:creator>mikeleemsft</dc:creator>
      <dc:date>2026-02-23T14:53:27Z</dc:date>
    </item>
    <item>
      <title>Large Mailbox Migration to Exchange Online</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/large-mailbox-migration-to-exchange-online/ba-p/4495977</link>
      <description>&lt;P&gt;Migrating large mailboxes is challenging for enterprise Exchange teams, especially when mailboxes are over 100 GB or contain extensive recoverable items. Using Exchange Messaging Records Management (MRM) to reduce mailbox size before migration can speed up moves to Exchange Online.&lt;/P&gt;
&lt;H2&gt;Why Use MRM Before a Large Mailbox Migration?&lt;/H2&gt;
&lt;P&gt;Many organizations place mailboxes on litigation hold or in-place hold, causing the recoverable items in these mailboxes to grow significantly, often exceeding the 100 GB quota in Exchange Online. Quota adjustments can be requested, allowing up to about 240 GB for the combined size of the primary mailbox and recoverable items. Still, it's common for recoverable items alone to surpass this limit.&lt;/P&gt;
&lt;P&gt;MRM lets you move content from the primary mailbox to an archive mailbox, reducing the primary's overall size. The archive mailbox may be hosted on-premises or in Exchange Online. Setting up the archive in Exchange Online is usually simpler, reducing the need for additional mailbox migrations. Occasionally, this process can result in the archive mailbox's recoverable items exceeding the 240 GB cap. Therefore, creating the archive in Exchange Online remains the most efficient solution.&lt;/P&gt;
&lt;H2&gt;Prerequisites&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Archive mailbox created in Exchange Online&lt;/LI&gt;
&lt;LI&gt;The archive mailbox must have the correct routing domain configured as the ArchiveDomain value&lt;/LI&gt;
&lt;LI&gt;OAuth enabled in Exchange&lt;/LI&gt;
&lt;LI&gt;AutoExpandingArchiveEnabled must be enabled for either mailbox or entire organization&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;MRM Configuration&lt;/H2&gt;
&lt;P&gt;The required retention policy tag is dependent upon where the data is located within the mailbox. Our primary focus is on recoverable items for mailboxes on holds; therefore, we need to create a tag to move recoverable items older than &lt;EM&gt;x&lt;/EM&gt; number of days to archive.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;New-RetentionPolicyTag -Name RecoverableItems_31_MoveToArchive -MessageClass * -RetentionAction MoveToArchive -AgeLimitForRetention 31.0:0:0 -Type RecoverableItems -RetentionEnabled:$True -Comment "Archive all items from the Recoverable Items over 31 days"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This tag must be added to a retention policy, and the retention policy must be assigned to the user being migrated. Once this is done, you can start the managed folder assistant (MFA) to move items into the remote archive.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Start-ManagedFolderAssistant user@contoso.com&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;A new retention policy may need to be created specifically for these larger mailboxes.&lt;/P&gt;
&lt;H2&gt;Speed up expanded archives&lt;/H2&gt;
&lt;P&gt;One issue with migrating large mailboxes is the delay caused by auto-expanding archives. Thankfully, this delay depends on Exchange processes, which we can observe and activate manually when needed.&lt;/P&gt;
&lt;P&gt;The first thing to do is keep an eye on your archive mailbox size. Once it hits 90GB, auto-expansion should kick in. To track this, check the mailbox statistics for the archive mailbox.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Get-MailboxStatistics&amp;nbsp; &amp;lt;guid of MainArchive shard of MailUser&amp;gt; | fl *itemCount,*ItemSize&lt;/EM&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-10" border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;AssociatedItemCount&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;6&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;DeletedItemCount&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;290041&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;ItemCount&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;2&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;TotalDeletedItemSize&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;100 GB (107,374,646,793 bytes)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;TotalItemSize&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-10"&gt;
&lt;P&gt;557.2 MB (584,222,341 bytes)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The results indicate that the TotalDeletedSize has reached 100GB, which is the established quota limit. At this threshold, the auxiliary archive should trigger the next time the managed folder assistant (MFA) runs against the mailbox. Manually start the MFA to expedite this process:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Start-ManagedFolderAssistant &amp;lt;guid of MainArchive shard of MailUser&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Confirm MFA has completed by checking the ELCLastSuccessTimestamp:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;(Export-MailboxDiagnosticLogs -Identity &amp;lt;guid of MainArchive shard of MailUser&amp;gt; -ExtendedProperties).mailboxlog | Select-Xml -XPath "//MailboxTable/*" | select -ExpandProperty Node | ? {$_.name -like "ELC*"}&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once the auxiliary archive becomes available, Exchange will initiate the process of copying data into the new mailbox. The MFA must be triggered again to start copying data. Then we can proceed to verify whether any folders have been ghosted using the following steps:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;$folders = Get-MailboxFolderStatistics -FolderScope recoverableitems&amp;nbsp; &amp;lt;guid of MainArchive shard of MailUser&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;$folders | ?{-Not $_.ContentFolder -and $_.VisibleItemsInFolder} | Sort-Object LastMovedTimeStamp | ft FolderSize,LastMoved*,Content*&lt;/EM&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;FolderSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;LastMovedTimeStamp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ContentFolder&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ContentMailboxGuid&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;17.79 GB&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;11/28/2024 10:25:07 PM&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;False&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;GUID of Aux archive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;12.95 GB&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;11/28/2024 10:25:07 PM&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;False&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;GUID of Aux archive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;1.371 MB&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;11/28/2024 10:25:07 PM&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;False&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;GUID of Aux archive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;11.14 GB&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;11/28/2024 10:25:07 PM&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;False&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;GUID of Aux archive&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;These folders have been copied to an auxiliary archive but are not yet expired on the MainArchive, leaving about 43GB of storage pending release. MFA will free this space after its next run, once five days have passed since "11/28/2024 10:25:07 PM". &amp;nbsp;&lt;/P&gt;
&lt;P&gt;Our monitoring speeds up the process since MFA may take several days to finish. After five days from the LastMovedTimeStamp, we manually start the MFA using the following command:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Start-ManagedFolderAssistant &amp;lt;guid of MainArchive shard of MailUser&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;You will notice these folders shrinking and the primary archive gaining free space.&lt;/P&gt;
&lt;P&gt;If there are no ghosted folders and the mailbox is full or exceeds 90GB of recoverable items, start MFA to trigger expansion. It may help to run MFA more than once and confirm that it completed successfully.&lt;/P&gt;
&lt;H2&gt;Conclusion&lt;/H2&gt;
&lt;P&gt;Using Messaging Records Management (MRM) ahead of a large mailbox migration helps reduce primary mailbox and recoverable items pressure by moving older content into the archive, improving the likelihood of staying within Exchange Online limits and accelerating move performance. With the right prerequisites in place, you can actively monitor archive growth and expansion. When the archive approaches capacity or when ghosted folders are older than five days, targeted monitoring and triggering MFA against a mailbox can accelerate expansion and free space sooner—keeping migrations on track.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Use MRM to move Recoverable Items older than your chosen threshold into the archive before starting migrations.&lt;/LI&gt;
&lt;LI&gt;Track archive statistics (especially TotalDeletedItemSize/TotalDeletedSize) to anticipate auto-expansion and identify bottlenecks.&lt;/LI&gt;
&lt;LI&gt;Monitor ghosted folders and run MFA after the relevant LastMovedTimeStamp interval to accelerate cleanup.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 19 Feb 2026 18:10:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/large-mailbox-migration-to-exchange-online/ba-p/4495977</guid>
      <dc:creator>thejimmartin</dc:creator>
      <dc:date>2026-02-19T18:10:13Z</dc:date>
    </item>
    <item>
      <title>Automating Azure OpenAI/Foundry Model Lifecycle Management</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/automating-azure-openai-foundry-model-lifecycle-management/ba-p/4491982</link>
      <description>&lt;BLOCKQUOTE&gt;
&lt;PRE&gt;&lt;SPAN data-contrast="auto"&gt;Disclaimer&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;:&amp;nbsp;The views expressed in this article are those of the author and do not necessarily reflect the official policy or position of Microsoft Corporation.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Last week, I got&amp;nbsp;an&amp;nbsp;Teams call from a customer:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;"Our production app just went down.&amp;nbsp;Deployment&amp;nbsp;is throwing authentication&amp;nbsp;errors&amp;nbsp;and we can't figure out why."&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Working as a Cloud Solution Architect at Microsoft,&amp;nbsp;I've&amp;nbsp;debugged my fair share of Azure OpenAI issues. This one&amp;nbsp;didn't&amp;nbsp;take long to figure out—they were running a model version that Microsoft had retired three months ago. The retirement announcement?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Buried somewhere in their inbox,&amp;nbsp;probably marked&amp;nbsp;as read but never actually read. The result? Several hours of downtime and some&amp;nbsp;very stressed&amp;nbsp;engineers.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here's&amp;nbsp;the thing: this keeps happening. As teams spin up more Azure OpenAI deployments, keeping track of everything manually just&amp;nbsp;doesn't&amp;nbsp;work anymore.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;The Challenge: Managing Azure OpenAI Deployments at Scale&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;You start with one Azure OpenAI/Foundry deployments,&amp;nbsp;maybe two&amp;nbsp;model deployments. Simple enough. Six months later?&amp;nbsp;You've&amp;nbsp;got 30+ deployments scattered across resource groups, different teams testing different model versions, and&amp;nbsp;you're&amp;nbsp;pretty sure&amp;nbsp;you're&amp;nbsp;paying for stuff&amp;nbsp;nobody's&amp;nbsp;using anymore.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here are the main headaches I see teams dealing with:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Model Retirements Sneak Up&amp;nbsp;On&amp;nbsp;You&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- Microsoft updates and retires models regularly (GPT-4, GPT-3.5, you name it). If&amp;nbsp;you're&amp;nbsp;not actively tracking this,&amp;nbsp;you'll&amp;nbsp;find out the hard way when production breaks.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Ghost Deployments Everywhere&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;- Remember that&amp;nbsp;Provisioned&amp;nbsp;Throughput Unit someone created for "just testing"?&amp;nbsp;It's&amp;nbsp;still running. Still costing $5,000/month. Still getting zero API calls. This stuff adds up fast.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Compliance is a Mess&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- When your auditor&amp;nbsp;asks&amp;nbsp;"who's been accessing these AI models and from where," digging through Azure Portal logs manually is nobody's idea of&amp;nbsp;a good time.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;No One Knows What's Actually Deployed&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- In bigger orgs, teams deploy models independently. Nobody has a complete picture of&amp;nbsp;what's&amp;nbsp;out there, where&amp;nbsp;it's&amp;nbsp;running, or what&amp;nbsp;it's&amp;nbsp;costing.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Tracking this manually&amp;nbsp;doesn't&amp;nbsp;scale. Spreadsheets are&amp;nbsp;outdated&amp;nbsp;the second you save them. You need something automated.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;The Solution:&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;An Open-Source Audit Tool&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;I built a tool that handles all of this automatically. It scans your Azure subscriptions, finds every OpenAI and AI Foundry deployment, pulls actual usage data from Azure Monitor, and flags models that are about to retire.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Here's&amp;nbsp;what it does:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Finds&amp;nbsp;all your Azure OpenAI and AI Services accounts automatically&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Grabs real usage metrics—API calls, token counts, the works&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Compares what&amp;nbsp;you've&amp;nbsp;deployed against Microsoft's official retirement schedules&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Spits out CSV reports with everything you need: inventories, usage stats, retirement warnings&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Can even configure diagnostic settings and pull detailed logs from Log Analytics if you need them&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Best part? Zero dependencies. Just Python standard library. It runs Azure CLI commands under the hood (which you&amp;nbsp;probably already&amp;nbsp;have installed anyway).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Grab it here: &lt;A class="lia-external-url" href="https://github.com/anishek-microsoft/foundry_model_audit" target="_blank" rel="noopener"&gt;https://github.com/anishek-microsoft/foundry_model_audit&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How This Can Help You&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Catch Cost Leaks Before They Drain Your Budget&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Ever wonder if&amp;nbsp;you've&amp;nbsp;got deployments sitting idle? The audit shows you exactly which ones have zero usage. Those Provisioned Throughput Units (PTUs) are expensive—if&amp;nbsp;one's&amp;nbsp;been sitting there doing nothing for weeks,&amp;nbsp;you'll&amp;nbsp;know&amp;nbsp;immediately.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Plan Model Migrations Without the Panic&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Instead of scrambling when a model gets retired,&amp;nbsp;you'll&amp;nbsp;see it coming months in advance. The tool flags everything&amp;nbsp;that's&amp;nbsp;approaching retirement and even shows Microsoft's suggested replacements. You get time to test, update configs, and migrate smoothly. No emergency meetings, no rushed deployments.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Make Compliance Audits Actually Manageable&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Need detailed logs showing who accessed your AI models and when? Enable diagnostic&amp;nbsp;settings&amp;nbsp;and the tool pulls all that data from Log Analytics into a clean CSV. When audit season rolls around,&amp;nbsp;you've&amp;nbsp;got comprehensive access reports ready to go instead of manually piecing together Portal logs.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Get Visibility Across Your Whole Organization&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;If your Azure environment is anything like most I work with, you've got multiple teams deploying independently.&amp;nbsp;This gives you one complete picture: every account, every deployment, every region.&amp;nbsp;You'll finally know what you're actually running and what it's costing.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;How It Actually Works&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;The tool&amp;nbsp;ties&amp;nbsp;into Azure Resource Manager, Azure Monitor, and Log Analytics.&amp;nbsp;Here's&amp;nbsp;the flow:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Uses your existing `&lt;STRONG&gt;az&amp;nbsp;login&lt;/STRONG&gt;` session (no extra auth needed)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Scans Azure Resource Manager for OpenAI and AI Services accounts&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;Calls Azure REST APIs to list all deployments (handles different API versions automatically)&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;Pulls metrics from Azure Monitor—API calls, token counts, last 7 days of data&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;Checks deployments against a JSON file of Microsoft's official retirement dates&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="" data-listid="3" data-list-defn-props="{&amp;quot;134224900&amp;quot;:true,&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;Optionally queries Log Analytics with KQL for detailed usage logs&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;I keep the retirement database (`&lt;STRONG&gt;model_retirements.json&lt;/STRONG&gt;`) updated with Microsoft's docs.&amp;nbsp;There's&amp;nbsp;a helper script if you want to update it yourself from CSV exports.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Everything&amp;nbsp;outputs to&amp;nbsp;timestamped CSV files. Easy to open in Excel, diff between runs, or feed into your BI tools.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Getting Started&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Three commands and&amp;nbsp;you're&amp;nbsp;running:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;# Grab the code 
git clone https://github.com/anishek-microsoft/foundry_model_audit.git 
cd foundry_model_audit 

# Log into Azure if you haven't already 
az login 

# Run it 
python foundry_model_audit.py &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;You'll get a timestamped folder (like `&lt;STRONG&gt;foundry-audit-20260126-114221/&lt;/STRONG&gt;`) with five CSV files:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;openai_deployments.csv&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- Everything&amp;nbsp;you've&amp;nbsp;got deployed&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;targeted_deployments.csv&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- Specific models&amp;nbsp;you're&amp;nbsp;tracking with usage data&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;model_retirement_alerts.csv&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- What's retiring soon&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;log_analytics_detailed_logs.csv&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- Detailed audit logs (if you&amp;nbsp;enabled&amp;nbsp;diagnostics)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;openai_no_diagnostics.csv&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;- Accounts that&amp;nbsp;don't&amp;nbsp;have logging turned on&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Want&amp;nbsp;to check specific models?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;python foundry_model_audit.py --target-models '[{"ModelName":"gpt-4","Versions":["0613","1106-preview"]}]'&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Enable detailed logging:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;python foundry_model_audit.py --enable-diag --diag-workspace-id "/subscriptions/.../workspaces/my-workspace" &lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Full documentation, parameters, and examples are in the [README](&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;https://github.com/anishek-microsoft/foundry_model_audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;What to Look&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;For&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;in the Reports&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Find the dead weight&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Check `targeted_deployments.csv` for anything with `totalCalls_7d = 0`. If&amp;nbsp;it's&amp;nbsp;been sitting idle for a month,&amp;nbsp;time&amp;nbsp;to shut it down.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Spot the money burners&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Filter for `sku&amp;nbsp;=&amp;nbsp;ProvisionedManaged` (those are PTUs) with low usage.&amp;nbsp;You're&amp;nbsp;paying fixed costs whether you use them or not. Low usage means&amp;nbsp;you're&amp;nbsp;probably wasting&amp;nbsp;money.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Watch for upcoming retirements&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;In `model_retirement_alerts.csv`, anything retiring in less than&amp;nbsp;90 days&amp;nbsp;needs your attention. Microsoft usually suggests what to upgrade to, so&amp;nbsp;you've&amp;nbsp;got a migration path.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="8" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;Security check&lt;/STRONG&gt;:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;In `log_analytics_detailed_logs.csv`, scan for weird `CallerIP` or `Identity` values. If you see API calls from places or&amp;nbsp;accounts&amp;nbsp;you&amp;nbsp;don't&amp;nbsp;recognize,&amp;nbsp;that's&amp;nbsp;worth investigating.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Things&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;I'd&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;Recommend&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Run this regularly, not just once.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Set up a weekly job (Azure Function or scheduled task, whatever works). Track how things change over time—usage patterns, costs, new&amp;nbsp;deployments.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Don't&amp;nbsp;let&amp;nbsp;retirements&amp;nbsp;surprise you.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Set up some kind of alert for models retiring in the next&amp;nbsp;90 days.&amp;nbsp;Give yourself time to plan migrations instead of firefighting.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Be smart about logging.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Turn on diagnostics for production stuff where you need compliance trails. For test/dev environments? Maybe skip it to save on Log Analytics costs. (First 5GB/month is free, but it&amp;nbsp;adds up&amp;nbsp;if&amp;nbsp;you're&amp;nbsp;logging everything.)&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Keep audit data secure.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;These logs have IP addresses, identities, sometimes&amp;nbsp;request details.&amp;nbsp;Don't&amp;nbsp;commit them to Git. Use Azure Blob Storage with proper access controls. Encrypt if&amp;nbsp;you're&amp;nbsp;in a regulated industry.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Establish an audit cadence.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Here's&amp;nbsp;what I recommend:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Weekly&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: Run the full audit to catch new deployments and usage changes&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Monthly&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: Review retirement alerts and plan migrations for anything &amp;lt;&amp;nbsp;90 days&amp;nbsp;out&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559683&amp;quot;:0,&amp;quot;335559684&amp;quot;:-2,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Quarterly&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;: Deep-dive cost analysis—look for PTU optimization opportunities and capacity right-sizing&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:0,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This schedule aligns well with Microsoft's typical model retirement announcement cadence (usually 90+&amp;nbsp;days notice).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:false,&amp;quot;134233118&amp;quot;:false,&amp;quot;201341983&amp;quot;:0,&amp;quot;335551550&amp;quot;:0,&amp;quot;335551620&amp;quot;:0,&amp;quot;335559738&amp;quot;:0,&amp;quot;335559739&amp;quot;:160,&amp;quot;335559740&amp;quot;:276}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Taking It Further: Automation and Dashboards&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Running this manually is useful, but&amp;nbsp;you're&amp;nbsp;probably wondering: "Can I automate this whole thing?" Yep.&amp;nbsp;Here's&amp;nbsp;how&amp;nbsp;I'd&amp;nbsp;set it up:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Run Audits Automatically with Azure Functions&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Deploy the script as an Azure Function with a timer trigger. Set it to run every Monday morning, whatever works for you.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Basic setup:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Timer trigger kicks off the audit weekly&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Use Managed Identity so you&amp;nbsp;don't&amp;nbsp;have to mess with credentials&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Save CSV files to Blob Storage&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Event Grid&amp;nbsp;notifies you&amp;nbsp;when new reports are ready&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Why&amp;nbsp;this&amp;nbsp;works well:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;No servers to maintain&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Scales automatically if needed&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Built-in logs and monitoring&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="6" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="auto"&gt;Consumption plan keeps costs low&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Sample deployment:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="python"&gt;import azure.functions as func 
import subprocess 
from azure.storage.blob import BlobServiceClient 
from datetime import datetime 

def main(mytimer: func.TimerRequest) -&amp;gt; None: 
    
# Run the audit 
    result = subprocess.run(['python', 'foundry_model_audit.py'],  
                          capture_output=True, text=True) 
   
 # Upload results to Blob Storage 
    timestamp = datetime.utcnow().strftime('%Y%m%d-%H%M%S') 
    blob_service = BlobServiceClient.from_connection_string(os.environ['STORAGE_CONNECTION']) 

    # Upload each CSV file 
    for csv_file in ['openai_deployments.csv', 'targeted_deployments.csv', 'model_retirement_alerts.csv']: 
        blob_client = blob_service.get_blob_client(container='audit-reports', blob=f'{timestamp}/{csv_file}') 
        with open(csv_file, 'rb') as data: 
            blob_client.upload_blob(data) &lt;/LI-CODE&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Build Dashboards with Power BI&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Once audit data is flowing to Blob Storage, hook up Power BI for some actual visibility:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Useful dashboard views:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Cost tracking&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;How many deployments per account and region&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;PTU deployments sitting idle (easy cost savings)&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Cost trends month-over-month&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Top 10 most expensive underused deployments&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Retirement timeline&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;Calendar showing when stuff's retiring&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Group by urgency (30/60/90 days out)&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Track migration progress&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Usage patterns&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;API call trends&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Token usage (prompt vs completion)&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Which deployments are actually getting hit&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Spot unusual spikes&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Compliance view&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;Which accounts have logging enabled&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Access patterns by user/service principal&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt; &lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;Overall audit coverage&lt;SPAN style="color: rgb(30, 30, 30);" data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Setup is&amp;nbsp;pretty standard:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Connect to Blob Storage, import the CSVs with Power Query, build some visuals, set auto-refresh, publish to Power BI Service. Set up alerts for critical stuff (like models retiring in 30 days).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Get Alerts in Microsoft Teams&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Use Power Automate to push notifications to Teams when stuff needs attention:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Flow setup:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; Trigger when a new blob shows up (new audit report)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; Parse the CSV for important stuff (retirements, unused PTUs)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; Post an adaptive card to your Teams channel&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;You'll&amp;nbsp;get messages like: "Hey,&amp;nbsp;found&amp;nbsp;5 unused Provisioned deployments worth $12K/month" or "3 models retiring in&amp;nbsp;next&amp;nbsp;90 days." Beats checking manually.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3 aria-level="3"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 3"&gt;Enterprise Workflows with Logic Apps&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;For bigger setups, Logic Apps can orchestrate more complex stuff:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Loop through multiple subscriptions automatically&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Route alerts to the right team owners&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Create work items in Azure DevOps for migrations&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt;Send exec summaries via email weekly&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Basically&amp;nbsp;turns this&amp;nbsp;from a one-off script into a proper governance system that runs itself.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H2 aria-level="2"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Wrapping Up&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Managing Azure OpenAI&amp;nbsp;at&amp;nbsp;scale&amp;nbsp;isn't&amp;nbsp;easy. The cloud moves&amp;nbsp;fast,&amp;nbsp;models retire, costs creep up, and keeping track of everything manually just&amp;nbsp;doesn't&amp;nbsp;work past a certain point.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;This tool&amp;nbsp;won't&amp;nbsp;solve every problem, but&amp;nbsp;it'll&amp;nbsp;give you visibility.&amp;nbsp;You'll know what's deployed, what's&amp;nbsp;actually being&amp;nbsp;used, what's wasting money, and what's about&amp;nbsp;to retire.&amp;nbsp;That's&amp;nbsp;a huge step up from flying&amp;nbsp;blind.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN data-contrast="auto"&gt;Want to try it?&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; Grab the code:&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;https://github.com/anishek-microsoft/foundry_model_audit&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; Run `python foundry_model_audit.py` on your subscription&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN data-contrast="auto"&gt; See what you find&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Set this up, run it regularly, and save yourself some headaches.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;&lt;SPAN data-contrast="auto"&gt;Related reading:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/ai-services/openai/" target="_blank" rel="noopener"&gt;Azure OpenAI Service Documentation&lt;/A&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/ai-foundry/concepts/model-lifecycle-retirement" target="_blank" rel="noopener"&gt;Azure AI Foundry Model Lifecycle and Retirement&lt;/A&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/azure-monitor/essentials/metrics-supported#microsoftcognitiveservicesaccounts" target="_blank" rel="noopener"&gt;Azure Monitor Metrics for Cognitive Services&lt;/A&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/cost-management-billing/" target="_blank" rel="noopener"&gt;Azure Cost Management and Optimization&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Got questions or ideas?&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;Drop a comment or open an issue on GitHub.&amp;nbsp;I'd&amp;nbsp;love to hear what you think and what features would make this more useful.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Thu, 05 Feb 2026 12:39:21 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/automating-azure-openai-foundry-model-lifecycle-management/ba-p/4491982</guid>
      <dc:creator>anishekkamal</dc:creator>
      <dc:date>2026-02-05T12:39:21Z</dc:date>
    </item>
    <item>
      <title>Hardening Spring Boot Health Probes on AKS: How to Prevent Restart Storms Before They Start</title>
      <link>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/hardening-spring-boot-health-probes-on-aks-how-to-prevent/ba-p/4491549</link>
      <description>&lt;H3&gt;Overview&lt;/H3&gt;
&lt;P&gt;Transient platform degradations can turn into outages if health probes are overly strict or wired to the wrong endpoint. In this case study, multiple incidents were reported in which many Spring Boot pods restarted in a short time window on Azure Kubernetes Service (AKS), contributing to visible downtime.&lt;/P&gt;
&lt;P&gt;A key lesson is that probing the consolidated /actuator/health endpoint can amplify blast radius: if any health contributor degrades, the overall endpoint can report unhealthy. When that endpoint is used for liveness, kubelet can restart pods at scale and create a feedback loop (mass restarts → node pressure → additional failures).&lt;/P&gt;
&lt;P&gt;The remediation combined two changes:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;separating liveness and readiness onto the dedicated Actuator probe endpoints (/actuator/health/liveness and /actuator/health/readiness), and&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;tuning probe thresholds (especially timeoutSeconds) to tolerate brief latency spikes.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;This article targets &lt;STRONG&gt;platform engineers&lt;/STRONG&gt; and &lt;STRONG&gt;SREs &lt;/STRONG&gt;and provides a &lt;STRONG&gt;baseline configuration&lt;/STRONG&gt;, a &lt;STRONG&gt;troubleshooting checklist&lt;/STRONG&gt;, and a simple &lt;STRONG&gt;validation &lt;/STRONG&gt;approach.&lt;/P&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313813"&gt;&lt;/A&gt;Environment (for reproducibility)&lt;/H3&gt;
&lt;P&gt;&lt;EM&gt;This scenario was observed on AKS (Kubernetes 1.30.3) with Spring Boot 2.3.x and an NGINX Ingress Controller deployed as a separate workload. Node OS image and JDK details are not required for the probe wiring and threshold tuning discussed here.&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313814"&gt;&lt;/A&gt;The Challenge&lt;/H2&gt;
&lt;P&gt;On AKS, even a short-lived control plane latency spike can ripple into workload behavior if kubelet health checks are configured too aggressively. Probes are meant to protect reliability, but when they are wired to the wrong signal they can turn a brief degradation into a restart loop.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Problem statement:&lt;/STRONG&gt; Probe design amplified a transient AKS control plane degradation into a mass pod restart event.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Business impact:&lt;/STRONG&gt; Visible downtime and unstable service behavior due to restart storms across multiple microservices.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Who’s affected:&lt;/STRONG&gt; SREs, platform engineers, and application teams operating Spring Boot workloads on Kubernetes (especially AKS).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313815"&gt;&lt;/A&gt;What Happened?&lt;/H2&gt;
&lt;P&gt;We saw a familiar pattern: many Spring Boot pods restarted within a short window, and probes started failing across a large part of the fleet at the same time.&lt;/P&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313816"&gt;&lt;/A&gt;Incident timeline&lt;/H3&gt;
&lt;P&gt;On &lt;STRONG&gt;2025-03-25&lt;/STRONG&gt;, downtime was reported across multiple Spring Boot-based microservices due to widespread pod restarts, and the event was associated with elevated Kubernetes API server connectivity/latency issues on the Linux node pool. A similar pattern was reported again on &lt;STRONG&gt;2025-06-02&lt;/STRONG&gt;: probes failed for many pods in a short window, restarts followed, and the system needed ~15 minutes to stabilize while CPU/memory pressure was elevated.&lt;/P&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313817"&gt;&lt;/A&gt;Why this failure mode is common&lt;/H3&gt;
&lt;P&gt;What made the situation worse was the probe design: liveness and readiness were both wired to the same composite health endpoint (/actuator/health) and the liveness timeout was very strict. Under transient latency, that combination can turn “brief slowness” into “restart many pods”, and restarts add even more pressure to nodes and the cluster.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313818"&gt;&lt;/A&gt;The Solution&lt;/H2&gt;
&lt;P&gt;We kept the solution intentionally simple and AKS-focused: reduce the blast radius during transient cluster/platform slowness, and prevent kubelet from turning short probe timeouts into mass restarts.&lt;/P&gt;
&lt;P&gt;Concretely, we did two things:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;moved readiness/liveness to the dedicated Actuator probe endpoints, and&lt;/LI&gt;
&lt;LI&gt;increased probe timeouts/thresholds to tolerate brief latency spikes.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313819"&gt;&lt;/A&gt;1) Use dedicated Actuator probe endpoints&lt;/H3&gt;
&lt;P&gt;Spring Boot Actuator exposes health endpoints under /actuator/health. The consolidated endpoint is intentionally broad (it reflects multiple health contributors). For Kubernetes probes, it is usually better to use dedicated readiness/liveness endpoints so a transient dependency issue can stop traffic without forcing restarts.&lt;/P&gt;
&lt;P&gt;In this case, we moved&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;readiness to /actuator/health/readiness (so AKS can stop sending traffic when the instance is not ready) and&lt;/LI&gt;
&lt;LI&gt;liveness to /actuator/health/liveness (so short slowness does not trigger restarts).&lt;/LI&gt;
&lt;LI&gt;We kept /actuator/health for human-facing checks and dashboards.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This article focuses on Kubernetes probe wiring and thresholds. The exact Spring Boot Actuator configuration (application.yml, environment variables, and the enabled health groups/contributors) is application-specific and does not change the core recommendation: use the dedicated probe endpoints for readiness/liveness and tune probe thresholds for transient latency.&lt;/P&gt;
&lt;P&gt;If you want a minimal Spring Boot baseline for these endpoints (Spring Boot 2.3+), it typically looks like this:&lt;/P&gt;
&lt;PRE&gt;management:&lt;BR /&gt;&amp;nbsp; endpoint:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; health:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; probes:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enabled: true&lt;/PRE&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313820"&gt;&lt;/A&gt;2) Tune probe thresholds to match reality&lt;/H3&gt;
&lt;P&gt;If the platform experiences brief latency spikes, timeoutSeconds: 1 is often too aggressive for liveness.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313821"&gt;&lt;/A&gt;Implementation (Step-by-Step)&lt;/H2&gt;
&lt;P&gt;The YAML snippets below illustrate the probe configurations used before and after the remediation.&lt;/P&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313822"&gt;&lt;/A&gt;Step 1 — Baseline probe behavior (before)&lt;/H3&gt;
&lt;H4&gt;Scenario 1 (before): readiness + liveness wired to /actuator/health&lt;/H4&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Baseline/original readiness probe (as captured):&lt;/P&gt;
&lt;PRE&gt;readinessProbe:&lt;BR /&gt;&amp;nbsp; httpGet:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: /actuator/health&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Spring Boot health endpoint for readiness&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 8080&lt;BR /&gt;&amp;nbsp; initialDelaySeconds: 5&lt;BR /&gt;&amp;nbsp; periodSeconds: 5&lt;BR /&gt;&amp;nbsp; timeoutSeconds: 2&lt;BR /&gt;&amp;nbsp; failureThreshold: 3&lt;/PRE&gt;
&lt;P&gt;Baseline/original liveness probe (as captured; failureThreshold not specified):&lt;/P&gt;
&lt;PRE&gt;livenessProbe:&lt;BR /&gt;&amp;nbsp; httpGet:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: /actuator/health&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Spring Boot health endpoint for liveness&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 8080&lt;BR /&gt;&amp;nbsp; initialDelaySeconds: 40&lt;BR /&gt;&amp;nbsp; periodSeconds: 15&lt;BR /&gt;&amp;nbsp; timeoutSeconds: 1&lt;BR /&gt;&amp;nbsp; # failureThreshold not specified (defaults apply)&lt;/PRE&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313823"&gt;&lt;/A&gt;Step 2 — Separate liveness and readiness endpoints (after)&lt;/H3&gt;
&lt;H4&gt;Scenario 2 (after): readiness gates traffic, liveness avoids restart loops&lt;/H4&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Remediated readiness probe:&lt;/P&gt;
&lt;PRE&gt;readinessProbe:&lt;BR /&gt;&amp;nbsp; httpGet:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: /actuator/health/readiness&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 8080&lt;BR /&gt;&amp;nbsp; initialDelaySeconds: 60&lt;BR /&gt;&amp;nbsp; periodSeconds: 5&lt;BR /&gt;&amp;nbsp; timeoutSeconds: 5&lt;BR /&gt;&amp;nbsp; failureThreshold: 3&lt;/PRE&gt;
&lt;P&gt;Remediated liveness probe:&lt;/P&gt;
&lt;PRE&gt;livenessProbe:&lt;BR /&gt;&amp;nbsp; httpGet:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: /actuator/health/liveness&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 8080&lt;BR /&gt;&amp;nbsp; initialDelaySeconds: 60&lt;BR /&gt;&amp;nbsp; periodSeconds: 30&lt;BR /&gt;&amp;nbsp; timeoutSeconds: 30&lt;BR /&gt;&amp;nbsp; failureThreshold: 5&lt;/PRE&gt;
&lt;H3&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313824"&gt;&lt;/A&gt;Step 3 — Add a startup probe (recommended)&lt;/H3&gt;
&lt;P&gt;Use a startup probe to prevent liveness/readiness from flapping while the JVM warms up (classloading, DB migrations, cache priming). The values below are a safe starting point for many Spring Boot services; tune them based on observed startup time.&lt;/P&gt;
&lt;PRE&gt;startupProbe:&lt;BR /&gt;&amp;nbsp; httpGet:&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: /actuator/health/liveness&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 8080&lt;BR /&gt;&amp;nbsp; # Allows up to 5 minutes for cold start: 30 * 10s = 300s&lt;BR /&gt;&amp;nbsp; failureThreshold: 30&lt;BR /&gt;&amp;nbsp; periodSeconds: 10&lt;BR /&gt;  timeoutSeconds: 5&lt;/PRE&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313825"&gt;&lt;/A&gt;Architecture / Dataflow&lt;/H2&gt;
&lt;P&gt;This diagram shows the causal chain at a glance: a transient platform issue can surface as slower health responses, which then interacts with probe thresholds to decide whether traffic is removed or containers restart.&lt;A class="lia-anchor" target="_blank" name="_Toc217313826"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313827"&gt;&lt;/A&gt;Validation (How to Prove It Worked)&lt;/H2&gt;
&lt;P&gt;Validation is a simple before/after check: after the change, probe failures and restarts should drop, and short AKS/platform slowness should lead to traffic being gated (readiness) instead of mass restarts (liveness). If you can capture sanitized metrics, focus on restart rate, probe failures, ingress 5xx, recovery time, and (when available) control plane latency.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313828"&gt;&lt;/A&gt;Troubleshooting Checklist (How to Diagnose)&lt;/H2&gt;
&lt;P&gt;Use this when you see synchronized restarts across many pods.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Confirm the restart pattern.&lt;/STRONG&gt; Start by watching pods and checking placement.
&lt;OL&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl get pods -n &amp;lt;ns&amp;gt; -w&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl get pods -n &amp;lt;ns&amp;gt; -o wide&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Check events and probe failures.&lt;/STRONG&gt; You want to see whether kubelet is killing containers due to probe timeouts.
&lt;OL&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl get events -n &amp;lt;ns&amp;gt; --sort-by=.lastTimestamp&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl describe pod &amp;lt;pod&amp;gt; -n &amp;lt;ns&amp;gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Identify restart reasons.&lt;/STRONG&gt; Look for CrashLoopBackOff, OOMKilled, and repeated probe failure events.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Validate Actuator endpoint behavior from inside the pod.&lt;/STRONG&gt; This confirms which endpoint flips and how fast it responds.
&lt;OL&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl exec -n &amp;lt;ns&amp;gt; &amp;lt;pod&amp;gt; -- curl -sS -m 5 &lt;A class="lia-external-url" href="http://127.0.0.1:8080/actuator/health" target="_blank" rel="noopener"&gt;http://127.0.0.1:8080/actuator/health&lt;/A&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl exec -n &amp;lt;ns&amp;gt; &amp;lt;pod&amp;gt; -- curl -sS -m 5 &lt;A class="lia-external-url" href="http://127.0.0.1:8080/actuator/health/readiness" target="_blank" rel="noopener"&gt;http://127.0.0.1:8080/actuator/health/readiness&lt;/A&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;PRE&gt;kubectl exec -n &amp;lt;ns&amp;gt; &amp;lt;pod&amp;gt; -- curl -sS -m 5 http://127.0.0.1:8080/actuator/health/liveness&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Correlate with AKS/platform signals.&lt;/STRONG&gt; If available, correlate probe failures with control plane latency signals.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313829"&gt;&lt;/A&gt;Security Notes (Don’t Create a New Exposure)&lt;/H2&gt;
&lt;P&gt;Treat Actuator as an internal-only surface. Probes need access, but that does not mean the internet does.&lt;/P&gt;
&lt;P&gt;Controls that typically work well for this pattern:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Avoid routing Actuator endpoints through an internet-facing ingress.&lt;/LI&gt;
&lt;LI&gt;If ingress is unavoidable, use internal exposure and strict allowlists.&lt;/LI&gt;
&lt;LI&gt;Keep Actuator exposure minimal (only the health endpoints needed for probes).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313830"&gt;&lt;/A&gt;Discussion &amp;amp; Feedback&lt;/H2&gt;
&lt;P&gt;If you’ve run similar AKS incidents, I’d love to compare notes:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Have you seen probe failures cascade into mass restarts?&lt;/LI&gt;
&lt;LI&gt;Do you wire liveness to a “full health” endpoint today, and why?&lt;/LI&gt;
&lt;LI&gt;What timeout and failure threshold values have proven reliable in production?&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313831"&gt;&lt;/A&gt;Resources&lt;/H2&gt;
&lt;P&gt;If you want to go deeper, these references cover the probe mechanics and the Spring Boot side of the health model:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/" target="_blank" rel="noopener"&gt;Configure liveness, readiness and startup probes&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.spring.io/spring-boot/docs/2.3.x/reference/html/production-ready-features.html" target="_blank" rel="noopener"&gt;Spring Boot 2.3: Production-ready features&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.spring.io/spring-boot/docs/2.3.x/reference/html/production-ready-features.html#production-ready-health-indicators" target="_blank" rel="noopener"&gt;Spring Boot 2.3: Health indicators&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/aks/monitor-aks" target="_blank" rel="noopener"&gt;Monitor Azure Kubernetes Service (AKS)&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313832"&gt;&lt;/A&gt;⚠️ Microsoft Support Statement&lt;/H2&gt;
&lt;P&gt;This article represents field experiences and community best practices. For official Microsoft support and SLA-backed guidance:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://azure.microsoft.com/support/" target="_blank" rel="noopener"&gt;Azure Support&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/" target="_blank" rel="noopener"&gt;Azure documentation on Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/answers/" target="_blank" rel="noopener"&gt;Microsoft Q&amp;amp;A&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Production issues: For production-impacting problems, contact Microsoft Support.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313833"&gt;&lt;/A&gt;🔒 Customer Privacy Notice&lt;/H2&gt;
&lt;P&gt;This article describes real-world scenarios from customer engagements. All customer-specific information has been anonymized:&lt;/P&gt;
&lt;P&gt;Company names are replaced with industry categories, exact metrics are generalized where necessary, and infrastructure details are sanitized.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313834"&gt;&lt;/A&gt;🤝 Community Contribution&lt;/H2&gt;
&lt;P&gt;We welcome corrections, improvements, and additional real-world examples. If you spot an issue or have a better probe hardening pattern, share it via comments or reach out.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc217313835"&gt;&lt;/A&gt;🤖 AI Tools Disclosure&lt;/H2&gt;
&lt;P&gt;Parts of this article were created with assistance from AI tools to improve clarity and structure. Review and validate all content before publication.&lt;/P&gt;</description>
      <pubDate>Thu, 05 Feb 2026 12:37:41 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/microsoft-mission-critical-blog/hardening-spring-boot-health-probes-on-aks-how-to-prevent/ba-p/4491549</guid>
      <dc:creator>AndreasSemmelmann</dc:creator>
      <dc:date>2026-02-05T12:37:41Z</dc:date>
    </item>
  </channel>
</rss>

