Author: Tony Redmond
How to Add a Loop Workspace to a Standard Teams Channel
The Latest Iteration of Channel Note Taking
In the past, every Teams channel had the Wiki tab to facilitate information sharing between channel members. The Wiki tab went away in 2023 and was replaced by OneNote. Many people love OneNote and that app is still a good option that’s been joined by Loop workspaces. According to Microsoft 365 notification MC973493 (last updated 9 May 2025, Microsoft 365 roadmap item 472022), deployment of the update to enable adding a Loop workspace as a channel tab will complete by the end of May 2025.
Loop workspaces appeared when Microsoft shipped the Loop app in 2023. At that point, Loop workspaces were personal. It’s taken since then to enable support for the features necessary to support Teams such as Microsoft 365 groups and sensitivity labels.
Making Loop Workspaces Possible
Adding a Loop workspace as a channel tab allows everyone in the team to work on the same content (organized in workspace pages and Loop components) with changes synchronized in almost real time. Like all resources managed by a Microsoft 365 group, all team members have equal access to the Loop workspace.
Three prerequisites must be met before Loop workspaces can be added as a channel tab:
- The tenant must enable use of the Loop app.
- Team members who want to create workspaces must have a license that includes Loop.
- The Loop Teams app must be available to team members (Figure 1). Updating access for the app in the Teams admin center can take several hours to become effective.

With everything in place, team members allowed to add channel tabs can add a new tab and choose Loop as the app for the tab. They can use the channel name for the workspace or choose a different name (Figure 2).

Once the workspace is active, team members can interact with the Loop workspace in the same way as they’d do through the Loop app, adding components and pages to organize content. In Figure 3, I’ve added a task list component to help organize the publication of the next edition of the Office 365 for IT Pros eBook. Like task lists in Loop components in Outlook or Teams chat, a team member can open the tasks in Planner or To Do.

SharePoint Embedded Container
Like other Loop workspaces, the physical instantiation for the new workspace is a SharePoint Embedded container that’s visible through the SharePoint admin center (Figure 4). Note that the owner of the container is the Microsoft 365 group and the ownership type is group rather than personal. The container receives the same sensitivity label as assigned to the owning group at the time of creation.

The workspace is quite separate to Teams. If a team member removes the channel tab by mistake, it’s easy to recreate the tab and reconnect the workspace. If the team is deleted, the workspace is also deleted like other team resources. Likewise, if a deleted team with a workspace is restored within the 30-day grace period, the workspace is also restored.
Loop workspaces are restricted to standard Teams channels. They don’t support the membership models used by private and shared channels. This is understandable because Loop has only just mastered the art of using Microsoft 365 groups for membership management.
Long-term Replacement for OneNote?
Some commentators believe that Loop will eventually replace OneNote. Certainly, Microsoft development appears to be focused on Loop these days and Microsoft is building Loop into as many places within Microsoft 365 as possible. Copilot Pages is a notable example of a Loop-powered app. It wouldn’t be surprising if Microsoft rationalized its note-taking apps around Loop in the future.
Before rationalizing anything, it would be nice if Microsoft updated the Get-SPOContainer cmdlet (from the SharePoint management module) to handle workspaces owned by Microsoft 365 groups. I updated my script to report Loop workspaces to handle group-owned workspaces, but the detail about the containers just isn’t there today.
Insight like this doesn’t come easily. You’ve got to know the technology and understand how to look behind the scenes. Benefit from the knowledge and experience of the Office 365 for IT Pros team by subscribing to the best eBook covering Office 365 and the wider Microsoft 365 ecosystem.
Quest Tool Migrates Protected Email and Files Between Tenants
Solves the Problem of Migrating Data Protected by Sensitivity Labels
I’ve worked as an advisor with Quest for several years, but I had no indication that they would launch a product to migrate content protected by sensitivity labels from one Microsoft 365 tenant to another. That capability is now available in Quest On Demand Migration.
The tenant migration issue has existed since Microsoft introduced Azure Information Protection labels (now sensitivity labels) in 2016. The problem doesn’t arise with labels that simply mark content as being of a certain nature. It comes into play when sensitivity labels apply rights-management based encryption where usage rights define the level of access granted to individual users for protected files or messages.
The popularity of sensitivity labels has increased over time as more tenants come to understand the value of protecting their most sensitive content using the labeling features built into the Office apps. It’s true that labeling only extends to Office documents and PDFs, but that set covers most files created within Microsoft 365 tenants.
The advent of Microsoft 365 Copilot and its ability to find and use files stored in SharePoint Online and OneDrive for Business means that sensitivity labels are even more important. By themselves, sensitivity labels won’t stop apps like BizChat finding sensitive documents, but they can stop Copilot reusing content from those documents in its responses. The DLP policy for Microsoft 365 Copilot imposes a better block by stopping Copilot finding documents assigned specific sensitivity labels.
The growth in protected content creates a problem for tenant-to-tenant migration projects. Many products are available to move Exchange mailboxes and SharePoint files between tenants. However, migration products usually assume that the data they move is unprotected and that users will be able to access the content once it reaches the target tenant. That assumption doesn’t hold true when sensitivity labels protect email and files. The challenge is to move protected items from the source tenant in such a way that protection is maintained and respected by the target tenant.
Methods to Remove Sensitivity Labels from Files
Until now, the guidance for source tenants is to remove protection from content before migration to the target tenant. There are a couple of ways of doing this, starting off by assigning an account super-user privilege to allow them to remove sensitivity labels from files. Finding and processing protected files is an intensely manual process that’s prone to error. It will take a long time to prepare, move, and check any reasonable collection of labelled files, like the 5,188 items with the Public label as reported by the Purview Data Explorer (Figure 1).

The SharePoint Online PowerShell module includes the Unlock-SPOSensitivityLabelEncryptedFile cmdlet. Administrators can use the cmdlet to remove protection from files in SharePoint sites and OneDrive for Business accounts. It is possible to script the removal of labels from files, but the automation journey breaks down when the files reach the target tenant and need to be relabeled.
SharePoint also supports the assignSensitivityLabel Graph API, which can remove or assign labels to files. However, assignSensitivityLabel is a metered API, meaning that each time the API is run, Microsoft charges $0.00185 (USD) paid for through an Azure subscription. That doesn’t seem like a big fee until the need exists to process tens of thousands of documents to remove labels in the source tenant and reapply labels in the target tenant.
No Solution for Protected Exchange Messages
Note that Exchange Online is missing from the discussion. That’s because all the methods described so far don’t handle email. I don’t know how clients like Outlook and OWA apply sensitivity labels to messages (it’s likely done using APIs from the Microsoft Information Protection SDK), but no cmdlets or Graph APIs are available to remove labels from messages or apply sensitivity labels in bulk to a set of messages migrated in mailboxes moved from one tenant to another.
Migrating Protected Content Between Tenants
All of which means that Quest’s claim to migrate protected content from Exchange Online, SharePoint Online, and OneDrive for Business is very interesting. It’s the first ISV migration offering that I know of which offers such a capability.
Reading the announcement and the accompanying Quest Knowledge Base article gives some insight into how the On Demand product handles protected items. A discovery process (like running the Get-Label cmdlet) finds the set of sensitivity labels in the source tenant. The labels from the source tenant are mapped to labels in the target in some form of table. Normal migration processing moves the data, and some form of post-migration task then updates the labels from the source tenant to matching labels for the target. Quest doesn’t describe what magic is used to make sure that protected content works when it reaches the target tenant, but the knowledge base article mentions the Microsoft Information Protection SDK, so it’s likely that On Demand uses MIP SDK API calls to read and update sensitivity labels for the migrated items.
User-Defined Permissions and Keys
Although creating the capability to move protected content between tenants is a great step forward for migration projects, there are always edge cases to consider. Sensitivity labels with user-defined permissions are an example. These labels are challenging because the permissions vary from item to item. SharePoint Online only recently gained support for sensitivity labels with user-defined permissions, and it’s interesting that Quest claim support for user-defined permissions out of the box.
Quest doesn’t mention sensitivity labels with double-key encryption (DKE), nor do they explain if On Demand supports migration of sensitivity labels with encryption based on customer keys rather than Microsoft-managed keys (sometimes called bring-your-own-key or BYOK). There’s a bunch of complexity involved in moving key management between tenants and it would be surprising if Quest supported BYOK. Thankfully, most customers use Microsoft-managed keys with sensitivity labels because it simplifies operations.
Let the Competition Begin
Overall, it’s great that an ISV has taken on and solved the challenge of moving protected content between tenants. The nature of competition is that once a migration vendor introduces a new capability, their competitors respond. We might see even more interesting developments in this space over the coming months.
Why Copilot Access to “Restricted” Passwords Isn’t as Big an Issue as Uploading Files to ChatGPT
Unless You Consider Excel Passwords to be Real Passwords
I see that some web sites have picked up the penetration test story about using Microsoft 365 Copilot to extract sensitive information from SharePoint. The May 14 Forbes.com story is an example. The headline of “New Warning — Microsoft Copilot AI Can Access Restricted Passwords” is highly misleading.

Unfortunately, tech journalists and others can rush to comment without thinking an issue through, and that’s what I fear has happened in many of the remarks I see in places like LinkedIn discussions. People assume that a much greater problem exists when if they would only think things through, they’d see the holes in the case being presented.
Understanding the Assumptions made by the Penetration Test
As I pointed out in a May 12 article, the penetration test was interesting (and did demonstrate just how weak Excel passwords are). However, the story depends on three major assumptions:
- Compromise: The attacker has control of an Entra ID account with a Microsoft 365 Copilot license. In other words, the target tenant is compromised. In terms of closing off holes for attackers to exploit, preventing access is the biggest problem in the scenario. All user accounts should be protected with strong multifactor authentication like the Microsoft authenticator app, passkeys, or FIDO-2 keys. SMS is not sufficient, and basic authentication (just passwords) is just madness.
- Poor tenant management: Once inside a tenant and using a compromised account, Microsoft 365 Copilot will do what the attacker asks it to do, including finding sensitive information like a file containing passwords. However, Copilot cannot find information that is unavailable to the signed-in user. If the tenant’s SharePoint Online deployment is badly managed without well-planned and well-managed access controls, then Copilot will happily find anything that the user’s access allows it to uncover. This is not a problem for Copilot: it is a failure of tenant management that builds on the first failure to protect user accounts appropriately.
- Failure to deploy available tools: Even in the best-managed SharePoint Online deployment, users can make mistakes when configuring access, Users can also follow poor practice, such as storing important files in OneDrive for Business rather than SharePoint Online. But tenants with Microsoft 365 Copilot licenses can mitigate against user error with tools available to them such as Restricted Content Discovery (RCD) and the DLP policy for Microsoft 365 Copilot. The latter requires the tenant to deploy sensitivity labels too, but that’s part of the effort required to protect confidential and sensitive information.
I’m sure any attacker would love to find an easily-compromised tenant where they can gain control over accounts that have access to both badly managed SharePoint Online sites that hold sensitive information and Microsoft 365 Copilot to help the attackers find that information. Badly-managed and easily-compromised Microsoft 365 tenants do exist, but it is my earnest hope that companies who invest in Microsoft 365 Copilot have the common sense to manage their tenants properly.
Uploading SharePoint and OneDrive Files to ChatGPT
Personally speaking, I’m much more concerned about users uploaded sensitive or confidential information to OpenAI for ChatGPT to process. The latest advice from OpenAI is how the process works for their Deep Research product. Users might like this feature because they can have their documents processed by AI. However, tenant administrators and anyone concerned with security or compliance might have a different perspective.
I covered the topic of uploading SharePoint and OneDrive files to ChatGPT on March 26 and explained that the process depends on an enterprise Entra ID app (with app id e0476654-c1d5-430b-ab80-70cbd947616a) to gain access to user files. Deep Research is different and its connector for SharePoint and OneDrive is in preview, but the basic principle is the same: a Graph-based app uploads files for ChatGPT to process. If that app is blocked (see my article to find out how) or denied access to the Graph permission needed to access files, the upload process doesn’t work.
Set Your Priorities
I suggest that it’s more important to block uploading of files from a tenant to a third-party AI service where you don’t know how the files are managed or retained. It certainly seems like a more pressing need than worrying about the potential of an attacker using Microsoft 365 Copilot to run riot over SharePoint, even if a penetration test company says that this can happen (purely as a public service, and not at all to publicize their company).
At least, that’s assuming user accounts are protected with strong multifactor authentication…
Microsoft Build 2025: Menyambut Era Agen AI dan Membangun Agentic Web Terbuka
Singkatnya? Dengarkan ringkasan berita dalam bentuk audio yang dihasilkan oleh AI melalui Microsoft 365 Copilot. Temukan transkrip lengkapnya di sini.
Era agen AI telah tiba. Berkat terobosan besar dalam kemampuan penalaran dan memori, model AI kini menjadi lebih canggih dan efisien. Kita mulai melihat bagaimana sistem AI dapat membantu menyelesaikan berbagai masalah dengan cara-cara baru yang lebih inovatif.
Sebagai contoh, 15 juta developer telah menggunakan GitHub Copilot, dengan fitur seperti agent mode dan code review yang menyederhanakan proses penulisan, checking, deployment hingga troubleshoot code. Sementara itu, ratusan ribu pelanggan memanfaatkan Microsoft 365 Copilot untuk riset, brainstorming, dan pengembangan solusi. Lebih dari 230.000 organisasi — termasuk 90% dari perusahaan Fortune 500 — juga telah menggunakan Copilot Studio untuk membangun agen AI dan otomatisasi.
Perusahaan seperti Fujitsu dan NTT DATA memanfaatkan Azure AI Foundry untuk membangun dan mengelola aplikasi serta agen AI yang membantu memprioritaskan prospek penjualan, mempercepat pembuatan proposal, dan memberikan insight klien.
Sementara itu, Stanford Health Care menggunakan healthcare agent orchestrator dari Microsoft untuk membangun dan menguji agen AI yang dapat mengurangi beban administratif sekaligus mempercepat alur kerja dalam persiapan tim ahli tumor.
Developer berada di pusat dari seluruh perubahan ini. Selama 50 tahun, Microsoft telah memberdayakan mereka dengan berbagai alat dan platform untuk mewujudkan ide-ide menjadi kenyataan dan mempercepat inovasi di setiap tahap. Dengan otomatisasi berbasis AI dan integrasi cloud yang semakin terhubung, para developer menjadi kekuatan pendorong di balik munculnya generasi baru transformasi digital.
Lalu, apa langkah berikutnya?
Kami membayangkan dunia di mana agen-agen AI dapat beroperasi lintas konteks—dari individu, tim, organisasi, hingga seluruh proses bisnis end-to-end. Inilah visi baru internet: sebuah agentic web yang terbuka, di mana agen AI mampu mengambil keputusan dan menjalankan tugas atas nama pengguna maupun organisasi.
Pada acara Microsoft Build, kami menunjukkan langkah konkret dalam mewujudkan visi ini melalui platform, produk, dan infrastruktur yang kami miliki. Kami membekali developer dengan model-model terbaru dan coding agents, memperkenalkan agen AI kelas enterprise, serta menjadikan Azure AI Foundry, GitHub, dan Windows sebagai pusat terbaik untuk membangun inovasi. Kami juga mendukung protokol terbuka dan mempercepat penemuan ilmiah melalui AI—semuanya agar para developer dan organisasi dapat melahirkan terobosan besar berikutnya.
Berikut sekilas beberapa pengumuman hari ini:
Transformasi Pengembangan Perangkat Lunak dengan AI
AI secara mendasar mengubah cara kita menulis, menerapkan, dan memelihara code. Developer kini memanfaatkan AI untuk tetap berada dalam alur kerja lebih lama dan mengalihkan fokus ke tugas-tugas yang lebih strategis. Seiring transformasi dalam siklus hidup pengembangan perangkat lunak, kami menghadirkan beragam fitur baru di platform seperti GitHub, Azure AI Foundry, dan Windows — agar para developer dapat bekerja lebih cepat, berpikir lebih luas, dan membangun dalam skala yang lebih besar.
- Agen coding GitHub Copilot dan pembaruan terbaru pada GitHub Models: GitHub Copilot kini berevolusi dari sekadar asisten in-editor menjadi mitra agentic AI, dengan agen coding asinkron pertama yang terintegrasi langsung ke platform GitHub. Kami menghadirkan fitur manajemen prompt, evaluasi ringan, dan kontrol tingkat enterprise pada GitHub Models, sehingga tim dapat bereksperimen dengan model-model terbaik tanpa harus keluar dari GitHub. Microsoft juga merilis open-source GitHub Copilot Chat di VS Code. Kemampuan AI dari ekstensi GitHub Copilot kini menjadi bagian dari repositori open-source yang sama yang mendukung alat pengembangan paling populer di dunia. Sebagai pusat bagi lebih dari 150 juta developer, upaya ini memperkuat komitmen kami terhadap pengembangan perangkat lunak yang terbuka, kolaboratif, dan didukung AI. Pelajari lebih lanjut tentang pembaruan GitHub Copilot.
- Memperkenalkan Windows AI Foundry: Bagi para developer, Windows tetap menjadi salah satu platform yang paling terbuka dan banyak digunakan yang menawarkan skala, fleksibilitas, dan peluang yang terus berkembang. Windows AI Foundry menghadirkan platform terpadu dan andal yang mendukung seluruh siklus pengembangan AI, dari pelatihan hingga inference. Dengan API model yang sederhana untuk tugas-tugas vision dan bahasa, developer dapat mengelola dan menjalankan LLM open source melalui Foundry Local, atau membawa model milik sendiri untuk dikonversi, disesuaikan, dan diterapkan di berbagai lingkungan, baik di perangkat klien maupun cloud. Windows AI Foundry sudah tersedia dan bisa langsung dicoba. Kunjungi Windows Developer Blog untuk informasi lebih lanjut.
- Azure AI Foundry Models dan alat baru untuk evaluasi model: Azure AI Foundry adalah platform terpadu bagi para developer untuk merancang, menyesuaikan, dan mengelola aplikasi serta agen AI. Melalui Azure AI Foundry Models, kami menghadirkan model Grok 3 dan Grok 3 mini dari xAI ke dalam ekosistem kami, yang di-host dan ditagihkan langsung oleh Microsoft. Kini, developer bisa memilih dari lebih dari 1.900 model AI yang di-host oleh mitra maupun Microsoft, sembari mengelola integrasi data yang aman, penyesuaian model, dan tata kelola kelas enterprise. Kami juga meluncurkan alat baru seperti Model Leaderboard, yang memberikan peringkat model AI dengan performa terbaik di berbagai kategori dan tugas, serta Model Router, yang dirancang untuk memilih model paling optimal untuk permintaan atau tugas tertentu secara real-time. Pelajari lebih lanjut tentang Azure AI Foundry Models.
Meningkatkan Kapabilitas dan Keamanan Agen AI
Agen AI tidak hanya mengubah cara developer membangun solusi, tetapi juga mengubah cara individu, tim, dan perusahaan menyelesaikan pekerjaan. Pada acara Build, kami memperkenalkan agen-agen siap pakai terbaru, komponen untuk membangun agen kustom, kemampuan multi-agen, serta model-model baru yang membantu developer dan organisasi membangun dan menerapkan agen secara aman untuk meningkatkan produktivitas secara signifikan.
- Dengan ketersediaan umum Azure AI Foundry Agent Service, Microsoft menghadirkan fitur-fitur baru yang memungkinkan para developer profesional untuk mengelola banyak agen khusus dalam menyelesaikan tugas-tugas kompleks. Ini mencakup penggabungan Semantic Kernel dan AutoGen ke dalam satu SDK yang berfokus pada developer, serta dukungan Agent-to-Agent (A2A) dan Model Context Protocol (MCP). Untuk meningkatkan kepercayaan developer terhadap agen AI yang mereka kembangkan, kami memperkenalkan fitur terbaru pada Azure AI Foundry Observability. Fitur ini menyediakan pemantauan menyeluruh atas metrik kinerja, kualitas, biaya, dan keamanan, yang dapat diakses melalui dashboard terpadu dengan pelacakan detail yang mudah digunakan. Pelajari lebih lanjut cara menerapkan agen AI kelas enterprise menggunakan Azure AI Foundry Service.
- Temukan, lindungi, dan kelola dalam Azure AI Foundry: Dengan Microsoft Entra Agent ID yang saat ini dalam tahap preview, secara otomatis memberikan identitas unik pada agen-agen yang dibuat developer di Microsoft Copilot Studio atau Azure AI Foundry dalam direktori Entra. Fitur ini membantu perusahaan mengelola agen secara aman sejak awal dan mencegah “agent sprawl” yang berpotensi menimbulkan celah. Aplikasi dan agen yang dibangun dengan Foundry juga mendapatkan manfaat dari kontrol keamanan data dan kepatuhan Microsoft Purview. Selain itu, Foundry menawarkan alat tata kelola yang lebih canggih untuk menetapkan parameter risiko, menjalankan evaluasi otomatis, dan menghasilkan laporan terperinci. Pelajari lebih lanjut mengenai Microsoft Entra Agent ID dan integrasi Azure AI Foundry dengan Microsoft Purview Compliance Manager.
- Memperkenalkan Microsoft 365 Copilot Tuning dan orkestrasi multi-agen:
Dengan Copilot Tuning, pelanggan dapat memanfaatkan data, alur kerja, dan proses perusahaan mereka sendiri untuk melatih model dan membuat agen secara sederhana dengan pendekatan low-code. Agen-agen ini mampu menjalankan tugas spesifik dengan tingkat akurasi tinggi secara aman dan tetap berada dalam batas keamanan layanan Microsoft 365. Misalnya, sebuah firma hukum dapat membuat agen yang menghasilkan dokumen sesuai dengan keahlian dan gaya khas organisasinya. Selain itu, fitur orkestrasi multi-agen terbaru di Copilot Studio memungkinkan berbagai agen saling terhubung dan bekerja sama, menggabungkan keahlian untuk menyelesaikan tugas yang lebih luas dan kompleks. Pelajari selengkapnya di blog Microsoft 365 untuk mengetahui cara mengakses alat-alat baru ini, termasuk informasi mengenai ketersediaan umum Microsoft 365 Copilot Wave 2 Spring Release yang mulai digulirkan hari ini.
Mendukung agentic web yang Terbuka
Untuk mewujudkan masa depan agen AI, Microsoft terus mengembangkan standar terbuka dan infrastruktur bersama agar dapat menghadirkan kemampuan unik bagi para pelanggan.
- Mendukung Model Context Protocol (MCP): Microsoft memberikan dukungan luas terhadap Model Context Protocol (MCP) di berbagai platform dan framework agen, termasuk GitHub, Copilot Studio, Dynamics 365, Azure AI Foundry, Semantic Kernel, serta Windows 11. Selain itu, Microsoft dan GitHub turut bergabung dalam MCP Steering Committee untuk mendorong adopsi protokol terbuka ini secara aman dan dalam skala besar. Microsoft juga memperkenalkan dua kontribusi baru untuk ekosistem MCP, yaitu spesifikasi otorisasi terbaru yang memungkinkan pengguna memakai metode masuk terpercaya yang sudah ada untuk memberikan akses kepada agen dan aplikasi berbasis LLM ke data serta layanan, seperti penyimpanan pribadi atau layanan berlangganan. Selain itu, terdapat desain layanan MCP server registry yang memungkinkan siapa saja membuat repositori server MCP versi publik maupun privat yang terpusat dan selalu diperbarui. Untuk informasi lebih lanjut, kunjungi repositori GitHub. Saat kami terus mengembangkan kemampuan MCP, fokus utama kami adalah membangun fondasi yang aman. Pelajari pendekatan ini lebih dalam melalui artikel Securing the Model Context Protocol: Building a Safe Agentic Future on Windows.
- Proyek terbuka baru bernama NLWeb: Microsoft menghadirkan proyek terbuka baru bernama NLWeb, yang kami yakini akan memiliki peran penting layaknya HTML dalam dunia agentic web. NLWeb memungkinkan situs web menyediakan antarmuka percakapan yang dapat disesuaikan dengan model pilihan dan data mereka sendiri, sehingga pengguna dapat berinteraksi langsung dengan konten secara lebih bermakna secara semantik. Setiap endpoint NLWeb juga berfungsi sebagai server MCP, sehingga situs web dapat membuat kontennya mudah ditemukan dan diakses oleh agen AI jika mereka menginginkannya. Pelajari lebih lanjut di sini.
Mempercepat Penemuan Ilmiah dengan AI
Sains merupakan salah satu bidang penting dalam pemanfaatan AI untuk menjawab berbagai tantangan besar manusia, mulai dari penemuan obat hingga keberlanjutan. Di Build, kami memperkenalkan Microsoft Discovery, sebuah platform extensible yang dirancang untuk membantu peneliti mengubah proses penemuan secara menyeluruh dengan dukungan agentic AI. Platform ini membantu divisi riset dan pengembangan di berbagai industri mempercepat peluncuran produk baru, sekaligus mendukung percepatan dan perluasan proses penemuan secara menyeluruh bagi komunitas ilmiah. Pelajari di sini
Ini baru sebagian kecil dari berbagai fitur dan pembaruan menarik yang akan kami umumkan di Build. Kami menantikan kehadiran Anda yang sudah mendaftar, baik secara virtual maupun langsung, untuk mengikuti sesi keynote, live coding deep dives, hackathon, dan lainnya — banyak di antaranya juga dapat diakses kapan saja.
Selain itu, Anda akan mendapatkan informasi lebih lengkap dari seluruh pengumuman ini dengan menjelajahi Book of News, kompendium resmi yang berisi seluruh berita hari ini.
Microsoft 365 Copilot Gets Viva Insights Service Plans
Two Workplace Analytics Service Plans to Enable Viva Insights
Microsoft message center notification MC1009917 (last updated 25 April 2025, Microsoft 365 roadmap item 471002) announced the inclusion of Viva Insights in the Microsoft 365 Copilot license. The mechanism used is the addition of two “Workplace Analytics” service plans to join the existing eight service plans (table 1) that make up the Copilot license.
Service Plan | Service Plan SKU | Service Plan Part Number |
Microsoft Copilot with Graph-grounded chat (Biz Chat) | 3f30311c-6b1e-48a4-ab79-725b469da960 | M365_COPILOT_BUSINESS_CHAT |
Microsoft 365 Copilot in Productivity App | a62f8878-de10-42f3-b68f-6149a25ceb97 | M365_COPILOT_APPS |
Microsoft 365 Copilot in Microsoft Teams | b95945de-b3bd-46db-8437-f2beb6ea2347 | M365_COPILOT_TEAMS |
Power Platform Connectors in Microsoft 365 Copilot | 89f1c4c8-0878-40f7-804d-869c9128ab5d | M365_COPILOT_CONNECTORS |
Graph Connectors in Microsoft 365 Copilot | 82d30987-df9b-4486-b146-198b21d164c7 | GRAPH_CONNECTORS_COPILOT |
Copilot Studio in Copilot for Microsoft 365 | fe6c28b3-d468-44ea-bbd0-a10a5167435c | COPILOT_STUDIO_IN_COPILOT_FOR_M365 |
Intelligent Search (Semantic search) | 931e4a88-a67f-48b5-814f-16a5f1e6028d) | M365_COPILOT_INTELLIGENT_SEARCH |
Microsoft 365 Copilot for SharePoint | 0aedf20c-091d-420b-aadf-30c042609612 | M365_COPILOT_SHAREPOINT |
Workplace Analytics (backend) | ff7b261f-d98b-415b-827c-42a3fdf015af | WORKPLACE_ANALYTICS_INSIGHTS_BACKEND |
Workplace Analytics (user) | b622badb-1b45-48d5-920f-4b27a2c0996c | WORKPLACE_ANALYTICS_INSIGHTS_USER |
Table 1: Microsoft 365 Copilot Service Plans
The last update from Microsoft said that updates to add the Viva Insights service plans completed in mid-April 2025.
Viva Insights and Microsoft 365 Copilot
According to Microsoft, access to Workplace Analytics allows “IT admins and analysts can tailor advanced prebuilt Copilot reports with their business data or create custom reports with organizational attributes, expanded Microsoft 365 Copilot usage metrics, and more granular controls.” The data is exposed in Viva Insights (web), the Viva Insights Teams app (Figure 1), and the Viva Insights mobile apps.

Everyone running a Copilot deployment is intimately aware of the need to track and understand how people use AI in different apps. The API behind the Copilot usage report in the Microsoft 365 admin center delivers sparse information. It’s possible to enhance the usage report data with audit data and use the result to track down people who don’t make use of expensive licenses, but that requires custom code. Hence the insights reported in the Copilot Dashboard in Viva Insights.
A note in the announcement says that access to the Copilot Dashboard now requires a minimum of 50 Viva Insights (Copilot) licenses. As obvious from Figure 1, my tenant has fewer than 50 licenses, but can still use Viva Insights because it’s not a new tenant.
What Service Plans Do
As you’re probably aware, a license (product, or SKU) is something that Microsoft sells to customers. A service plan enables or disables specific functionality within a license. For example, the Copilot license includes the Copilot Studio in Copilot for Microsoft 365 service plan, which in turn allows users to create agents in Copilot Studio. If you don’t want people to be able to access Copilot Studio, you can disable the service plan.
Disabling a service plan can be done by updating a user’s licenses through the Microsoft 365 admin center. Options are available to do this through User Accounts or License Details (Figure 2).

If you use group-based licensing, you can amend the options for the Copilot license to remove service plans. However, this affects every user in the group, so you might end up with one group to assign “full” Copilot licenses and another to assign “restricted” licenses.
Be Careful When Disabling Copilot Service Plans
One potential issue with some Copilot service plans is that you’re never quite sure what removing a service plan will do. Removing the Microsoft 365 Copilot in Productivity Apps service plan seems straightforward because it disables the Copilot options in the Office desktop apps (all platforms). But disabling the Intelligent Search service plan will mess up any app that uses Copilot to search.
Blocking Copilot Studio is problematic. Removing the service plan only removes the ability of a user to sign in to use Copilot Studio. They can still sign in for a 60-day trial, just like anyone else with an email address who doesn’t have a Copilot Studio license.
Disabling Copilot Service Plans with PowerShell
Disabling service plans through a GUI can rapidly become tiresome. I wrote a PowerShell script to (downloadable from GitHub) to demonstrate how to use the Set-MgUserLicense cmdlet from the Microsoft Graph PowerShell SDK to disable a Copilot service plan. Another variation on removing service plans is explained here.
The script checks for group-based license assignment for Copilot licenses and if found, creates an array of excluded accounts that it won’t process. It then scans for accounts with a Microsoft 365 Copilot license and if the account isn’t excluded, runs Set-MgUserLicense to disable the Copilot Studio service plan. It’s just an example of using PowerShell to automate a license management operation and is easily amended to process any of the Copilot service plans. Enjoy!!
Stay updated with developments across the Microsoft 365 ecosystem by subscribing to the Office 365 for IT Pros eBook. We do the research to make sure that our readers understand the technology. The Office 365 book package includes the Automating Microsoft 365 with PowerShell eBook.
Time to Review How to Preserve Ex-Employee Data
Microsoft Layoffs Remind Microsoft 365 Tenants About the Need to Preserve Ex-Employee Data
This week’s news that Microsoft is trimming 3% of its global workforce brought shock to those affected by the elimination of their position. My LinkedIn feed has been flooded by updates from people who discovered that they’re in a position that they never anticipated, some of whom have been with Microsoft for many years. I’ve been involved in many downsizing actions at Digital Equipment Corporation, Compaq, and HP, and it’s never easy for managers and employees alike. I wish all those affected the best of luck in finding new positions.
The hope of Microsoft management is probably that the layoffs will result in a leaner, more agile organization, the only goodness for the Microsoft 365 community that comes from the episode is that it’s a great reminder for tenant administrators to review the process used to secure ex-employee information following a termination.
Changes in Microsoft 365 Make It More Complex to Preserve Ex-Employee Data
Ten years ago, the task was relatively simple because fewer types of information needed to be secured. Today, new applications and more integration between applications means that the task is more complex.
The basics remain:
- Terminating access to resources by revoking access tokens, disabling accounts, and changing account passwords.
- Physically securing devices (workstations and mobile devices) or remote wipes to remove corporate content.
- Preserving application information such as mailboxes and OneDrive for Business accounts.
Deleting a user account via the Microsoft 365 admin center (Figure 1) takes care of the basics. To do a more comprehensive job, it’s best to script all the steps with PowerShell.

I recommend using inactive mailboxes to retain mailbox content rather than making a regular user mailbox into a shared mailbox, but advantages exist for both approaches. Happily, not much has recently changed with mailbox retention. The situation is completely different with OneDrive for Business in terms of the app reliance on OneDrive and how Microsoft deals with unlicensed OneDrive accounts.
The Key Role Played by OneDrive for Business
OneDrive for Business has become the de facto storage destination for many Microsoft apps, storing files as diverse as Loop components, Teams meeting recordings, and whiteboards. Microsoft’s enthusiasm knows no boundaries when it comes to storing files in OneDrive for Business. Even PowerShell module installations end up in OneDrive for Business if you’re not careful.
Message center notification MC1053121 (last updated 23 April 2025) describes how users who don’t use the Known Folder Move (KFM) feature to redirect common folders like Documents from local disks to OneDrive will be more aggressively “encouraged” to back up files in OneDrive for Business. This change is rolling out to general availability and should be active worldwide by mid-June 2025. If you don’t like users seeing this kind of prompting, consider the new Restrict KFM from Office policy for the Office apps (see MC1053121 for details).
Because OneDrive for Business accounts owned by ex-employees are so important from a retention perspective, it’s important to ensure an alternative site administrator (usually the ex-employee’s manager) is assigned to these accounts so that any useful information in the account is retained. Moving shared objects like Loop components or files shared in Teams chats from the account will break sharing. Eventually, the organization can remove the OneDrive account. If the account remains online, Microsoft will archive the now-unlicensed OneDrive account. Deleting or archiving the account will also break sharing!
The challenges of dealing with OneDrive accounts owned by ex-employees is one of the reasons why it is important to coach users to store corporate information in SharePoint Online instead of keeping files in OneDrive for Business. Unfortunately, that advice is often observed more in theory than practice.
The New Challenge Posed by Flows and Agents
Power Platform flows are often tied to a user account. If the account goes away or is disabled, the flow will stop working. That shouldn’t be a problem if the process performed by the flow is personal to the now-departed employee. On the other hand, if the flow does something that others depend on, that process is now broken and needs to be fixed.
The same applies to agents. It all depends on what an agent does and who uses it. Personal agents will stop running when an account is no longer available to authenticate and that shouldn’t be a problem. But we’re at the early stages of understanding the development, deployment, and management of agents within Microsoft 365 tenants, and care must be taken to ensure that any agents created and maintained by ex-employees remain functional when needed or are disabled and removed if not. This doesn’t happen automatically when an administrator disables or deletes a user account.
Other Issues Requiring Attention
Apart from personal data, there are other issues that might need attention to preserve ex-employee data, including the ownership of:
- Microsoft 365 groups, security groups, and distribution lists.
- Loop workspaces and the associated SharePoint Embedded container.
- Entra ID apps.
- Recurring meetings.
- Phone numbers for use with the Teams Phone system.
The point is that the Microsoft 365 ecosystem continues to evolve. This means that processes and procedures used to manage access to Microsoft 365 resources must evolve in step. This week’s Microsoft layoffs are a regrettable reminder of that fact.
Keep up with the changing world of the Microsoft 365 ecosystem by subscribing to the Office 365 for IT Pros eBook. Monthly updates mean that our subscribers learn about new developments as they happen.
Microsoft Graph PowerShell SDK V2.28 Attempts to Restore Stability
One Step Forward, Six Steps Back for Flawed Releases
Literally millions of people download and use the Microsoft Graph PowerShell SDK. With the retirement of the older Azure AD and MSOL modules, an obvious spike in the number of downloads occurred, all of which meant that the SDK is now a critical automation component for many Microsoft 365 tenants.
On May 10, 2025, Microsoft released V2.28 of the Microsoft Graph PowerShell SDK to the PowerShell Gallery (Figure 1). This release follows a catalog of woe since the release of V2.26 of the Graph PowerShell SDK on February 25, 2025. In an attempt to stem a cascade of bugs, Microsoft followed up by releasing V2.26.1, and V2.27 in April. It was all to no avail. In a case of one step forward, six steps back, V2.27 addressed a problem with Azure Automation but introduced the disappearing payload issue.

Disappearing Payloads
Graph API requests to create or update objects like users, groups, and policies usually include a JSON-formatted payload containing parameter values or instructions. Graph SDK cmdlets also use payloads, usually formatted as hash tables, that are passed to the underlying Graph API requests when the cmdlets run. You can see the Graph API request and payload used by an SDK cmdlet by including the Debug parameter.
Soon after the release of V2.27, developers complained that cmdlets did not pass the provided payload. An example of the problem is the inability to pass parameters when assigning licenses to user accounts with the Set-MgUserLicense cmdlet. Because license management is such an important task, this problem easily fell into the “must fix quick” category. Another example is when the payload disappears when updating an application with the Update-MgApplication cmdlet, or when creating a new calendar event with New-MgUserEvent ignores the start and end times.
Running what appears to be perfectly good code (often copied from Microsoft documentation) only to run into inexplicable failures is frustrating and annoying. A problem like this happening after a succession of flawed releases is especially worrisome because you’d expect Microsoft to have upped their game and improved software release processes.
Cautious Optimism
At this point, just a few days since the release of V2.28, I am cautiously optimistic. Microsoft is closing SDK issues in GitHub as people test the problems reported with previous releases. I have not experienced any new problems, scripts run without problems (aside from my own bugs), and everything works with PowerShell 5.1 runbooks in Azure Automation, as far as I can see (or rather, test). PowerShell V7 runbooks are still problematic and will remain so until Azure Automation supports PowerShell V7.4 in mid-June 2025.
I guess the takeaway is that V2.28 of the Microsoft Graph PowerShell SDK seems to be as stable as V2.25. Given that Microsoft has fixed some bugs, V2.28 is likely a little better. That’s as far as I would go at this point. V2.28 is definitely worth testing in a development environment to make sure that production scripts run with.
Each installation of the Microsoft Graph PowerShell SDK leaves a bunch of modules on your PC. When you install, make sure that you clean out old files and reboot, just to make sure that the new modules are used. To make things a little easier, I have a script to install and clean up modules on a local PC and another to update the Graph PowerShell modules used with Azure Automation.
Next Steps
I doubt that V2.28 will be perfect. New bugs will emerge, and we already know that some reported bugs are not fixed. One issue that I am tracking is where interactive sessions fail to recognize URIs when running cmdlets (including Invoke-MgGraphRequest) and respond with an “Invalid URI: The format of the URI could not be determined.” error. Running Connect-MgGraph to reconnect the session restores everything to good health, but suddenly losing the ability to run cmdlets is a disturbing problem that Microsoft needs to fix.
Overall, I’m not all that worried about seeing a few new bugs or having to wait a little longer for Microsoft to fix known issues. If you do find a bug, please take the time to report it by filing a report in GitHub. Don’t complain if things are not fixed if you don’t report the problem.
All I want is to see V2.28 resort relative stability to the Microsoft Graph PowerShell SDK in such a way that Microsoft 365 tenants can depend on it for day-to-day management of users, groups, licenses, devices, and other objects. That’s not too much to ask.
Need some assistance to write and manage PowerShell scripts for Microsoft 365? Get a copy of the Automating Microsoft 365 with PowerShell eBook, available standalone or as part of the Office 365 for IT Pros eBook bundle.
Replacing Litigation Holds with Microsoft 365 Retention Policies
Maybe a Microsoft 365 Retention Policy is Better than an eDiscovery Hold
Last month, I wrote about how to replace Exchange Online litigation holds, which only preserve mailbox content, with holds applied by Purview eDiscovery cases. The advantage gained by this exercise is that eDiscovery holds can also secure the OneDrive for Business accounts owned by specific users, including those who leave the company.
My idea works, but it’s unnatural. eDiscovery cases are designed to secure information required by eDiscovery investigations, not to preserve information for indeterminate periods. Retention policies are the designated Microsoft 365 mechanism to retain information. Still, I enjoyed probing how to use eDiscovery case holds, and the good news is that much of the code written to prove the principle can be repurposed for retention policies.
Using a Retention Policy
A Microsoft 365 retention policy can cover many different types of data. In terms of mailbox data, a Microsoft 365 retention policy isn’t as granular as Exchange (“legacy”) retention tags, nor does a Microsoft 365 retention policy support the move to archive action to move items from a primary mailbox into its associated archive mailbox. For these reasons, Microsoft hasn’t deprecated Exchange retention policies and tags.
The question of granularity doesn’t arise with litigation holds because a litigation hold retains everything in the primary and archive mailbox. We can therefore replace litigation holds with a retention policy to hold everything indefinitely, and that policy will place a hold on everything in the mailboxes and OneDrive accounts that are added as locations to the policy.
Dealing with the 1,000-Location Limit
The only real limitation that exists is the maximum number of locations supported for Exchange mailboxes and OneDrive accounts. A retention policy that uses static locations can add up to 1,000 locations for each type. It’s unlikely that a tenant will have more than 1,000 mailboxes on litigation hold, but if this is the case, the choice is to either split the locations across multiple retention policies or use an adaptive scope to identify the mailboxes. A retention policy based on an adaptive scope isn’t subject to the 1,000-location limit.
The easiest way to mark mailboxes to be found by an adaptive scope is to set a value in one of the fifteen custom properties available for mailboxes. Each of the mailboxes (accounts) covered by an adaptive scope requires an Office 365 E5, Microsoft 365 E5, or Microsoft E5 Compliance license.
Creating the Retention Policy and Rule
A retention policy consists of two parts. The policy defines the set of target locations, like Exchange mailboxes, OneDrive accounts, SharePoint Online “classic” sites, and Microsoft 365 groups. Figure 1 shows the target locations for a “standard” retention policy. Specific retention policies can be created for Teams channel messages, Teams chat and Copilot interactions, and Viva Engage (Yammer) community messages.

The policy rule defines the retention settings, or what the policy does to the items found in the target locations. In this instance, the rule is very simple because the idea is to mimic what a litigation hold often does, which is to apply an unlimited hold. Litigation holds do accommodate a limited duration hold, and it would be possible to recreate this kind of hold with a retention policy, but here we’re just proving the principle, so it’s enough to show how to create the retention policy and a rule to hold continue indefinitely. Here’s the code:
Write-Host "Creating Microsoft 365 retention policy to replace litigation holds..." -ForegroundColor Yellow $NewPolicy = New-RetentionCompliancePolicy -Name "Litigation Hold Retention Policy" -ExchangeLocation $MailboxesToHold -OneDriveLocation $OneDriveToHold ` -Comment ("Retention policy to replace litigation holds created by Switch-LitigationHoldsforRetentionPolicies.PS1 script on {0}" -f (Get-Date).ToString("dd-MMM-yyyy")) ` If ($NewPolicy) { Write-Host ("Retention policy {0} created" -f $NewPolicy.Name) -ForegroundColor Green $NewPolicyRule = New-RetentionComplianceRule -Name LitigationHoldRule -Policy "Litigation Hold Retention Policy" -RetentionDuration unlimited ` -Comment "Created by Switch-LitigationHoldsforRetentionPolicies.PS1 script" If ($NewPolicyRule) { Write-Host ("Retention rule {0} created" -f $NewPolicyRule.Name) -ForegroundColor Green } Else { Write-Host "Failed to create retention rule" -ForegroundColor Red Break } } Else { Write-Host "Failed to create retention policy" -ForegroundColor Red Break }
If you want to create a more complicated retention rule, it’s probably best to do so via the Purview compliance portal GUI. You can download the script I used from GitHub.
After applying a retention policy, it can take a few days before the policy becomes fully effective. I’d wait a week and then remove the litigation holds from the mailboxes.
Dump Litigation Holds Now
I don’t hesitate to recommend phasing litigation holds out in favor of retention policies. At this point, litigation holds are a dead-end street that Microsoft is putting little or no effort into. By comparison, Microsoft 365 retention policies are more functional and under active development, which makes them a better long-term bet for meeting the retention needs of Microsoft 365 tenants.
Insight like this doesn’t come easily. You’ve got to know the technology and understand how to look behind the scenes. Benefit from the knowledge and experience of the Office 365 for IT Pros team by subscribing to the best eBook covering Office 365 and the wider Microsoft 365 ecosystem.
Use an OWA Mailbox Policy to Block Attachment Download for the New Outlook for Windows
Make Sure that Users Can’t Download Copies of Attachments to Unmanaged Devices
A recent encounter with David Los in Microsoft’s HQ in Redmond reminded me of a relatively unknown feature of OWA mailbox policies that might be of interest as the new Outlook for Windows progresses. In October 2018, David wrote about how to combine a setting in a OWA mailbox policy with an Entra ID conditional access policy to block the download of attachments on untrusted (unmanaged) devices. It’s a similar idea to the SharePoint Online’s block download access policy.
Fast forward seven years and OWA mailbox policies control many aspects of how the new Outlook for Windows work, so let’s see if the setting works as well for it as it does for OWA.
Updating the Conditional Access Setting for an OWA Mailbox Policy
The magic starts with the ConditionalAccessPolicy setting in a OWA mailbox policy. The values of the setting can be:
- Off (default): Exchange Online doesn’t attempt to apply a CA policy.
- ReadOnly: Users can’t download attachments to make local copies (which means that they cannot use the Office apps to edit files). They can view attachments in the browser.
- ReadOnlyPlusAttachmentsBlocked: User cannot view attachments at all.
To set the block in the OWA mailbox policy, sign into the Exchange Online management PowerShell module with an account holding the Exchange administrator role and run the Set-OWAMailboxPolicy cmdlet to update an OWA mailbox policy. I don’t recommend that you update the default policy unless you want the block to apply to all users. Choose a different policy (or create a new policy by running the New-OWAMailboxPolicy cmdlet instead).
After updating the policy, run the Get-OWAMailboxPolicy cmdlet to check that the setting is in place for the chosen OWA mailbox policy. Note that the ConditionalAccessFeatures property for the policy reports the set of restrictions for OWA to enforce.
Set-OWAMailboxPolicy -Identity NoOfflineAccess -ConditionalAccessPolicy ReadOnly Get-OWAMailboxPolicy -Identity NoOfflineAccess | Format-List ConditionalAccess* ConditionalAccessPolicy : ReadOnly ConditionalAccessFeatures : {Offline, AttachmentDirectFileAccessOnPrivateComputersEnabled, AttachmentDirectFileAccessOnPublicComputersEnabled, AttachmentPrintWithoutDownload}
When the ConditionalAccessPolicy setting is ReadOnlyPlusAttachmentsBlocked, the AttachmentWacViewingOnPrivateComputersEnabled and AttachmentWacViewingOnPublicComputersEnabled are added to the set of restrictions.
Use the Set-CASMailbox cmdlet to apply the OWA mailbox policy to a mailbox. It normally takes about 15 minutes for an updated policy to be effective. In the meantime, run Get-CASMailbox to check which mailboxes come within the scope of the policy, just in case some other mailboxes are affected.
Set-CasMailbox -Identity "Marty.King" -OwaMailboxPolicy 'NoOfflineAccess' Get-CasMailbox -RecipientTypeDetails UserMailbox | Where-Object {$_.OWAMailboxPolicy -eq 'NoOfflineAccess'} | Format-Table DisplayName, OWAMailboxPolicy
Create a Conditional Access Policy to Block OWA Downloads
Figure 1 illustrates the details of the conditional access policy to enforce the blocks specified in the OWA mailbox policy. The session control for the CA policy says: “use app enforced restrictions,” which is the set of restrictions defined in the OWA mailbox policy. The only role conditional access has here is to notify the selected app(s) that they should apply restrictions because the device used for the connection is unmanaged.
The app is Office 365 Exchange Online, the enterprise app used by Exchange Online for many purposes, including OWA (its role in managing hybrid rich coexistence is being replaced by a dedicated tenant app soon).

Testing the Block Download Policy with OWA
To test the policies, I ran OWA on an iPad (an unmanaged device). A banner on messages with attachments informed me that the block on download and printing existed (Figure 2). Microsoft refers to this as the “limited access experience.”

A side-effect of imposing the CA policy is that the light version of OWA is blocked, probably because the light version is so simple that it doesn’t include the necessary smarts to handle the CA policy.
Testing with the New Outlook for Windows
Experience so far of managing the new Outlook is that settings from OWA mailbox policies apply to the Monarch client. Testing confirms that this is also true for conditional access restrictions. Installing and running the new Outlook for Windows on a Windows PC shows that the client picks up the same restriction as applied to OWA (Figure 3).

It’s nice that the restrictions imposed by the OWA mailbox policy work, but it would be nicer if the documentation reflected the fact. I’m sure Microsoft will get around to updating its web pages. In the meantime, to learn more about blocking access to downloads, here’s a Practical365.com article to read.
Learn about managing Exchange Online and the rest of Microsoft 365 by subscribing to the Office 365 for IT Pros eBook. Use our experience to understand what’s important and how best to protect your tenant.
Penetration Test Asks Questions About Copilot Access to SharePoint Online
Can Attackers Use Copilot for Microsoft 365 to Help Find Information?
An article by a UK-based security penetration test company titled “Exploiting Copilot AI for SharePoint” drew my attention to see what weaknesses testing had found. I was disappointed. Although the article makes some good points, it doesn’t tell reveal anything new about the potential issues that can arise due to poor protection of information stored in SharePoint Online sites. Let’s discuss the points raised in the article.
A Compromised Account
Copilot for Microsoft 365 always works as a signed in user. Before an attacker can use Copilot for Microsoft 365, they must be able to sign into a licensed user’s account. In other words, that account is compromised. That’s bad for a tenant because any compromise can lead to data loss or other damage, and it’s probably indicative of other problems that attackers can exploit without going near Copilot.
Organizations should protect themselves with strong multifactor authentication (MFA). That message seems to be slowly getting through, and you’d imagine that any tenant willing to invest in Copilot is also willing to protect themselves by insisting that all accounts are protected by MFA.
Seeking Sensitive Information
The authors make a good point that people often store sensitive information in SharePoint Online. Attackers like to search for information about passwords, private keys, and sensitive documents. Copilot undoubtedly makes it much easier for attackers to search, but I don’t think that the default site agents create any vulnerability because these agents are constrained to searching within the sites they belong to.
Custom agents might be more problematic, but that depends on the information accessed by the agents. It also depends on the penetrated user being able to run the custom agents. The big thing to remember here is that Copilot can only access data available to the account being used. Custom agents in the hands of an attacker can’t automagically get to some hidden data. Anyway, organizations should monitor the creation of agents and have some method to approve the use of those agents.
Accessing Password Data
The penetration team reported that they had found an interesting file (an encrypted spreadsheet) that appeared to contain passwords that SharePoint blocked access to because “all methods of opening the file in the browser had been restricted.” This sounds like SharePoint’s block download policy was in operation for the site. However, Copilot was able to fetch and display the passwords stored in the file.
It’s likely that the spreadsheet was “encrypted” using the default Excel protection applied when a user adds a password to a spreadsheet. However, the encryption is no match for Microsoft Search, which can index the information in the file, and that’s what Copilot for Microsoft 365 Chat was able to display (Figure 1).

Excel’s encryption is very poor protection in the era of AI. Sensitivity labels should be used to secure access to sensitive information, specifically labels that do not allow Copilot to extract and display information from files found by searching against Microsoft Search. Even better, use the DLP policy for Microsoft 365 Copilot to completely hide sensitive files against Copilot so that not even the file metadata is indexed.
Alternatively, use Restricted Content Discovery (RCD) to hide complete sites so that casual browsing by attackers (or anyone else looking for “interesting” information). Apart from RCD, Microsoft makes other SharePoint Advanced Management (SAM) features available to Microsoft 365 Copilot tenants. There’s no excuse for failing to use the access control and reporting features to secure sensitive sites.
Copilot for Microsoft 365 is a Superb Seeker
Copilot for Microsoft 365 is superb at finding information stored in SharePoint Online and OneDrive for Business. With good prompting, an attacker with access to a compromised account can retrieve data faster than ever before, and unlike previous methods of trawling through SharePoint files, Copilot access doesn’t leave breadcrumbs like entries in the last files accessed list.
Copilot access can be constrained by making sure that suitable permissions are in place for documents, deploying the DLP policy for Microsoft 365 Copilot, and limiting access to confidential sites through Restricted Content Discovery. The DLP policy and RCD are recent Copilot control mechanisms that I don’t think the authors of the penetration test report considered (even though they refer to blocking agents with RCD). But available mechanisms are worthless unless implemented, and the real value of reports like this is to prompt administrators to use available tools, including MFA to reduce the likelihood of a compromised account.
Insight like this doesn’t come easily. You’ve got to know the technology and understand how to look behind the scenes. Benefit from the knowledge and experience of the Office 365 for IT Pros team by subscribing to the best eBook covering Office 365 and the wider Microsoft 365 ecosystem.
How to Enhance Copilot Usage Data
Combine Copilot Usage Data with User Account Details to Gain Better Insight for Deployments
Discussing the usage data that’s available for Microsoft 365 Copilot (in the Microsoft 365 admin center and via a Graph API), a colleague remarked that it would be much easier to leverage the usage data if it contained the department and job title for each user. The usage data available for any workload is sparse and needs to be enhanced to be more useful.
Knowing what data sources exist within Microsoft 365 and how to combine sources with PowerShell or whatever other method you choose is becoming a valuable skill for tenant administrators. I’ve been down this path before to discuss combining usage data with audit data to figure out user accounts who aren’t using expensive Copilot licenses. Another example is combining Entra ID account information with MFA registration methods to generate a comprehensive view of user authentication settings.
Scripting a Solution
In this instance, the solution is very straightforward. Use a Graph API call (complete with pagination) to download the latest Copilot usage data, Find the set of user accounts with a Microsoft 365 Copilot license and loop through the set to match the user account with usage data. Report what’s found (Figure 1).

Obfuscated Data and Graph Reports
The thing that most people trip over is matching usage data with user accounts. This is impossible if your tenant obfuscates (anonymizes) usage data. This facility has been available since late 2020 and if the obfuscation setting is on in the Microsoft 365 admin center, all usage data, including the data used by the admin center and Graph API requests is “de-identified” by replacing information like user principal names and display names with a system-generated string.
It’s therefore important to check the settings and reverse it if necessary for the duration of the script to make sure that you can download “real” user information. If you don’t, there’s no way of matching a value like FE7CC8C15246EDCCA289C9A4022762F7 with a user principal name like Lotte.Vetler@office365itpros.com.
Fortunately, I had a lot of code to repurpose, so the script wasn’t difficult to write. You can download the complete script from the Office 365 for IT Pros GitHub repository.
Finding Areas for Focus
Getting back to the original question, I assume the idea of including job titles and departments with Copilot usage data is to figure out where to deploy assistance to help people understand how to use Copilot in different apps. You could do something like this to find the departments with Copilot users who have no activity in the report period (90 days).
Group-Object -Property Department | ForEach-Object { [PSCustomObject]@{ Department = $_.Name UserCount = $_.Group.Count } } $GroupedReport | Sort-Object -Property Department | Format-Table -AutoSize Department UserCount ---------- --------- Analysis and Strategy 3 Business Development 1 Core Operations 57 Editorial 1 Group HQ 1 Information Technology 3 Marketing 22 Planning & Action 1 Project Management 1 Research and Development 1
With this kind of output, the team driving Copilot adoption and use for the organization would be wise to spend some time with the Core Operations and Marketing departments to ask why so many of their users don’t appear to be using Copilot.
As noted above, understanding how to use PowerShell to mix and match data sources to answer questions is a valuable skill. There’s lots of data available in a Microsoft 365 tenant. That data is there to be used!
Need some assistance to write and manage PowerShell scripts for Microsoft 365? Get a copy of the Automating Microsoft 365 with PowerShell eBook, available standalone or as part of the Office 365 for IT Pros eBook bundle.
The Downside of Losing the Exchange Mailbox Audit Search Cmdlets
Finding Exchange Mailbox Audit Data Isn’t So Easy Anymore
From an engineering perspective, Microsoft’s decision to decommission the Search-MailboxAuditLog and New-MailboxAuditLogSearch cmdlets makes a ton of sense. Microsoft 365 apps consume shared services, and the unified audit service ingests the data used by these Exchange Online cmdlets. Why incur the engineering and support expense to keep the old on-premises cmdlets going?
Microsoft posted the news on January 14, 2025, and stopped writing audit log data to mailboxes on March 1, 2025. The cmdlets will disappear at the end of 2025. You might have missed this information because Microsoft posted to the security blog instead of the Exchange EHLO blog, where all the other Exchange-related news appears. Perhaps this is because audit data is related to Microsoft Purview and the topic therefore is in the security space. However, losing cmdlets that might be used in Exchange-related administrative processes is a big deal deserving better awareness.
In 2016, Exchange mailbox audit data was one of the first sources of audit events for the unified audit log. Ever since, mailbox audit data has flowed into the unified audit log and can be found by audit log searches, so what’s the problem?
Searching the Unified Audit Log for Exchange Mailbox Audit Data
Searches of the unified audit log can be performed synchronously using the Search-UnifiedAuditLog cmdlet or asynchronously through the Audit section of the Purview compliance portal or by submitting a job through the Graph AuditLogQuery API. Audit log searches can find mailbox data among the many other forms of workload data ingested on an ongoing basis, and searches can go back 180 days (audit standard) or 365 days (audit premium). It all sounds good.

But people build processes around PowerShell cmdlets, and when a cmdlet disappears, those processes must be redeveloped. In this instance, any script that uses the deprecated cmdlets must be altered, probably to use the Search-UnifiedAuditLog cmdlet. And let’s face it, even its biggest fans (and I’m probably in that category) wouldn’t consider Search-UnifiedAuditLog to be an easy cmdlet to use, and Microsoft has tinkered with the way the cmdlet functions over the years. Thankfully, they’ve retreated from the idea of making high completeness (very slow) searches the norm.
The parameters for audit log searches can be complex to construct, duplicate audit records can be retrieved, and there’s always the need to unpack the JSON structure contained in the AuditData property to find out what actually happened for the auditable event.
Those accustomed to interacting with the AuditData property know that every workload decides what information to include in audit events and how that data is formatted. Extracting properties from AuditData usually isn’t hard, but it’s tiresome to see how many variations Microsoft engineers can come up with when inserting data into audit events.
Apart from the issue of interpreting audit events, there’s also the simple fact that it’s easier to extract audit data for the actions of a single user from their mailbox. Finding the relevant information about mailbox events from the unified audit log is more complicated.
Find Exchange Mailbox Audit Data for a Single Mailbox
The easiest way to find audit records for a specific mailbox with the Search-UnifiedAuditLog cmdlet is to pass the user principal name for the mailbox owner (or, to search multiple mailboxes, a set of user principal names) in the UserIds parameter. Here’s an example that finds the audit records for a mailbox and reduces the set to those belonging to Exchange actions:
$RecordType = "ExchangeAdmin","ExchangeItem","ExchangeItemAggregated","ExchangeItemGroup","ExchangeSearch" [array]$Records = Search-UnifiedAuditLog -Userids ‘kim.akers@office365itpros.com' -StartDate (Get-Date).AddDays(-1) -EndDate (Get-Date) -Formatted -ResultSize 5000 -SessionCommand ReturnLargeSet $Records = $Records | Where-Object {$_.RecordType -in $RecordType} | Sort-Object Identity -Unique
Searching based on user principal names finds audit records for actions performed by that user. If you want to find audit records for actions performed by a mailbox delegate, use a free text search for the object identifier of the mailbox owner’s account. The free text search finds references to the mailbox owner in the AuditData property and includes those records in the set returned. Here’s an example of using an account identifier in a free text search. It’s important that the identifier is cast as a string as otherwise the search will fail because it will attempt to use a GUID where the cmdlet expects a string:
[array]$Records = Search-UnifiedAuditLog -Freetext ((Get-ExoMailbox -Identity Tony.Redmond).ExternalDirectoryObjectId -as [string]) -StartDate (Get-Date).AddDays(-90) -EndDate (Get-Date) -Formatted -ResultSize 5000 -SessionCommand ReturnLargeSet $Records = $Records | Where-Object {$_.RecordType -in $RecordType} | Sort-Object Identity -Unique
The Bottom Line
You might not have been aware of the change to the old cmdlets. They still work (for now), but mailbox audit data generated since March 1, 2025, cannot be retrieved using the cmdlets. In any case, it’s a good idea to check scripts to find any instances where the old cmdlets are used. The bad news is that those scripts must be redeveloped. Good luck!
How to Permanently Remove Mailbox Items with the Graph API
Permanent Deletion for Message and Other Types of Items from User Mailboxes
On April 1, 2025, Microsoft announced the availability of APIs to permanently delete mailbox items. This news might well have passed you by because the post appeared in the developer blog rather than anything a Microsoft 365 tenant administrator might see.
The APIs are intended to fill in some gaps in Graph API coverage for mailbox items compared to Exchange Web Services (EWS). It’s part of the campaign to remove EWS from Exchange Online by October 2026. An example of where permanent removal of mailbox items is needed is when migrating mailboxes from one tenant to another. After a successful move, the migration utility might clean up by removing items from the source mailbox.
In any case, APIs are now available to permanently delete mail message, mail folder, event, calendar, contact, and contact folder objects.
What Permanent Removal Means
In this context, permanent removal means that no client interface exists to allow the user to recover the message. For example, users can’t use Outlook’s Recover Deleted Items facility to retrieve the deleted items and administrators can’t use the Get-RecoverableItems cmdlet to do likewise (or appear in a report of recoverable items).
The reason why this is so is that when Outlook deletes items in the Deleted Items folder, the items move to the Deletions folder within Recoverable Items. When the API deletes an item, the item moves to the Purges folder. If the item is not subject to a hold, the Managed Folder Assistant will remove it the next item the mailbox is processed. If it is subject to a hold, the item remains in the Purges folder until the hold lapses.
Permanent Removal with the Microsoft Graph API
Two pieces of information are needed to permanently remove a message item using the Graph API: the object identifier for the account that owns the mailbox and the message identifier. Let’s assume that you have a variable containing details of a message:
$Message | Format-List Subject, CreatedDateTime, Id Subject : Thank You for Subscribing CreatedDateTime : 06/05/2022 06:47:28 Id : AAMkADAzNzBmMzU0LTI3NTItNDQzNy04NzhkLWNmMGU1MzEwYThkNABGAAAAAAB_7ILpFNx8TrktaK8VYWerBwDcIrNcmtpBSZUJ1fXZjZ5iAB_wAYDdAAA3tTkMTDKYRI6zB9VW59QNAAQnaACXAAA=
To delete the item, construct a URI pointing to the message and post the request to the messages endpoint. This example shows where the variables for the user identifier and message identifier are in the URI:
$Uri = ("https://graph.microsoft.com/v1.0/users/{0}/messages/{1}/permanentDelete" -f $UserId, $Message.Id) $Uri https://graph.microsoft.com/v1.0/users/eff4cd58-1bb8-4899-94de-795f656b4a18/messages/AAMkADAzNzBmMzU0LTI3NTItNDQzNy04NzhkLWNmMGU1MzEwYThkNABGAAAAAAB_7ILpFNx8TrktaK8VYWerBwDcIrNcmtpBSZUJ1fXZjZ5iAB_wAYDdAAA3tTkMTDKYRI6zB9VW59QNAAQnaACXAAA=/permanentDelete Invoke-MgGraphRequest -Uri $Uri -Method Post
The Graph API doesn’t ask for confirmation before proceeding to remove the item and it doesn’t provide a status to show that the deletion was successful. The only indication that something happened is found by using the Get-MailboxFolderStatistics cmdlet to see if the items in the Purges folder increase:
Get-MailboxFolderStatistics -FolderScope RecoverableItems -Identity Tony.Redmond | Format-Table Name, ItemsInFolder Name ItemsInFolder ---- ------------- Recoverable Items 0 Deletions 2135 DiscoveryHolds 2543 Purges 16 SubstrateHolds 12 Versions 79
Alternatively, use the MFCMAPI utility to examine the items in the Purges folder. Figure 1 shows that the “Thank you for subscribing” message is in the Purges folder.

Permanent Removal with the Microsoft Graph PowerShell SDK
The Remove-MgUserMessagePermanent cmdlet does the same job as the Graph API request:
Remove-MgUserMessagePermanent -UserId $UserId -MessageId $Message.Id
Once again, there’s no status or confirmation required for the deletion to proceed. The other Microsoft Graph PowerShell SDK cmdlets to permanently remove objects are:
- Remove-MgUserMailFolderPermanent: Remove mail folder
- Remove-MgUserCalendarPermanent: Remove calendar.
- Remove-MgUserEventPermanent: Remove calendar event.
- Remove-MgUserContactPermanent: Remove contact.
- Remove-MgUserContactFolderPermanent: Remove contact folder.
All the cmdlets work in the same way. Deletion is immediate and permanent.
Adding new automation capabilities by extending APIs is always welcome. I just need to find a suitable use case for the new cmdlets.
Need some assistance to write and manage PowerShell scripts for Microsoft 365? Get a copy of the Automating Microsoft 365 with PowerShell eBook, available standalone or as part of the Office 365 for IT Pros eBook bundle.
How Microsoft 365 Copilot Tenants Benefit from SharePoint Advanced Management
Ignite Announcement About SAM for Copilot Customers Misinterpreted by Many
At the Ignite 2024 conference, Microsoft announced that “Microsoft 365 Copilot will now include built-in content governance controls and insights provided by SharePoint Advanced Management.” At the time, and still broadly believed, the assumption was that Microsoft would provide customers with Microsoft 365 Copilot licenses with SharePoint Advanced Management (SAM) licenses. Maybe even a single SAM license would be sufficient to license SAM technology alongside Copilot. That’s not the case.
If you’ve been waiting for a SAM license to appear in your tenant, you’ll be disappointed and won’t see SAM listed in the set of tenant subscriptions. Don’t be swayed by the banner in the SharePoint Online admin center to announce that your SharePoint Advanced Management subscription is enabled (Figure 1). It’s not. Access to SAM features is granted through a check enabled in code for the presence of Copilot. The necessary update is now broadly available to customers.

SAM Features for Microsoft 365 Copilot Customers
The facts are laid out in the SAM documentation. Customers with eligible Copilot licenses can use some, but not all, SAM functionality without a SAM license. Here’s the list:
- Site Lifecycle Policy
- Inactive SharePoint sites policy
- Site Ownership Policy
- Data Access Governance (DAG) Insights
- “Everyone Except External Users” (EEEU) insights
- Sharing Links and Sensitivity Labels
- PowerShell: Permission state report for SharePoint and OneDrive Sites, and Files
- Sharing links report
- Site Access Review
- Restricted Content Discovery (RCD – enabled via PowerShell)
- Restricted Access Control (RAC) for SharePoint and OneDrive for Business.
- Recent Admin Actions and Change History
- Block Download Policy
- SharePoint and OneDrive sites
- Teams recordings
There’s some good stuff here, particularly Restricted Content Discovery (RCD), the Site Lifecycle Policy to manage inactive sites, and the Block download policy. Every tenant with Microsoft 365 Copilot should consider enabling RCD to block Copilot access to sites containing sensitive Office and PDF files and sites containing old and obsolete material (the digital rot or debris that clutters up so many tenants).
The problem with Copilot reusing sensitive material in its responses is obvious. The issue with Copilot reusing old, obsolete, and potentially misleading content in its responses is equally problematic, especially if human checks don’t catch errors in responses. Copilot doesn’t know when a Word document written ten years ago is outdated and inaccurate. All Copilot sees is words that can be processed and reused.
When SAM is Needed
All of which brings me to a point where a SAM license is required. In my case, I wanted to test the extend SharePoint protections with a default sensitivity label feature. The idea here is to make sure that unlabeled files receive protection when downloaded by applying a sensitivity label with equivalent rights to those enjoyed by site users. Defining a default sensitivity label for a document library already requires an Office 365 E5 license or equivalent. Why this slight extension wanders into the need to have SAM is another example of bizarre Microsoft licensing.
The documentation notes that Copilot can’t currently open files with sensitivity labels applied in this manner. This means that Copilot cannot extract the protected content to use in its responses because it doesn’t have the right to do so. However, Copilot can search the metadata of labeled files and show that metadata to those who perform searches. Restricted Content Discovery is the right way to block Copilot access to files.
Anyway, without a SAM license, I can’t test. Do I want to pay Microsoft for a license for the privilege of testing their software? I don’t think so.
Copilot in Word for iOS
In closing, I attempted to use a new feature in Word for iOS (and Android) to dictate some notes for this article for Copilot to reason over and produce a draft. The feature is covered in MC1060866 (23 April 2025) and deployment has begun, which is why I guess I could use it. The dictation part worked, even if some of my words were misunderstood (Figure 2). But any attempt to have Copilot do some magic failed utterly. I guess that AI can’t help me…

Support the work of the Office 365 for IT Pros team by subscribing to the Office 365 for IT Pros eBook. Your support pays for the time we need to track, analyze, and document the changing world of Microsoft 365 and Office 365.
Microsoft Extends DLP Policy for Copilot to Office Apps
Same DLP Policy for Copilot Used to Block BizChat
On May 1, Microsoft announced that the public preview of the DLP policy for Microsoft 365 Copilot is effective for the Office apps (MC1059677, 21 April 2025, Microsoft 365 roadmap item 423483). The new functionality is an extension of the DLP policy introduced in March 2025. At that time, the policy only covered Microsoft 365 Copilot Chat (BizChat). Its extension to cover the Office apps (desktop and web) is logical, even if the implementation is different. We’ll get to what those differences are shortly.
How the DLP Policy for Copilot Works
As a quick refresher, the DLP policy for Copilot works by checking if a file is assigned a specific sensitivity label. If true, the Copilot functionality built into the app is limited and the content of the file cannot be used in Copilot responses, such as creating a document summary.
Apps are responsible for checking if a DLP policy is active within the tenant and what sensitivity labels are associated with the policy, so the announcement marks the inclusion of the necessary code in the Office apps to check for the DLP policy. I tested with Microsoft 365 Enterprise Apps version 2504 (build 18730.20122).
Like any other DLP policy, the policy can have multiple rules. In this case, rules for the DLP policy for Copilot block access for a sensitivity label, so if you want to block access for multiple sensitivity labels, the DLP policy has a separate rule for each label. If you created the DLP policy for Copilot to use with BizChat, you don’t need to do anything to extend the policy to cover the Office apps.
Using the DLP Policy for Copilot in Word
As an example, I created a Word document and tested that all the Copilot functionality worked as expected. I saved the document and reopened it to force Copilot to generate the automatic summary.
I then applied one of the sensitivity labels covered by a rule in the DLP policy for Copilot and tried out some of the Copilot features. As you can see from Figure 1, the automatic summary was not removed (but the summary cannot be updated), and asking Copilot to explicitly summarize the document fails because “your organization’s policy doesn’t allow it.” However, it looks like Copilot can query the content of the document to answer questions in chat.

In their announcement, Microsoft says that “Copilot actions like summarizing or auto-generating content directly in the canvas are blocked.” They also say that chatting with Copilot is also blocked, but as you can see in Figure 1, Copilot answered a predefined question (“What is the purpose of DLP for M365 Copilot”) quite happily. On the other hand, if you go to the Message Copilot section and input the same question, Copilot refuses to answer. The block on chat worked in the web app but not always in the desktop version of Word (but this is preview software, so some bugs are expected).
Finally, Copilot cannot reference a file protected by one of the sensitivity labels covered by the DLP policy (an action that forces Copilot to extract the content of the referenced document).
Maybe Just Turn Copilot Off
I’ve used Copilot for nearly two years, and I was initially confused by the effect the DLP policy for Copilot has on the Office apps. To me, it would be simpler and more understandable to disable Copilot completely for documents within the scope of the DLP policy. I would remove the Copilot button from the menu bar and make sure that no UI elements that expose any Copilot feature, like the automatic summary appear. Right now, the UI is a confusing mishmash of things that work and stuff that doesn’t that needs to be cleaned up.
Learn how to exploit the data available to Microsoft 365 tenant administrators through the Office 365 for IT Pros eBook. We love figuring out how things work.
The Return of the General Channel
Teams Can Have a General Channel Just Like Before
In July 2024, Microsoft announced that team owners would be able to rename the General channel (or local language value) of teams. The idea was that “General” is just too general in nature and that it would be better if team owners could assign a more meaningful name to the first channel created in a team. Once
Now Microsoft has reversed course a tad. Message center notification MC1048628 (updated 9 April 2025) says that team owners can choose General as the name for the first channel. The new channel creation UI even has a button to set the channel name to “General” (Figure 1). The change is already effective in targeted release tenants and will roll out worldwide in mid-May 2025.

The big thing about using General as the default channel name is that the General channel is always listed first in the channels for a team. If you use a different name for the first channel, Teams orders the channel list alphabetically. You can see the effect of renaming the General channel in Figure 2.

Channel Creation Made Easier
MC1053645 (11 April 2025, Microsoft 365 roadmap item 479744) describes another channel-related change that will roll out to targeted release tenants in early May. The option to create a new channel is now present in the New Items menu (Figure 2).

Recent conference appearances by the Teams development group have emphasized that users should create channels rather than new teams. With 1,000 channels available in a team, there’s lots of room to avoid creating new teams with the attendant overhead that comes with a team. The more teams in a tenant, the higher the likelihood for digital debris. That wasn’t such a problem years ago, but digital debris can influence the accuracy and usefulness of AI-generated content, so it’s a real issue now.
No More Code Snippets
In other Teams news related to channels, MC1055554 (15 April 2025) announces the retirement of the code snippets feature in chat and channel conversations starting May 30, 2025. Microsoft is replacing code snippets with code blocks. Type /code in the editor or click on the code block icon in the menu bar to insert a new block, and then select the type of code so that the block displays the code appropriately (Figure 4).

Microsoft believes that code blocks are faster and more efficient. Line numbers aren’t current available in code blocks but will be soon, and code blocks will also be viewable on mobile clients.
You might ask what’s driving the change. I think it’s a matter of Teams dropping an older component that doesn’t probably get much use for a shared component that’s under active development. Microsoft says that the change will allow users to “create, edit, and share code directly in the compose box without needing a title.” That’s true when someone composes a message, but if you want channel or chat members to be able to edit code in a code block, considering using the Loop paragraph component and format it as code (Figure 5).

Posting a Loop component to a channel allows team members to edit the content, so it’s possible to have real-time collaboration to discuss code issues and potential solutions. Loop components posted in this manner are stored in the channel folder in the document library of the SharePoint Online site belonging to the team.
Adieu Classic Teams
Another change that’s coming up is that the classic Teams client will be unavailable after July 1, 2025 (MC1059667, 21 April 2025). Microsoft will block attempted access to Teams with the classic client after that date. It really is time to embrace the new (well, slightly used) Teams client.
Learn about using Teams and the rest of Microsoft 365 by subscribing to the Office 365 for IT Pros eBook. Use our experience to understand what’s important and how best to protect your tenant.
May 2025 Update for the Office 365 for IT Pros eBook
Monthly Update #119 Now Available for Subscribers to Download

The Office 365 for IT Pros writing team is proud to announce the availability of monthly update #119. Subscribers can download the updated files using the link in the receipt emailed to them when they bought Office 365 for IT Pros (2025 edition). The link always fetches the latest files. For more details about downloading updates, see our FAQ. Details about the changes in update #119 are in our change log.
Automating Microsoft 365 with PowerShell
Updated files are also available for the Automating Microsoft 365 with PowerShell eBook. We posted a note about update #11 a couple of days ago because we try to get this update out before focusing on the big book. Since then, we’ve added some more information, and the current version of the PowerShell book is 11.3.
The earlier post contained some information about bugs in V2.27 of the Microsoft Graph PowerShell SDK. More bugs have been reported since, and a common problem appears to be that the payload used to create or update objects “disappears” when the Graph SDK translates the cmdlet parameters into Graph API requests. There’s a batch of issues listed in the SDK GitHub repository, including a problem assigning licenses to user accounts. Collectively, the bugs make us believe that it’s not a good idea to update to V2.27. Stay with V2.25, which is the last solid release of the Microsoft Graph PowerShell SDK.
Copilot Wave 2 and the M365 Conference
A week ago, Microsoft announced Copilot Wave 2 spring release. The updates include new agents, a new agent store, better personalization, and Copilot notebooks. Having yet another notebook is a depressing thought. Maybe Microsoft could have integrated Copilot better into Loop or OneNote? Just a thought.
Next week, the Microsoft 365 “Community Conference” takes place in Las Vegas, NV. I won’t be there. My experience from last year’s event in Orlando confirmed my feeling that this isn’t a community conference at all. It’s dominated by Microsoft, who spend a lot of money for the privilege of branding, multiple keynotes, and many conference sessions. If it were a community event, there would be a higher percentage of sessions covering the experience of working with today’s products instead of marketing sessions about the future.
The other problem I have with the event is that it doesn’t cover all of Microsoft 365. This is an event deep in SharePoint Online, OneDrive for Business, and Teams, all covered with a rich coating of Copilot for Microsoft 365. There’s room for topics like Microsoft Mesh, Loop, Viva Connections, Power Pages, and Viva Engage, but other parts of Microsoft 365 are excluded because they are not part of the sponsoring business unit. A strong impression is that the conference organizers believe that everyone will write agents and everyone has Copilot for Microsoft 365, and that’s not reality. But organizers will do what sponsors want.
If you attend the conference, don’t expect to hear much about the Microsoft 365 substrate, Exchange Online, Entra ID, Intune, Sentinel, Microsoft Defender, the Microsoft Graph, and PowerShell, all of which play important roles in a Microsoft 365 deployment. Success with SharePoint Online and Teams only happens when tenants are built on a strong and secure foundation, and I think this conference completely misses that point. The organizers will plead that they can only schedule the sessions submitted for consideration. That’s not true. It’s always possible for conferences to find speakers to cover important topics (I’ve done this several times).
I’m sure that the conference attendees will have a fun time in Vegas. It’s always nice to get away from the office to focus on new things. It’s just sad when a major conference purporting to cover Microsoft 365 does such a poor job of covering the essentials.
Back to Writing
Returning to Office 365 for IT Pros, where we do our level best to cover all the important pieces in a Microsoft 365 infrastructure, we’re working on update #120 for the Office 365 for IT Pros eBook, which we plan to make available on June 1, 2025. Have a great May!
Microsoft Introduces Control for Direct Send in Exchange Online
Moving Exchange Online Away from Unauthenticated Connections with Reject Send

If your tenant still has devices that send email to Exchange Online, you should pay attention to the April 28 announcement about more control over the Direct Send feature. This step is part of the overall campaign to improve the security of Exchange Online that’s included initiatives like removing support for Exchange Web Services (EWS) and only accepting inbound mail from supported versions of Exchange Server in hybrid configurations.
Direct Send is a method for devices or applications to unauthenticated send email to Exchange Online recipients using an external mail server using an accepted domain for a Microsoft 365 tenant. No mailbox is required, so Direct Send is a relatively painless way to set up an email connection to internal recipients (Exchange Online rejects messages sent to external recipients).
Authenticated Connections Preferred
Because authenticated connections are used, Microsoft would prefer customers to use client SMTP submission (SMTP AUTH) or SMTP relay instead of Direct Send. The announcement says that Reject Send is a new option to disable Direct Send by default. If they don’t need to use Direct Send, tenants should use Reject Send to block Direct Send because it’s a method that could be exploited by spammers.
SMTP AUTH is next on the list for upgrade as it will lose the ability to connect with Basic authentication in September 2025. Devices and apps that use basic auth today, for instance to send email using the PowerShell Send-MailMessage cmdlet, must be upgraded to use OAuth connections or they will lose the ability to send messages via Exchange Online. Authenticating SMTP connections via OAuth is not a matter of changing out cmdlets, so if a tenant hasn’t started that work to make sure that apps and devices continue working after the September deadline, they’re behind the curve and need to accelerate.
The Reject Send Feature
Direct Send email is anonymous (messages don’t come in via a connector). In the past, this didn’t matter so much because the messages came from devices or apps controlled by you and submitted using a domain owned by the organization. Reject Send works by updating the Exchange organization configuration to instruct the transport service to reject any unauthenticated messages submitted by Direct Send.
Reject Send is currently an opt-in feature, so the RejectDirectSend setting in the organization configuration is set to false. To enable Reject Send, connect to Exchange Online PowerShell as an administrator and run the Set-OrganizationConfig cmdlet:
Set-OrganizationConfig -RejectDirectSend $True
Exchange Online organizational settings need time to percolate to all the mailbox servers used by a tenant, so it could take up to 30 minutes before the update is effective across a tenant. Once the block is effective, messages submitted via Direct Send will then a 550 5.7.68 error. Of course, unless someone is checking devices for errors in mail transmission or notices that expected messages don’t arrive, those errors might remain undetected.
Microsoft says that they plan to enable Reject Send by default for new tenants. The logic here is impeccable. If you’ve never used the feature, don’t get the habit. Reject Send is a preview feature to allow customers to test. An issue with forwarding and Sender Rewriting Scheme (SRS) is documented in the announcement, and Microsoft does not provide a date for general availability.
Before Reject Send can reach general availability, Microsoft must deliver the promised “optics” (a report) to give administrators insight into the level of Direct Send traffic within a tenant. Assuming that the report turns up soon and unless big problems are uncovered during the preview, I’d expect Reject Send to be fully available by the end of 2025.
Connectors Required
It’s possible that some existing mail will be affected by enabling Reject Send. If so, that email must be authenticated by routing across a partner mail flow connector.
SMTP AUTH is the Immediate Priority
There’s not much else to say about Reject Send. If you have a test tenant that mimics the operational environment (complete with apps and devices), you should enable Reject Send and see what happens. You could do the same for the production tenant, but only when prepared to track problems with devices and apps. A better idea might be to wait for the promised report to understand the level of Direct Send traffic within the organization.
Given the looming deadline for SMTP AUTH to lose support for basic authentication, this is likely to remain the immediate priority for upgrade. September isn’t that far away, especially when the prime vacation period is in the middle.
So much change, all the time. It’s a challenge to stay abreast of all the updates Microsoft makes across the Microsoft 365 ecosystem. Subscribe to the Office 365 for IT Pros eBook to receive monthly insights into what happens, why it happens, and what new features and capabilities mean for your tenant.
How to Find Active EWS-Based Apps in a Microsoft 365 Tenant
Use the Exchange Web Services Usage Report to Track Down the Apps Still Using EWS
On April 22, I wrote about the steps Microsoft is taking to prepare for the removal of Exchange Web Services (EWS) from Exchange Online through the introduction of a dedicated app for hybrid interoperability. Essentially, the new app will take over as the fulcrum for fetching data such as free/busy information from on-premises mailboxes, first using EWS before moving to Graph API requests later this year.
This is an example of Microsoft preparing first-party apps before retiring EWS. Third-party apps running in tenants might also still use EWS. It’s important to check if such apps exist so that contact can made with the app vendor to ascertain their plans for EWS retirement. To help with the process, the reports section of the Microsoft 365 admin center has an EWS usage report (Figure 1).

Validating Apps Listed in the EWS Usage Report
The report details the application identifier, SOAP action (API call) and volume, and the last activity date. Application identifiers make a lot of sense to Microsoft 365 (and more specifically, Entra ID), but they’re hard for humans to understand. Fortunately, it’s easy to resolve the application identifiers for many Microsoft apps by consulting the Verify first-party Microsoft apps in (Entra ID) sign-in reports page. A quick check against the apps reported for my tenant found the following apps:
- Office 365 Exchange Online (00000002-0000-0ff1-ce00-000000000000).
- Office 365 SharePoint Online (00000003-0000-0ff1-ce00-000000000000)
- Teams (1fec8e78-bce4-4aaf-ab1b-5451cc387264).
- Microsoft Office (d3590ed6-52b3-4102-aeff-aad2292ab01c)
- Microsoft Outlook (5d661950-3475-41cd-a2c3-d671a3162bc1)
- Teams Web Chat (5e3ce6c0-2b1f-4285-8d4b-75ee78787346).
None of these are surprising. EWS has long been used for calendar lookups, and Teams uses EWS in its middle tier to communicate with Exchange. The apps listed here probably use EWS to fetch information about the current calendar status for users to display that status in their profile data.
Checking for Other Apps
Two explanations exist if you find an application identifier that isn’t in Microsoft’s list of first-party applications. The app is either owned by Microsoft but didn’t make it onto the list for some reason. The more likely reason is that it’s a third-party or custom-developed app that uses EWS.
You can resolve the application identifier by searching the set of enterprise applications in the Entra admin center or with PowerShell. Figure 2 shows an extract of the set of enterprise apps with Teams in the name. You can’t search by application identifier or even sort the set of apps by application identifier, so finding the right app can be tiresome.

Instead of grappling with the Entra admin center UI, it’s usually faster to search for an enterprise application with PowerShell. In this case, I create an interactive Microsoft Graph PowerShell SDK session with the Application.Read.All scope (permission) and use the Get-MgServicePrincipal cmdlet to look for the application with a specific identifier. Once you know the name, you can find other details by examining the app’s properties through PowerShell or the Entra admin center.
Connect-MgGraph -Scopes Application.Read.All Get-MgServicePrincipal -Filter "Appid eq '5d661950-3475-41cd-a2c3-d671a3162bc1'" | Select-Object DisplayName, AppId DisplayName AppId ----------- ----- Microsoft Outlook 5d661950-3475-41cd-a2c3-d671a3162bc1
Time Ebbing Away
Microsoft plans to retire EWS from Exchange Online on 1 October 2026. That seems like a long time away, but it’s not if you have to track down the developers of EWS apps built for your organization internally or externally. Unlike other deadlines, Microsoft won’t extend the retirement date for EWS because the API is considered insecure and a prime method for attackers to exfiltrate data from a compromised tenant.
Perhaps your EWS usage report will only contain references to Microsoft first-party apps. If so, you’re all set. If not, it’s time to get moving and either retire or upgrade apps.
Support the work of the Office 365 for IT Pros team by subscribing to the Office 365 for IT Pros eBook. Your support pays for the time we need to track, analyze, and document the changing world of Microsoft 365 and Office 365.
Automating Microsoft 365 with PowerShell Update #11
Over 300 Pages of Microsoft 365 PowerShell Goodness to Read

The Office 365 for IT Pros writing team are pleased to announce the availability of update 11 for the Automating Microsoft 365 with PowerShell eBook. The eBook is part of the Office 365 for IT Pros (2025 edition) bundle and is also available separately (PDF and EPUB formats) or from Amazon in Kindle and paperback formats. The current version is dated 24 April 2025 and has the version number 11.1.
We typically release an updated version of Automating Microsoft 365 with PowerShell several days before the release of the monthly update of the Office 365 for IT Pros eBook. This approach makes it easier for us to manage the updates for the “big book.” We anticipate that monthly update #119 for Office 365 for IT Pros will be available on May 1.
Subscribers to the Office 365 for IT Pros bundle or to the Automating Microsoft 365 with PowerShell eBook can download the latest files by using the link in the receipt sent to them from Gumroad.com after their original purchase. See our FAQ for more details about how to download updated book files.
New Microsoft Graph PowerShell SDK Version
Microsoft released V2.27 of the Microsoft Graph PowerShell SDK on April 20. This is an important update because it had to address the many woes inflicted on customers with the buggy V2.26 and V2.26.1 releases. Azure Automation runbooks remain an issue (stay with V2.25 if you want to use PowerShell V7.1 or V7.2 runbooks) that will be addressed when Microsoft ships support for PowerShell V7.4 for Azure Automation on June 15, 2025. Two issues must be cleaned up: a clash between the SDK and Exchange Online PowerShell and support for .NET 8. In the interim, V2.27 runs fine with V5.1 runbooks.
License Assignment Bug
After several days of intensive work with V2.27 in interactive and app-only modes, I haven’t noticed any of the obvious flaws that affected its predecessors. Some early cmdlet oddities were cleared up by rebooting my PC. These were likely due to some lingering older components hanging on in memory. Following the reboot, all is well. Then I heard about problems with the Set-MgUserLicense cmdlet (issue #3286) where new licenses cannot be assigned to accounts. It seems like the cmdlet has problems parsing the information passed in the AddLicenses parameter. However, passing the license data in a body parameter works:
$LicenseData = @{ addLicenses = @( @{ disabledPlans = @() skuId = "f30db892-07e9-47e9-837c-80727f46fd3d" } ) removeLicenses = @() } Set-MgUserLicense -Userid $User.id -BodyParameter $LicenseData
Speaking of bugs, if you encounter a problem with V2.27, please report details of the issue and steps to reproduce the problem via the GitHub repro for the SDK. Reporting an issue doesn’t take long and it is really helpful to have issues documented. Microsoft engineering monitors the open issues list and does their best to respond to problems that might affect many customers (like the license issue described above). If you don’t report problems, don’t complain when an SDK cmdlet doesn’t work the way you expect it to.
On to The Next Update
The Automating Microsoft 365 with PowerShell eBook is now well over 300 pages. That’s quite a change from the first version published in July 2024. There’s lots to cover in the next update, including a look at the newly-introduced Graph API usage report API. The API is still in beta and only covers certain parts of Graph usage such as Exchange Online and Teams messaging. The output lacks refinement and doesn’t throw any detailed light into how the Graph APIs are used within a Microsoft 365 tenant. Going forward, that situation is likely to change. It will be interesting to see the usage data generated by Microsoft and how that data is used.
Need some assistance to write and manage PowerShell scripts for Microsoft 365? Get a copy of the Automating Microsoft 365 with PowerShell eBook, available standalone or as part of the Office 365 for IT Pros eBook bundle.