<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Elumenotion</title><description>AI solutions, architecture, and innovation by Doug Ware</description><link>https://www.elumenotion.com/</link><item><title>Is MCP Really Necessary? Why &quot;APIs Are Hard&quot; Is Overstated and MCP Is Oversold</title><link>https://www.elumenotion.com/journal/ismcpreallynecessary/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/ismcpreallynecessary/</guid><description>Why the common &apos;APIs are hard&apos; pitch for MCP is overstated, what you can do with direct APIs + LLMs, and the real tradeoffs MCP introduces for cost and quality.</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Is MCP Really Necessary? Why “APIs Are Hard” Is Overstated and MCP Is Oversold&lt;/h1&gt;
&lt;p&gt;The sales pitch around Model Context Protocol (MCP) usually starts with a familiar complaint: APIs are too hard, too messy, too fragmented. The official MCP documentation leans into this story, emphasizing “standardization” through unified interfaces and protocols, promising “efficiency” via optimized context management, and highlighting “ease of use” with simple, intuitive APIs and a low barrier to entry. &lt;a href=&quot;https://modelcontextprotocol.info/docs/&quot;&gt;MCP Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OpenAI’s Agents SDK doubles down with the “USB‑C for AI” analogy. In that framing, “MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB‑C port for AI applications. Just as USB‑C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.” &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI Agents SDK (MCP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The implied premise is straightforward: direct API integration is so painful that you should prefer going through MCP whenever possible.&lt;/p&gt;
&lt;h2&gt;APIs as City Streets, MCP as Highways&lt;/h2&gt;
&lt;p&gt;A useful way to think about this is roads.&lt;/p&gt;
&lt;p&gt;APIs are like roads. When MCP marketing talks about “APIs are hard,” it’s implicitly comparing itself to the worst dirt roads and pothole‑ridden alleys, then claiming it’s the only way to drive safely.&lt;/p&gt;
&lt;p&gt;But most modern REST APIs aren’t like that at all. They’re more like well‑paved city streets: clear lane markings, sensible signs, predictable intersections. You can drive on them just fine, especially if you have a good map.&lt;/p&gt;
&lt;p&gt;Legacy or undocumented systems are the exceptions. Those are the occasional dirt roads at the edge of town. They’re rougher, and you might need a map and some careful observation (developer tools plus an LLM) to figure out where they go, but you can still drive on them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IsMCPReallyNecessary/image1.png&quot; alt=&quot;Flow for deriving an API schema when no docs exist&quot;&gt;&lt;/p&gt;
&lt;p&gt;MCP, in this metaphor, is more like a standardized highway interchange system. It becomes valuable when you’re coordinating a lot of traffic between many different cities, and you want consistent on‑ramps, off‑ramps, and signage across a whole region.&lt;/p&gt;
&lt;p&gt;The key point is that you don’t need a highway to drive across town. For many teams, the paved city streets they already have (their existing REST APIs, plus a bit of LLM help) are more than enough. Highways and interchanges are useful infrastructure at scale, but they don’t suddenly make ordinary streets “too hard” to use.&lt;/p&gt;
&lt;p&gt;As a general claim, that doesn’t hold up.&lt;/p&gt;
&lt;h2&gt;Are APIs Really So Hard That You Need MCP?&lt;/h2&gt;
&lt;p&gt;If you listened only to MCP marketing, you might come away believing that working directly with APIs is a slog of glue code, inconsistent conventions, and integration hell. In reality, a large fraction of modern APIs are already straightforward to use (especially when you have a capable language model helping you).&lt;/p&gt;
&lt;p&gt;Consider a very ordinary task: integrating a single, well‑documented REST endpoint. I recently asked an LLM agent to read the Brave Images Search API documentation and generate an OpenAPI schema for the &lt;code&gt;/res/v1/images/search&lt;/code&gt; endpoint. &lt;a href=&quot;https://api-dashboard.search.brave.com/app/documentation/image-search&quot;&gt;Brave Images Search API Docs&lt;/a&gt; The interaction was almost comically simple. I pointed it to the documentation page and asked it to create an OpenAPI schema in JSON format. I told it not to use components. Then I asked it to simplify the request and response schemas, removing any properties that weren’t necessary to find and display images.&lt;/p&gt;
&lt;p&gt;After a couple of iterations, I had a minimal schema. The request consisted of a query string, a count, and a &lt;code&gt;safesearch&lt;/code&gt; flag. The response was an array of results, each with a URL, a thumbnail, and a title. That was enough to build a working, agent‑friendly tool that could find images and show them in a UI. There was no elaborate glue code, no “integration hell,” and no special framework. The API itself was clean: a single base URL, a single endpoint, one auth header, straightforward parameters, and JSON responses. The language model did the grunt work of turning prose documentation into a machine‑readable schema; I merely nudged it to match my preferences.&lt;/p&gt;
&lt;p&gt;This Brave example is not a cherry‑picked miracle. A large fraction of modern APIs already look like this. They follow reasonable REST conventions, use simple authentication schemes such as API keys or bearer tokens, define clear parameters, and provide concrete examples. They speak JSON, often with an OpenAPI specification available or trivial to infer from the docs.&lt;/p&gt;
&lt;p&gt;If your starting point is a halfway decent REST API plus an LLM, the idea that you need MCP just to make integration tractable becomes very weak. MCP may still be useful in some contexts (large organizations with many systems and strong governance concerns, for example) but the baseline claim that “APIs are too hard” is simply not true in many real‑world cases. MCP proponents often compare themselves to the worst APIs and the worst integration practices, then claim victory. When you compare MCP to competent use of existing APIs combined with LLM‑assisted schema generation, the value gap shrinks dramatically.&lt;/p&gt;
&lt;h2&gt;What Happens When There Are No API Docs (Do You Need MCP Then?)&lt;/h2&gt;
&lt;p&gt;At this point, someone usually raises a fair objection. The Brave example worked because the documentation was good. What about internal or legacy systems with no documentation at all? Isn’t that where MCP really shines?&lt;/p&gt;
&lt;p&gt;Even then, you often don’t need formal API docs (or MCP).&lt;/p&gt;
&lt;p&gt;Modern browser developer tools give you direct access to the real API traffic your application is already sending. For many internal features, that traffic is more reliable than whatever half‑written wiki page might exist. You can picture the process as a flow from a human using a feature in the browser to an agent calling a tailored API schema.&lt;/p&gt;
&lt;p&gt;Here is the flow, visualized:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IsMCPReallyNecessary/image2.png&quot; alt=&quot;Flow for deriving an API schema when no docs exist&quot;&gt;&lt;br&gt;&lt;em&gt;Flow: from using a feature in the browser to an agent using a tailored API schema.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You begin by opening the application in a browser and navigating to the feature you care about, perhaps a “Client Lookup” screen in a support tool. You open the browser’s developer tools and switch to the Network tab so you can observe HTTP traffic. Then you use the feature exactly as a normal user would: you type a client name, press search, and click through the results.&lt;/p&gt;
&lt;p&gt;As you do this, you watch the requests that appear in the Network tab. Somewhere in that stream of calls, you will see a request that looks suspiciously like the client search you just performed, something like &lt;code&gt;GET /api/clients?query=alice&lt;/code&gt; or &lt;code&gt;POST /api/clients/search&lt;/code&gt;. Once you’ve identified the relevant request, you right‑click it. Modern browsers let you copy the request as cURL or in a similar format, capturing the exact HTTP call your application is making, including headers, URL, method, and parameters.&lt;/p&gt;
&lt;p&gt;Next, you click the same entry and look at the Response pane, where you can see the JSON payload the server returned. You copy that response as well. At this point, you have two critical artifacts: a concrete request and a concrete response.&lt;/p&gt;
&lt;p&gt;From these, either you or an LLM can extract the URL and HTTP method, identify the query string or body parameters, and infer the structure of the JSON response, including the key fields and how they nest. You can feed that request and response into an LLM and ask it to propose a clear, domain‑specific operation name. Instead of a generic &lt;code&gt;searchClients&lt;/code&gt;, you might ask it to suggest something like &lt;code&gt;searchClientsForSupportAgent&lt;/code&gt;. You can tell it to keep only the fields your agent actually needs (perhaps an ID, a name, an email address, and a status) and to ignore everything else. You can also ask it to suggest sensible defaults or constraints, such as a maximum number of results or a default sort order.&lt;/p&gt;
&lt;p&gt;Once the model understands the shape of the request and response and the intent behind the operation, you ask it to emit a minimal OpenAPI schema that reflects this operation. The result is a small, tailored spec that describes exactly the “Client Lookup” behavior you care about, with a name and surface area that make sense for your agent. From the agent’s perspective, it now has a clean, well‑named, tightly scoped API for client search, even though no official documentation ever existed.&lt;/p&gt;
&lt;p&gt;The important point is that even in the “no docs” scenario, the combination of browser developer tools, captured traffic, and an LLM makes describing an API almost trivial. You don’t need MCP. You don’t need a vendor‑maintained spec. You don’t need to wait for anyone to wrap the system. If the basic value premise is that APIs are hard to understand and describe, this workflow directly contradicts it. For many real applications, the friction is low enough that an MCP layer is a nice‑to‑have infrastructure choice, not a fundamental requirement.&lt;/p&gt;
&lt;h2&gt;What Are the Downsides of MCP for Cost and Quality?&lt;/h2&gt;
&lt;p&gt;So far, we’ve focused on why MCP is often unnecessary. There are also real downsides, especially if your goal is to lower cost and improve quality with tool‑based agents.&lt;/p&gt;
&lt;p&gt;These downsides become clearer when you compare MCP’s default usage patterns to the kind of architecture described in “How to Lower Cost and Improve Quality with Tool‑Based Agents,” which relies on narrow, task‑specific tools, early filtering, and specialized worker agents. &lt;a href=&quot;https://www.elumenotion.com/articles/searchreadwebdesign&quot;&gt;How to Lower Cost and Improve Quality with Tool‑Based Agents&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Does MCP Encourage Overly Broad Tool Surfaces?&lt;/h3&gt;
&lt;p&gt;MCP makes it easy to expose a large catalog of tools from a server. That convenience comes with a risk: it becomes equally easy to expose too much.&lt;/p&gt;
&lt;p&gt;In practice, tools from different MCP servers tend to use generic operation names like &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, and &lt;code&gt;create&lt;/code&gt;. Their descriptions are often vague or overlapping, promising to “search for items,” “retrieve records,” or “list resources” without clearly stating which domain they belong to or how they differ from one another. Their parameters are technically valid but semantically unclear. To a language model, this is not a neat toolbox; it is a junk drawer.&lt;/p&gt;
&lt;p&gt;In a tool‑based architecture focused on cost and quality, the tools look very different. They are narrowly defined, named in domain‑specific terms, and designed as clear contracts for the agent. That tight surface area is a key lever for both cost and reliability. When MCP lowers the friction to exposing big, generic tool surfaces, it quietly increases token usage, confusion, and the risk of misuse. The more overlapping operations you show the model, the more ways it has to be slightly wrong.&lt;/p&gt;
&lt;h3&gt;Does MCP Make It Too Easy to Send Raw Data into the Model?&lt;/h3&gt;
&lt;p&gt;MCP’s default pattern is simple: the model calls a tool, and the tool returns a raw response directly to the model. There is no built‑in concept of filtering or compressing the data before it hits the main context. &lt;a href=&quot;https://modelcontextprotocol.info/docs/&quot;&gt;MCP Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the tool‑based agents pattern, the architecture is deliberately different. Noisy work (like crawling and reading web pages) happens in specialized sub‑agents. Each sub‑agent sees a small, focused context, often just one page and the user’s query. Those sub‑agents can respond with “NOT FOUND” when nothing relevant appears, discarding irrelevant content early. Only filtered, relevant snippets ever reach the main agent. &lt;a href=&quot;https://www.elumenotion.com/articles/searchreadwebdesign&quot;&gt;How to Lower Cost and Improve Quality with Tool‑Based Agents&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This early filtering and context isolation is what keeps token usage low and answer quality high. With MCP, it is easy to fall into a lazier pattern: call a search tool, get back a large result set, and pass it all to the model; call a “read” tool, get back full documents, and dump them into context; let the main agent do all the filtering and extraction. The downside is straightforward: more tokens, more noise, worse answers. MCP does not force you into this pattern, but its convenience at the protocol layer makes it very tempting.&lt;/p&gt;
&lt;h3&gt;Does MCP Push Complexity into One Big Agent Instead of Specialized Workers?&lt;/h3&gt;
&lt;p&gt;The default story around MCP and hosted tools is that you have a model, it discovers tools, it calls them directly, and it interprets their responses. The OpenAI Agents SDK documentation describes how “the model lists the remote server’s tools and invokes them without an extra callback to your Python process,” and how “each MCP server supports tool filters so that you can expose only the functions that your agent needs.” &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI Agents SDK (MCP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is no structural encouragement in that story to split responsibilities between an orchestrator and specialized workers, or to use different models for different tasks.&lt;/p&gt;
&lt;p&gt;In a cost‑optimized tool‑based design, you typically do the opposite. You use an orchestrator model for high‑level reasoning and planning, and cheaper, smaller models for extraction, filtering, and classification. You isolate contexts so each worker sees only what it needs. This pattern can significantly reduce cost while improving reliability. &lt;a href=&quot;https://www.elumenotion.com/articles/searchreadwebdesign&quot;&gt;How to Lower Cost and Improve Quality with Tool‑Based Agents&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MCP doesn’t forbid this architecture, but it doesn’t promote it either. Without deliberate design, teams tend to default to a single large model doing orchestration, extraction, filtering, and synthesis, all in one big context, with direct access to a large set of tools. That increases cost, because you are paying a premium model to do cheap work, and it makes behavior more brittle, because all the complexity is concentrated in one place.&lt;/p&gt;
&lt;h3&gt;Can MCP Give a False Sense That Tool Design Is “Solved”?&lt;/h3&gt;
&lt;p&gt;Because MCP standardizes how tools are exposed, discovered, and called, it is easy to assume that “tool design” is largely taken care of. You stand up an MCP server, define some tools, and now your agents can use them. Problem solved (or so it seems).&lt;/p&gt;
&lt;p&gt;In reality, all the hard work remains. You still have to decide which tools belong in a given agent’s world, name them in domain‑specific, unambiguous ways, trim their surface area to what the agent actually needs, set defaults and constraints, and write prompts and descriptions that explain when and why to use each tool. MCP does not remove any of that effort. At best, it makes some plumbing more convenient.&lt;/p&gt;
&lt;p&gt;The danger is that teams think, “we have MCP, so our tools are agent‑ready,” and under‑invest in the design work that actually drives cost and quality. The result is a system that looks standardized on paper but behaves unpredictably in practice.&lt;/p&gt;
&lt;h2&gt;Does MCP Really Deliver Composable Tools?&lt;/h2&gt;
&lt;p&gt;Another major claim around MCP is composability. Because tools all speak the same protocol, the story goes, agents can discover them dynamically and chain them together. The OpenAI Agents SDK documentation explains how hosted MCP tools let the model list a remote server’s tools and invoke them without an extra callback to your Python process, and how each MCP server supports tool filters so that you can expose only the functions your agent needs. &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI Agents SDK (MCP)&lt;/a&gt; The narrative that emerges is one of a plug‑and‑play ecosystem: tools that “just work together” because they share a protocol.&lt;/p&gt;
&lt;p&gt;This sounds great. It is also mostly wishful thinking.&lt;/p&gt;
&lt;p&gt;MCP standardizes how tools are called. It does nothing to standardize what they mean. In practice, tools use generic operation names, vague descriptions, and parameters that are technically valid but semantically unclear. To a language model, this is not composability; it is ambiguity.&lt;/p&gt;
&lt;p&gt;The fact that everything speaks MCP does not tell the model which &lt;code&gt;search&lt;/code&gt; finds images, which &lt;code&gt;search&lt;/code&gt; queries CRM contacts, which &lt;code&gt;search&lt;/code&gt; digs through logs, or how to chain a &lt;code&gt;list&lt;/code&gt;, a &lt;code&gt;get&lt;/code&gt;, and an &lt;code&gt;update&lt;/code&gt; across different domains. The hard part is not calling a function over a protocol. The hard part is semantic alignment: giving the model a set of tools that are named, scoped, and documented in a way that matches the agent’s job.&lt;/p&gt;
&lt;p&gt;A thin, bespoke API description layer gives you exactly that control. Instead of exposing a generic &lt;code&gt;search&lt;/code&gt; operation, you rename it to something unambiguous in your agent’s world, such as &lt;code&gt;searchBraveImagesForDisplay&lt;/code&gt;, &lt;code&gt;getCrmContactsForEmailCampaign&lt;/code&gt;, or &lt;code&gt;lookupProductBySkuForCheckout&lt;/code&gt;. These names carry domain intent in a way that “search” never will. You trim the surface area of each tool to what the agent actually needs, set defaults so the model doesn’t have to decide on every detail, and embed assistant‑specific guidance right into the descriptions. You might tell the model to use a particular tool only when the user explicitly asks for images to show in the UI, or to fetch customer records with another tool before drafting an email.&lt;/p&gt;
&lt;p&gt;MCP does not prevent you from doing any of this, but it does not do it for you either. The claim that MCP gives you composable tools because they share a protocol ignores the real bottleneck, which is semantics and user experience for the model. Protocol‑level composability is the easy part. Semantic composability is the hard part, and MCP does not solve it.&lt;/p&gt;
&lt;h2&gt;Does Tool Discovery in MCP Mean the Model Understands the Tools?&lt;/h2&gt;
&lt;p&gt;A third pillar of the MCP story is discovery. The MCP docs talk about “standardization” and “ease of use,” presenting MCP as a way to “simplify development” and “optimize context management.” &lt;a href=&quot;https://modelcontextprotocol.info/docs/&quot;&gt;MCP Docs&lt;/a&gt; The OpenAI Agents SDK shows how hosted MCP tools allow the model to list and call tools from remote servers without custom listing and dispatch logic. &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI Agents SDK (MCP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Again, this sounds nice: the model can “discover” tools and just start using them. But discovery is not understanding.&lt;/p&gt;
&lt;p&gt;Discovery gives the model a list of tools, their signatures, and short descriptions. It does not give the model a sense of which tools are appropriate for this agent’s responsibilities, a strategy for choosing between overlapping tools, a plan for sequencing tools in multi‑step workflows, any real notion of business rules or safety constraints, or a concept of when not to call a tool even if it looks superficially relevant.&lt;/p&gt;
&lt;p&gt;Without strong system prompts and curated tool surfaces, models with a large discovered toolset behave exactly as you would expect. They overuse some tools and ignore others. They call tools redundantly. They misread vague descriptions and pick the wrong operation.&lt;/p&gt;
&lt;p&gt;All of the hard work remains in tool selection, in deciding which tools even belong in this agent’s world; in naming and scoping, in making tools match the domain and the agent’s role; in prompt design, in telling the model when and why to use each tool; and in policy and safety, in enforcing constraints outside the model. MCP does not remove any of that effort. At best, it makes some plumbing more convenient. The idea that discovery plus a protocol is enough to make tools “just work” with agents is optimistic marketing.&lt;/p&gt;
&lt;h2&gt;So When Is MCP Actually Worth Using?&lt;/h2&gt;
&lt;p&gt;None of this means MCP has no value. There are real benefits in certain contexts.&lt;/p&gt;
&lt;p&gt;MCP can standardize how tools are exposed and called across teams and products, and can centralize some aspects of connectivity, especially when you use hosted MCP tools. &lt;a href=&quot;https://modelcontextprotocol.info/docs/&quot;&gt;MCP Docs&lt;/a&gt; &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot;&gt;OpenAI Agents SDK (MCP)&lt;/a&gt; It can provide large organizations with a common substrate for governance, logging, and access control. These are meaningful advantages (but they are infrastructure and governance wins, not magic bullets for “APIs are hard” or “agents can’t use tools”).&lt;/p&gt;
&lt;p&gt;If we are honest about the value proposition, it looks different from the USB‑C analogy. USB‑C solved a brutal mess of incompatible connectors. Modern HTTP APIs with JSON and a capable language model are nowhere near that level of chaos.&lt;/p&gt;
&lt;p&gt;If your primary goals are to lower cost and improve quality, patterns like orchestrator‑and‑worker agents, narrow, domain‑specific tools, early filtering and context isolation, and using different models for different tasks matter far more than whether you use MCP. Those are the patterns described in “How to Lower Cost and Improve Quality with Tool‑Based Agents,” and they apply whether your tools are exposed via MCP, direct HTTP, or something else entirely. &lt;a href=&quot;https://www.elumenotion.com/articles/searchreadwebdesign&quot;&gt;How to Lower Cost and Improve Quality with Tool‑Based Agents&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For many teams, the simplest and most effective path remains to use the APIs they already have, to capture real traffic when documentation is missing, to let an LLM help generate a thin, bespoke OpenAPI spec, and to curate a small set of tools with clear prompts that explain how those tools relate to the agent’s job. MCP can be a useful piece of infrastructure, especially at scale. But as a universal answer to “APIs are hard” or “agents can’t use tools,” its case is overstated.&lt;/p&gt;
</content:encoded></item><item><title>How to Lower Cost and Improve Quality with Tool-Based Agents</title><link>https://www.elumenotion.com/journal/searchreadwebdesign/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/searchreadwebdesign/</guid><description>A deep dive into the Search + ReadWeb design pattern used in GuideAnts Notebooks, showing how tool-based agents reduce tokens, improve answer quality, and differ from typical MCP setups.</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;A Deep Dive into the Search + ReadWeb Design (vs. MCP)&lt;/h2&gt;
&lt;p&gt;This article shows you how to build agent systems that are cheaper to run and produce better answers. I&amp;#39;ll use a concrete example - the &lt;strong&gt;Search&lt;/strong&gt; assistant in &lt;a href=&quot;https://www.guideants.ai&quot;&gt;GuideAnts Notebooks&lt;/a&gt; - to illustrate the pattern, but the principles apply to any agent system that orchestrates tools.&lt;/p&gt;
&lt;p&gt;The core ideas are: &lt;strong&gt;abstract complexity behind precise tool definitions&lt;/strong&gt; (this is where OpenAPI descriptions shine), &lt;strong&gt;isolate noisy work in specialized sub-agents&lt;/strong&gt;, and &lt;strong&gt;match model capability to task complexity&lt;/strong&gt;. I&amp;#39;ll also explain why this approach delivers results that a typical Model Context Protocol (MCP) setup cannot.&lt;/p&gt;
&lt;h2&gt;The Concrete Flow: Search → crawl → ReadWeb → GetContentFromUrl&lt;/h2&gt;
&lt;p&gt;The screenshot below illustrates a single user turn where the &lt;strong&gt;Search&lt;/strong&gt; assistant orchestrates multiple tools and subagents.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/SearchReadWebDesign/image1.png&quot; alt=&quot;Invocation tree&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process begins when the &lt;strong&gt;Search assistant&lt;/strong&gt; receives the user&amp;#39;s query and calls the &lt;code&gt;crawl&lt;/code&gt; tool. The &lt;code&gt;crawl&lt;/code&gt; tool returns a lightweight set of page titles and URLs relevant to the query - metadata only, with no full page content yet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/SearchReadWebDesign/image2.png&quot; alt=&quot;crawl tool&quot;&gt;&lt;/p&gt;
&lt;p&gt;For each candidate URL, Search invokes the &lt;strong&gt;ReadWeb assistant&lt;/strong&gt; in an isolated context. ReadWeb uses the &lt;code&gt;GetContentFromUrl&lt;/code&gt; tool to fetch and parse the page, then decides whether the page actually contains content matching the user&amp;#39;s query. If no relevant content is found, it simply returns &lt;code&gt;NOT FOUND&lt;/code&gt;. However, if it finds relevant material, it extracts and returns only the specific snippets or sections of interest, rather than the entire page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/SearchReadWebDesign/image3.png&quot; alt=&quot;ReadWeb&quot;&gt;&lt;/p&gt;
&lt;p&gt;Finally, the Search assistant aggregates the results. Pages that returned &lt;code&gt;NOT FOUND&lt;/code&gt; are effectively discarded, so only the extracted, query-relevant content is brought back into the main context for answer generation. As you can see in the trace (&lt;code&gt;AGENT Search&lt;/code&gt; → &lt;code&gt;TOOL: crawl&lt;/code&gt;, followed by repeated &lt;code&gt;AGENT Read Web&lt;/code&gt; → &lt;code&gt;TOOL: GetContentFromUrl&lt;/code&gt; calls), the bulk of tokens are consumed in the main Search turn, while the ReadWeb interactions remain smaller and cheaper.&lt;/p&gt;
&lt;h2&gt;Why This Design Works: Precise Tools, Isolated Contexts, Early Filtering&lt;/h2&gt;
&lt;p&gt;Three mechanisms drive the token savings and quality improvements in this pattern.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Precise Tool Definitions.&lt;/strong&gt; Both &lt;code&gt;crawl&lt;/code&gt; and &lt;code&gt;GetContentFromUrl&lt;/code&gt; have simple, focused OpenAPI descriptions that hide complexity from the LLM. The LLM never sees how crawling works, how HTML is parsed, or how relevance is scored internally. It only sees a clear contract: &amp;quot;give me URLs for this query&amp;quot; or &amp;quot;extract relevant content from this URL, or say NOT FOUND.&amp;quot; This keeps prompt size small and reduces the chance of incorrect tool usage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolated Contexts.&lt;/strong&gt; Each page is handled in a separate ReadWeb context. The sub-agent sees only the query and a single URL; it returns either &lt;code&gt;NOT FOUND&lt;/code&gt; or a compact snippet. We never load multiple full web pages into the main Search context. This isolation prevents the main agent from being overwhelmed by irrelevant content and keeps each sub-call cheap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Early Filtering.&lt;/strong&gt; Because ReadWeb can respond with &lt;code&gt;NOT FOUND&lt;/code&gt;, irrelevant pages are discarded before they ever reach the main context. The Search assistant only sees pages that actually contain matching content - and specifically, only the parts that matter. This avoids the common failure mode of stuffing the context with everything a crawler finds and hoping the LLM picks the right pieces.&lt;/p&gt;
&lt;p&gt;The result: fewer tokens, less noise, and an LLM that can focus on reasoning and synthesis rather than sifting through garbage.&lt;/p&gt;
&lt;h2&gt;Model Specialization: The Cost Multiplier&lt;/h2&gt;
&lt;p&gt;Beyond token savings, this design enables a powerful cost optimization: &lt;strong&gt;running different models for different roles&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Search&lt;/strong&gt; assistant handles the complex work - reasoning about the user&amp;#39;s intent, synthesizing information from multiple sources, and writing a coherent answer. This requires a capable (and expensive) model.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;ReadWeb&lt;/strong&gt; assistant has a much simpler job: fetch a page, decide if it&amp;#39;s relevant, extract the good parts. This is mostly pattern matching and extraction, not deep reasoning. It can run on a &lt;strong&gt;mini model&lt;/strong&gt; that costs approximately 10x less per token.&lt;/p&gt;
&lt;p&gt;Because the architecture isolates these roles, you can make this tradeoff cleanly. Most of the &amp;quot;web reading&amp;quot; cost is paid at mini-model rates. The expensive model is reserved for the synthesis work that actually requires it. In a typical search query that touches 5-10 pages, this can reduce total cost by 50% or more compared to running everything on a single large model.&lt;/p&gt;
&lt;h2&gt;How This Differs from MCP&lt;/h2&gt;
&lt;p&gt;The Model Context Protocol (MCP) standardizes &lt;em&gt;access&lt;/em&gt; - it gives you a consistent way for agents to discover and call tools across different servers. This design optimizes &lt;em&gt;interfaces and execution&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/SearchReadWebDesign/image4.png&quot; alt=&quot;MCP Server&quot;&gt;&lt;/p&gt;
&lt;p&gt;MCP typically exposes tools at the server level and returns raw tool responses directly to the LLM. The client or LLM is responsible for filtering and interpreting the data. This is fine for simple tools, but for complex operations like web search, it means the LLM sees everything the tool returns - relevant or not.&lt;/p&gt;
&lt;p&gt;In contrast, this Search design uses &lt;strong&gt;assistant-specific tool abstraction&lt;/strong&gt;. Search sees a high-level &lt;code&gt;crawl&lt;/code&gt; tool and a ReadWeb assistant (not a raw HTTP client). ReadWeb sees a specialized &lt;code&gt;GetContentFromUrl&lt;/code&gt; tool (not a generic web fetcher). Response filtering and compression happen at the tool or assistant level - &lt;code&gt;NOT FOUND&lt;/code&gt; vs. &amp;quot;here is the exact snippet&amp;quot; - before anything reaches the main context.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/SearchReadWebDesign/image5.png&quot; alt=&quot;MCP Server&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can think of it this way: &lt;strong&gt;MCP standardizes how agents talk to services. This pattern optimizes what agents see and how much they pay to see it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The two approaches aren&amp;#39;t mutually exclusive. You can use MCP for tool discovery and transport while still applying these abstraction and specialization patterns within your agent architecture.&lt;/p&gt;
&lt;h2&gt;Takeaways for Any Agent System&lt;/h2&gt;
&lt;p&gt;These patterns apply far beyond search. Any time you&amp;#39;re building an agent that orchestrates tools, consider:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specialized Roles.&lt;/strong&gt; Split complex workflows into an &lt;strong&gt;Orchestrator&lt;/strong&gt; that manages high-level reasoning and &lt;strong&gt;Specialized Workers&lt;/strong&gt; that handle noisy or expensive sub-tasks. The Orchestrator should never see raw, unfiltered data from the outside world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Precise Tool Definitions.&lt;/strong&gt; Don&amp;#39;t expose raw APIs to your agents. Create task-specific abstractions with clear contracts. OpenAPI descriptions are ideal for this - they let you define exactly what parameters the LLM can use and what shape of response it will receive, hiding everything else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model Specialization.&lt;/strong&gt; Match model capability to task complexity. Use mini models for extraction, filtering, and formatting. Reserve your strongest models for synthesis and reasoning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Filter at the Source.&lt;/strong&gt; Don&amp;#39;t dump raw tool output into your main context and hope the LLM figures it out. Filter early, compress aggressively, and let irrelevant results die in the sub-agent that found them.&lt;/p&gt;
&lt;p&gt;The goal is simple: &lt;strong&gt;give your main agent only the signals that matter, at the lowest possible cost.&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>Faster, Cheaper, Better: Why Guides and Assistants Beat Single-Model AI</title><link>https://www.elumenotion.com/journal/understandingaiassistantsandtheirroles/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/understandingaiassistantsandtheirroles/</guid><description>Learn how guides and assistants create modular AI workflows that deliver quality, speed, and cost efficiency. Real-world example: creating a podcast video with Python using multiple specialized assistants.</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Faster, Cheaper, Better: Why Guides and Assistants Beat Single-Model AI&lt;/h1&gt;
&lt;p&gt;When you ask an AI to do something complex (like creating a podcast, designing a cover image, and producing a video) it&amp;#39;s tempting to throw the entire request at a single model in a single conversation thread. But there&amp;#39;s a smarter, faster, and cheaper way: break the work into &lt;strong&gt;guides&lt;/strong&gt; and &lt;strong&gt;assistants&lt;/strong&gt;, each with its own role, tools, and even its own model.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;#39;ll walk through a real example  -  &lt;strong&gt;&amp;quot;Today in History Podcast Video with Python&amp;quot;&lt;/strong&gt;  -  to show how modular AI architecture, combined with parallel execution, can deliver high-quality results quickly while keeping costs under control.&lt;/p&gt;
&lt;h2&gt;What Are Guides and Assistants?&lt;/h2&gt;
&lt;p&gt;Before diving into the example, let&amp;#39;s define the core concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Guide&lt;/strong&gt; → The project manager. Understands the overall goal, breaks it into steps, and delegates tasks to specialized assistants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assistants&lt;/strong&gt; → Specialists. Each is narrowly focused: searching the web, reading pages, generating media, or executing code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crew&lt;/strong&gt; → The team inside a guide. A guide can include multiple assistants, each with its own tools and model configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of it like a newsroom: The editor-in-chief (guide) assigns reporters (assistants) to cover different angles of a story. Designers and technicians (other assistants) prepare visuals and audio, all coordinated into one final product.&lt;/p&gt;
&lt;h3&gt;Types of Assistants&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Global Assistants&lt;/strong&gt; are pre-configured by the platform and available to all teams. They include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search (Web Search and Scrape)&lt;/li&gt;
&lt;li&gt;Code Executor&lt;/li&gt;
&lt;li&gt;Read Web&lt;/li&gt;
&lt;li&gt;Media Creator&lt;/li&gt;
&lt;li&gt;Diagrams&lt;/li&gt;
&lt;li&gt;And many more specialized tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Custom Assistants&lt;/strong&gt; are created by your team, tailored to your specific needs, with custom tools, files, and instructions. They&amp;#39;re only available to your team and can be reused across multiple guides.&lt;/p&gt;
&lt;h2&gt;The &amp;quot;Today in History&amp;quot; Project: A Real-World Example&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s examine how a guide orchestrated multiple assistants to complete a complex multimedia project. This example was built using &lt;a href=&quot;https://www.guideants.ai&quot;&gt;GuideAnts Notebooks&lt;/a&gt;, an AI-powered workspace that makes it easy to create guides, configure assistants, and build modular workflows like the one shown here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User request:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Create a podcast about today in history and a cover image, then combine the two to make a video with sound using Python.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Guide&amp;#39;s plan:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Search for historical facts for January 8&lt;/li&gt;
&lt;li&gt;Read and extract relevant details from web pages&lt;/li&gt;
&lt;li&gt;Create a podcast script and record narration&lt;/li&gt;
&lt;li&gt;Design a cover image&lt;/li&gt;
&lt;li&gt;Combine audio and image into a video using Python&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/images/understandingaiassistantsandtheirroles/image1.png&quot; alt=&quot;GuideAnts Chat&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Here&amp;#39;s the completed video that was generated by the guide and its crew:&lt;/p&gt;
&lt;p&gt;&lt;video controls width=&quot;100%&quot; src=&quot;/images/understandingaiassistantsandtheirroles/today_in_history_jan8_podcast_video.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2&gt;How the Crew Worked Together&lt;/h2&gt;
&lt;p&gt;The guide orchestrated four specialized assistants to complete this task:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Search Assistant&lt;/strong&gt; &lt;em&gt;(Model: GPT-4.1)&lt;/em&gt;  -  Found &amp;quot;Today in History&amp;quot; events from multiple sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read Web Assistant&lt;/strong&gt; &lt;em&gt;(Model: GPT-4.1 Mini)&lt;/em&gt;  -  Loaded pages and extracted key facts&lt;ul&gt;
&lt;li&gt;This step consumed 35,528 tokens across multiple page reads, so using a cheaper model saved significant costs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media Creator Assistant&lt;/strong&gt;  -  Produced podcast audio narration and cover image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code Executor Assistant&lt;/strong&gt;  -  Combined the audio and image into a final &lt;code&gt;.mp4&lt;/code&gt; video file&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/images/understandingaiassistantsandtheirroles/image2.png&quot; alt=&quot;Actual Invocation Tree&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Cost Breakdown&lt;/h3&gt;
&lt;p&gt;From the conversation activity report:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total Tokens:&lt;/strong&gt; 86,298  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total Cost:&lt;/strong&gt; $0.2128&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assistant Steps:&lt;/strong&gt; 4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Calls:&lt;/strong&gt; 14&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The heavy web reading tasks (which consumed over 50,000 tokens) were handled by GPT-4.1 Mini, keeping costs low without sacrificing quality for extraction tasks. The guide&amp;#39;s orchestration and creative synthesis used GPT-4.1, ensuring high-quality decision-making where it mattered most.&lt;/p&gt;
&lt;h2&gt;Quality Through Context Isolation&lt;/h2&gt;
&lt;p&gt;One of the most significant advantages of the guide + assistants architecture is how it handles conversation context.&lt;/p&gt;
&lt;h3&gt;The Single-Thread Problem&lt;/h3&gt;
&lt;p&gt;In a &lt;strong&gt;single model, single-thread&lt;/strong&gt; approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every step shares the same conversation context&lt;/li&gt;
&lt;li&gt;Large inputs (like full web pages) can bloat the context window, pushing important instructions out&lt;/li&gt;
&lt;li&gt;Raw data from early steps can distract or contaminate later outputs&lt;/li&gt;
&lt;li&gt;The model must juggle multiple task types simultaneously, reducing focus&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The Invocation Tree Advantage&lt;/h3&gt;
&lt;p&gt;In the &lt;strong&gt;guide + assistants invocation tree&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each assistant runs in its own &lt;strong&gt;local context&lt;/strong&gt;, isolated from other assistants&lt;/li&gt;
&lt;li&gt;The Read Web assistant sees only the page content and extraction instructions  -  it&amp;#39;s not burdened with the podcast script or Python code steps&lt;/li&gt;
&lt;li&gt;The guide receives &lt;em&gt;clean, distilled summaries&lt;/em&gt; instead of noisy raw data&lt;/li&gt;
&lt;li&gt;Each assistant can fully focus on its specialized task without irrelevant context noise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Higher accuracy per step, and the guide&amp;#39;s reasoning stays sharp because it maintains a lean context focused on orchestration and synthesis.&lt;/p&gt;
&lt;h3&gt;Context Isolation Comparison&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Single Model, Linear Context&lt;/th&gt;
&lt;th&gt;Guide + Assistants Invocation Tree&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus per step&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mixed, all steps share context&lt;/td&gt;
&lt;td&gt;Laser-focused per assistant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can bloat quickly&lt;/td&gt;
&lt;td&gt;Lean guide context, isolated assistant contexts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model fit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-size-fits-all&lt;/td&gt;
&lt;td&gt;Task-specific models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Noise risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (irrelevant tokens persist)&lt;/td&gt;
&lt;td&gt;Low (clean outputs passed back)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quality consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;May drift over long context&lt;/td&gt;
&lt;td&gt;Maintained per assistant role&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Cost Efficiency Through Model Specialization&lt;/h2&gt;
&lt;p&gt;Perhaps the most practical benefit of this architecture is the ability to optimize costs by matching models to tasks.&lt;/p&gt;
&lt;h3&gt;Strategic Model Assignment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token-heavy tasks&lt;/strong&gt; (like reading multiple web pages) use &lt;strong&gt;GPT-4.1 Mini&lt;/strong&gt;  -  cheaper, faster, and well-suited for extraction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-reasoning tasks&lt;/strong&gt; (like synthesizing the podcast script) use &lt;strong&gt;GPT-5.2&lt;/strong&gt;  -  more capable for complex decision-making&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creative generation tasks&lt;/strong&gt; can use models tuned specifically for media output&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Beneficial Impacts&lt;/h3&gt;
&lt;p&gt;In the January 8 project, the Read Web assistant processed over 50,000 tokens across multiple web pages. If this had been done with GPT-4.1 instead of GPT-4.1 Mini, the cost would have been significantly higher. By using the right model for the right job:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost savings:&lt;/strong&gt; The cheaper model handled high-volume, low-complexity extraction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality preservation:&lt;/strong&gt; The premium model was reserved for tasks requiring deeper reasoning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Lightweight models process faster on large payloads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The work performed by crew members is done using a specific model for each assistant, outside of the main context window. This is crucial because token-heavy operations (like reading web pages) can consume enormous amounts of tokens, and using an expensive model for these tasks would quickly become cost-prohibitive.&lt;/p&gt;
&lt;h2&gt;Speed Through Parallel Operations&lt;/h2&gt;
&lt;p&gt;One of the most powerful features of this architecture is &lt;strong&gt;parallel execution&lt;/strong&gt;. When assistants run independently with their own models and contexts, tasks that don&amp;#39;t depend on each other can execute simultaneously.&lt;/p&gt;
&lt;h3&gt;How Parallelism Works&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Assistants run at the same time when tasks don&amp;#39;t depend on each other&lt;/li&gt;
&lt;li&gt;Search can query multiple sources while Read Web processes several pages in parallel&lt;/li&gt;
&lt;li&gt;Media Creator can start image generation while audio is being recorded&lt;/li&gt;
&lt;li&gt;Code Executor can prepare the video script while assets are being finalized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/understandingaiassistantsandtheirroles/image3.png&quot; alt=&quot;Execution Tree&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Impact on Speed&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sequential execution:&lt;/strong&gt; Time = sum of all task durations&lt;br&gt;&lt;strong&gt;Parallel execution:&lt;/strong&gt; Time ≈ longest single task duration&lt;/p&gt;
&lt;p&gt;For the January 8 project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple web pages were read simultaneously&lt;/li&gt;
&lt;li&gt;Audio and image generation overlapped&lt;/li&gt;
&lt;li&gt;The final video assembly happened immediately after assets were ready&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This turns what would be a &lt;strong&gt;multi-minute sequential process&lt;/strong&gt; into &lt;strong&gt;seconds or a minute&lt;/strong&gt; of wall-clock time.&lt;/p&gt;
&lt;h3&gt;Parallelism + Invocation Tree = Optimal Architecture&lt;/h3&gt;
&lt;p&gt;When combined:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Invocation tree&lt;/strong&gt; provides isolation, model specialization, and cost control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel execution&lt;/strong&gt; provides speed and scalability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This architecture is essentially &lt;strong&gt;AI multiprocessing&lt;/strong&gt;  -  the guide acts like a scheduler, assistants act like worker threads, and each has its own optimized environment. The system&amp;#39;s excellent support for parallel operations is what makes the modular guide/assistant architecture practically viable for large, multi-step AI projects without sacrificing quality or blowing through budgets.&lt;/p&gt;
&lt;h2&gt;The Big Picture Benefits&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s summarize the key advantages of this modular approach:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Role Separation&lt;/strong&gt;  -  Guides orchestrate, assistants execute. Clear boundaries prevent confusion and overlap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context Isolation&lt;/strong&gt;  -  Each assistant focuses only on what&amp;#39;s relevant, avoiding context bloat and contamination.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Optimization&lt;/strong&gt;  -  Assign the right model to the right task, maximizing quality per dollar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost Control&lt;/strong&gt;  -  Save money on high-volume steps without losing quality on critical reasoning tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parallel Execution&lt;/strong&gt;  -  Dramatically reduce total run time by running independent tasks simultaneously.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transparency&lt;/strong&gt;  -  Activity reports show exactly who did what, with token and cost breakdowns for optimization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reusability&lt;/strong&gt;  -  The same assistants can be plugged into other guides, building a library of specialized capabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;  -  Add or swap assistants without redesigning the whole workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;  -  Update an assistant&amp;#39;s instructions or tools, and all guides using it benefit instantly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality Consistency&lt;/strong&gt;  -  Each assistant maintains its specialized focus, preventing quality drift over long contexts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The &amp;quot;Today in History Podcast Video with Python&amp;quot; project demonstrates how guides and assistants  -  combined with parallel execution  -  create &lt;strong&gt;fast, cost-efficient, and high-quality AI workflows&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead of forcing one model to handle everything in a bloated context, this architecture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Breaks work into specialized roles&lt;/li&gt;
&lt;li&gt;Matches models to tasks&lt;/li&gt;
&lt;li&gt;Runs tasks in parallel&lt;/li&gt;
&lt;li&gt;Keeps the guide&amp;#39;s context lean for clear reasoning&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is faster, cheaper and better.&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;If you&amp;#39;re building AI-powered workflows, start thinking like a project manager:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Define guides&lt;/strong&gt; to orchestrate complex workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create assistants&lt;/strong&gt; for specialized tasks (or use global assistants where appropriate)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick the right model&lt;/strong&gt; for each job  -  match the model&amp;#39;s capabilities to the task&amp;#39;s requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run them in parallel&lt;/strong&gt; when possible to maximize speed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor activity reports&lt;/strong&gt; to optimize token usage and costs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The modular guide/assistant architecture turns AI workflows into well-structured, reusable systems. Just like well-designed software projects, this approach gives you the building blocks to create powerful, efficient, and maintainable AI applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to build your own?&lt;/strong&gt; The example in this article was created using &lt;a href=&quot;https://www.guideants.ai&quot;&gt;GuideAnts Notebooks&lt;/a&gt;, which provides the platform and tools to design guides, configure assistants with custom models, and orchestrate complex workflows. You can start building similar modular AI workflows today - &lt;a href=&quot;https://guideants.ai/get-started/&quot;&gt;Get Started&lt;/a&gt; now.&lt;/p&gt;
</content:encoded></item><item><title>Why &quot;Guides&quot; - from prompts to workflows</title><link>https://www.elumenotion.com/journal/whyguidesnotchatbots/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/whyguidesnotchatbots/</guid><description>Building Applications with Guides &amp; Assistants (GuideAnts + AntRunner). This post introduces the core mental model: Guides are coordinators for getting work done.</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Why &amp;quot;Guides&amp;quot; - from prompts to workflows&lt;/h1&gt;
&lt;p&gt;Most teams don&amp;#39;t need &amp;quot;a chatbot.&amp;quot; They need guidance to find and use information to perform work using natural text, voice and vision. This distinction matters because it shifts the conversation from &amp;quot;let&amp;#39;s add AI&amp;quot; to &amp;quot;let&amp;#39;s make this workflow reliable.&amp;quot;&lt;/p&gt;
&lt;p&gt;This post introduces the core mental model we&amp;#39;ll use throughout the series. &lt;strong&gt;Guides&lt;/strong&gt; are coordinators for getting work done. &lt;strong&gt;Assistants&lt;/strong&gt; are specialized helpers the guide can delegate to. &lt;strong&gt;Tools&lt;/strong&gt; are capabilities like APIs, retrieval, code execution, and integrations. &lt;strong&gt;Knowledge and files&lt;/strong&gt; are sources of truth the workflow can reference. And &lt;strong&gt;publishing or embedding&lt;/strong&gt; turns internal guidance into product experiences.&lt;/p&gt;
&lt;h2&gt;Why &amp;quot;prompting&amp;quot; isn&amp;#39;t an architecture&lt;/h2&gt;
&lt;p&gt;Prompts are great for exploration, but they&amp;#39;re fragile as a foundation for applications. When you rely on prompts alone, you run into several problems.&lt;/p&gt;
&lt;p&gt;First, there&amp;#39;s the issue of inconsistent outputs. A &amp;quot;pretty good&amp;quot; answer isn&amp;#39;t good enough for a workflow step that ships to customers. You need reliability, not occasional brilliance. Second, when results are wrong, it&amp;#39;s hard to tell which step failed because the process is hidden inside a single prompt. Third, there&amp;#39;s no modularity. The moment you add &amp;quot;and also do X,&amp;quot; you create a mega-prompt that&amp;#39;s difficult to test and maintain. Finally, prompts are hard to operationalize. You need controls around tool access, authentication, limits, retention, and monitoring.&lt;/p&gt;
&lt;p&gt;Production applications require guided work, not vibes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WhyGuidesNotChatbots/image1.png&quot; alt=&quot;Turning a prompt into guided work with assistants and tools.&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The &amp;quot;Guide&amp;quot; mental model&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;Guide&lt;/strong&gt; is an agent designed like a product feature. It has a purpose, boundaries, and a repeatable operating procedure. This is the core shift in thinking.&lt;/p&gt;
&lt;p&gt;When you define a guide, you should be able to answer several questions. What job is it responsible for? What inputs does it require? What tools is it allowed to use? What outputs does it produce, including both format and quality bar? When does it delegate, and to whom? How does it handle failure? How do you measure whether it&amp;#39;s working?&lt;/p&gt;
&lt;p&gt;Think of a guide as the orchestrator in a system, not the whole system. It&amp;#39;s the thing that knows what needs to happen and coordinates the pieces to make it happen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WhyGuidesNotChatbots/image2.png&quot; alt=&quot;Guides orchestrate; assistants specialize.&quot;&gt;&lt;/p&gt;
&lt;h2&gt;From one agent to many: crews and specialized assistants&lt;/h2&gt;
&lt;p&gt;In real applications, one agent doing everything is a reliability trap. The more responsibilities you pile onto a single agent, the more likely it is to fail in subtle ways.&lt;/p&gt;
&lt;p&gt;Instead, use a &lt;strong&gt;crew&lt;/strong&gt;. The guide stays focused on planning, delegation, and synthesis. Specialized assistants do narrow work like research, code review, security analysis, formatting, and data extraction.&lt;/p&gt;
&lt;p&gt;This is the same reason modern software is built from services and modules instead of one giant function. Separation of concerns isn&amp;#39;t just good architecture; it&amp;#39;s how you build systems that can be tested, improved, and trusted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WhyGuidesNotChatbots/image3.png&quot; alt=&quot;A simple heuristic for deciding when to use multi-agent crews.&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Tools: when &amp;quot;AI&amp;quot; becomes &amp;quot;software&amp;quot;&lt;/h2&gt;
&lt;p&gt;Tools are what turn chat into application behavior. Without tools, an AI can only describe what should happen. With tools, it can actually do things.&lt;/p&gt;
&lt;p&gt;Tools let you query internal data, create and validate artifacts, run deterministic checks, integrate with third-party systems, and enforce policy about what&amp;#39;s allowed and what&amp;#39;s not. If your AI can&amp;#39;t call a tool, it can&amp;#39;t reliably complete real tasks. It can only describe them.&lt;/p&gt;
&lt;h2&gt;Extend your AI beyond your team&lt;/h2&gt;
&lt;p&gt;Guides are used interactively inside notebooks, but publishing is a key value proposition. Treat a guide, along with its crew, tools, and knowledge, as a reusable component you can deploy across many surfaces.&lt;/p&gt;
&lt;p&gt;Build and test guides internally, then publish them anywhere. Once defined, these guides can be rendered anywhere via standard web components. For example, the &lt;code&gt;guideants-chat&lt;/code&gt; widget allows reuse. But the core idea is broader: your guide becomes a portable capability you can embed into new or existing systems.&lt;/p&gt;
&lt;p&gt;You can embed AI chat widgets directly into your website, customer portal, or internal tools. You can create public-facing assistants for support, documentation, or interactive experiences. You can integrate with your app using client-side tool execution for dynamic, context-aware conversations. And you can maintain control with authentication options, usage limits, and real-time analytics.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WhyGuidesNotChatbots/powerbi.gif&quot; alt=&quot;How guided work becomes a customer-facing feature.&quot;&gt;&lt;/p&gt;
&lt;h2&gt;A concrete reference stack&lt;/h2&gt;
&lt;p&gt;Throughout this series, we&amp;#39;ll reference two complementary ways to build guided agent workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GuideAnts&lt;/strong&gt; is the product and workflow layer. It&amp;#39;s where you author guides, crews, tools, and knowledge, then publish and embed them. You can learn more at &lt;a href=&quot;https://www.guideants.ai&quot;&gt;GuideAnts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AntRunner&lt;/strong&gt; is the code and implementation layer in .NET. It provides tool-based assistants, streaming, external tool calls, and OAuth token forwarding. It&amp;#39;s open source and available at &lt;a href=&quot;https://github.com/Elumenotion/AntRunner&quot;&gt;AntRunner on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can use either independently, but together they illustrate the full spectrum from designing agent workflows to implementing them.&lt;/p&gt;
&lt;h2&gt;What &amp;quot;good&amp;quot; looks like: a guide design checklist&lt;/h2&gt;
&lt;p&gt;Use this checklist when you turn a prompt into a guide.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clear scope&lt;/strong&gt;: what the guide does and does not do.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeatable procedure&lt;/strong&gt;: the steps the guide follows every time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured output&lt;/strong&gt;: a stable format like headings, tables, or JSON schema, whatever your app needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool boundaries&lt;/strong&gt;: only the tools required, no &amp;quot;tool buffet.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delegation rules&lt;/strong&gt;: when to call specialized assistants and what each assistant is responsible for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test prompts&lt;/strong&gt;: five to ten golden test cases that represent real user requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability hooks&lt;/strong&gt;: what you&amp;#39;ll monitor, including cost per run, tool call counts, error patterns, and user success rate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#39;ll expand each of these in upcoming posts.&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s next&lt;/h2&gt;
&lt;p&gt;In the next post we&amp;#39;ll build a reusable assistant using Search as an example. You&amp;#39;ll see how to define clear boundaries, structure tool calls, and create something that can be tested independently and composed into larger workflows.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re building an application and want a reliable AI feature, start here. Don&amp;#39;t ask &amp;quot;what prompt should I use?&amp;quot; Ask: what work am I trying to guide and standardize?&lt;/p&gt;
</content:encoded></item><item><title>ToolBasedAgents</title><link>https://www.elumenotion.com/journal/toolbasedagents/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/toolbasedagents/</guid><pubDate>Mon, 06 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Tool-based Agent Pattern&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;I ended my last article, &lt;a href=&quot;https://www.elumenotion.com/Journal/RagIsAnAntipattern.html&quot;&gt;Retrieval Augmented Generation is an Anti-pattern&lt;/a&gt; by saying, &lt;em&gt;”Cheaper and better models with large context windows allow us to use the LLM to manage generation and greatly simplify the architecture by giving it the entire context and allowing it to manage retrieval and any other tools it needs to fulfill its purpose. The use of knowledge sources becomes just like any other thing the agent knows how to do.”&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This article is about the pattern I use in &lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt;, &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt;, and &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt;. I call it the &lt;strong&gt;Tool-based Agent Pattern&lt;/strong&gt;.&lt;br/&gt;  &lt;/p&gt;
&lt;h2&gt;Attribution&lt;/h2&gt;
&lt;p&gt;One aspect of calling something a pattern is that it is commonly used. The &lt;a href=&quot;https://help.openai.com/en/articles/8550641-assistants-api-v2-faq&quot;&gt;OpenAI Assistants API&lt;/a&gt; is an example, as is &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt;. It is documented elsewhere as &lt;a href=&quot;https://weaviate.io/blog/what-is-agentic-rag&quot;&gt;Agentic RAG&lt;/a&gt;, but I maintain that “Agentic RAG” is not in fact a RAG pattern because it is not a given that an agents tools involve retrieval.&lt;br/&gt;&lt;br&gt;If you disagree, ask yourself if a tool like Code Interpreter (a python sandbox) is a form of retrieval. The agent’s LLM makes all the decisions. There is no ‘augmentation’. The agents  writes code based on the model’s training. It sin’t RAG because there is no ‘R’etrieval and no ‘A’ugmentation, only ‘G’eneration. Furthermore, nothing in the name suggests there are, generically, tools at the center of the pattern.&lt;br/&gt;&lt;br&gt;If an agent can write notes via a tool, is it not doing retrieval, adding a new tool to the same API that can read notes doesn’t change the architecture pattern, can your design become RAG by including a read operation? &lt;br/&gt;&lt;br&gt;Thanks to &lt;a href=&quot;https://www.linkedin.com/in/mahmoudhamedhassan/&quot;&gt;Mahmoud Hassan | LinkedIn&lt;/a&gt; for asking about this in a comment on the last article! &lt;br/&gt;&lt;br&gt;Terminology aside, this is a common approach you should understand because: it works, it is easy to understand, it is versatile, and it is architecturally sound as you can extend it without making fundamental changes to the pattern.  &lt;/p&gt;
&lt;h2&gt;Software Architecture Methodology&lt;/h2&gt;
&lt;p&gt;This article will explain the pattern using a software architecture methodology known as Structured Analysis and Decomposition.   &lt;/p&gt;
&lt;h3&gt;Structured Analysis and Decomposition&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Structured Analysis and Decomposition (SA/SD)&lt;/strong&gt; is a systematic approach used in software engineering to analyze business requirements and develop specifications for converting these requirements into functional systems. This methodology emerged in the 1970s and is characterized by its focus on breaking down complex systems into smaller, manageable components. The primary goals of SA/SD are to improve clarity, enhance communication among stakeholders, and ensure that the system meets user needs.&lt;br/&gt;&lt;br&gt;You can read more about &lt;a href=&quot;https://en.wikipedia.org/wiki/Structured_analysis&quot;&gt;Structured Analysis on Wikipedia&lt;/a&gt;.  &lt;/p&gt;
&lt;h3&gt;Data Flow Diagrams (DFDs) in Structured Analysis&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Data Flow Diagrams (DFDs)&lt;/strong&gt; are a crucial tool in the structured analysis phase of SA/SD. They visually represent the flow of data within a system, highlighting how information is exchanged between processes and external entities. Here’s how DFDs are utilized in structured analysis:  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Modeling Data Flow&lt;/strong&gt;: DFDs depict the movement of data through processes, showing inputs, outputs, and data stores without detailing the timing or sequence of data exchanges.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identifying Processes&lt;/strong&gt;: Each process in a DFD represents a specific function that transforms input data into output data, facilitating a clear understanding of system operations.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clarifying Requirements&lt;/strong&gt;: By illustrating data flows, DFDs help stakeholders visualize system functionality, ensuring that all necessary processes are included.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facilitating Communication&lt;/strong&gt;: DFDs provide a common framework for developers and stakeholders, improving understanding and collaboration throughout the project lifecycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Elements of Data Flow Diagrams&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Processes&lt;/strong&gt;: Represented by circles or ovals, indicating where data is processed.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Stores&lt;/strong&gt;: Shown as open-ended rectangles, representing where data is stored.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External Entities&lt;/strong&gt;: Illustrated as squares, indicating outside actors that interact with the system.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Flows&lt;/strong&gt;: Arrows that show the direction of data movement between processes, stores, and entities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The goal is communication.&lt;/strong&gt; You don’t need to know a lot of technical details and there is no code.&lt;br/&gt;  &lt;/p&gt;
&lt;h3&gt;Context diagram&lt;/h3&gt;
&lt;p&gt;Drawing DFD’s is like a game where if you follow the rules honestly, you can be reasonably sure the design is correct and complete.&lt;br/&gt;&lt;br&gt;You start at the top…  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;And work your way down…  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;With a few simple rules:  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Inputs and outputs must match&lt;/strong&gt;: In the diagrams above each has the same inputs and outputs such that we can replace the first drawing’s single process with the second drawing  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Miracles Allowed&lt;/strong&gt;: The data in the flows must have a source. When you are in a decomposition layer and it requires data that isn’t plausibly coming from somewhere, there is a hole in the design or the layers above are structurally deficient  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No black holes&lt;/strong&gt;: The data produced by a process must go somewhere. If not, there is a hole in the requirements or the layers above are structurally deficient  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No avoidably vague process names&lt;/strong&gt;: Processes with names like &lt;em&gt;Process data&lt;/em&gt; are a sign that the design is not finished or completely thought through.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iterate until done&lt;/strong&gt;: Keep working until you have broken the problem down to sufficient detail, fixing mistakes as they are found.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Requirements and Reasons Why&lt;/h2&gt;
&lt;p&gt;Architecture always depends on requirements. Without them, how do you judge anything? In turn, each requirement needs justification.  &lt;/p&gt;
&lt;h3&gt;Cohesively functional, stable, and measurable&lt;/h3&gt;
&lt;p&gt;First and foremost, what we build needs to work and we need to be able to prove it works. This is not easy with traditional software where operations are generally &lt;a href=&quot;https://en.wikipedia.org/wiki/Deterministic_algorithm&quot;&gt;deterministic&lt;/a&gt; which means that given the same input we will get the same output.&lt;br/&gt;&lt;br&gt;An agent is inherently &lt;a href=&quot;https://en.wikipedia.org/wiki/Nondeterministic_algorithm&quot;&gt;nondeterministic&lt;/a&gt; which means that we really don’t know what will happen. The natural language processing has randomness built-in and is a giant statistical model. In fact, when the agents work together in a network where one agent can choose to ask other agents, the resulting system is &lt;a href=&quot;https://gist.github.com/rbishop/9082539&quot;&gt;indeterministic (see ‘Notes from Carl Hewitt on the Actor Model’&lt;/a&gt;. I won’t go off on a tangent, but this is the specific reason why it is helpful to apply the &lt;a href=&quot;https://en.wikipedia.org/wiki/Actor_model&quot;&gt;actor model of computing&lt;/a&gt;. If you don’t get what I mean when I say an agent is actor-like, don’t worry about it but if you are interested in distributed systems designs, I’d encourage you to expand your horizons in this direction.&lt;br/&gt;&lt;br&gt;We need ways to test and measure the performance of an agent because there is a likelihood that a given operation will yield unexpected, possibly undesirable, results.    &lt;/p&gt;
&lt;h4&gt;Defining functional agents&lt;/h4&gt;
&lt;p&gt;The inputs to an agent are practically unbounded, but we can narrow the scope of what the agent can do based on its instructions which include the tools the agent can use. This is necessary because a single agent is limited by the capabilities of today’s models. In an agentic system we will use multiple specialized agents with an array of available tools in each.&lt;br/&gt;&lt;br&gt;I find it helpful to think of an AI agent in terms of cohesion and modularity. Cohesion and modularity are important concepts in software design and architecture:&lt;br&gt;-	&lt;strong&gt;Cohesion&lt;/strong&gt; refers to how closely related and focused the responsibilities of a single module or component are. A module with high cohesion performs a specific task or a set of related tasks, making it easier to understand, maintain, and reuse. High cohesion is desirable as it leads to systems that are easier to manage and less prone to bugs.&lt;br&gt;-	&lt;strong&gt;Modularity&lt;/strong&gt; is the degree to which a system&amp;#39;s components can be separated and recombined. A modular system is composed of distinct modules that can be developed, tested, and updated independently. This separation helps in organizing code, improving maintainability, and facilitating collaboration among multiple developers.  &lt;/p&gt;
&lt;p&gt;We want high cohesion within agents and strong modularity across the system.  &lt;/p&gt;
&lt;h4&gt;The importance of stability&lt;/h4&gt;
&lt;p&gt;Depending on the model there is a point where the performance will degrade if the instructions are too complex. Furthermore, we might want to evaluate other models or alter the parameters.&lt;br/&gt;&lt;br&gt;The instructions with tools, the model, and the model parameters are the &lt;strong&gt;Agent Configuration&lt;/strong&gt;. We can measure the performance of the agent using real or synthetic data and iterate and (hopefully) improve by including better instructions, using different models, and altering the model parameters. When we start to build and improve an agent or system, we need to manage the Agent Configuration as a versioned artifact. For now, at the architectural level this means the Agent Configuration is a unit with its own management lifecycle.  &lt;/p&gt;
&lt;h4&gt;Measurability requires cohesion and stability&lt;/h4&gt;
&lt;p&gt;Measurability requires us to say up front what we are measuring; what the agent does and what its limits are.  The measurement allows us to iterate for better results and gives us a way to consider how the agent fits into a system and is a tool we can use to identify additional requirements to compensate for its deficiencies. Perfection is impossible but we can design working systems with imperfect pieces if we build in ways to compensate for faults.&lt;br/&gt;&lt;br&gt;Doing this kind of measurement and tuning resulted in the creation of &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt; which makes it easy to package a assistants in easily version-able forms, deploy them, and run them with test scripts.    &lt;/p&gt;
&lt;h4&gt;Cohesive AntArmy Ants&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt; comes with a number of predefined agents.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Each Ant has a clear purpose, and the tools support the purpose. They work together on a thread directed by the user. We can add new ants without altering the existing, tested, and stable ants.	  &lt;/p&gt;
&lt;h3&gt;Modular and reusable&lt;/h3&gt;
&lt;p&gt;Agents should be modular and reusable. AntArmy is a chat interface and an interactive UI. AntRunner supports scripts,  applications like jobs, and individual services. These facts are evidence of the pattern’s modularity and support for reuse.  &lt;/p&gt;
&lt;h4&gt;Pre-defined orchestrations&lt;/h4&gt;
&lt;p&gt;This diagram shows a job which extracts meaning from transcripts. The steps in this orchestration are explicit. The individual agents use the same pattern as the AntArmy Ants, but there is no UI or human in the loop.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image6.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SpeakerNameIdentifier&lt;/strong&gt; has tools to read a transcript from a database given its ID, and write records that identify the speaker names and roles from the context of the transcript  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SpeakerNameIdentifierEvaluator&lt;/strong&gt; has instructions to evaluate the identified speakers and a tool to identify speakers missing in the database  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SpeakerInsightsExtractor&lt;/strong&gt; extracts meaning from passages in the transcript and a tool to insert the results into the database&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Self-directed orchestrations, aka Agent Swarms&lt;/h4&gt;
&lt;p&gt;Consider that a ‘Tool’ can be anything. The assistants API supports file retrieval, code interpreter, and functions. This means that a tool can be another agent which, in turn, can also use other agents as tools.&lt;br/&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/douglasware/AntRunner/blob/main/Notebooks/8-Web-Search-Ant-As-Tool.ipynb&quot;&gt;AntRunner&lt;/a&gt; contains a sample notebook which illustrates this using a &lt;strong&gt;WebSearchAgentAnt&lt;/strong&gt; which has a tool for web search and another tool which is an agent named &lt;strong&gt;WebPageAgentAnt&lt;/strong&gt; which reads a web page and returns the content that answers the question, if any. The notebook is a cut-down and faster version of &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt; which uses a similar design with more reasoning and quality checks.&lt;br/&gt;&lt;br&gt;I will write more about these agents in future articles.  &lt;/p&gt;
&lt;h2&gt;Tool-based Agent Pattern&lt;/h2&gt;
&lt;p&gt;My apologies for the long preamble, the rest of the article is about the actual pattern, starting at the top.&lt;br/&gt;&lt;br&gt;For clarity, these diagrams show the data elements in the flows, but in truth the bigger system with many agents would show them at a higher-level because the threads and thread runs are shared by all the agents in the system. We can create a thread by using one agent, and then continue it with others.  &lt;/p&gt;
&lt;h3&gt;Tool-based Agent&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;1. Assemble Thread Run&lt;/h4&gt;
&lt;p&gt;Agents work against a thread which represents the conversation. Invoking an agent either creates a new thread or continues an existing thread.&lt;br/&gt;&lt;br&gt;Inference (using the LLM) is inherently stateless and its input contains everything the model needs the produce a response including:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The input message  &lt;/li&gt;
&lt;li&gt;Previous messages, i.e. the thread  &lt;/li&gt;
&lt;li&gt;The model parameters, e.g. temperature  &lt;/li&gt;
&lt;li&gt;The agent’s specific instructions  &lt;/li&gt;
&lt;li&gt;Any additional context required, e.g. today’s date, the user’s location  &lt;/li&gt;
&lt;li&gt;Tool definitions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image8.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h5&gt;1.1 Add Instructions &amp;amp; Model Parameters&lt;/h5&gt;
&lt;p&gt;At the beginning of the flow, we have the input message and optionally a thread identifier. Given that the input message could be an entire previous conversation, the persisted thread and thread run are optional. Implicit and not shown is the agent’s identity or name. The process begins by combining the input message such as:&lt;br/&gt;&lt;br&gt;&lt;strong&gt;“What is my name”&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;With the agent instructions, such as:&lt;br/&gt;&lt;br&gt;&lt;strong&gt;“You use a tool to get the user’s profile”&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;And the model parameters such as:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;top_p = 0.7  
Temperature = 0.5  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that names and number of model parameters depend on the specific model.  &lt;/p&gt;
&lt;h5&gt;1.2 Add Context Messages&lt;/h5&gt;
&lt;p&gt;Frequently an agent will need extra information such as the current date and time or a user’s preference. If your agent has a code sandbox, you could use it to get the current date and time, but that uses tokens and time. A better alternative is to add messages with whatever information is required before starting the run.&lt;br/&gt;&lt;br&gt;&lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;AntArmy Chat&lt;/a&gt; includes tools that an agent can use to save preferences such as the current OneNote notebook. The agent instructions specify which are added.  &lt;/p&gt;
&lt;h5&gt;1.3 Add Tool Definitions&lt;/h5&gt;
&lt;p&gt;Generically, a tool definition is something in the prompt which we can translate to running an operation and getting a result. In the case of the Open AI Assistants API we configure file retrieval and the python sandbox in the assistant definition and can also specify other tools using JSON. The &lt;a href=&quot;https://github.com/douglasware/AntRunner/blob/main/Notebooks/1-Basics-Cat-Facts.ipynb&quot;&gt;Cat Facts AntRunner sample&lt;/a&gt;. Incudes this a tool named &lt;strong&gt;GetCatFacts&lt;/strong&gt;.&lt;br/&gt;  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{  
  &amp;quot;name&amp;quot;: &amp;quot;GetCatFacts&amp;quot;,  
  &amp;quot;description&amp;quot;: &amp;quot;Retrieve and query facts&amp;quot;,  
  &amp;quot;parameters&amp;quot;: {  
    &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,  
    &amp;quot;properties&amp;quot;: {},  
    &amp;quot;required&amp;quot;: []  
  },  
  &amp;quot;strict&amp;quot;: false  
}  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice that the JSON doesn’t have any information about how &lt;strong&gt;GetCatFacts&lt;/strong&gt; works. The LLM’s instructions do not include information about this because the LLM is only a model - it can’t run code or use the internet. The LLM will ‘call’ the tool by asking for it via generation, in this case GetCatFacts(), the application using the model, in this case the AntRunner library, to give it the result of using the tool &lt;em&gt;&lt;strong&gt;somehow&lt;/strong&gt;&lt;/em&gt;. Accordingly, implementations of this pattern can vary widely without altering the pattern.&lt;br/&gt;&lt;br&gt;We will get into the mechanics of tool calling  later, but for now, note that here we are translating a complete definition of the tool including such information as the server URL and auth, into a simplified subset.  &lt;/p&gt;
&lt;h5&gt;1.4 Get or Create Thread&lt;/h5&gt;
&lt;p&gt;Finally, a thread is created or retrieved if there is history, and everything is packaged to send to the LLM to run the thread.  &lt;/p&gt;
&lt;h4&gt;2. Run Thread&lt;/h4&gt;
&lt;p&gt;The assembled “thread” already has a few pieces of information: the system’s settings (Agent Config), the latest messages in the thread, and an ID to keep everything organized. First, we create a new “Thread Run.” Think of this as opening a new session dedicated to handling the conversation with an agent. It can be a different agent than those used previously.&lt;br/&gt;&lt;br&gt;Next the LLM generates an actual response for the conversation. It looks at the conversation’s history, applies the agent’s behavior rules, and then crafts the next output message. If the system decides it needs outside help - like calling a search API or some other external tool - it creates a &amp;quot;tool call&amp;quot; to describe what it wants the external service to do. In the next step, the system handles those tool calls. If the new information from the tools change what needs to be said next, the process loops back to generating output again, this time using the fresh tool results. This cycle continues until the conversation produces a final response or no longer needs outside services.&lt;br/&gt;&lt;br&gt;The &lt;strong&gt;Thread Run&lt;/strong&gt; stores the state and all the messages, tool calls, and tool call results, for the run.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image9.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h5&gt;Example Thread Run&lt;/h5&gt;
&lt;p&gt;Below is an example of how a Thread Run might unfold when an agent that has two tools (“GetLocation” and “GetWeather”) receives the user’s message: “What is the current weather?”&lt;br/&gt;&lt;br&gt;Each row represents a step in the overall process (Create Thread Run, Generate Output, Handle Run Step), showing what goes in and what comes out.  &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step #&lt;/th&gt;
&lt;th&gt;Step Name&lt;/th&gt;
&lt;th&gt;Key Inputs&lt;/th&gt;
&lt;th&gt;Process / Action&lt;/th&gt;
&lt;th&gt;Outputs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Create Thread Run&lt;/td&gt;
&lt;td&gt;- Agent Config (with tools GetLocation, GetWeather) &lt;br/&gt; - Thread Messages (User: “What is the current weather?”) &lt;br/&gt; - Thread ID (e.g. 1234)&lt;/td&gt;
&lt;td&gt;- System initializes a new Thread Run context. &lt;br/&gt; - Generates a Thread Run ID (e.g. run_001).&lt;/td&gt;
&lt;td&gt;- Thread ID (1234) &lt;br/&gt; - Thread Run ID (run_001) &lt;br/&gt; - (Agent Config &amp;amp; Thread Messages passed along)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Generate Output&lt;/td&gt;
&lt;td&gt;- Agent Config, Thread Messages (incl. “What is the current weather?”), Thread ID (1234), Thread Run ID (run_001)&lt;/td&gt;
&lt;td&gt;- Agent analyzes the user request. &lt;br/&gt; - Determines it needs a location before it can fetch the weather. &lt;br/&gt; - Decides to call GetLocation.&lt;/td&gt;
&lt;td&gt;- Output Messages: No new direct message yet. &lt;br/&gt; - Tool call: “GetLocation” &lt;br/&gt; - Thread Run ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Handle Run Step&lt;/td&gt;
&lt;td&gt;- Tool call: “GetLocation” &lt;br/&gt; - Thread Run ID (run_001)&lt;/td&gt;
&lt;td&gt;- System invokes the “GetLocation” tool. &lt;br/&gt; - GetLocation responds with a location (e.g., “New York, NY”).&lt;/td&gt;
&lt;td&gt;- Tool call result: “New York, NY” &lt;br/&gt; - Thread Run ID (run_001)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Generate Output&lt;/td&gt;
&lt;td&gt;- Agent Config, Thread Messages, Thread ID (1234), Thread Run ID (run_001) &lt;br/&gt; - Tool call result: “New York, NY”&lt;/td&gt;
&lt;td&gt;- Agent sees the location is “New York, NY.” &lt;br/&gt; - Decides it now needs the weather for that city. &lt;br/&gt; - Creates a new tool call for “GetWeather(‘New York, NY’).”&lt;/td&gt;
&lt;td&gt;- Output Messages: No new direct message yet. &lt;br/&gt; - Tool call: “GetWeather(‘New York, NY’)” &lt;br/&gt; - Thread Run ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Handle Run Step&lt;/td&gt;
&lt;td&gt;- Tool call: “GetWeather(‘New York, NY’)” &lt;br/&gt; - Thread Run ID (run_001)&lt;/td&gt;
&lt;td&gt;- System invokes GetWeather with “New York, NY.” &lt;br/&gt; - Tool returns weather data (e.g., “Currently sunny, 25°C”).&lt;/td&gt;
&lt;td&gt;- Tool call result: “Currently sunny, 25°C” &lt;br/&gt; - Thread Run ID (run_001)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Generate Output&lt;/td&gt;
&lt;td&gt;- Agent Config, Thread Messages, Thread ID (1234), Thread Run ID (run_001) &lt;br/&gt; - Tool call result: “Currently sunny, 25°C”&lt;/td&gt;
&lt;td&gt;- Agent now has location and weather info. &lt;br/&gt; - Crafts the final message: “It’s currently sunny and 25°C in New York.”&lt;/td&gt;
&lt;td&gt;- Output Message (to user): “It’s currently sunny and 25°C in New York.” &lt;br/&gt; - No further tool calls required.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;End of Thread Run&lt;/td&gt;
&lt;td&gt;- N/A&lt;/td&gt;
&lt;td&gt;- System sees no more steps are needed. &lt;br/&gt; - Thread Run concludes.&lt;/td&gt;
&lt;td&gt;- Final output delivered to user. &lt;br/&gt; - Thread Run complete.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;3. Use Tool&lt;/h4&gt;
&lt;p&gt;Finally, we get to using tools. Remember: &lt;strong&gt;a tool definition is something in the prompt which we can translate to running an operation and getting a result&lt;/strong&gt;.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ToolBasedAgents/image10.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;In the case of the &lt;a href=&quot;https://github.com/douglasware/AntRunner/blob/main/Notebooks/1-Basics-Cat-Facts.ipynb&quot;&gt;Cat Facts AntRunner sample&lt;/a&gt; the LLM’s definition was:  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{  
  &amp;quot;name&amp;quot;: &amp;quot;GetCatFacts&amp;quot;,  
  &amp;quot;description&amp;quot;: &amp;quot;Retrieve and query facts&amp;quot;,  
  &amp;quot;parameters&amp;quot;: {  
    &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,  
    &amp;quot;properties&amp;quot;: {},  
    &amp;quot;required&amp;quot;: []  
  },  
  &amp;quot;strict&amp;quot;: false  
}  
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;3.1 Get Tool Definition&lt;/h5&gt;
&lt;p&gt;When the LLM asks for a tool call of GetCatFacts, the system must provide the tool call result somehow. Mechanically this could be a web service, a local function, or a step in a low-code solution. In this case AntRunner uses an &lt;a href=&quot;https://www.openapis.org/&quot;&gt;Open API schema&lt;/a&gt; that describes a simple web service. &lt;br/&gt;  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{  
  &amp;quot;openapi&amp;quot;: &amp;quot;3.0.0&amp;quot;,  
  &amp;quot;info&amp;quot;: {  
    &amp;quot;title&amp;quot;: &amp;quot;Cat Facts API&amp;quot;,  
    &amp;quot;description&amp;quot;: &amp;quot;API to retrieve and manage cat facts.&amp;quot;,  
    &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  
    &amp;quot;contact&amp;quot;: {  
      &amp;quot;name&amp;quot;: &amp;quot;alexwohlbruck&amp;quot;,  
      &amp;quot;url&amp;quot;: &amp;quot;https://github.com/alexwohlbruck/cat-facts&amp;quot;  
    }  
  },  
  &amp;quot;servers&amp;quot;: [  
    {  
      &amp;quot;url&amp;quot;: &amp;quot;https://cat-fact.herokuapp.com&amp;quot;,  
      &amp;quot;description&amp;quot;: &amp;quot;Base URL for all endpoints&amp;quot;  
    }  
  ],  
  &amp;quot;paths&amp;quot;: {  
    &amp;quot;/facts&amp;quot;: {  
      &amp;quot;get&amp;quot;: {  
        &amp;quot;operationId&amp;quot;: &amp;quot;GetCatFacts&amp;quot;,  
        &amp;quot;summary&amp;quot;: &amp;quot;Retrieve and query facts&amp;quot;,  
        &amp;quot;description&amp;quot;: &amp;quot;Get a list of animal facts.&amp;quot;  
      }  
    }  
  }  
}  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AntRunner creates the tool definition that the LLM uses from the full specification and uses the full specification to do call the real tool. In this case a web service, but &lt;a href=&quot;https://github.com/douglasware/AntRunner/blob/main/Notebooks/2-Local-Function-Calling.ipynb&quot;&gt;local function calling is also supported as shown in this notebook&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;In Conclusion&lt;/h2&gt;
&lt;p&gt;The Tool-based Agent Pattern is a practical way to design agent systems by utilizing modular agents, each with specific tools. This method enhances flexibility and reusability, making it easier to adapt to changing requirements.&lt;br/&gt;&lt;br&gt;Cohesive and modular agents are essential components of this pattern. Cohesion refers to how closely related the responsibilities of a single agent are, ensuring that each agent performs a specific task effectively. For example, consider an agent designed to handle customer inquiries. This agent could be responsible for answering questions about product availability, while another agent could focus on processing orders. By separating these functions, each agent can be optimized for its specific role, leading to better overall performance. &lt;br/&gt;&lt;br&gt;The applicability of the Tool-based Agent Pattern extends across a wide range of scenarios. For instance, pre-defined orchestrations allow for structured workflows where agents perform specific tasks in a coordinated manner. Interactive UIs enable users to engage with multiple agents seamlessly, enhancing the overall experience. Additionally, job orchestration automates complex processes, allowing agents to work together without human intervention. This versatility makes the Tool-based Agent Pattern a valuable framework for developing efficient and responsive systems in various domains.  &lt;/p&gt;
&lt;h2&gt;Next up…&lt;/h2&gt;
&lt;p&gt;A key reason why the Ants work well is because a lot of time went into creating and tuning the instructions and tool descriptions. At the heart of the &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner library&lt;/a&gt; there is a focus on making the most of tools to enable:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quality output  &lt;/li&gt;
&lt;li&gt;Agent swarms  &lt;/li&gt;
&lt;li&gt;Security authorization  &lt;/li&gt;
&lt;li&gt;Local functions  &lt;/li&gt;
&lt;li&gt;Output filtering to conserve tokens, improve performance, and lower cost  &lt;/li&gt;
&lt;li&gt;More&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading this very long article! &lt;br/&gt;&lt;br&gt;If you like this kind of long-form content, please share and link. &lt;br/&gt;&lt;br&gt;Up with humans!&lt;br&gt;--Doug Ware&lt;/p&gt;
</content:encoded></item><item><title>AboutAnts</title><link>https://www.elumenotion.com/journal/aboutants/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/aboutants/</guid><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AntArmy and AntRunner&lt;/h1&gt;
&lt;p&gt;Two weeks ago, I started the process of getting AntArmy released to the first group of testers and now the uses table has several new entries! I am grateful for the help and feedback, and I am excited to make it to this milestone. If you would like to help test and give feedback, please send me a message!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/AboutAnts/antarmy1.png&quot; alt=&quot;Go AntArmy!&quot;&gt;&lt;/p&gt;
&lt;p&gt;I recently released &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;&lt;strong&gt;Antunner&lt;/strong&gt;&lt;/a&gt;, a .NET library, PowerShell module and Azure Functions tools we use to make, test, deploy and improve the AI assistants we call &lt;em&gt;Ants&lt;/em&gt;. I&amp;#39;ve been busy adding features and fixing bugs. Over the next weeks and months I&amp;#39;ll be using these tools to teach and demonstrate an effective way to build AI apps.&lt;/p&gt;
&lt;p&gt;AntRunner is very much targeted at the .NET, Microsoft Azure, and M365 communities. If it sounds useful to you, I hope you&amp;#39;ll ty out the &lt;a href=&quot;https://github.com/douglasware/AntRunner/tree/main/Notebooks&quot;&gt;demo notebooks&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Ants - More than just a fun name&lt;/h2&gt;
&lt;p&gt;A key philosophy of building and using ants is that they are small, specialized, and independent and that they work together. I took this name from notes I took long ago about the Actor Model of computing because ants, conceptually, are actors.&lt;/p&gt;
&lt;p&gt;I created the section that follows using two ants in collaboration. The first ant searched the web and then autonomously sent messages to five other ants to read the pages identified by search to extract applicable content for the first ant who wrote the final response. &lt;strong&gt;&lt;a href=&quot;https://github.com/douglasware/AntRunner/blob/main/Notebooks/8-Web-Search-Ant-As-Tool.ipynb&quot;&gt;See the 8-Web-Search-Ant-As-Tool notebook for details&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ensuing that you include links to pages supporting key statements are included throught your output, explain how the quote &amp;#39;one ant is no ants&amp;#39; applies to the actor model of computing. Do not simply povide a list of links at the end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Start of Ant Output (images are from the pages the ants found...)&lt;/h3&gt;
&lt;hr/&gt;

&lt;p&gt;The phrase &amp;quot;one ant is no ants&amp;quot; is often used to emphasize the collective and collaborative nature of ants in a colony. This concept is directly applicable to the Actor Model of computing, which relies on the interactions and cooperation among multiple actors to achieve concurrent and distributed computations effectively.&lt;/p&gt;
&lt;h3&gt;Explanation:&lt;/h3&gt;
&lt;h4&gt;Collective Strength&lt;/h4&gt;
&lt;p&gt;In an ant colony, the strength and effectiveness of the colony arise from the interactions and cooperation among individual ants. An individual ant is limited in what it can achieve alone; however, together as a colony, ants can perform complex tasks and solve problems efficiently. This idea is encapsulated in the saying &amp;quot;one ant is no ant.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/600/1*bIQhhOQilM3iUBgESywYuA.jpeg&quot; alt=&quot;Ant Colony&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image Source: &lt;a href=&quot;https://towardsai.net/p/l/ant-colony-optimization-an-overview&quot;&gt;towardsai.net&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Actor Model Collaboration&lt;/h4&gt;
&lt;p&gt;Similarly, in the Actor Model of computing, the phrase &amp;quot;one actor is no actor&amp;quot; underscores that the power and effectiveness of the model come from the interactions and collaboration among multiple actors. An individual actor can perform a specific computation or task, but the true strength of the Actor Model is realized when multiple actors work together, exchange messages, and coordinate their actions. This is essential for building scalable and fault-tolerant applications.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&quot;https://www.brianstorti.com/the-actor-model/&quot;&gt;Brian Storti&amp;#39;s article&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One ant is no ant. And one actor is no actor. They come in systems. In the actor model everything is an actor and they need to have addresses so one actor can send a message to another.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This highlights the importance of having multiple actors that interact with each other to create a functional concurrent system, much like how ants work together in a colony.
&lt;img src=&quot;https://static.vecteezy.com/system/resources/previews/004/256/124/non_2x/anti-ant-no-ants-sign-for-insecticide-vector.jpg&quot; alt=&quot;Actor Model&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image Source: &lt;a href=&quot;https://www.vecteezy.com/vector-art/4256124-anti-ant-no-ants-vector-sign-for-insecticide&quot;&gt;vecteezy.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For more details, you can explore the full content &lt;a href=&quot;https://rustinaction.dev/actors/2023/introduction-to-actix&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Summary:&lt;/h3&gt;
&lt;p&gt;&amp;quot;One ant is no ant&amp;quot; underscores the collective strength of ants in a colony, while &amp;quot;one actor is no actor&amp;quot; emphasizes the collaborative nature of the Actor Model in concurrent and distributed computing. The power of the Actor Model lies in the interactions among multiple actors, just as the effectiveness of an ant colony lies in the cooperation among individual ants.&lt;/p&gt;
&lt;p&gt;By understanding and applying this analogy, developers can better grasp the necessity of designing systems where multiple actors work together to manage state and perform computations effectively, ensuring scalability and fault-tolerance.&lt;/p&gt;
&lt;hr/&gt;
### End of Ant output... the rest is human including the typos

&lt;br/&gt;

&lt;h2&gt;Ants versus Copilots&lt;/h2&gt;
&lt;p&gt;One of the biggest requirements I used to drive this architecture was that each AI application, i.e. each ant, needs to be self standing and reusable. The AntRunner functions and AntRunner library make it easy to turn ants into web services which in turn supports several flavors of copilot extensibility and anything else that can use a web service. So, your copilot can look to an army of ants to do all sorts of useful things that were not practically possible eighteen months ago!&lt;/p&gt;
&lt;p&gt;--Doug Ware, September 26, 2024&lt;/p&gt;
&lt;p&gt;P.S. It is hard to get noticed with all the noise about AI. If you like the project and are the type of person who uses github, contributions are very much appreciated.&lt;/p&gt;
</content:encoded></item><item><title>AntRunnerSwarms</title><link>https://www.elumenotion.com/journal/antrunnerswarms/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/antrunnerswarms/</guid><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&amp;#39;Reasoning Tokens&amp;#39; and swarm-based agent applications&lt;/h1&gt;
&lt;p&gt;Today is an exciting time to be a product builder and AI applications consultant. Two of the biggest obstacles to building useful systems with generative AI have fallen away in the last month or two: available capacity of state of the art models, and high costs.&lt;/p&gt;
&lt;p&gt;As of today (Sept 30, 2024) the default quotas are documented on the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/quotas-limits&quot;&gt;Azure OpenAI Service quotas and limits page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Massive capacity increases of available Tokens Per Minute (TPM) per deployment&lt;/h2&gt;
&lt;p&gt;Azure OpenAI Service imposes quotas and rate limits to manage resources effectively. These limits are defined in terms of Tokens Per Minute (TPM) and Requests Per Minute (RPM).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default TPM Limits&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4o&lt;/strong&gt;: 450,000 TPM (Default), 30 million TPM (Enterprise agreement)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4o-mini&lt;/strong&gt;: 2 million TPM (Default), 50 million TPM (Enterprise agreement)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4 Turbo&lt;/strong&gt;: 450,000 TPM (Default), 2 million TPM (Enterprise agreement)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;... and steep price declines&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/AntRunnerSwarms/CapacityAndCost.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;In terms of practical architecture and design, going from a quota of 80k per minute to 2000k changes things dramatically.&lt;/p&gt;
&lt;h2&gt;&amp;#39;Reasoning Tokens&amp;#39;, swarms, and high TPM requirements&lt;/h2&gt;
&lt;p&gt;Recently &lt;a href=&quot;https://openai.com/index/introducing-openai-o1-preview/&quot;&gt;OpenAI released o1-preview&lt;/a&gt;. The o1 models prioritize enhanced reasoning and extended thinking time for complex tasks.&lt;/p&gt;
&lt;p&gt;OpenAI hasn&amp;#39;t disclosed how the system works and are reportedly &lt;a href=&quot;https://www.yahoo.com/tech/openai-threatening-ban-users-asking-224308494.html#:~:text=As%20Ars%20Technica%20reports,%20OpenAI%20is%20now&quot;&gt;banning people who get too nosey&lt;/a&gt;. API billing for the model includes &lt;strong&gt;&amp;#39;reasoning tokens&amp;#39;&lt;/strong&gt;. Reasoning tokens are a key aspect of the o1 models, representing the model&amp;#39;s internal thought process as it breaks down the prompt, considers various approaches, and formulates a response. These tokens are not visible in the API response but are still billed and counted as output tokens.&lt;/p&gt;
&lt;h3&gt;Thinking for yourself&lt;/h3&gt;
&lt;p&gt;While I don&amp;#39;t know how OpenAI&amp;#39;s chain of thought system works, I can guess that it is based on the same &lt;strong&gt;extension mechanism&lt;/strong&gt; used for image generation, file search, code interpreter and plugins which, in the assistants API is &lt;strong&gt;&lt;a href=&quot;https://platform.openai.com/docs/assistants/overview&quot;&gt;called tools&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Tools allow a language model to know about and &amp;#39;call&amp;#39; other programs. The language model has no ability to talk to other systems (+1 for humanity), the program (such as a chatbot) using the language model has to do the work of invoking the tool (somehow) with the input provided by the language model, get the results (however is appropriate) and continue the generation by including the tool call output in the next generation operation.&lt;/p&gt;
&lt;p&gt;My work with AI ecosystems over the past couple of years has included a mix of python, javascript/typescript, and .NET. A big reason I used c# and .NET for &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt; instead of one of the others is the strength of .NET for asynchronous operations and parallel tasks. That is to say simply: &lt;strong&gt;it&amp;#39;s easy to do a lot of things at once, instead of one thing at a time&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Doing a lot of things at once is really important if you have a lot of work to do that can be done in parallel.&lt;/p&gt;
&lt;p&gt;Over the coming days, weeks, and months I plan to write a lot about building agentic AI applications. I&amp;#39;ll be using &lt;a href=&quot;https://github.com/douglasware/AntRunner/tree/main/Notebooks&quot;&gt;AntRunner&lt;/a&gt; which is an open source library and associated tools for building AI applications. AntRunner allows an ant to use tools which might be other ants. In those cases, a swarm of ants work together in parallel to create the answer.&lt;/p&gt;
&lt;p&gt;This chart shows one such run which took just over 60 seconds. During that time a total of 41 ants search the web, loaded pages and extracted relevant content, but it also shows a massive spike in usage which the quota for the deployments easily permit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/AntRunnerSwarms/TokenUsage.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The prompt&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Use python to get today&amp;#39;s date and then use it to find things to do in Atlanta for each of the next four weekends with pictures and correct links from FindAnswers.

Don&amp;#39;t forget - include only valid links!
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sample output&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.elumenotion.com/Projects/AntRunnerAgentsSample.html&quot;&gt;You can view the output of a sample run here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.elumenotion.com/Projects/AntRunnerAgentsSample.html&quot;&gt;&lt;img src=&quot;/images/AntRunnerSwarms/ArticleSnippet.png&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Cost breakdown&lt;/h2&gt;
&lt;p&gt;Using mostly gpt-4o-mini keeps costs down. The single call to gpt-4o cost almost as much as 40 calls to gpt-4o-mini!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/AntRunnerSwarms/UsageAndCost.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This same ant swarm with only gpt-4o produces similar, slightly better results but costs around $1.20 instead of 12 cents. I can easily reduce it to 9 cents by replacing code interpreter with a local function.&lt;/p&gt;
&lt;p&gt;--Doug Ware
September 30, 2024&lt;/p&gt;
&lt;p&gt;P.S. Need to build AI applications but could use a guide? I&amp;#39;d love to hear from you!&lt;/p&gt;
</content:encoded></item><item><title>RagIsAnAntipattern</title><link>https://www.elumenotion.com/journal/ragisanantipattern/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/ragisanantipattern/</guid><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Retrieval Augmented Generation is an Anti-pattern&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;In 2025, don’t start your AI journey solving problems from 2022&lt;/h2&gt;
&lt;p&gt;It’s hard for me to believe that I started my AI/ML journey in earnest over 2.5 years ago. At the beginning my interest was in computer vision, but ChatGPT came out at the end of 2022 and turned me toward generative AI. Since then, I’ve been working successfully as a consultant and building commercial and open-source products including &lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt;, &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt;, and &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt;.&lt;br/&gt;&lt;br&gt;Educating myself and keeping up with the changes is a lot of work, but building things for my own business and for others helps give me a point of view based on first-hand experience. If you are an experienced AI software builder, you may disagree with what I am about to say. If you are new to the space, I think this is important advice: &lt;strong&gt;The most popular approach to chatbot and agent design, Retrieval Augmented Generation (RAG), is outmoded!&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;This article explains why I say this and what I think is a better alternative.  &lt;/p&gt;
&lt;h3&gt;Conventional wisdom&lt;/h3&gt;
&lt;p&gt;If you search LinkedIn for &lt;strong&gt;’RAG Patterns’&lt;/strong&gt; you will find many posts and articles telling you why it is good and how to use it with numerous variations.  &lt;/p&gt;
&lt;h3&gt;Conventional wisdom&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;It is a popular approach for building chatbots and agents. &lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt;, &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt;, does not use this pattern in any of its agents, but the Web Ants do something similar using an alternative pattern. If I ask them &lt;strong&gt;is this correct? &amp;quot;Retrieval Augmented Generation is an Anti-pattern“&lt;/strong&gt;, they will tell me something like: &lt;em&gt;&lt;strong&gt;The statement &amp;quot;Retrieval Augmented Generation is an Anti-pattern&amp;quot; is not widely supported by current literature or expert consensus. Instead, Retrieval-Augmented Generation (RAG) is generally viewed as a beneficial approach in the field of natural language processing (NLP) and artificial intelligence (AI).&lt;/strong&gt;&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image3.gif&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;AntArmy.AI is integrated with M365 and is a private solution for people to run in Azure, and so there is no public demo for it yet, but anyone can use the search ants by sending an email to &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt;.&lt;br/&gt;  &lt;/p&gt;
&lt;h3&gt;What is an Anti-pattern?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Anti-pattern&quot;&gt;Wikipedia&lt;/a&gt; says an anti-pattern: &lt;em&gt;&lt;strong&gt;in software engineering, project management, and business processes is a common response to a recurring problem that is usually ineffective and risks being highly counterproductive.&lt;/strong&gt;&lt;/em&gt;&lt;br/&gt;&lt;br&gt;To be an anti-pattern then is to be a pattern that seems reasonable and is popular, and where, by implication, there are better alternatives. Sometimes we make patterns to work around challenges that later disappear or are mitigated enough that the pattern no longer fits the real world. Retrieval Augmented Generation is an example.  &lt;/p&gt;
&lt;h3&gt;What is RAG?&lt;/h3&gt;
&lt;p&gt;Retrieval-Augmented Generation (RAG) is an approach in natural language processing that combines a search index(s) with a generative model(s). In RAG, a specialized embeddings model first retrieves relevant documents or pieces of information from an index based on the user&amp;#39;s query. This retrieval process ensures that the generated responses are grounded in factual data, enhancing their relevance and accuracy.&lt;br/&gt;&lt;br&gt;Once the relevant information is retrieved, a generative model, creates a response using information in the retrieved content. This method allows the application to use information that the model does not contain such as anything that happened after the model was trained.&lt;br/&gt;&lt;br&gt;RAG is used in applications such as question answering, conversational agents, and content generation, where accurate and contextually relevant information is crucial. By combining retrieval and generation, RAG models try to produce more informed and contextually appropriate responses, and address limitations with models that rely solely on pre-trained knowledge without real-time data access.   &lt;/p&gt;
&lt;p&gt;This diagram shows the basic pattern. I didn’t make it and I don’t know who did - I’ve seen it several times and image search yields more than 20 pages going back to 2023 in different sites including the OpenAI community site!  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;There are many variations on this pattern (which is a symptom of the problem), but the basic pattern is:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retrieval&lt;/strong&gt; happens in steps 2 and 3 using the original user query&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Augmentation&lt;/strong&gt; happens in step 4 when the original user query is augmented or rewritten to contain the (hopefully) relevant information that was retrieved&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generation&lt;/strong&gt; of the response happens when the language model responds to the augmented query&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some simple cases where this basic pattern works well, and it makes for great demos. In December of 2023 I wrote &lt;a href=&quot;https://www.elumenotion.com/Journal/CopilotStudioThoughts.html&quot;&gt;Building Good Chatbots Part One, No-Code with Microsoft Copilot Studio and Azure AI Studio&lt;/a&gt;. At the end of that article, I teased a following article ‘Castle on a hill’ that was to include a lot of the techniques I and others use extend the pattern, but the more I built this less comfortable I got about recommending the pattern, and by May 2024 felt that there was a better way.&lt;br/&gt;&lt;br&gt;If you are Monty Python fan, you’ll appreciate it when I say ‘that castle sank into the swamp’.&lt;br/&gt;  &lt;/p&gt;
&lt;h2&gt;RAG Challenges&lt;/h2&gt;
&lt;p&gt;In the diagram retrieval is done in the box labeled &lt;strong&gt;Search Relevant Information&lt;/strong&gt; with input named &lt;strong&gt;‘Query’&lt;/strong&gt; coming from the computer icon which represents a &lt;strong&gt;chat application&lt;/strong&gt;.&lt;br/&gt;  &lt;/p&gt;
&lt;h3&gt;Searching Relevant Information&lt;/h3&gt;
&lt;p&gt;How does this &lt;strong&gt;Search Relevant Information&lt;/strong&gt; process know which knowledge sources to use and how to invoke them? In simple systems there is only one, but this might be complicated. Typically, making a decision about which sources to use is simply not made and instead the process will query everything in parallel and use a ranking function to pick the winning information. If a decision is made up-front it is often done by a fast and inexpensive models, not by the LLM used for the final generation.&lt;br/&gt;&lt;br&gt;Why wouldn’t you use an LLM, perhaps the same one used for the final generation? This part of the pattern is an example of a solution to problems that were solved by time. The first is inference cost. For example, GPT-4o-mini is approximately 200 times cheaper than GPT-4 and prices continue to decrease while quality continues to improve. A second is scarcity. Getting enough capacity to use GPT-4 in a system typically required a commitment to spend tens of thousands of dollars per month! Today capacity is more abundant with metered rates often with no minimums.&lt;br/&gt;&lt;br&gt;Backing up a step, how does the &lt;strong&gt;chat application&lt;/strong&gt; know that the user asked a question that should be handled by search? In a simple implementation the usual answer is that it just doesn’t worry about it and does a search anyway. If there are no results, the chat application deals with it somehow in the augmentation step.   &lt;/p&gt;
&lt;h3&gt;Knowledge Sources&lt;/h3&gt;
&lt;p&gt;A popular first project is the chatbot using a set of documents. If you use Copilot Studio or the Azure AI Foundry Chat Playground, you can get started quickly using documents you already have and deploy a new chatbot in minutes.    &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;SharePoint Agents are another of the many options.&lt;br/&gt;&lt;br&gt;With high quality documents under active content management and a narrow focus, you can create useful chat agents with good quality. In this case RAG is not an anti-pattern because it fits and doesn’t require a lot of extensions. But what if the content is not curated, covers a wide variety of topics, has hand-written text, pictures, or tables, or includes important metadata on a cover page, or as a document property?&lt;br/&gt;&lt;br&gt;What if people need to ask questions about the overall corpus like, ‘what was the most common complaint customers made?’ &lt;strong&gt;Document search depends on text that is in documents. Unless there is a document with text about&lt;/strong&gt; &lt;em&gt;&lt;strong&gt;common complaints&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;, a chatbot using search will not be able to answer the question because the answer is not in the text.&lt;/strong&gt;   &lt;/p&gt;
&lt;h3&gt;Multiple knowledge sources&lt;/h3&gt;
&lt;p&gt;It is very important to note that &lt;strong&gt;you can’t eliminate the need for knowledge sources!&lt;/strong&gt; If you want to create an AI agent like the Web Ants or &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt;, you have to provide the correct knowledge to the LLM for everything to work. &lt;strong&gt;The question is what patterns you use to build the agent.&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;A temptation is to try to create a single knowledge source that works for every scenario, but this is only practical when you have narrow requirements that everyone agrees on with high quality data, so basically never.&lt;br/&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt;&lt;/strong&gt; solves this challenge by using many agent ants with specific and narrow definitions, each with their own knowledge sources and tools. The pattern is very different from RAG, but &lt;strong&gt;many of the same pieces are required&lt;/strong&gt;. However, they are &lt;strong&gt;organized differently.&lt;/strong&gt;      &lt;/p&gt;
&lt;h2&gt;Augmentation introduces fragility&lt;/h2&gt;
&lt;p&gt;Step 4 is the creation of an ‘enhanced prompt’. At this point the chat application takes the original question, adds the knowledge, and in the case of the Azure AI Foundry ‘Add your data’ extensions (among others), adds instructions concerning citations.&lt;br/&gt;&lt;br&gt;Depending on the implementation, this new prompt might be very different, or even at odds with the user or system prompt. I encountered this when I had a knowledge source that consisted of questions, answers, and links to source documents that contained the official answers. Using the ‘Add your data’ extensions, it proved very difficult to get output that included the specific links from the answers in the Q&amp;amp;A documents instead of citing the Q&amp;amp;A documents themselves.&lt;br/&gt;&lt;br&gt;We wanted it to use the links in the content, but the creators of that specific RAG implementation assumed that citations to the indexed documents were desirable. The resulting augmented prompt overrode the instructions about the links.&lt;br/&gt;  &lt;/p&gt;
&lt;p&gt;A big flaw comes from the fact that the pattern explicitly separates the LLM from the true context and relies on an intermediary which frequently uses less capable or overly specialized models or instructions.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image6.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This intermediary is another element that made sense previously due to the constraints imposed by the size of the context window. In 2022, gpt-3.5-turbo had a context window size of 4096 tokens compared to 128,000 tokens with gpt-4o. So, when implementing RAG with gpt-3.5-turbo, managing the size of the context widow was much harder as today we have almost 32 times as much space to work with.&lt;br/&gt;&lt;br&gt;This means we can:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put more facts in the prompt&lt;/li&gt;
&lt;li&gt;Provide more instructions for dealing with different knowledge sources&lt;/li&gt;
&lt;li&gt;Have longer threads&lt;/li&gt;
&lt;li&gt;Do more ‘thinking’&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Much of the augmentation and context management done by the chat application with RAG can now be managed by the LLM which has a large enough context window to ‘see’ and participate in the entire flow.   &lt;/p&gt;
&lt;h2&gt;Bigger picture RAG pattern&lt;/h2&gt;
&lt;p&gt;I looked at a lot of articles about RAG as I was putting this article together and I was impressed by the completeness of this one from Hevo Data - &lt;a href=&quot;https://hevodata.com/learn/what-is-rag-architecture/&quot;&gt;What is RAG Architecture? A Complete Guide | Hevo&lt;/a&gt;.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This diagram includes the ingestion pipeline to the vector database which is only one kind of knowledge source. Often there are easier, better, and more direct ways to provide the LLM with knowledge.   &lt;/p&gt;
&lt;h2&gt;Agents with tools are easier to build and can do more things&lt;/h2&gt;
&lt;p&gt;Cheaper and better models with large context windows allow us to use the LLM to manage generation and greatly simplify the architecture by giving it the entire context and allowing it to manage retrieval and any other tools it needs to fulfill its purpose. The use of knowledge sources becomes just like any other thing the agent knows how to do.    &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/RagIsAnAntipattern/image8.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Thanks for reading&lt;/h2&gt;
&lt;p&gt;This article is the preface for what I expect to be a long series articles about building AI agents with tools like the &lt;a href=&quot;https://www.antarmy.ai/&quot;&gt;Go AntArmy!&lt;/a&gt; ants, using the &lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt; library, &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/assistant&quot;&gt;using the  assistants api and Azure OpenAI&lt;/a&gt;. A big focus will be on how to define tools for existing APIs of your own and from vendors using examples like MSGraph and local functions.&lt;br/&gt;&lt;br&gt;A big focus of the architecture is the ability to use the resulting agents in other products, for examples, as Copilot Declarative Agents, and in fully custom systems or jobs such as &lt;a href=&quot;mailto://ask@antarmy.ai?subject=Answer%20this%20question&quot;&gt;ask@antarmy.ai&lt;/a&gt;.&lt;br/&gt;&lt;br&gt;Happy New Year!&lt;br&gt;--Doug Ware&lt;/p&gt;
</content:encoded></item><item><title>AntRunnerAgentsSample</title><link>https://www.elumenotion.com/projects/antrunneragentssample/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/antrunneragentssample/</guid><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here are some exciting things to do in Atlanta for each of the next four weekends, along with pictures and links to more information:&lt;/p&gt;
&lt;h3&gt;October 5-6, 2024&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Taste of Tucker&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 5, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Annual food festival along Main Street, Tucker, featuring food and drink from local restaurants and breweries, arts and crafts, music, and more.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://www.experism.com/explore/wp-content/uploads/2024/08/Taste_Tucker-1.jpg&quot; alt=&quot;Taste of Tucker&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Festival on Ponce&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 5-6, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Twice-annual arts festival in Olmsted Linear Park, with 125+ vendors of fine art, folk art, and outsider art, plus food and drink, and children&amp;#39;s activities.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://img.youtube.com/vi/Y21p3pgHRLU/maxresdefault.jpg&quot; alt=&quot;Fall Festival on Ponce&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Candler Park Fall Fest&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 5-6, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Popular annual festival in Candler Park and neighborhood, with live music, art, food, rides, games, and more.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://img.youtube.com/vi/Ddu1Hup5T7Y/maxresdefault.jpg&quot; alt=&quot;Candler Park Fall Fest&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atlanta Horror Film Festival&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 4-6, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Limelight Theater&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://www.experism.com/explore/wp-content/uploads/2024/08/Atlanta_Horror_Film_Fest_2.jpg&quot; alt=&quot;Atlanta Horror Film Festival&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atlanta Arab Festival&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 5-6, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Annual festival of Arabic food and culture at the Alif Institute, with traditional dishes from Arabic countries, live performances, vendors, exhibits, workshops, games, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;October 12-13, 2024&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atlanta Pride Festival and Parade&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 12-13, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; The Atlanta Pride Festival and Parade is a vibrant event that celebrates and supports the LGBTQ+ community.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://unexpectedatlanta.com/wp-content/uploads/2023/12/Atlanta-Festival-Calendar-2024.png&quot; alt=&quot;Atlanta Pride Festival&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://unexpectedatlanta.com/atlanta-festival-calendar-2024/&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Taste of Acworth&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 12, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Downtown Acworth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; An affordable food festival featuring FREE admission, with small bites for just $1 to $5 each.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlantaonthecheap.com/taste-of-acworth&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lilburn Daze&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 12, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Lilburn City Park&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A beloved fall arts &amp;amp; crafts festival with plenty of activities for kids, food, vendor booths, and live entertainment.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlantaonthecheap.com/lilburn-daze&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chalktoberfest&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 12-13, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Marietta Square&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A festival celebrating street art and craft beer, featuring live music and food, with a ticketed craft beer tasting.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://www.atlantaonthecheap.com/wp-content/uploads/2016/10/chalktoberfest-from-stock-37714032_s-e1570630137637.jpg&quot; alt=&quot;Chalktoberfest&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlantaonthecheap.com/chalktoberfest&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Old Fourth Ward Park Arts Festival&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 12-13, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Old 4th Ward Park&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A two-day arts festival with live acoustic music, about 150 vendor booths, food, and fall fun.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlantaonthecheap.com/old-fourth-ward-park-arts-festival&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;October 19-20, 2024&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Taste of Chamblee&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 19, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Annual food festival in downtown Chamblee, featuring food from neighborhood restaurants, craft vendors, children&amp;#39;s activities, football screenings, live performances, wine tent, beer garden, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HarvestFest and Scarecrows In The Square&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 19, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Annual fall festival in Marietta Square, with arts and crafts show, touch-a-truck, scarecrow displays, costume and pie-eating contests, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cherokee Heights Arts Festival&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 19, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Free annual arts festival in the Cherokee Heights neighborhood, with local artists and makers, local musicians, art activities, food, beer, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;L5P Halloween Festival and Parade&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 19-20, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Popular annual Halloween celebration in Little Five Points, with live music, parade, haunted house, ghost tours, and more.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Johns Creek Arts Festival&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 19-20, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Annual arts and crafts festival in Johns Creek featuring 140 artisans from across the country.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gosouthatlanta.com/things-to-do/events/atlanta-festivals.html&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;October 26-27, 2024&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atlanta Halloween Half Marathon &amp;amp; 5K&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 26, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Piedmont Park&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A fun and spooky race where participants are encouraged to wear costumes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Little 5 Points Halloween Festival &amp;amp; Parade&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 26-27, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A unique event with pumpkin decorating, street vendors, and live performances.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://offloadmedia.feverup.com/secretatlanta.co/wp-content/uploads/2022/09/13061101/rsz_shutterstock_122725621-e1697813240667.jpg&quot; alt=&quot;Little Five Points Halloween Parade&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://secretatlanta.co/little-five-points-halloween-parade-festival/&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scarecrows in the Garden&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 26-31, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location:&lt;/strong&gt; Atlanta Botanical Garden&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; The garden will feature a variety of scarecrows built and decorated by community members and local businesses.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://unexpectedatlanta.com/wp-content/uploads/2023/09/The-Best-Things-to-Do-in-Atlanta-in-October.png&quot; alt=&quot;Scarecrows in the Garden&quot;&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://atlantabotanicalgarden.org&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pumpkin Festival at Stone Mountain Park&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 26-27, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Offers family-friendly activities including costume contests and trick-or-treat scavenger hunts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discoveratlanta.com/events/festivals/fall/&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Howl-O-Ween at Zoo Atlanta&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; October 26-27, 2024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; A family-friendly Halloween event at the zoo with trick-or-treating, costume contests, and animal encounters.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.experism.com/atlanta/october&quot;&gt;More Info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These events provide a variety of activities and experiences perfect for enjoying the fall season in Atlanta!&lt;/p&gt;
</content:encoded></item><item><title>AntRunnerTools</title><link>https://www.elumenotion.com/projects/antrunnertools/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/antrunnertools/</guid><pubDate>Thu, 12 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://github.com/douglasware/AntRunner&quot;&gt;AntRunner&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A full set of .NET tools for creating and using Open AI and Azure Open AI Assistants&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create and manage Open AI Assistants (ants) from files stored in a file system and in Azure Blob Storage&lt;/li&gt;
&lt;li&gt;Easy setup of file search with vector stores from files bundled with ant definitions&lt;/li&gt;
&lt;li&gt;Easy setup of code interpreter and code interpreter files bundled with ant definitions&lt;/li&gt;
&lt;li&gt;Download files from code interpreter outputs&lt;/li&gt;
&lt;li&gt;Define and call REST API endpoints automatically with auth headers and oauth tokens&lt;/li&gt;
&lt;li&gt;Define and call local .NET methods automatically as tool calls&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AntRunner Projects and Tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AntRunnerLib - The core library for creating and running ants, published on nuget.org&lt;/li&gt;
&lt;li&gt;AntRunnerFunctions - Azure Functions for running ants including a REST API and Durable Functions&lt;/li&gt;
&lt;li&gt;AntRunnerPowershell - A PowerShell module for managing and running ants&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Notebooks&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/douglasware/AntRunner/Notebooks&quot;&gt;Get started with the sample notebooks&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var assistantRunOptions = new AssistantRunOptions() {
    AssistantName = &amp;quot;MsGraphUserProfile&amp;quot;,
    Instructions = &amp;quot;What is my name?&amp;quot;,
    OauthUserAccessToken = oAuthToken
};
var output = await AntRunnerLib.AssistantRunner.RunThread(assistantRunOptions, config);
Console.WriteLine(output.LastMessage)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Your name is Doug Ware.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>AntArmyPreview</title><link>https://www.elumenotion.com/projects/antarmypreview/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/antarmypreview/</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AntArmy - Together we are strong!&lt;/h1&gt;
&lt;div&gt;&lt;video width= &quot;960&quot; height= &quot;504&quot; controls&gt;&lt;source src=&quot;https://github.com/douglasware/ElumenotionSite/raw/master/docs/video/AntArmyIntro.mp4?raw=true&quot; type=&quot;video/mp4&quot;&gt;Your browser does not support the video tag&lt;/video&gt;&lt;/div&gt;</content:encoded></item><item><title>TranscriptionAndDiarization</title><link>https://www.elumenotion.com/journal/transcriptionanddiarization/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/transcriptionanddiarization/</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Locally and Privately Extracting Meaning from Video with Transcription, Diarization, and LLMs&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/TranscriptionAndDiarization/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;My &lt;a href=&quot;IngestingPdfContent.md&quot;&gt;previous entry&lt;/a&gt; was about using computer vision and OCR along with various versions of GPT-4 with vision to convert PDFs into text files containing descriptions of images and text-based diagrams. I’m excited by the ability to turn images into words, but I am also excited about turning sound into words!&lt;br/&gt;&lt;br&gt;… and sound into images, images into sound, etc. &lt;br/&gt;&lt;br&gt;Ultimately, I think user experiences should &lt;a href=&quot;ProjectedUserExperiencesWithAI&quot;&gt;adapt to the person&lt;/a&gt; and be multimodal for the benefit of all kinds of people, but another reason for my interest is because there is a lot of useful information that isn’t written down. It must be seen and/or heard. How do we make that information usable?&lt;br/&gt;&lt;br&gt;Microsoft stirred up a lot of controversy these past weeks with &lt;a href=&quot;https://apnews.com/article/microsoft-ai-recall-windows-6ba8df3f22e9fca599d20f2d5770cd95?utm_source=copy&amp;utm_medium=share&quot;&gt;Recall&lt;/a&gt; and it reminded me why I am so interested in private and local AI applications. That reason is simply that there are a lot of reasons people might hesitate to trust cloud providers with certain information.   &lt;/p&gt;
&lt;h2&gt;Who is this entry for?&lt;/h2&gt;
&lt;p&gt;I am writing this for as general an audience as possible. The technical details are in the &lt;a href=&quot;../Projects/TranscriptionAndDiarization.md&quot;&gt;demonstration project&lt;/a&gt; and &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization&quot;&gt;gihub&lt;/a&gt;. If you want to do this yourself, I broke it down into each step using jupyter notebooks and included one with the complete process to create a transcript with speakers from a video. Here, I will talk about it at a much higher level.&lt;br/&gt;&lt;br&gt;I am approaching this topic as a continuation of my previous ones about &lt;a href=&quot;./BuildingDomainSpecificLLMBots.md&quot;&gt;building and grounding chatbots&lt;/a&gt; and &lt;a href=&quot;./IngestingPdfContent.md&quot;&gt;ingesting PDF content&lt;/a&gt;, but I also use these techniques often to create interview and meeting notes and to analyze content.&lt;br/&gt;&lt;br&gt;Teams Copilot does a great job at many of these tasks if you can use it, but the way it is licensed and the fact that it’s locked into Teams limit its utility for me. This works on any video or audio, I can use its output however I like, and it’s private and completely free.&lt;br/&gt;&lt;br&gt;The key thing though is that the transcript and other information I create when I do this is the end of the first step. The next step might be some kind of analysis, additional content generation, indexing, or work by an AI agent.  &lt;/p&gt;
&lt;h2&gt;Local or privately hosted generative AI with open source models and libraries&lt;/h2&gt;
&lt;p&gt;Everything in this article ran on my desktop computer. It is similar in specs to the configuration shown below (core I9, 64GB memory, with NVIDIA Geforce RTX 4090 24GB).    &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/TranscriptionAndDiarization/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Let me just start by saying that I completely get that that is an expensive setup and most people don’t have a desktop with a top-end consumer GPU and CPU. The good news is that everything I use here is possible on a lot of consumer hardware, but it will be slower, and you might have to break up the steps a bit. Part of my experiment was to see if I could do everything in a single process with my GPU.&lt;br/&gt;&lt;br&gt;Alternatively, you can do all of this in the cloud in notebooks, containers, or virtual machines using many different providers. The point is that the models and tools are all open source. All of this works on Windows, Mac, and Linux.   &lt;/p&gt;
&lt;h2&gt;The process&lt;/h2&gt;
&lt;p&gt;This diagram shows the steps.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD  
    A[&amp;quot;Download a video from YouTube using pytube&amp;quot;] --&amp;gt; B[&amp;quot;Extract audio from video using MoviePy&amp;quot;]  
    B --&amp;gt; C[&amp;quot;Create transcript using whisper-large-v3&amp;quot;]  
    C --&amp;gt; D[&amp;quot;Identify distinct speakers using pyannote.audio&amp;quot;]  
    D --&amp;gt; E[&amp;quot;Combine Whisper transcript with pyannote speaker data&amp;quot;]  
    E --&amp;gt; F[&amp;quot;Identify speaker names using phi-3-medium&amp;quot;]  
    F --&amp;gt; G[&amp;quot;Create final output&amp;quot;]  
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Test video&lt;/h3&gt;
&lt;p&gt;The test video I am using is &lt;a href=&quot;https://www.youtube.com/watch?v=MI9DHkyH8Yk&quot;&gt;Developer’s Guide to Customizing Microsoft Copilot - Microsoft Build 2024&lt;/a&gt;. I chose it because it was a great presentation, because Jeremy has an accent, and because Barnam and Jeremy introduced themselves and said their names! It’s funny what you notice when you start looking for specific information, but often people forget to introduce themselves.&lt;br/&gt;  &lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/MI9DHkyH8Yk?si=CjeMA_mM-zwwOQpM&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;  

&lt;p&gt;I use &lt;a href=&quot;https://pypi.org/project/pytube/&quot;&gt;pytube&lt;/a&gt; to download videos from YouTube. There are some dodgy websites that will do it for you too.   &lt;/p&gt;
&lt;h3&gt;Extract audio from video using MoviePy&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&quot;https://pypi.org/project/moviepy/&quot;&gt;moviepy&lt;/a&gt; to easily extract the audio track. Pytube and moviepy are venerable and popular, and ChatGPT has no trouble writing code using them.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/TranscriptionAndDiarization/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;Create transcript using whisper-large-v3&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/openai/whisper&quot;&gt;Whisper&lt;/a&gt; is a speech recognition model from OpenAI you can use as a service, but it has an open license which means that, unlike GPT-4 and DALL-E, you can download it and run it yourself. It is available on &lt;a href=&quot;https://huggingface.co/openai/whisper-large-v3&quot;&gt;huggingface&lt;/a&gt; and has millions of downloads across its different versions and &lt;a href=&quot;https://huggingface.co/spaces/hf-audio/open_asr_leaderboard&quot;&gt;ranks among the very best automatic speech recognition options&lt;/a&gt;.&lt;br/&gt;&lt;br&gt;For comparison:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/TranscriptionAndDiarization/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The YouTube transcript lacks spelling and punctuation and is also less accurate. Where YouTube failed badly, Whisper did a good job phonetically with Barnam’s name. The fact that it spelled it incorrectly isn’t surprising and is even expected.&lt;br/&gt;&lt;br&gt;To me ‘mistakes’ made by a model fall into two categories:&lt;br/&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Things the model should know either through its training or grounding data&lt;/li&gt;
&lt;li&gt;Things that the model does not know or have any way of knowing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The easiest way to identify the second category is to ask yourself if a normal person could do it. If we were talking, and I said his name, could you correctly spell Barnam Bora?  &lt;/p&gt;
&lt;h3&gt;Who said what? Identify distinct speakers using pyannote.audio&lt;/h3&gt;
&lt;p&gt;If the audio is a single speaker, the whisper transcript would be enough to use with an LLM, but without knowing who said what, there are a lot of questions an LLM (or a person) would not be able to answer. Conceptually, this is the same sort of problem I wrote about in &lt;a href=&quot;IngestingPdfContent.md&quot;&gt;my article about ingesting PDFs&lt;/a&gt;. Concepts aside, it is a different problem and requires a different solution.&lt;br/&gt;&lt;br&gt;I use &lt;a href=&quot;https://pypi.org/project/pyannote.audio/&quot;&gt;pyannote.audio&lt;/a&gt; which is also available as a more robust &lt;a href=&quot;https://pyannote.ai/&quot;&gt;service&lt;/a&gt; to perform diarization. The diarization creates a Rich Transcription Time Marked (RTTM) file, a space-delimited text files containing one turn per line. &lt;br/&gt;&lt;br&gt;This video covers the topic in more depth:   &lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/37R_R82lfwA?si=61ATFFZwDcH-7Sky&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;  

&lt;p&gt;For reference, the first five lines of the output look like this:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SPEAKER Developer’sGuidetoCustomizingMicrosoftCopilot-MicrososftBuild2024 1 10.240 3.324 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt; SPEAKER_00 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt;  
SPEAKER Developer’sGuidetoCustomizingMicrosoftCopilot-MicrososftBuild2024 1 14.257 19.389 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt; SPEAKER_00 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt;  
SPEAKER Developer’sGuidetoCustomizingMicrosoftCopilot-MicrososftBuild2024 1 34.102 0.017 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt; SPEAKER_00 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt;  
SPEAKER Developer’sGuidetoCustomizingMicrosoftCopilot-MicrososftBuild2024 1 34.118 0.456 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt; SPEAKER_01 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt;  
SPEAKER Developer’sGuidetoCustomizingMicrosoftCopilot-MicrososftBuild2024 1 34.574 0.388 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt; SPEAKER_00 &amp;lt;NA&amp;gt; &amp;lt;NA&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Combine whisper transcript with pyannote speaker data&lt;/h3&gt;
&lt;p&gt;At this point we have a file with a transcript and time codes but not speaker information from whisper and another with time codes and speakers without a transcript from pyannote. The code is in &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/TranscriptionAndDiarization/DiarizeWithPyannote.ipynb&quot;&gt;this notebook&lt;/a&gt;. It also changes the time codes from seconds to something easier to read (hh:mm:ss). One wrinkle to this is that the time codes from the two models don’t line up perfectly, and so the final result often has some issues where the speaker changed in the middle of a line in the whisper transcript, although in this case it was fine.&lt;br/&gt;&lt;br&gt;The &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/TranscriptionAndDiarization/Transcript/Developer%E2%80%99s%20Guide%20to%20Customizing%20Microsoft%20Copilot%20-%20Micrososft%20Build%202024.transcript.txt&quot;&gt;result&lt;/a&gt; looks like this:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[SPEAKER_00] : [(00:00:00.000, 00:00:23.660)] :  All right, everybody. Welcome, welcome, welcome, welcome. First breakout of Build. I&amp;#39;m Barnum Bora, and I lead the developer advocacy team for Microsoft 365 and Copilot Platform.  
[SPEAKER_00] : [(00:00:23.660, 00:00:24.340)] :  advocacy team for Microsoft 365 and Copilot platform.  
[SPEAKER_00] : [(00:00:27.920, 00:00:28.120)] :  But without further ado, before I come back and do more things,  
[SPEAKER_00] : [(00:00:31.980, 00:00:36.160)] :  I&amp;#39;m going to hand off to my good friend Jeremy Thake, and he&amp;#39;s going to walk you through the first half of this session. Thanks, Barno. I appreciate it. And thank you for coming to Build.  
[SPEAKER_01] : [(00:00:37.960, 00:00:40.280)] :  So I&amp;#39;m Jeremy Thake. I&amp;#39;m a   
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Identify speaker names using phi-3-medium&lt;/h3&gt;
&lt;p&gt;Often at this point I have to do some manual steps to replace “SPEAKER_00” with a real name because I find that very often, perhaps most of the time, people don’t say their own names or refer to others by name. But still, if I am doing this process, I intend to use the transcript with a language model to get insight from the content.&lt;br/&gt;&lt;br&gt;In this case, Barnam and Jeremy demonstrated excellent presenter skills and the text contains their names. Thanks to this, I can use a language model to extract their names and update the transcript - an perfect example of using a language model to get insight from the content!&lt;br/&gt;&lt;br&gt;For this task I used &lt;a href=&quot;https://huggingface.co/microsoft/Phi-3-medium-4k-instruct-onnx-directml&quot;&gt;microsoft/Phi-3-medium-4k-instruct-onnx-directml&lt;/a&gt; which is a version of Phi-3-medium-4k-instruct optimized for use with &lt;a href=&quot;https://onnxruntime.ai/docs/genai/tutorials/phi3-python.html&quot;&gt;ONNX runtime&lt;/a&gt; which makes it super fast on my RTX-4090 GPU. Use it if you have a GPU and are using Windows.  &lt;/p&gt;
&lt;p&gt;My notebook contains code to pull out a few lines before and after a speaker’s first appearance and build a prompt:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # Create the prompt with the current speaker and their context  
        prompt = f&amp;quot;&amp;quot;&amp;quot;  
        The following text is a piece of a transcript. Examine the text and if the text identifies the speaker reply with ONLY the full name matching the exact spelling of the person listed as {speaker} and nothing else.   
        ----------------------------------------  
        {context_text}&amp;quot;&amp;quot;&amp;quot;  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The output of the function looks like this:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SPEAKER_00:  Barnum Bora  
SPEAKER_01:  Jeremy Thake  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the file is updated, the &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/TranscriptionAndDiarization/Transcript/Developer%E2%80%99s%20Guide%20to%20Customizing%20Microsoft%20Copilot%20-%20Micrososft%20Build%202024.transcript.FINAL.txt&quot;&gt;final transcript&lt;/a&gt; looks like this:  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Barnum Bora] : [(00:00:00.000, 00:00:23.660)] :  All right, everybody. Welcome, welcome, welcome, welcome. First breakout of Build. I&amp;#39;m Barnum Bora, and I lead the developer advocacy team for Microsoft 365 and Copilot Platform.  
[Barnum Bora] : [(00:00:23.660, 00:00:24.340)] :  advocacy team for Microsoft 365 and Copilot platform.  
[Barnum Bora] : [(00:00:27.920, 00:00:28.120)] :  But without further ado, before I come back and do more things,  
[Barnum Bora] : [(00:00:31.980, 00:00:36.160)] :  I&amp;#39;m going to hand off to my good friend Jeremy Thake, and he&amp;#39;s going to walk you through the first half of this session. Thanks, Barno. I appreciate it. And thank you for coming to Build.  
[Jeremy Thake] : [(00:00:37.960, 00:00:40.280)] :  So I&amp;#39;m Jeremy Thake. I&amp;#39;m a  
[Jeremy Thake] : [(00:00:40.280, 00:00:44.100)] :  principal program manager in the Copilot developer experience team. And a slight  
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;From here there is still room for improvement. The information extracted from the video contains only what was heard and none of what was seen. For example, one could further improve the pipeline by cutting the video into screen shots at transitions and enhance the content with both images as well as descriptions from a vision model. Often the names of the speakers are displayed as text in the video and looking for names in both places would presumably yield correct spellings for the speaker’s names.&lt;br/&gt;&lt;br&gt;Teams Copilot is exciting to people because it unlocks information and answers questions, but it is locked into Teams. You don’t have to settle for that.&lt;br/&gt;&lt;br&gt;Thanks for reading!&lt;br&gt;--Doug Ware&lt;br&gt;June 17, 2024&lt;/p&gt;
</content:encoded></item><item><title>TranscriptionAndDiarization</title><link>https://www.elumenotion.com/projects/transcriptionanddiarization/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/transcriptionanddiarization/</guid><pubDate>Sat, 15 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization&quot;&gt;This project&lt;/a&gt; demonstrates the use of local AI to transcribe, diarize, and enrich transcripts created from videos&lt;/h2&gt;
&lt;p&gt;It uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pytube.io/en/latest/index.html&quot;&gt;pytube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/moviepy/&quot;&gt;moviepy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/huggingface/transformers&quot;&gt;transformers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/pyannote.audio/&quot;&gt;pyannote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/onnxruntime-genai-directml/&quot;&gt;onnx-directml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will need to download and install microsoft/Phi-3-medium-4k-instruct-onnx-directml and update the model_path below. If you do not have GPU or are not using Windows, see the Phi-3 docs and set yourself up accordingly.&lt;/p&gt;
&lt;p&gt;Pyannote.audio is gated on huggingface and requires an account and access key. See &lt;a href=&quot;https://huggingface.co/pyannote/speaker-diarization-3.1&quot;&gt;https://huggingface.co/pyannote/speaker-diarization-3.1&lt;/a&gt; for instructions.&lt;/p&gt;
&lt;h2&gt;Notebooks&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/DownloadFromYoutube.ipynb&quot;&gt;DownloadFromYoutube.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Use pytube to download a video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/ExtractAudioFromVideo.ipynb&quot;&gt;ExtractAudioFromVideo.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Extract mp3 from mp4 with moviepy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/TranscribeVideoWithWhisperLarge.ipynb&quot;&gt;TranscribeVideoWithWhisperLarge.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Create a transcript with whisper-large-v3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/DiarizeWithPyannote.ipynb&quot;&gt;DiarizeWithPyannote.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Diarize with Pyannote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/Phi3-ONNX.ipynb&quot;&gt;Phi3-ONNX.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Use Phi-3 with ONNX to identify names and finalize transcript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/phi3test-transformers.ipynb&quot;&gt;phi3test-transformers.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A test for comparing transformers to ONNX (spoiler ONNX is waaaaay faster)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/TranscriptionAndDiarization/VideoToFullTranscriptWithWhisperPyannoteAndPhi3-medium.ipynb&quot;&gt;VideoToFullTranscriptWithWhisperPyannoteAndPhi3-medium.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Complete process in a single notebook&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded></item><item><title>IngestingPdfContent</title><link>https://www.elumenotion.com/projects/ingestingpdfcontent/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/ingestingpdfcontent/</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This project contains the companion code for &lt;a href=&quot;../Journal/IngestingPdfContent.html&quot;&gt;GPT-4o versus Azure Document Intelligence and Azure Computer Vision OCR&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Notebook Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToTextPages.ipynb&quot;&gt;PdfToTextPages.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Baseline, makes a text file for each page using pypdf to extract the text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb&quot;&gt;PdfToPageImages.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Given a folder of PDF files, converts each page of each PDF file into JPEG images using a resolution of 300 dpi, and saves them in a structured directory format.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/DocIntelligencePipeline.ipynb&quot;&gt;DocIntelligencePipeline.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C# Polyglot notebook with functions to convert an entire PDF to markdown and another that creates an OCR markdown file from each image created using &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb&quot;&gt;PdfToPageImages.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/turbo-2024-04-09.ipynb&quot;&gt;turbo-2024-04-09.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Azure Open AI using GPT-4 with vision to create a markdown file for each image created using &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb&quot;&gt;PdfToPageImages.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/v4omni.ipynb&quot;&gt;v4omni.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenAI using GPT-4o to create a markdown file for each image created using &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb&quot;&gt;PdfToPageImages.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/v4omni-image-plus-docIntelOcr.ipynb&quot;&gt;v4omni-image-plus-docIntelOcr.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenAI using GPT-4o to create a markdown file for each image created using &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb&quot;&gt;PdfToPageImages.ipynb&lt;/a&gt; grounded with OCR text created using &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/DocIntelligencePipeline.ipynb&quot;&gt;DocIntelligencePipeline.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/visionWithOcr.ipynb&quot;&gt;visionWithOcr.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Azure Computer Vision GPT4-Vision OCR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/PdfToMarkdownAndQaPairs/visionWithOcrAndGrounding.ipynb&quot;&gt;visionWithOcrAndGrounding.ipynb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Azure Computer Vision GPT4-Vision OCR and grounding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded></item><item><title>LibreChatBicep</title><link>https://www.elumenotion.com/journal/librechatbicep/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/librechatbicep/</guid><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Setup LibreChat in Azure Container Apps with Bicep&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/LibreChatBicep/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This post is by our summer intern, &lt;a href=&quot;https://www.linkedin.com/in/louis-de-fromont/&quot;&gt;Louis de Fromont&lt;/a&gt;, who is helping out tailoring the excellent &lt;a href=&quot;https://www.librechat.ai/&quot;&gt;LibreChat&lt;/a&gt; open source AI chat platform to use in projects specifically hosted in Azure. This bicep template can have you up and running in short order!&lt;br/&gt;&lt;br&gt;Take it away Louis!  &lt;/p&gt;
&lt;hr/&gt;  

&lt;h2&gt;Using the script&lt;/h2&gt;
&lt;p&gt;This Bicep script is the first small project that I’ve been working on at Elumention and is used to deploy a fully functional LibreChat instance to Azure. If you’ve been looking for an example to model your own script, hopefully, this blog post should help by highlighting some of the specifics when working with LibreChat. If you’re just interested in getting the deployment up and running, &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/LibreChatBicep/README.md&quot;&gt;you can take a look at the deployment instructions&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/LibreChatBicep/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;At a high level, this script creates a managed environment for containers hosting LibreChat, a MongoDB instance, and a Mongo Express web interface, with support for optional Azure Active Directory authentication. Additionally, it sets up a Cognitive Services account for OpenAI, creates storage accounts and file shares for configurations, and automates uploading the &lt;code&gt;librechat.yaml&lt;/code&gt; file for configuration.&lt;br&gt;At the heart of the deployment are the three different container apps:  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LibreChat container app&lt;/strong&gt;:  &lt;br&gt;   - Image: &lt;a href=&quot;https://hub.docker.com/r/librechat/librechat&quot;&gt;librechat/librechat:v0.7.3-rc&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MongoDB container app&lt;/strong&gt;:  &lt;br&gt;   - Image: &lt;a href=&quot;https://hub.docker.com/r/bitnami/mongodb&quot;&gt;bitnami/mongodb:7.0.7&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mongo-Express container app&lt;/strong&gt;:  &lt;br&gt;   - Image: &lt;a href=&quot;https://hub.docker.com/_/mongo-express&quot;&gt;mongo-express&lt;/a&gt;  &lt;br&gt;   - Provides an admin web UI to MongoDB.&lt;br&gt;All three container apps use public images from Docker Hub.&lt;br&gt;Additionally, two file shares are deployed:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MongoDB file share&lt;/strong&gt;:  &lt;br&gt;  - Mounted for the MongoDB container app to persist its database contents.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LibreChat file share&lt;/strong&gt;:  &lt;br&gt;  - Used to mount the &lt;code&gt;librechat.yaml&lt;/code&gt; file for LibreChat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As part of the deployment script, the &lt;code&gt;librechat.yaml&lt;/code&gt; file is processed and uploaded to the deployed file share for use by the LibreChat container app. The processing is done by first loading the contents of the file in Bicep using &lt;code&gt;loadTextContent(&amp;#39;../librechat.yaml&amp;#39;)&lt;/code&gt; then a series of &lt;code&gt;replace()&lt;/code&gt; functions are called on the loaded text to replace the API key and instance name of the OpenAI group. The key and instance name are loaded dynamically from the OpenAI service created as part of this script. After replacing the loaded YAML file, the contents are uploaded to the LibreChat file share via a deployment script. I based the code to write this deployment script based on &lt;a href=&quot;https://github.com/mattias-fjellstrom/azure-bicep-upload-data-to-storage/blob/main/modules/file.bicep&quot;&gt;a Bicep file by Mattias Fjellström&lt;/a&gt;.  &lt;/p&gt;
&lt;h3&gt;OpenAI Service Creation and Model Deployment:&lt;/h3&gt;
&lt;p&gt;To create the OpenAI service, a cognitive service account is first provisioned to manage the AI model deployments. Then, models are deployed based on the configuration defined in the &lt;code&gt;models.json&lt;/code&gt; file. The &lt;code&gt;deploymentName&lt;/code&gt; property for each model in the &lt;code&gt;models.json&lt;/code&gt; file should match the corresponding &lt;code&gt;deploymentName&lt;/code&gt; property in the &lt;code&gt;librechat.yaml&lt;/code&gt; file. This external configuration is accomplished in the Bicep script using the &lt;code&gt;loadJsonContent(&amp;#39;./models.json&amp;#39;)&lt;/code&gt; function and an iterative loop over every model. One note about this loop is I had to include the &lt;code&gt;@batchSize()&lt;/code&gt; decorator above the loop to limit the deployments of the models to one at a time. This is to avoid an error I commonly got in Azure when deploying models in parallel stating that “another operation is being performed on the parent resource” (the parent resource being the OpenAI service).  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/LibreChatBicep/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;A separate parameter in the script is available for configuring the location of the OpenAI service and its deployments. This is because not all regions have the same mode deployments available which is why you might want to deploy the OpenAI service in a separate region than the rest of the resource group. To ensure compatibility and availability of OpenAI models in your selected region, consult the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#model-summary-table-and-region-availability&quot;&gt;Model Summary Table and Region Availability guide&lt;/a&gt;. This provides detailed information on which AI models are available in specific OpenAI service regions.  &lt;/p&gt;
&lt;h3&gt;Configuring Optional Authentication for Mongo-Express:&lt;/h3&gt;
&lt;p&gt;To limit access to the Mongo-Express container app, an optional parameter called &lt;code&gt;createMonogexpressAuthConfig&lt;/code&gt; is available. When set to true, an Azure AD app registration and authentication configuration is created, adding Azure AD as an identity provider for Mongo-Express. This is accomplished natively in the Bicep script using the &lt;code&gt;Microsoft.Graph/applications@v1.0&lt;/code&gt; resource type. However, as of the time of writing, it is still an experimental feature and has just recently entered a public preview. Instructions to configure Bicep to work with Microsoft graph resources can be found &lt;a href=&quot;https://learn.microsoft.com/en-us/graph/templates/quickstart-create-bicep-interactive-mode&quot;&gt;here&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Because this is an experimental feature, not all features are fully supported, for example, attempting to re-run the Bicep script after setting up the Azure AD app registration can result in an error from the Azure CLI because the app registration resource already exists and modifications to an active app registration can’t be made. This is another reason I chose to make this part of the script be enabled with the &lt;code&gt;createMonogexpressAuthConfig&lt;/code&gt; parameter, with the idea being you set the parameter to true on the initial deployment, then keep it false on subsequent deployments to avoid having this part of the script cause the rest of the deployment to fail.  &lt;/p&gt;
&lt;hr/&gt;  
Louis de Fromont  
June 3, 2024</content:encoded></item><item><title>StringExtensions</title><link>https://www.elumenotion.com/projects/stringextensions/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/stringextensions/</guid><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;DougWare.StringExtensionMethods&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/StringExtensionMethods&quot;&gt;Source on Github&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DougWare.StringExtensionMethods is a set of C# extension methods for the &lt;code&gt;string&lt;/code&gt; class, providing functionality to extract substrings and lists of substrings between specified delimiters. These methods are particularly useful for text parsing tasks such as extracting content from HTML fragments or other structured text.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;Install the NuGet package using the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;dotnet add package DougWare.StringExtensionMethods
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;h3&gt;Methods&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;GetInnerText&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Retrieves the first substring between a specified preamble and postscript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static string GetInnerText(this string input, string preamble, string postscript)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; (string): The input string.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preamble&lt;/code&gt; (string): The start substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postscript&lt;/code&gt; (string): The end substring.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(string): The substring between the preamble and postscript, or an empty string if they are not found.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;string input = &amp;quot;preambleHello, World!postscript&amp;quot;;
string result = input.GetInnerText(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;);
// result: &amp;quot;Hello, World!&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;GetInnerText&lt;/code&gt; with Case Sensitivity&lt;/h4&gt;
&lt;p&gt;Retrieves the first substring between a specified preamble and postscript with an option for case sensitivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static string GetInnerText(this string input, string preamble, string postscript, bool ignoreCase)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; (string): The input string.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preamble&lt;/code&gt; (string): The start substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postscript&lt;/code&gt; (string): The end substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignoreCase&lt;/code&gt; (bool): Boolean flag to indicate if the search should be case insensitive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(string): The substring between the preamble and postscript, or an empty string if they are not found.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;string input = &amp;quot;PREAMBLEHello, World!POSTSCRIPT&amp;quot;;
string result = input.GetInnerText(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;, true);
// result: &amp;quot;Hello, World!&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;ToByteArrayUtf8&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Converts a string into a byte array using UTF-8 encoding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static byte[] ToByteArrayUtf8(this string input)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; (string): The input string.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(byte[]): The byte array representation of the input string.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;string input = &amp;quot;Hello, World!&amp;quot;;
byte[] result = input.ToByteArrayUtf8();
// result: [byte array of the string]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;GetInnerTextList&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Retrieves a list of substrings between specified preambles and postscripts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static List&amp;lt;string&amp;gt; GetInnerTextList(this string input, string preamble, string postscript)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; (string): The input string.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preamble&lt;/code&gt; (string): The start substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postscript&lt;/code&gt; (string): The end substring.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(List&lt;string&gt;): A list of substrings between the preamble and postscript.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;string input = &amp;quot;preambleHello, World!postscript preambleHello Again!postscript&amp;quot;;
List&amp;lt;string&amp;gt; result = input.GetInnerTextList(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;);
// result: [&amp;quot;Hello, World!&amp;quot;, &amp;quot;Hello Again!&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;GetInnerTextList&lt;/code&gt; with Case Sensitivity&lt;/h4&gt;
&lt;p&gt;Retrieves a list of substrings between specified preambles and postscripts with an option for case sensitivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static List&amp;lt;string&amp;gt; GetInnerTextList(this string input, string preamble, string postscript, bool ignoreCase)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt; (string): The input string.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preamble&lt;/code&gt; (string): The start substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postscript&lt;/code&gt; (string): The end substring.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignoreCase&lt;/code&gt; (bool): Boolean flag to indicate if the search should be case insensitive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(List&lt;string&gt;): A list of substrings between the preamble and postscript.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;string input = &amp;quot;PREAMBLEHello, World!POSTSCRIPT PREAMBLEHello Again!POSTSCRIPT&amp;quot;;
List&amp;lt;string&amp;gt; result = input.GetInnerTextList(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;, true);
// result: [&amp;quot;Hello, World!&amp;quot;, &amp;quot;Hello Again!&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Unit Tests&lt;/h2&gt;
&lt;h3&gt;GetInnerText&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;[TestMethod]
public void GetInnerText_ReturnsCorrectInnerText()
{
    var input = &amp;quot;preambleHello, World!postscript&amp;quot;;
    var result = input.GetInnerText(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;);
    Assert.AreEqual(&amp;quot;Hello, World!&amp;quot;, result);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GetInnerTextList&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;[TestMethod]
public void GetInnerTextList_ReturnsCorrectList()
{
    var input = &amp;quot;preambleHello, World!postscript preambleHello Again!postscript&amp;quot;;
    var result = input.GetInnerTextList(&amp;quot;preamble&amp;quot;, &amp;quot;postscript&amp;quot;);
    var expected = new List&amp;lt;string&amp;gt; { &amp;quot;Hello, World!&amp;quot;, &amp;quot;Hello Again!&amp;quot; };
    CollectionAssert.AreEqual(expected, result);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ToByteArrayUtf8&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;[TestMethod]
public void ToByteArrayUtf8_ReturnsCorrectByteArray()
{
    var input = &amp;quot;Hello, World!&amp;quot;;
    var result = input.ToByteArrayUtf8();
    var expected = Encoding.UTF8.GetBytes(input);
    CollectionAssert.AreEqual(expected, result);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more examples and detailed documentation, please refer to the source code and unit tests provided.&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;This project is licensed under the MIT License. See the &lt;a href=&quot;LICENSE&quot;&gt;LICENSE&lt;/a&gt; file for more details.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Feel free to contribute by submitting issues or pull requests to the GitHub repository. Happy coding!&lt;/p&gt;
</content:encoded></item><item><title>DocBuilder</title><link>https://www.elumenotion.com/projects/docbuilder/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/docbuilder/</guid><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Getting Started&lt;/h1&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;h3&gt;DocFx&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;a href=&quot;https://dotnet.github.io/docfx/tutorial/docfx_getting_started.html&quot;&gt;Getting Started with DocFX | DocFX website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DocFX is an API documentation generator for .NET, which currently supports C#, VB, and F#. It generates API reference documentation from triple-slash comments in your source code. It also allows you to use Markdown files to create additional topics such as tutorials and how-tos, and to customize the generated reference documentation.&lt;/li&gt;
&lt;li&gt;Chocolatey: &lt;code&gt;choco install docfx -y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Homebrew (owned by the community): &lt;code&gt;brew install docfx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitHub: Download and unzip docfx.zip from &lt;a href=&quot;https://github.com/dotnet/docfx/releases&quot;&gt;GitHub DocFX releases&lt;/a&gt;, extract it to a local folder, and add it to PATH so you can run it anywhere.&lt;/li&gt;
&lt;li&gt;NuGet: &lt;code&gt;nuget install docfx.console&lt;/code&gt;. &lt;code&gt;docfx.exe&lt;/code&gt; is under folder &lt;code&gt;docfx.console/tools/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DocBuilder PowerShell module&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Located in the same GitHub repo as this documentation, &lt;a href=&quot;https://github.com/ey-org/daas-documentation-tools&quot;&gt;ey-org/daas-documentation-tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clone the repo&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;LoadModule.ps1&lt;/code&gt; in your favorite (.NET Framework-based) PowerShell host to load the module&lt;/li&gt;
&lt;li&gt;Note: This module depends on GDI+, which does not exist in all host types, even on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The sample script used to build this site is here: &lt;code&gt;daas-documentation-tools\DocBuilder\Documentation\BuildDocs.ps1&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Building the Static Web Site&lt;/h2&gt;
&lt;h3&gt;Basic Process&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/GettingStarted/image8.png&quot; alt=&quot;Basic Process&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You can use the BuildOutput folder in the same way this repo does as the source for GitHub pages&lt;/li&gt;
&lt;li&gt;You can split the basic processes into smaller steps if you want to edit the markdown generated from PPTX&lt;ul&gt;
&lt;li&gt;Generate the markdown to a different location&lt;/li&gt;
&lt;li&gt;Edit as desired and copy into StaticContent using the best process for your project&lt;/li&gt;
&lt;li&gt;Generate the static website&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Converting PowerPoint to Markdown&lt;/h1&gt;
&lt;h2&gt;About the DocBuilder PowerShell Module&lt;/h2&gt;
&lt;p&gt;First, ensure you have the module loaded, as described in the Getting Started section.&lt;/p&gt;
&lt;h3&gt;PowerPoint File Conversion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To convert PowerPoint files to Markdown, use the &lt;code&gt;Convert-PowerPointToMarkdown&lt;/code&gt; cmdlet provided by the DocBuilder PowerShell module.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example usage:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Convert-PowerPointToMarkdown -InputFile &amp;quot;path    o\your\presentation.pptx&amp;quot; -OutputDirectory &amp;quot;path    o\output&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Converting PowerShell Module to Markdown&lt;/h1&gt;
&lt;h2&gt;Preparing Your Module&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure your PowerShell module is well-documented with appropriate comments.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Export-ModuleMember&lt;/code&gt; cmdlet to explicitly export functions and aliases that you want to include in the documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generating Markdown&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;Convert-PowerShellToMarkdown&lt;/code&gt; cmdlet from the DocBuilder PowerShell module.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example usage:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Convert-PowerShellToMarkdown -ModuleName &amp;quot;YourModuleName&amp;quot; -OutputDirectory &amp;quot;path    o\output&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Generating A Static Website&lt;/h1&gt;
&lt;h2&gt;Setting Up the Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure you have all prerequisites installed, as mentioned in the Getting Started section.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building the Website&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run the &lt;code&gt;BuildDocs.ps1&lt;/code&gt; script to generate the static website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example usage:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;.\BuildDocs.ps1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Customize the &lt;code&gt;docfx.json&lt;/code&gt; file to suit your project&amp;#39;s needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example configuration settings:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;metadata&amp;quot;: [
    {
      &amp;quot;src&amp;quot;: [
        {
          &amp;quot;files&amp;quot;: [
            &amp;quot;src/**/*.csproj&amp;quot;
          ],
          &amp;quot;cwd&amp;quot;: &amp;quot;../&amp;quot;
        }
      ],
      &amp;quot;dest&amp;quot;: &amp;quot;api&amp;quot;
    }
  ],
  &amp;quot;build&amp;quot;: {
    &amp;quot;content&amp;quot;: [
      {
        &amp;quot;files&amp;quot;: [
          &amp;quot;articles/**.md&amp;quot;,
          &amp;quot;toc.yml&amp;quot;
        ]
      }
    ],
    &amp;quot;resource&amp;quot;: [
      {
        &amp;quot;files&amp;quot;: [
          &amp;quot;images/**&amp;quot;
        ]
      }
    ],
    &amp;quot;dest&amp;quot;: &amp;quot;dist&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Adding Topics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When you add new topic articles or wish to change the order of the topic list, you must edit &lt;code&gt;StaticContent/topics/toc.yml&lt;/code&gt; manually.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/GeneratingAStaticWebsite/image10.png&quot; alt=&quot;Editing toc.yml&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Testing Locally&lt;/h1&gt;
&lt;h2&gt;Using http-server&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;After executing &lt;code&gt;BuildDocs.ps1&lt;/code&gt;, the &lt;code&gt;BuildOutput&lt;/code&gt; folder will contain a complete static website.&lt;/li&gt;
&lt;li&gt;One recommended choice for serving content is &lt;a href=&quot;https://www.npmjs.com/package/http-server&quot;&gt;http-server&lt;/a&gt; from NPM.&lt;/li&gt;
&lt;li&gt;Note that this option requires npm and its dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/TestingLocally/image8.png&quot; alt=&quot;http-server&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Hot Reloading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You don’t have to stop the web server to run the build script.&lt;/li&gt;
&lt;li&gt;It is highly recommended to open developer tools and disable caching.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Using GitHub Pages&lt;/h1&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/UsingGitHubPages/image8.png&quot; alt=&quot;GitHub Pages Setup&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Updating the Site&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Copy the &lt;strong&gt;contents&lt;/strong&gt; of the &lt;code&gt;BuildOutput&lt;/code&gt; folder to &lt;strong&gt;/docs&lt;/strong&gt; and update the master branch with a Pull Request.&lt;/li&gt;
&lt;li&gt;Wait a moment for the site to update.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>LibreChatBicep</title><link>https://www.elumenotion.com/projects/librechatbicep/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/librechatbicep/</guid><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Source Files are located in the &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/LibreChatBicep&quot;&gt;repo containing this site&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;Tools and Configuration Setup&lt;/h2&gt;
&lt;p&gt;Make sure you have &lt;a href=&quot;https://learn.microsoft.com/en-us/cli/azure/install-azure-cli&quot;&gt;installed Azure CLI&lt;/a&gt; and &lt;a href=&quot;https://learn.microsoft.com/en-us/cli/azure/authenticate-azure-cli&quot;&gt;are signed in to your Azure account&lt;/a&gt;. If you already have Azure CLI installed, run the &lt;code&gt;az bicep upgrade&lt;/code&gt; command to ensure you&amp;#39;re on the latest version of Bicep.&lt;/p&gt;
&lt;h3&gt;librechat.yaml&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;librechat.yaml&lt;/code&gt; file should be located in the parent directory of the &lt;code&gt;main.bicep&lt;/code&gt; script. To properly configure the &lt;code&gt;librechat.yaml&lt;/code&gt; as part of the Bicep deployment, create an OpenAI group named &lt;code&gt;&amp;quot;openai&amp;quot;&lt;/code&gt;, and set the &lt;code&gt;apiKey&lt;/code&gt; to &lt;code&gt;&amp;quot;openai-key&amp;quot;&lt;/code&gt; and the &lt;code&gt;instanceName&lt;/code&gt; to &lt;code&gt;&amp;quot;openai-instance-name&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;endpoints:
  azureOpenAI:
    (...)
    groups:
    - group: &amp;quot;openai&amp;quot;
      apiKey: &amp;quot;openai-key&amp;quot;
      instanceName: &amp;quot;openai-instance-name&amp;quot;
      forcePrompt: false
      assistants: true
      models:
        gpt-4-turbo:
          deploymentName: gpt-4-turbo
          version: &amp;quot;2024-02-15-preview&amp;quot;
        gpt-3.5-turbo-16k:
          deploymentName: gpt-35-turbo-16k
          version: &amp;quot;2024-02-15-preview&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;models.json&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;models.json&lt;/code&gt; file should be located in the same directory of the &lt;code&gt;main.bicep&lt;/code&gt; script. Configure the &lt;code&gt;modelName&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, and &lt;code&gt;capacity&lt;/code&gt; for each model based on the desired &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models&quot;&gt;models available in Azure OpenAI Service&lt;/a&gt;. Ensure the &lt;code&gt;deploymentName&lt;/code&gt; for each model matches the &lt;code&gt;deploymentName&lt;/code&gt; parameter in your &lt;code&gt;librechat.yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;models&amp;quot;: [
    {
      &amp;quot;deploymentName&amp;quot;: &amp;quot;gpt-4-turbo&amp;quot;,
      &amp;quot;modelName&amp;quot;: &amp;quot;gpt-4&amp;quot;,
      &amp;quot;version&amp;quot;: &amp;quot;turbo-2024-04-09&amp;quot;,
      &amp;quot;capacity&amp;quot;: 75
    },
    {
      &amp;quot;deploymentName&amp;quot;: &amp;quot;gpt-35-turbo-16k&amp;quot;,
      &amp;quot;modelName&amp;quot;: &amp;quot;gpt-35-turbo-16k&amp;quot;,
      &amp;quot;version&amp;quot;: &amp;quot;0613&amp;quot;,
      &amp;quot;capacity&amp;quot;: 150
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Deployment Instructions&lt;/h2&gt;
&lt;p&gt;To get a list of available location names for deployment, use the &lt;code&gt;az account list-locations&lt;/code&gt; command and use the given &lt;code&gt;name&lt;/code&gt; property when referencing that location.&lt;/p&gt;
&lt;p&gt;To ensure compatibility and availability of OpenAI models in your selected region, consult the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#model-summary-table-and-region-availability&quot;&gt;Model Summary Table and Region Availability guide&lt;/a&gt;. This provides detailed information on which AI models are available in specific OpenAI service regions.&lt;/p&gt;
&lt;h3&gt;Provisioning a New Resource Group&lt;/h3&gt;
&lt;p&gt;To provision a new resource group and deploy resources to it, use the following command. Replace &lt;code&gt;your_region&lt;/code&gt; with your preferred Azure location, &lt;code&gt;resource_group_name&lt;/code&gt; with your desired resource group name, and &lt;code&gt;openai_service_region&lt;/code&gt; with the OpenAI service region that supports the models you need.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;az deployment sub create --name librechat --location your_region --template-file .\rg.bicep --parameters resourcegroup=resource_group_name location=your_region openAiService_location=openai_service_region
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you accidentally deploy to the wrong region or want to deploy this script across multiple regions, you might get the following error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&amp;quot;code&amp;quot;: &amp;quot;InvalidDeploymentLocation&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;Invalid deployment location &amp;#39;westeurope&amp;#39;. The deployment &amp;#39;librechat&amp;#39; already exists in location &amp;#39;eastus&amp;#39;.&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To fix this, change the &lt;code&gt;--name&lt;/code&gt; parameter in the command from &lt;code&gt;librechat&lt;/code&gt; to something else, eg. &lt;code&gt;librechat2&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Deploying to an Existing Resource Group&lt;/h3&gt;
&lt;p&gt;For deploying resources to an existing resource group, execute the command below. Replace &lt;code&gt;resource_group_name&lt;/code&gt; with the name of your existing resource group and &lt;code&gt;openai_service_region&lt;/code&gt; with the appropriate OpenAI service region.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;az deployment group create --resource-group resource_group_name --template-file .\main.bicep --parameters openAiService_location=openai_service_region createMonogexpressAuthConfig=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;createMonogexpressAuthConfig&lt;/code&gt; parameter will automatically setup a Microsoft identity provider for mongo-express. Remove this parameter or set it to false if you don&amp;#39;t want this.&lt;/p&gt;
</content:encoded></item><item><title>IngestingPdfContent</title><link>https://www.elumenotion.com/journal/ingestingpdfcontent/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/ingestingpdfcontent/</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;GPT-4o versus Azure Document Intelligence and Azure Computer Vision OCR&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;It’s been about sixth months since my last post, &lt;strong&gt;&lt;a href=&quot;https://www.elumenotion.com/CopilotStudioThoughts.html&quot;&gt;Building Good Chatbots Part One, No-Code with Microsoft Copilot Studio and Azure AI Studio&lt;/a&gt;&lt;/strong&gt;. At the end of that very long article, which I split in two for LinkedIn, I said I’d write another part called “Castle on a hill” and immediately got insanely busy with client work. This is not that article, but it is closely related as it is about techniques for processing PDF content to make it easier to use with generative AI systems. &lt;br/&gt;&lt;br&gt;PDF files can be a challenge: the format itself is old and very permissive, processing tables is hard, and they often contain images with important information. They also require a lot of space compared to text-based file formats which means they take longer to move around and read and can trigger file size limits in some ‘chat about your documents’ systems. For these and other reasons it is usually best to either extract the text or convert the file itself to a text-based format such as &lt;strong&gt;markdown&lt;/strong&gt;.&lt;br/&gt;&lt;br&gt;If you are not familiar with markdown, it is a popular text-based format for documents and it looks like this:     &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;On the left is the text, and on the right is the formatted output.&lt;br/&gt;&lt;br&gt;This post compares several generative AI options you can use to convert PDF’s to markdown:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/concept-layout?view=doc-intel-4.0.0&quot;&gt;Azure Document Intelligence Layout Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision&quot;&gt;GPT-4 Turbo with Vision (turbo-2024-04-09)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/hello-gpt-4o/&quot;&gt;GPT-4o&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision?tabs=rest%2Csystem-assigned%2Cresource#use-vision-enhancement-with-images&quot;&gt;GPT-4 Turbo with Vision (vision-preview) with Azure Computer Vision OCR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/index/hello-gpt-4o/&quot;&gt;GPT-4o and Azure Document Intelligence Layout Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: as of the time of this writing (May 18, 2024), turbo-2024-04-09 is not compatible with the Azure Computer Vision OCR extensions and GPT-4o is not available in Azure. To fully use the notebooks referenced in this post, you will need both Azure and Open AI subscriptions.     &lt;/p&gt;
&lt;p&gt;In the end you will understand how to combine Azure Document Intelligence OCR with GPT4o to transform binary PDF content like this:     &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Into pure text in markdown format which displays like this:      &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Without losing the information displayed in tables and images, for around 3 cents ($0.03) per page.&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;The test PDF file is &lt;a href=&quot;./PDFMarkdown/entra-identity-multi-tenant-organizations.pdf&quot;&gt;here&lt;/a&gt;&lt;br&gt;Here are the results you can judge for yourself.  &lt;/p&gt;
&lt;p&gt;&lt;table style=&quot;width: 100%; border-collapse: collapse;&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller; background-color: #f2f2f2;&quot;&gt;Output File&lt;/th&gt;&lt;th style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller; background-color: #f2f2f2;&quot;&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoExtractedText.html&quot; target=&quot;_blank&quot;&gt;mtoExtractedText&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Cheap, fast, and ugly. Significant information loss. The default for most systems including Azure AI Search &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoGPT4Turbo.html&quot; target=&quot;_blank&quot;&gt;mtoGPT4Turbo&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Cheap, fast, and pretty. Poor accuracy and precision with significant hallucinations &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoGPT4Omni.html&quot; target=&quot;_blank&quot;&gt;mtoGPT4Omni&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Less cheap, not as fast, and pretty. Poor accuracy and precision with significant hallucinations &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoFromDocIntelOnly.html&quot; target=&quot;_blank&quot;&gt;mtoFromDocIntelOnly&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Less cheap, less fast, and less ugly, but dependable. &lt;strong&gt;Possibly the best option if workload doesn&apos;t require interpretation of visual content&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoGPT4VisionPreviewAndAzureComputerVisionOCR.html&quot; target=&quot;_blank&quot;&gt;mtoGPT4VisionPreviewAndAzureComputerVisionOCR&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Expensive, slow, pretty, more reliable. Not recommended, see below &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoGPT4TurboWithDocIntelOCR.html&quot; target=&quot;_blank&quot;&gt;mtoGPT4TurboWithDocIntelOCR&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Good OCR and interpretation of visual content, possibly fewer hallucinations &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt;&lt;a href=&quot;./PDFMarkdown/mtoGPT4OmniWithDocIntelOCR.html&quot; target=&quot;_blank&quot;&gt;mtoGPT4OmniWithDocIntelOCR&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;border: 1px solid black; padding: 8px; text-align: left; font-size: smaller;&quot;&gt; Least expensive combination of OCR grounding and GPT-4* with vision. &lt;strong&gt;Possibly the best option if workload requires interpretation of visual content&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;  

&lt;h2&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;In my previous post, I explained a little about [solving hallucinations with retrieval augmented generation] (&lt;a href=&quot;https://www.elumenotion.com/Journal/CopilotStudioThoughts.html#solving-hallucinations-with-retrieval-augmented-generation-rag&quot;&gt;https://www.elumenotion.com/Journal/CopilotStudioThoughts.html#solving-hallucinations-with-retrieval-augmented-generation-rag&lt;/a&gt;). To summarize, the easiest way to prevent hallucinations is to provide the information required to answer the user’s question to the LLM in a prompt that contains the question and instructions to answer the question based on the provided information. &lt;br/&gt;&lt;br&gt;This ‘one simple trick’ requires you to have the information somewhere, such as a search index, and to be able to find the right information for the question when the user asks. &lt;br/&gt;&lt;br&gt;PDFs and other document formats that contain images such as figures are challenging because simple text extraction loses all the visual information and because the document formatting itself conveys information about the relationships between whatever is on the page. Tables are an example of this. Correctly extracting tables from PDFs is a notoriously difficult task. &lt;br/&gt;&lt;br&gt;I will say flatly that, if you have complex PDF content and you upload it to any off-the-shelf chat-on-your-data product today, you are very likely to be disappointed by the resulting solution - especially if it is ready to answer questions within a few seconds. If it is fast, you can be sure it didn’t do more than extract the text.  &lt;/p&gt;
&lt;h2&gt;Baseline: Azure AI Studio and Search with Hybrid Vector/Keyword search&lt;/h2&gt;
&lt;p&gt;As a baseline I am using a &lt;a href=&quot;https://learn.microsoft.com/pdf?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fentra%2Fidentity%2Fmulti-tenant-organizations%2Ftoc.json&quot;&gt;pdf of the entra identity multi-tenant-organizations documentation from Microsoft Learn&lt;/a&gt;. I selected it because I have been reading it all recently and am familiar with its contents and because it contains challenging tables, diagrams, and other content.&lt;br/&gt;  &lt;/p&gt;
&lt;h3&gt;Azure AI Studio and Azure AI Search&lt;/h3&gt;
&lt;p&gt;I will not cover the details of setting it up here, but I &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-studio/how-to/index-add#create-an-index-from-the-playground&quot;&gt;created a new index in Azure AI Search by uploading entra-identity-multi-tenant-organizations.pdf in the Azure AI Studio Chat Playground with the vector hybrid options and embeddings&lt;/a&gt;.   &lt;/p&gt;
&lt;h3&gt;The test index&lt;/h3&gt;
&lt;p&gt;When you create an index this way, AI Studio creates a job using a docker image which ingests the content and builds the index. The longest running step is typically “Crack, Chuck, and Embed” which cracks open the document, chunks it into pieces of text, and creates embeddings for the vector search index from each chunk.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;When the job completes, you can test the index in Azure AI Search. The ** Search explorer ** tab [DTW] shows that 198 documents are in the index because the job created a chunk from each page of the original PDF file. This page is of interest it contains several elements: text, a table, and images.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image6.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;Lost Information&lt;/h3&gt;
&lt;p&gt; The original page of the PDF looks like this:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;And the result of the search looks like this:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image8.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;As you can see, the text itself has odd spaces and the meaning conveyed by the table is completely lost. Assuming we can somehow infer the positioning of the check marks in the columns from the white space is wrong as there is not enough whitespace on the first row. An LLM is likely to make this mistake and give incorrect answers as a result.&lt;br/&gt;&lt;br&gt;There are additional challenges, but the final example I will give here is shown in the next image:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image9.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This content has a page break and an image. I already explained that the information in the image is lost, but even if it wasn’t the position of the page break ensures that the section will be split across chunks. It is unlikely that a search that finds the first chunk will naturally include the second page which might be very important. Were this a markdown document, the headings could be used to keep related text in the same chunk except for cases where the text under a heading is longer than the chunk size.&lt;br/&gt;&lt;br&gt;For completeness, a notebook, &lt;strong&gt;PdfToTextPages.ipynb&lt;/strong&gt;, which chunks the test pdf to pages of text is located in &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/PdfToTextPages.ipynb?short_path=08da8e8&quot;&gt;this repo.&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;PDF to Markdown Options&lt;/h2&gt;
&lt;h3&gt;Option One: Azure Document Intelligence Layout Model&lt;/h3&gt;
&lt;p&gt;First up is &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/concept-layout?view=doc-intel-4.0.0&quot;&gt;Azure Document Intelligence with the Layout Model&lt;/a&gt;. Of the notebooks related to this article, it is the only based on C# and .NET. The rest are python. &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/docIntelligencePipeline.ipynb?short_path=f806d7f&quot;&gt;My version&lt;/a&gt; is based on this &lt;a href=&quot;https://github.com/jamesmcroft/azure-document-intelligence-markdown-to-openai-data-extraction-sample&quot;&gt;sample by  James Croft&lt;/a&gt;. &lt;br/&gt;&lt;br&gt;This service is part of the approach that I recommend today based on the work that is the subject of this article, but the first version is notable for the following reasons:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can produce a single markdown file from a PDF with little more than a line of code&lt;/li&gt;
&lt;li&gt;It is very fast, processing a 198 page PFD in less than a minute&lt;/li&gt;
&lt;li&gt;It provided accurate results for table contents and long numbers&lt;/li&gt;
&lt;li&gt;It is the least expensive single option at one cent per page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, by itself it has several weaknesses:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The markdown formatting is inconsistent&lt;/li&gt;
&lt;li&gt;It is OCR only and does not extract meaning from images and diagrams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The page with the table from the baseline looks like this:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image10.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The table content is correct, and the formatting is present, but the formatting is not very good.&lt;br&gt;&lt;br/&gt;  &lt;/p&gt;
&lt;h3&gt;PDF to Images&lt;/h3&gt;
&lt;p&gt;Each of the remaining options starts by turning the PDF into a series of image files for processing. A notebook to perform this task, &lt;strong&gt;PdfToPageImages.ipynb&lt;/strong&gt;, is &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/PdfToPageImages.ipynb?short_path=36363ef&quot;&gt;in this repository&lt;/a&gt;, but the repository also contains the images used by the notebooks.  &lt;/p&gt;
&lt;h3&gt;Option Two: gpt-4-turbo-2024-04-09 (GPT 4 Turbo with Vision) -OR - GPT-4o (Omni)  &lt;br/&gt;&lt;/h3&gt;
&lt;p&gt;GPT-4-Turbo,  &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/turbo-2024-04-09.ipynb?short_path=65fda5f&quot;&gt;notebook&lt;/a&gt;, and GPT-4o &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/v4omni.ipynb?short_path=b5de81a&quot;&gt;notebook&lt;/a&gt; are multimodal models which can reason against images. We can send the image directly to the LLM with a prompt to create a page of markdown.   &lt;/p&gt;
&lt;h4&gt;Sample Prompt&lt;/h4&gt;
&lt;p&gt;&lt;div style=&quot;border: 2px solid black; padding: 10px;&quot;&gt;Give me the markdown text output from this page in a PDF using formatting to match the structure of the page as close as you can get.&lt;br/&gt;Only output the markdown and nothing else. Do not explain the output, just return it.&lt;br/&gt;Do not use a single # for a heading. All headings will start with ## or ###.&lt;br/&gt; Convert tables to markdown tables.&lt;br/&gt;Take great care to ensure the precision and accuracy of numbers especially longer series of digits - do not transcribe or reorder the digits!&lt;br/&gt;Describe charts and images as best you can and, when possible use mermaidjs format.&lt;br/&gt;DO NOT return in a codeblock. Just return the raw text in markdown format. &lt;br/&gt;Remove any irrelevant text from the markdown, returning the cleaned up version of the content. Examples include any images or &apos;click here&apos; or &apos;Listen to this article&apos; or page numbers or logos.&lt;/div&gt;&lt;/p&gt;  

&lt;p&gt;As I progressed through the options I refined this prompt and there is a better version at the end, but this was my first version. &lt;br/&gt;&lt;br&gt;This key part: &lt;strong&gt;Describe charts and images as best you can and, when possible use mermaidjs format&lt;/strong&gt;, adds an ability that Doc Intelligence alone lacks, which is the ability to describe images. There is no reason why the description must only be text, and so I asked the LLM to create diagrams.&lt;br/&gt;&lt;br&gt;Now this image (the original):  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image11.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Became this markdown which includes descriptions of the visual content including some mermaid diagrams:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image12.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Unfortunately, it changed a few things in the process and the output is consistently untrustworthy. For example:   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image13.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The table looks good, BUT it is factually incorrect and an example of a hallucination.  In fact, every version of GPT-4, including the newest Omni, failed consistently to produce this table correctly.&lt;br/&gt;&lt;br&gt;A much more serious issue present in each of the GPT-4 models I tried was transcription of digits. Consider this source content:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image14.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;br/&gt;  
The “VRS code:” is **886249**. The hallucination is easy to observe. On one run, GPT-4o turned it into it to 286492&lt;br/&gt;  
  
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image15.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;br/&gt;   
On another run, GPT-4-Turbo-2024-04-09 transcribed it to 882469 &lt;br/&gt;  
  
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image16.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;I honestly don’t think I observed a single success on this test without using some form of real OCR such as Azure Document Intelligence or Azure Computer Vision. &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Differences between GPT-4-Turbo-2024 and GPT-4o&lt;/h4&gt;
&lt;p&gt;I personally found GPT-4-Turbo-2024 to be a little better with my small sample with markdown and image descriptions. But each made serious mistakes with the OCR that would create false answers were the result used for grounding. That said, GPT-4o was consistently around 30% faster and costs 50% less. &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Conclusion on Option Two&lt;/h4&gt;
&lt;p&gt;If precise and accurate results are crucial, solutions using only GPT-4-Turbo-2024 and GPT-4o without OCR are problematic.  &lt;/p&gt;
&lt;h3&gt;Option Three: gpt-4-vision-preview with Azure Computer Vision OCR&lt;/h3&gt;
&lt;p&gt;From &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/gpt-with-vision?tabs=rest%2Csystem-assigned%2Cresource#use-vision-enhancement-with-images&quot;&gt;How to use the GPT-4 Turbo with Vision model - Azure OpenAI Service | Microsoft Learn&lt;/a&gt;:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image17.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The notebooks for this option are &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/visionWithOcr.ipynb?short_path=715cda1&quot;&gt;notebook with OCR&lt;/a&gt; and &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/visionWithOcrAndGrounding.ipynb?short_path=ade8da9&quot;&gt;notebook with OCR and grounding&lt;/a&gt;. &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Good results, but not recommended&lt;/h4&gt;
&lt;p&gt;This combination yields the best results of the tested options (so far) but there are three issues:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are the most expensive at approximately $0.05-$0.07 per page&lt;/li&gt;
&lt;li&gt;The combination is the slowest at approximately 40-50 per seconds per page&lt;/li&gt;
&lt;li&gt;The reliance on proprietary Microsoft extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The extensions are detailed in the MS doc linked above. My objection is not so much that they are proprietary as that using them is a risk, and Microsoft has not done a good job keeping them up to date. At an API level, I can’t imagine why one can only use GPT-4-Vision-Preview and not the better, faster, and cheaper GPT-4-Turbo-2024 other than that MS hasn’t gotten around to changing the config, or perhaps that they don’t foresee this feature ever exiting preview and becoming generally available.  &lt;/p&gt;
&lt;h3&gt;Option Four (WINNER!!!): Azure Document Intelligence OCR and GPT-4o&lt;/h3&gt;
&lt;p&gt;Fortunately, you don’t need to take any chances with a proprietary extension when you can easily do the same thing while exercising full control. The [final notebook, v4omni-image-plus-docIntelOcr.ipynb,] ](&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/v4omni-image-plus-docIntelOcr.ipynb?short_path=78bb846&quot;&gt;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/PdfToMarkdownAndQaPairs/v4omni-image-plus-docIntelOcr.ipynb?short_path=78bb846&lt;/a&gt;) sends the text of OCR’d markdown of a single page created from an image and the following prompt to GPT-4o. &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Sample Prompt&lt;/h4&gt;
&lt;div style=&quot;border: 2px solid black; padding: 10px;font-size:small;&quot;&gt;&lt;p&gt;The provided image is a page of a document.&lt;/p&gt;&lt;p&gt;The following markdown formatted text is a true and accurate but incomplete conversion of the provided image. Information contained in figures and other illustrations is missing.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MARKDOWN START&lt;/strong&gt;&lt;/p&gt;MARKDOWN TEXT HERE&lt;p&gt;&lt;strong&gt;MARKDOWN END&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Create new markdown that contains the EXACT original text and EXACT original tables WITHOUT alteration, while ADDING full text descriptions in place of each figure or illustration.&lt;/p&gt;&lt;p&gt;Following each text description, consider if it is possible to further describe the figure or illustration using valid mermaidjs syntax and do so taking care to avoid syntax errors.&lt;/p&gt; &lt;p&gt;Following these guidelines ensures valid and correctly rendered MermaidJS diagrams.&lt;/p&gt;&lt;ol&gt;        &lt;li&gt;&lt;strong&gt;Node IDs&lt;/strong&gt;: Use only alphanumeric characters and underscores (_). Avoid spaces and other special characters.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Labels with Special Characters&lt;/strong&gt;: Avoid special characters in labels. Enclose labels with spaces or special characters in double quotes within brackets.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Example&lt;/h3&gt;graph TD;&lt;br/&gt;    OwnerTenantC[&quot;Owner tenant (C)&quot;] --&gt; MemberTenantA[&quot;Member tenant (A)&quot;] &lt;br/&gt; OwnerTenantC[&quot;Owner tenant (C)&quot;] --&gt; MemberTenantB[&quot;Member tenant (B)&quot;] &lt;br/&gt;MemberTenantA[&quot;Member tenant (A)&quot;] --&gt; MemberTenantB[&quot;Member tenant (B)&quot;] &lt;br/&gt;&lt;h3&gt;Correct Usage&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Node ID&lt;/strong&gt;: OwnerTenantC&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Label&lt;/strong&gt;: &quot;Owner tenant (C)&quot;&lt;/li&gt;&lt;/ul&gt;    &lt;h3&gt;Avoid&lt;/h3&gt;    &lt;ul&gt;        &lt;li&gt;Opening or closing params and other special characters in labels&lt;/li&gt;        &lt;li&gt;Node IDs with spaces or special characters: Owner tenant (C)&lt;/li&gt;        &lt;li&gt;Labels without quotes: [Owner tenant (C)]&lt;/li&gt;    &lt;/ul&gt;&lt;/div&gt;  

&lt;p&gt;Note that to use the notebook, you must first use the PdfToPageImages notebook to create images and then use the DocIntelligencePipeline notebook to convert the single page images from the PDFs into individual markdown files.&lt;br/&gt;&lt;br&gt;This prompt grounds the text from the high-quality OCR from Document Intelligence with the generative capabilities of GPT-4o to insert image descriptions and well formatted mermaid diagrams. &lt;br/&gt;&lt;br&gt;The process costs around 3 cents ($0.03) per page and took less than 10 seconds per page on average.  &lt;/p&gt;
&lt;h2&gt;Sample Output&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image18.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Interestingly, in some cases GPT-4o elected to add diagrams where previously there were none. This sequence diagram mermaid syntax is correct and but there is nothing like it on the source page! &lt;br/&gt;&lt;br&gt;A cursory examination might make you think the content is correct.&lt;br/&gt;&lt;br&gt;Unfortunately, it is a hallucination. In fact, although most of the mermaid diagrams are correct, they often have errors. I’m very interested in this behavior and plan to spend much more time on it. The model might do a much better job with mermaid alternatives such as PlantUml.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image19.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;The Index&lt;/h2&gt;
&lt;p&gt;Earlier, I showed the Search Explorer in Azure AI Search using an index based on the PDF. Here is the index for the markdown file.&lt;br/&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image20.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The index has fewer chunks and takes up less space while containing much of the information lost in the original translation. This is the content for the same page in the new index.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IngestingPdfContent/image21.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Over a year ago now, the amazing &lt;a href=&quot;https://en.wikipedia.org/wiki/Ted_Chiang&quot;&gt;Ted Chiang&lt;/a&gt; wrote &lt;a href=&quot;https://www.newyorker.com/tech/annals-of-technology/chatgpt-is-a-blurry-jpeg-of-the-web&quot;&gt;ChatGPT Is a Blurry JPEG of the Web&lt;/a&gt;. The multimodal capabilities of models like GPT-4o show that his interesting and thoughtful perspective is quite incorrect. These tools give us the ability to refine information and project it in new and interesting ways by combining text, sound, and vision to extract meaning. We did not have this ability before, and it is as fundamental to our future as the printing press was to our ancestors.&lt;br/&gt;&lt;br&gt;Thanks for reading! If you need help improving your chat bots, copilots, and other generative AI applications, drop me a line. We would love to help!&lt;br&gt;&lt;a href=&quot;mailto://DougWare@Elumenotion.com&quot;&gt;Doug Ware&lt;/a&gt;&lt;br&gt;May 18, 2024&lt;/p&gt;
</content:encoded></item><item><title>mtoExtractedText</title><link>https://www.elumenotion.com/journal/mtoextractedtext/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtoextractedtext/</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tell us about y our PDF experience.
Multit enant or ganizations
documentation
A multitenant organization is an organization that has more than one instance of
Microsoft Entra ID. Describes ways that users can have a seamless experience accessing
resources and collaborating across multiple tenants.
About multit enant or ganizations
ｅOVERVIE W
Multitenant organization capabilities
Compare multitenant capabilities
Configur e a multit enant or ganization
ｅOVERVIE W
What is a multitenant organization?
ｃHOW-T O GUIDE
Microsoft 365 admin center
PowerShell or Microsoft Graph API
Configur e cross-t enant synchr onization
ｅOVERVIE W
What is cross-tenant synchronization?
ｃHOW-T O GUIDE
Microsoft Entra admin center
PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;Collaborat e in Micr osoft 365
ｐCONCEPT
Identity provisioning for Microsoft 365
Microsoft 365 multitenant people search
Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;Multitenant organization capabilities in
Microsoft Entra ID
Article •04/23/2024
This article provides an overview of the multitenant organization scenario and the
related capabilities in Microsoft Entra ID.
A tenant  is an instance of Microsoft Entra ID in which information about a single
organization resides including organizational objects such as users, groups, and devices
and also application registrations, such as Microsoft 365 and third-party applications. A
tenant also contains access and compliance policies for resources, such as applications
registered in the directory. The primary functions served by a tenant include identity
authentication as well as resource access management.
From a Microsoft Entra perspective, a tenant forms an identity and access management
scope. For example, a tenant administrator makes an application available to some or all
the users in the tenant and enforces access policies on that application for users in that
tenant. In addition, a tenant contains organizational branding data that drives end-user
experiences, such as the organizations email domains and ShareP oint URLs used by
employees in that organization. From a Microsoft 365 perspective, a tenant forms the
default collaboration and licensing boundary. For example, users in Microsoft T eams or
Microsoft Outlook can easily find and collaborate with other users in their tenant, but
don&amp;#39;t have the ability to find or see users in other tenants.
Tenants contain privileged organizational data and are securely isolated from other
tenants. In addition, tenants can be configured to have data persisted and processed in
a specific region or cloud, which enables organizations to use tenants as a mechanism
to meet data residency and handling compliance requirements.
A multit enant or ganization  is an organization that has more than one instance of
Microsoft Entra ID. Here are the primary reasons why an organization might have
multiple tenants:
Conglomerat es: Organizations with multiple subsidiaries or business units that
operate independently.What is a tenant?
What is a multitenant organization?&lt;/p&gt;
&lt;p&gt;Mergers and acquisitions:  Organizations that merge or acquire companies.
Divestitur e activity:  In a divestiture, one organization splits off part of its business
to form a new organization or sell it to an existing organization.
Multiple clouds:  Organizations that have compliance or regulatory needs to exist
in multiple cloud environments.
Multiple geographical boundaries:  Organizations that operate in multiple
geographic locations with various residency regulations.
Test or staging t enants:  Organizations that need multiple tenants for testing or
staging purposes before deploying more broadly to primary tenants.
Department or employ ee-cr eated tenants:  Organizations where departments or
employees have created tenants for development, testing, or separate control.
Your organization may have recently acquired a new company, merged with another
company, or restructured based on newly formed business units. If you have disparate
identity management systems, it might be challenging for users in different tenants to
access resources and collaborate.
The following diagram shows how users in other tenants might not be able to access
applications across tenants in your organization.
As your organization evolves, your IT team must adapt to meet the changing needs. This
often includes integrating with an existing tenant or forming a new one. R egardless of
how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless
experience accessing resources and collaborating. T oday, you may be using custom
scripts or on-premises solutions to bring the tenants together to provide a seamless
experience across tenants.
To enable users across tenants to collaborate in Teams Connect shared channels , you
can use Microsoft Entra B2B direct connect . B2B direct connect is a feature of External
Identities that lets you set up a mutual trust relationship with another Microsoft Entra
organization for seamless collaboration in T eams. When the trust is established, the B2B
direct connect user has single sign-on access using credentials from their home tenant.Multitenant challenges

B2B direct connect&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:
Currently, B2B direct connect works only with T eams Connect shared channels.
For more information, see B2B direct connect overview .
To enable users across tenants to collaborate, you can use Microsoft Entra B2B
collaboration . B2B collaboration is a feature within External Identities that lets you invite
guest users to collaborate with your organization. Once the external user has redeemed
their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user
object. With B2B collaboration, you can securely share your company&amp;#39;s applications and
services with external users, while maintaining control over your own corporate data.
Here are the primary constraints with using B2B collaboration across multiple tenants:
Administrators must invite users using the B2B invitation process or build an
onboarding experience using the B2B collaboration invitation manager .
Administrators might have to synchronize users using custom scripts.
Depending on automatic redemption settings, users might need to accept a
consent prompt and follow a redemption process in each tenant.
By default, users are of type external guest, which has different permissions than
external member and might not be the desired user experience.

B2B collaboration
&lt;/p&gt;
&lt;p&gt;For more information, see B2B collaboration overview .
If you want users to have a more seamless collaboration experience across tenants, you
can use cross-tenant synchronization . Cross-tenant synchronization is a one-way
synchronization service in Microsoft Entra ID that automates creating, updating, and
deleting B2B collaboration users across tenants in an organization. Cross-tenant
synchronization builds on the B2B collaboration functionality and utilizes existing B2B
cross-tenant access settings. Users are represented in the target tenant as a B2B
collaboration user object.
Here are the primary benefits with using cross-tenant synchronization:
Automatically create B2B collaboration users within your organization and provide
them access to the applications they need, without creating and maintaining
custom scripts.
Improve the user experience and ensure that users can access resources, without
receiving an invitation email and having to accept a consent prompt in each
tenant.
Automatically update users and remove them when they leave the organization.
Here are the primary constraints with using cross-tenant synchronization across multiple
tenants:
Doesn&amp;#39;t enhance the current T eams or Microsoft 365 experiences. S ynchronized
users will have the same cross-tenant T eams and Microsoft 365 experiences
available to any other B2B collaboration user.
Doesn&amp;#39;t synchronize groups, devices, or contacts.
For more information, see What is cross-tenant synchronization? .Cross-tenant synchronization
&lt;/p&gt;
&lt;p&gt;Multitenant organization  is a feature in Microsoft Entra ID and Microsoft 365 that
enables you to form a tenant group within your organization. Each pair of tenants in the
group is governed by cross-tenant access settings that you can use to configure B2B or
cross-tenant synchronization.
Here are the primary benefits of a multitenant organization:
Differentiate in-organization and out-of-organization external users
Improved collaborative experience in new Microsoft T eams
Improved people search experience across tenants
For more information, see What is a multitenant organization in Microsoft Entra ID? .
Depending on the needs of your organization, you can use any combination of B2B
direct connect, B2B collaboration, cross-tenant synchronization, and multitenant
organization capabilities. B2B direct connect and B2B collaboration are independent
capabilities, while cross-tenant synchronization and multitenant organization capabilities
are independent of each other, though both rely on underlying B2B collaboration.
The following table compares the capabilities of each feature. For more information
about different external identity scenarios, see Comparing External Identities feature
sets.Multitenant organization

Compare multitenant capabilities
ﾉExpand table&lt;/p&gt;
&lt;p&gt;B2B dir ect
connect
(Org-to-org
external or
internal)B2B
collaboration
(Org-to-org
external or
internal)Cross-t enant
synchr onization
(Org int ernal)Multit enant
organization
(Org int ernal)
Purpose Users can
access T eams
Connect shared
channels hosted
in external
tenants.Users can access
apps/resources
hosted in external
tenants, usually
with limited guest
privileges.
Depending on
automatic
redemption
settings, users
might need to
accept a consent
prompt in each
tenant.Users can
seamlessly access
apps/resources
across the same
organization, even
if they&amp;#39;re hosted in
different tenants.Users can more
seamlessly
collaborate across
a multitenant
organization in
new T eams and
people search.
Value Enables external
collaboration
within T eams
Connect shared
channels only.
More
convenient for
administrators
because they
don&amp;#39;t have to
manage B2B
users.Enables external
collaboration.
More control and
monitoring for
administrators by
managing the B2B
collaboration
users.
Administrators
can limit the
access that these
external users
have to their
apps/resources.Enables
collaboration
across
organizational
tenants.
Administrators
don&amp;#39;t have to
manually invite and
synchronize users
between tenants to
ensure continuous
access to
apps/resources
within the
organization.Enables
collaboration
across
organizational
tenants.
Administrators
continue to have
full configuration
ability via cross-
tenant access
settings. Optional
cross-tenant
access templates
allow pre-
configuration of
cross-tenant
access settings.
Primar y
administrat or
workflowConfigure
cross-tenant
access to
provide external
users inbound
access to tenant
the credentials
for their home
tenant.Add external
users to resource
tenant by using
the B2B invitation
process or build
your own
onboarding
experience using
the B2B
collaborationConfigure the
cross-tenant
synchronization
engine to
synchronize users
between multiple
tenants as B2B
collaboration users.Create a
multitenant
organization, add
(invite) tenants,
join a multitenant
organization.
Leverage existing
B2B collaboration
users or use cross-
tenant
synchronization to&lt;/p&gt;
&lt;p&gt;B2B dir ect
connect
(Org-to-org
external or
internal)B2B
collaboration
(Org-to-org
external or
internal)Cross-t enant
synchr onization
(Org int ernal)Multit enant
organization
(Org int ernal)
invitation
manager .provision B2B
collaboration
users.
Trust lev el Mid trust. B2B
direct connect
users are less
easy to track,
mandating a
certain level of
trust with the
external
organization.Low to mid trust.
User objects can
be tracked easily
and managed
with granular
controls.High trust. All
tenants are part of
the same
organization, and
users are typically
granted member
access to all
apps/resources.High trust. All
tenants are part of
the same
organization, and
users are typically
granted member
access to all
apps/resources.
Effect on
usersUsers access the
resource tenant
using the
credentials for
their home
tenant. User
objects aren&amp;#39;t
created in the
resource tenant.External users are
added to a tenant
as B2B
collaboration
users.Within the same
organization, users
are synchronized
from their home
tenant to the
resource tenant as
B2B collaboration
users.Within the same
multitenant
organization, B2B
collaboration
users, particularly
member users,
benefit from
enhanced,
seamless
collaboration
across Microsoft
365.
User type B2B direct
connect user&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N/AB2B collaboration
user&lt;/li&gt;
&lt;li&gt;External
member&lt;/li&gt;
&lt;li&gt;External guest
(default)B2B collaboration
user&lt;/li&gt;
&lt;li&gt;External member
(default)&lt;/li&gt;
&lt;li&gt;External guestB2B collaboration
user&lt;/li&gt;
&lt;li&gt;External member
(default)&lt;/li&gt;
&lt;li&gt;External guest
The following diagram shows how B2B direct connect, B2B collaboration, and cross-
tenant synchronization capabilities could be used together.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra
capabilities, you can refer back to the following list of terms.
Term Definition
tenant An instance of Microsoft Entra ID.
organization The top level of a business hierarchy.
multitenant
organizationAn organization that has more than one instance of Microsoft Entra ID,
as well as a capability to group those instances in Microsoft Entra ID.
creator tenant The tenant that created the multitenant organization.
owner tenant A tenant with the owner role. Initially, the creator tenant.
added tenant A tenant that was added by an owner tenant.
joiner tenant A tenant that is joining the multitenant organization.
join request A joiner or added tenant submits a join request to join the multitenant
organization.
pending tenant A tenant that was added by an owner but that hasn&amp;#39;t yet joined.
active tenant A tenant that created or joined the multitenant organization.

Terminology
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Term Definition
member tenant A tenant with the member role. Most joiner tenants start as members.
multitenant
organization tenantAn active tenant of the multitenant organization, not pending.
cross-tenant
synchronizationA one-way synchronization service in Microsoft Entra ID that automates
creating, updating, and deleting B2B collaboration users across tenants
in an organization.
cross-tenant access
settingsSettings to manage collaboration for specific Microsoft Entra
organizations.
cross-tenant access
settings templateAn optional template to preconfigure cross-tenant access settings that
are applied to any partner tenant newly joining the multitenant
organization.
organizational
settingsCross-tenant access settings for specific Microsoft Entra organizations.
configuration An application and underlying service principal in Microsoft Entra ID that
includes the settings (such as target tenant, user scope, and attribute
mappings) needed for cross-tenant synchronization.
provisioning The process of automatically creating or synchronizing objects across a
boundary.
automatic redemption A B2B setting to automatically redeem invitations so newly created users
don&amp;#39;t receive an invitation email or have to accept a consent prompt
when added to a target tenant.
What is a multitenant organization in Microsoft Entra ID?
What is cross-tenant synchronization?Next steps&lt;/p&gt;
&lt;p&gt;What is a multitenant organization in
Microsoft Entra ID?
Article •04/24/2024
Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that
enables you to form a tenant group within your organization. Each pair of tenants in the
group is governed by cross-tenant access settings that you can use to configure B2B or
cross-tenant synchronization.
Here are the primary goals of multitenant organization:
Define a group of tenants belonging to your organization
Collaborate across your tenants in new Microsoft T eams
Enable search and discovery of user profiles across your tenants through Microsoft
365 people search
Organizations that own multiple Microsoft Entra tenants and want to streamline intra-
organization cross-tenant collaboration in Microsoft 365.
The multitenant organization capability is built on the assumption of reciprocal
provisioning of B2B member users across multitenant organization tenants.
As such, the multitenant organization capability assumes the simultaneous use of
Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine
for external identities .
Here are the primary benefits of a multitenant organization:
Differentiate in-organization and out-of-organization external users
In Microsoft Entra ID, external users originating from within a multitenant
organization can be differentiated from external users originating from outside the
multitenant organization. This differentiation facilitates the application of different
policies for in-organization and out-of-organization external users.Why use multitenant organization?
Who should use it?
Benefits&lt;/p&gt;
&lt;p&gt;Improved collaborative experience in Microsoft T eams
In new Microsoft T eams, multitenant organization users can expect an improved
collaborative experience across tenants with chat, calling, and meeting start
notifications from all connected tenants across the multitenant organization.
Tenant switching is more seamless and faster. For more information, see
Announcing more seamless collaboration in Microsoft T eams for multitenant
organizations  and Microsoft T eams: Advantages of the new architecture .
Improved people search experience across tenants
Across Microsoft 365 services, the multitenant organization people search
experience is a collaboration feature that enables search and discovery of people
across multiple tenants. Once enabled, users are able to search and discover
synced user profiles in a tenant&amp;#39;s global address list and view their corresponding
people cards. For more information, see Microsoft 365 multitenant organization
people search .
The multitenant organization capability enables you to form a tenant group within your
organization. The following list describes the basic lifecycle of a multitenant
organization.
Define a multitenant organization
One tenant administrator defines a multitenant organization as a grouping of
tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes
action to join the multitenant organization. The objective is a reciprocal agreement
between all listed tenants.
Join a multitenant organization
Tenant administrators of listed tenants take action to join the multitenant
organization. After joining, the multitenant organization relationship is reciprocal
between each and every tenant that joined the multitenant organization.
Leave a multitenant organization
Tenant administrators of listed tenants can leave a multitenant organization at any
time. While a tenant administrator who defined the multitenant organization can
add and remove listed tenants they don&amp;#39;t control the other tenants.
How does a multitenant organization work?&lt;/p&gt;
&lt;p&gt;A multitenant organization is established as a collaboration of equals. Each tenant
administrator stays in control of their tenant and their membership in the multitenant
organization.
Administrators staying in control of their resources is a guiding principle for multitenant
organization collaboration. Cross-tenant access settings are required for each tenant-to-
tenant relationship. T enant administrators explicitly configure, as needed, the following
policies:
Cross-tenant access partner configurations
For more information, see Configure cross-tenant access settings for B2B
collaboration  and crossT enantAccessP olicyConfigurationP artner resource type .
Cross-tenant access identity synchronization
For more information, see Configure cross-tenant synchronization  and
crossT enantIdentityS yncPolicyP artner resource type .
The following diagram shows three tenants A, B, and C that form a multitenant
organization.Cross-tenant access setting s
Multitenant organization example

ﾉExpand table&lt;/p&gt;
&lt;p&gt;Tenant Descr iption
A Administrators see a multitenant organization consisting of A, B, C.
They also see cross-tenant access settings for B and C.
B Administrators see a multitenant organization consisting of A, B, C.
They also see cross-tenant access settings for A and C.
C Administrators see a multitenant organization consisting of A, B, C.
They also see cross-tenant access settings for A and B.
To ease the setup of homogenous cross-tenant access settings applied to partner
tenants in the multitenant organization, the administrator of each multitenant
organization tenant can configure optional cross-tenant access settings templates
dedicated to the multitenant organization. These templates can be used to preconfigure
cross-tenant access settings that are applied to any partner tenant newly joining the
multitenant organization.
To facilitate the management of a multitenant organization, any given multitenant
organization tenant has an associated role and state.
Tenant
roleDescr iption
Owner One tenant creates the multitenant organization. The multitenant organization
creating tenant receives the role of owner. The privilege of the owner tenant is to add
tenants into a pending state as well as to remove tenants from the multitenant
organization. Also, an owner tenant can change the role of other multitenant
organization tenants.
Member Following the addition of pending tenants to the multitenant organization, pending
tenants need to join the multitenant organization to turn their state from pending to
active. Joined tenants typically start in the member role. Any member tenant has the
privilege to leave the multitenant organization.Templates for cross-tenant access setting s
Tenant role and state
ﾉExpand table
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Tenant
stateDescr iption
Pending A pending tenant has yet to join a multitenant organization. While listed in an
administrator’s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of
the multitenant organization, and as such is hidden from an end user’s view of a
multitenant organization.
Active Following the addition of pending tenants to the multitenant organization, pending
tenants need to join the multitenant organization to turn their state from pending to
active. Joined tenants typically start in the member role. Any member tenant has the
privilege to leave the multitenant organization.
The multitenant organization capability has been designed with the following
constraints:
Any given tenant can only create or join a single multitenant organization.
Any multitenant organization must have at least one active owner tenant.
Each active tenant must have cross-tenant access settings for all active tenants.
Any active tenant may leave a multitenant organization by removing themselves
from it.
A multitenant organization is deleted when the only remaining active (owner)
tenant leaves.
Resour ce Limit Notes
Maximum
number of
active tenants,
including the
owner tenant100 The owner tenant can add more than 100 pending tenants, but they
won&amp;#39;t be able to join the multitenant organization if the limit is
exceeded. This limit is applied at the time a pending tenant joins a
multitenant organization. This limit is specific to the number of tenants
in a multitenant organization. It does not apply to cross-tenant
synchronization by itself. T o increase this limit, submit a support
request in the Microsoft Entra or Microsoft 365 admin center.
In the Microsoft Graph APIs, the default limit of 100 tenants is only
enforced at the time of joining. In Microsoft 365 admin center, the
default limit is enforced at multitenant organization creation time and
at time of joining.Constraints
Limits
ﾉExpand table&lt;/p&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user
property of userT ype, external identities  are segmented as follows:
External members originating from within a multitenant organization
External guests originating from within a multitenant organization
External members originating from outside of your organization
External guests originating from outside of your organization
This segmentation of external users, due to the definition of a multitenant organization,
enables administrators to better differentiate in-organization from out-of-organization
external users.
External members originating from within a multitenant organization are called
multitenant organization members.
Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless
collaboration experience across tenant boundaries when collaborating with multitenant
organization member users.
If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and
you intend to establish a collaborating user set  topology where the same set of
users is shared to all multitenant organization tenants, you might want to use the
Microsoft 365 admin center share users functionality.
If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various
multi-hub multi-spoke topologies , you don&amp;#39;t need to use the Microsoft 365 admin
center share users functionality. Instead, you might want to continue using your
existing Microsoft Entra cross-tenant synchronization jobs.
Here are the basic steps to get started using multitenant organization.
For more information, see Plan for multitenant organizations in Microsoft 365 .External user segmentation
Choosing between Microsoft 365 admin center
and cross-tenant synchronization
Get started
Step 1: Plan your deployment&lt;/p&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center , Microsoft
Graph P owerShell , or Microsoft Graph API :
First tenant, soon-to-be owner tenant, creates a multitenant organization.
Owner tenant adds one or more joiner tenants.
Join a multitenant organization using Microsoft 365 admin center  or Microsoft Graph
PowerShell , or Microsoft Graph API :
Joiner tenants submit a join request to join the multitenant organization of owner
tenant.
To allow for asynchronous processing, wait up to 2 hour s.
Your multitenant organization is formed.
Depending on your use case, you may want to synchronize users using one of the
following methods:
Synchronize users in multitenant organizations in Microsoft 365
Configure cross-tenant synchronization
Configure cross-tenant synchronization using P owerShell or Microsoft Graph API
Your alternative bulk provisioning engine
The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one
Microsoft Entra ID P1 license is required per employee per multitenant organization.
Also, you must have at least one Microsoft Entra ID P1 license per tenant. T o find the
right license for your requirements, see Compare generally available features of
Microsoft Entra ID .
Plan for multitenant organizations in Microsoft 365
What is cross-tenant synchronization?Step 2: Create your multitenant organization
Step 3: Join a multitenant organization
Step 4: Synchronize users
License requirements
Next steps&lt;/p&gt;
&lt;p&gt;What is cross-tenant synchronization?
Article •01/03/2024
Cross-tenant s ynchr onization  automates creating, updating, and deleting Microsoft Entra
B2B collaboration  users across tenants in an organization. It enables users to access
applications and collaborate across tenants, while still allowing the organization to
evolve.
Here are the primary goals of cross-tenant synchronization:
Seamless collaboration for a multitenant organization
Automate lifecycle management of B2B collaboration users in a multitenant
organization
Automatically remove B2B accounts when a user leaves the organization
Cross-tenant synchronization automates creating, updating, and deleting B2B
collaboration users. Users created with cross-tenant synchronization are able to access
both Microsoft applications (such as T eams and ShareP oint) and non-Microsoft
applications (such as ServiceNow , Adobe , and many more), regardless of which tenant
the apps are integrated with. These users continue to benefit from the security
capabilities in Microsoft Entra ID, such as Microsoft Entra Conditional Access  and cross-
tenant access settings , and can be governed through features such as Microsoft Entra
entitlement management .
The following diagram shows how you can use cross-tenant synchronization to enable
users to access applications across tenants in your organization.&lt;a href=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBc&quot;&gt;https://www.youtube-nocookie.com/embed/7B-PQwNfGBc&lt;/a&gt;
Why use cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline
intra-organization cross-tenant application access.
Cross-tenant synchronization is not currently suitable for use across organizational
boundaries.
With cross-tenant synchronization, you can do the following:
Automatically create B2B collaboration users within your organization and provide
them access to the applications they need, without creating and maintaining
custom scripts.
Improve the user experience and ensure that users can access resources, without
receiving an invitation email and having to accept a consent prompt in each
tenant.
Automatically update users and remove them when they leave the organization.
Users created by cross-tenant synchronization will have the same experience when
accessing Microsoft T eams and other Microsoft 365 services as B2B collaboration users
created through a manual invitation. If your organization uses shared channels, please
see the known issues  document for additional details. Over time, the member userT ype
will be used by the various Microsoft 365 services to provide differentiated end user
experiences for users in a multitenant organization.

Who should use?
Benefits
Teams and Microsoft 365&lt;/p&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship
between a source tenant and a target tenant. Cross-tenant synchronization has the
following properties:
Based on the Microsoft Entra provisioning engine.
Is a push process from the source tenant, not a pull process from the target tenant.
Supports pushing only internal members from the source tenant. It doesn&amp;#39;t
support syncing external users from the source tenant.
Users in scope for synchronization are configured in the source tenant.
Attribute mapping is configured in the source tenant.
Extension attributes are supported.
Target tenant administrators can stop a synchronization at any time.
The following table shows the parts of cross-tenant synchronization and which tenant
they&amp;#39;re configured.
Tenant Cross-t enant
access settingsAutomatic r edemption Sync settings
configurationUser s in scope
Source tenant✔ ✔ ✔ 
Target tenant✔ ✔ 
The cross-tenant synchronization setting is an inbound only organizational setting to
allow the administrator of a source tenant to synchronize users into a target tenant. This
setting is a check box with the name Allow user s sync int o this t enant  that is specified
in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other
processes such as manual invitation  or Microsoft Entra entitlement management .Properties
ﾉExpand table
Cross-tenant synchronization setting&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update
crossT enantIdentityS yncPolicyP artner  API. For more information, see Configure cross-
tenant synchronization .
The automatic redemption setting is an inbound and outbound organizational trust
setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent
prompt the first time they access the resource/target tenant. This setting is a check box
with the following name:
Automatically r edeem invitations with the t enant  &lt;tenant&gt;
The automatic redemption setting applies to cross-tenant synchronization, B2B
collaboration, and B2B direct connect in the following situations:

Automatic redemption setting

Compare setting for different scenarios&lt;/p&gt;
&lt;p&gt;When users are created in a target tenant using cross-tenant synchronization.
When users are added to a resource tenant using B2B collaboration.
When users access resources in a resource tenant using B2B direct connect.
The following table shows how this setting compares when enabled for these scenarios:
Item Cross-t enant
synchr onizationB2B
collaborationB2B dir ect
connect
Automatic redemption setting Required Optional Optional
Users receive a B2B collaboration
invitation emailNo No N/A
Users must accept a consent
promptNo No No
Users receive a B2B collaboration
notification emailNo Yes N/A
This setting doesn&amp;#39;t impact application consent experiences. For more information, see
Consent experience for applications in Microsoft Entra ID . This setting isn&amp;#39;t supported
for organizations across different Microsoft cloud environments, such as Azure
commercial and Azure Government.
The automatic redemption setting will only suppress the consent prompt and invitation
email if both the home/source tenant (outbound) and resource/target tenant (inbound)
checks this setting.
The following table shows the consent prompt behavior for source tenant users when
the automatic redemption setting is checked for different cross-tenant access setting
combinations.ﾉExpand table
When is consent prompt suppressed?&lt;/p&gt;
&lt;p&gt;Home/sour ce tenant Resour ce/tar get t enant Consent pr ompt behavior
for sour ce tenant user s
Outbound Inbound
Suppressed
Not suppressed
Not suppressed
Not suppressed
Inbound Outbound
Not suppressed
Not suppressed
Not suppressed
Not suppressed
To configure this setting using Microsoft Graph, see the Update
crossT enantAccessP olicyConfigurationP artner  API. For more information, see Configure
cross-tenant synchronization .
For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a
consent prompt. If users want to see what tenants they belong to, they can open their
My Account  page and select Organizations . In the Microsoft Entra admin center, users
can open their Portal settings , view their Directories + subscriptions , and switch
directories.
For more information, including privacy information, see Leave an organization as an
external user .
Here are the basic steps to get started using cross-tenant synchronization.ﾉExpand table
How do users know what tenants they belong to?
Get started&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but
every organization is different. For example, you might have a central tenant, satellite
tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of
these topologies. For more information, see Topologies for cross-tenant
synchronization .
In the target tenant where users are created, navigate to the Cross-t enant access
settings  page. Here you enable cross-tenant synchronization and the B2B automatic
redemption settings by selecting the respective check boxes. For more information, see
Configure cross-tenant synchronization .
In any source tenant, navigate to the Cross-t enant access settings  page and enable the
B2B automatic redemption feature. Next, you use the Cross-t enant synchr onization
page to set up a cross-tenant synchronization job and specify:
Which users you want to synchronize
What attributes you want to include
Any transformations
For anyone that has used Microsoft Entra ID to provision identities into a SaaS
application , this experience will be familiar. Once you have synchronization configured,Step 1: Define how to structure the tenants in your organization
Step 2: Enable cross-tenant synchronization in the target tenants
Step 3: Enable cross-tenant synchronization in the source tenants&lt;/p&gt;
&lt;p&gt;you can start testing with a few users and make sure they&amp;#39;re created with all the
attributes that you need. When testing is complete, you can quickly add additional users
to synchronize and roll out across your organization. For more information, see
Configure cross-tenant synchronization .
In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user
who is synchronized with cross-tenant synchronization must have a P1 license in their
home/source tenant. T o find the right license for your requirements, see Compare
generally available features of Microsoft Entra ID .
In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing
model. T o understand the external identities licensing model, see MAU billing model for
Microsoft Entra External ID . You will also need at least one Microsoft Entra ID P1 license
in the target tenant to enable auto-redemption.
Which clouds can cross-tenant synchronization be used in?
Cross-tenant synchronization is supported within the commercial cloud and Azure
Government.
Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated
by 21Vianet cloud.
Synchronization is only supported between two tenants in the same cloud.
Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.
Will cross-tenant synchronization manage existing B2B users?License requirements
Frequently asked questions
Clouds
Existing B2B users&lt;/p&gt;
&lt;p&gt;Yes. Cross-tenant synchronization uses an internal attribute called the
alternativeSecurityIdentifier to uniquely match an internal user in the source tenant
with an external / B2B user in the target tenant. Cross-tenant synchronization can
update existing B2B users, ensuring that each user has only one account.
Cross-tenant synchronization cannot match an internal user in the source tenant
with an internal user in the target tenant (both type member and type guest).
How often does cross-tenant synchronization run?
The sync interval is currently fixed to start at 40-minute intervals. S ync duration
varies based on the number of in-scope users. The initial sync cycle is likely to take
significantly longer than the following incremental sync cycles.
How do I control what is synchronized into the target tenant?
In the source tenant, you can control which users are provisioned with the
configuration or attribute-based filters. Y ou can also control what attributes on the
user object are synchronized. For more information, see Scoping users or groups
to be provisioned with scoping filters .
If a user is removed from the scope of sync in a source tenant, will cross-tenant
synchronization soft delete them in the target?
Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant
synchronization will soft delete them in the target tenant.
What object types can be synchronized?
Microsoft Entra users can be synchronized between tenants. (Groups, devices, and
contacts aren&amp;#39;t currently supported.)
What user types can be synchronized?
Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t
be synchronized from source tenants.
Users can be synchronized to target tenants as external members (default) or
external guests.Synchronization frequency
Scope
Object types&lt;/p&gt;
&lt;p&gt;For more information about the UserT ype definitions, see Properties of a Microsoft
Entra B2B collaboration user .
I have existing B2B collaboration users. What will happen to them?
Cross-tenant synchronization will match the user and make any necessary updates
to the user, such as update the display name. By default, the UserT ype won&amp;#39;t be
updated from guest to member, but you can configure this in the attribute
mappings.
What user attributes can be synchronized?
Cross-tenant synchronization will sync commonly used attributes on the user
object in Microsoft Entra ID, including (but not limited to) displayName,
userPrincipalName, and directory extension attributes.
Cross-tenant synchronization supports provisioning the manager attribute. Both
the user and their manager must be in scope for provisioning.
For cross-tenant synchronization configurations created before January 2024
with the default schema / attribute mappings:
The manager attribute will automatically be added to the mappings.
This does not trigger an initial sync cycle.
Manager updates will apply on the incremental cycle for users that are
undergoing changes (e.g. manager change). The sync engine doesn’t
automatically update all existing users that were provisioned previously.
To update the manager for existing users that are in scope for provisioning,
you can use on-demand provisioning for specific users or do a restart to
provision the manager for all users.
For cross-tenant synchronization configurations created before January 2024
with a custom schema / attribute mappings (e.g. you added an attribute to the
mappings or changed the default mappings):
You need to manually add the manager attribute to your attribute mappings.
This will trigger a restart and update all users that are in scope for
provisioning. This should be a direct mapping of the manager attribute in the
source tenant to the manager in the target tenant.
If the manager of a user is removed in the source tenant and no new manager is
assigned in the source tenant, the manager attribute will not be updated in the
target tenant.
What attributes can&amp;#39;t be synchronized?Attributes&lt;/p&gt;
&lt;p&gt;Attributes including (but not limited to) photos, custom security attributes, and
user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant
synchronization.
Can I control where user attributes are sourced/managed?
Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority.
The user and its attributes are deemed authoritative at the source tenant. There are
parallel sources of authority workstreams that will evolve source of authority
controls for users down to the attribute level and a user object at the source may
ultimately reflect multiple underlying sources. For the tenant-to-tenant process,
this is still treated as the source tenant&amp;#39;s values being authoritative for the sync
process (even if pieces actually originate elsewhere) into the target tenant.
Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.
Cross-tenant synchronization only supports source of authority at the object level.
That means all attributes of a user must come from the same source, including
credentials. It isn&amp;#39;t possible to reverse the source of authority or federation
direction of a synchronized object.
What happens if attributes for a synced user are changed in the target tenant?
Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no
changes are made to the synced user in the source tenant, then user attribute
changes made in the target tenant will persist. However, if changes are made to
the user in the source tenant, then during the next synchronization cycle, the user
in the target tenant will be updated to match the user in the source tenant.
Can the target tenant manually block sign-in for a specific home/source tenant user that
is synced?
If no changes are made to the synced user in the source tenant, then the block
sign-in setting in the target tenant will persist. If a change is detected for the user
in the source tenant, cross-tenant synchronization will re-enable that user blocked
from sign-in in the target tenant.
Can I sync a mesh between multiple tenants?
Cross-tenant synchronization is configured as a single-direction peer-to-peer sync,
meaning sync is configured between one source and one target tenant. Multiple
instances of cross-tenant synchronization can be configured to sync from a singleStructure&lt;/p&gt;
&lt;p&gt;source to multiple targets and from multiple sources into a single target. But only
one sync instance can exist between a source and a target.
Cross-tenant synchronization only synchronizes users that are internal to the
home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is
written back to the same tenant.
Multiple topologies are supported. For more information, see Topologies for cross-
tenant synchronization .
Can I use cross-tenant synchronization across organizations (outside my multitenant
organization)?
For privacy reasons, cross-tenant synchronization is intended for use within an
organization. W e recommend using entitlement management  for inviting B2B
collaboration users across organizations.
Can cross-tenant synchronization be used to migrate users from one tenant to another
tenant?
No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant
is required for synchronized users to authenticate. In addition, tenant migrations
would require migrating user data such as ShareP oint and OneDrive.
Does cross-tenant synchronization resolve any present B2B collaboration  limitations?
Since cross-tenant synchronization is built on existing B2B collaboration
technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):
App or
serviceLimitations
Power BI - Support for UserT ype Member in P ower BI is currently in preview. For
more information, see Distribute P ower BI content to external guest users
with Microsoft Entra B2B .
Azure Virtual
Desktop- External member and external guest aren&amp;#39;t supported in Azure Virtual
Desktop.
How does cross-tenant synchronization relate to B2B direct connect ?B2B collaboration
ﾉExpand table
B2B direct connect&lt;/p&gt;
&lt;p&gt;B2B direct connect is the underlying identity technology required for Teams
Connect shared channels .
We recommend B2B collaboration for all other cross-tenant application access
scenarios, including both Microsoft and non-Microsoft applications.
B2B direct connect and cross-tenant synchronization are designed to co-exist, and
you can enable them both for broad coverage of cross-tenant scenarios.
We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant
synchronization in our multitenant organization. Do you plan to extend support for B2B
direct connect beyond T eams Connect?
There&amp;#39;s no plan to extend support for B2B direct connect beyond T eams Connect
shared channels.
Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access
user experiences?
Cross-tenant synchronization utilizes a feature that improves the user experience
by suppressing the first-time B2B consent prompt and redemption process in each
tenant.
Synchronized users will have the same cross-tenant Microsoft 365 experiences
available to any other B2B collaboration user.
Can cross-tenant synchronization enable people search scenarios where synchronized
users appear in the global address list of the target tenant?
Yes, but you must set the value for the showInAddr essList  attribute of
synchronized users to True, which is not set by default. If you want to create a
unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology . For more
information, see Step 9: R eview attribute mappings .
Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create
contacts.
Does cross-tenant synchronization enhance any current T eams experiences?
Synchronized users will have the same cross-tenant Microsoft 365 experiences
available to any other B2B collaboration user.Microsoft 365
Teams&lt;/p&gt;
&lt;p&gt;What federation options are supported for users in the target tenant back to the source
tenant?
For each internal user in the source tenant, cross-tenant synchronization creates a
federated external user (commonly used in B2B) in the target. It supports syncing
internal users. This includes internal users federated to other identity systems using
domain federation (such as Active Directory Federation Services ). It doesn&amp;#39;t
support syncing external users.
Does cross-tenant synchronization use S ystem for Cross-Domain Identity Management
(SCIM)?
No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For
more information, see SCIM synchronization with Microsoft Entra ID .
Does cross-tenant synchronization support deprovisioning users?
Yes, when the below actions occur in the source tenant, the user will be soft
deleted  in the target tenant.
Delete the user in the source tenant
Unassign the user from the cross-tenant synchronization configuration
Remove the user from a group that is assigned to the cross-tenant
synchronization configuration
An attribute on the user changes such that they do not meet the scoping filter
conditions defined on the cross-tenant synchronization configuration anymore
If the user is blocked from sign-in in the source tenant (accountEnabled = false)
they will be blocked from sign-in in the target. This is not a deletion, but an
updated to the accountEnabled property.
Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a user to a group and assign it to the cross-tenant synchronization
configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Update the account enabled status to false on the user in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle. The account
enabled status is changed to false in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.Integration
Deprovisioning&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Does cross-tenant synchronization support restoring users?
If the user in the source tenant is restored, reassigned to the app, meets the
scoping condition again within 30 days of soft deletion, it will be restored in the
target tenant.
IT admins can also manually restore  the user directly in the target tenant.
How can I deprovision all the users that are currently in scope of cross-tenant
synchronization?
Unassign all users and / or groups from the cross-tenant synchronization
configuration. This will trigger all the users that were unassigned, either directly or
through group membership, to be deprovisioned in subsequent sync cycles. Please
note that the target tenant will need to keep the inbound policy for sync enabled
until deprovisioning is complete. If the scope is set to Sync all user s and gr oups ,
you will also need to change it to Sync only assigned user s and gr oups . The users
will be automatically soft deleted by cross-tenant synchronization. The users will be
automatically hard deleted after 30 days or you can choose to hard delete the
users directly from the target tenant. Y ou can choose to hard delete the users
directly in the target tenant or wait 30 days for the users to be automatically hard
deleted.
If the sync relationship is severed, are external users previously managed by cross-
tenant synchronization deleted in the target tenant?
No. No changes are made to the external users previously managed by cross-
tenant synchronization if the relationship is severed (for example, if the cross-
tenant synchronization policy is deleted).
Topologies for cross-tenant synchronization
Configure cross-tenant synchronizationNext steps&lt;/p&gt;
&lt;p&gt;Multitenant organization identity
provisioning for Microsoft 365
Article •04/24/2024
The multitenant organization capability is designed for organizations that own multiple
Microsoft Entra tenants and want to streamline intra-organization cross-tenant
collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B
member users across multitenant organization tenants.
Teams external access  and Teams shared channels  excluded, Microsoft 365 people
search  is typically scoped to within local tenant boundaries. In multitenant organizations
with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to
reciprocally provision users from their home tenants into the resource tenants of
collaborating coworkers.
The new Microsoft T eams  experience improves upon Microsoft 365 people search and
Teams external access for a unified seamless collaboration experience. For this improved
experience to light up, the multitenant organization representation in Microsoft Entra ID
is required and collaborating users shall be provisioned as B2B members. For more
information, see Announcing more seamless collaboration in Microsoft T eams for
multitenant organizations .
Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B
identities across multitenant organization tenants.
For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C
want to collaborate. Conceptually, these four users represent a collaborating user set of
four internal identities across three tenants.Microsoft 365 people search
New Microsoft Teams
Collaborating user set&lt;/p&gt;
&lt;p&gt;For people search to succeed, while scoped to local tenant boundaries, the entire
collaborating user set must be represented within the scope of each multitenant
organization tenant A, B, and C, in the form of either internal or B2B identities.
Depending on your organization’s needs, the collaborating user set may contain a
subset of collaborating employees, or eventually all employees.
One of the simpler ways to achieve a collaborating user set in each multitenant
organization tenant is for each tenant administrator to define their user contribution
and synchronization them outbound. T enant administrators on the receiving end should
accept the shared users inbound.
Administrator A contributes or shares Annie
Administrator B contributes or shares Bob and Barbara
Administrator C contributes or shares Charles


Sharing your users&lt;/p&gt;
&lt;p&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set
across multitenant organization tenants. For more information, see Synchronize users in
multitenant organizations in Microsoft 365 .
Alternatively, pair-wise configuration of inbound and outbound cross-tenant
synchronization can be used to orchestrate such collating user set across multitenant
organization tenants. For more information, see What is a cross-tenant synchronization .
To ensure a seamless collaboration experience across the multitenant organization in
new Microsoft T eams, B2B identities are provisioned as B2B users of Member userT ype.
User synchr onization method Default userT ype pr oper ty
Synchronize users in multitenant organizations in
Microsoft 365Member
Remains Guest, if the B2B identity already
existed as Guest
Cross-tenant synchronization in Microsoft Entra ID Member
Remains Guest, if the B2B identity already
existed as Guest

B2B member users
ﾉExpand table&lt;/p&gt;
&lt;p&gt;From a security perspective, you should review the default permissions granted to B2B
member users. For more information, see Compare member and guest default
permissions .
To change the userT ype from Guest  to Member  (or vice versa), a source tenant
administrator can amend the attribute mappings , or a target tenant administrator can
change the userT ype if the property is not recurringly synchronized.
To unshare users, you deprovision users by using the user deprovisioning capabilities
available in Microsoft Entra cross-tenant synchronization. By default, when provisioning
scope is reduced while a synchronization job is running, users fall out of scope and are
soft deleted, unless T arget Object Actions for Delete is disabled. For more information,
see Deprovisioning  and Define who is in scope for provisioning .
Plan for multitenant organizations in Microsoft 365
Set up a multitenant org in Microsoft 365Unsharing your users
Next steps&lt;/p&gt;
&lt;p&gt;Multitenant organization optional policy
templates
Article •04/23/2024
Administrators staying in control of their resources is a guiding principle for multitenant
organization collaboration. Cross-tenant access settings are required for each tenant-to-
tenant relationship. T enant administrators explicitly configure cross-tenant access
partner configurations and identity synchronization settings for partner tenants inside
the multitenant organization.
To help apply homogenous cross-tenant access settings to partner tenants in the
multitenant organization, the administrator of each tenant can configure optional cross-
tenant access settings templates dedicated to the multitenant organization. This article
describes how to use templates to preconfigure cross-tenant access settings that are
applied to any partner tenant newly joining the multitenant organization.
Within a multitenant organization, each pair of tenants must have bi-directional cross-
tenant access settings , for both, partner configuration and identity synchronization.
These settings provide the underlying policy framework for enabling trust and for
sharing users and applications.
When your tenant joins a new multitenant organization, or when a partner tenant joins
your existing multitenant organization, cross-tenant access settings to other partner
tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are
automatically generated in an unconfigured state. In an unconfigured state, these cross-
tenant access settings pass through the default settings .
Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t
created organization-specific customized settings. T ypically, these settings are
configured to be nontrusting. For example, cross-tenant trusts for multifactor
authentication and compliant device claims might be disabled and user and group
sharing in B2B direct connect or B2B collaboration might be disallowed.
In multitenant organizations, on the other hand, cross-tenant access settings are
typically expected to be trusting. For example, cross-tenant trusts for multifactor
authentication and compliant device claims might be enabled and user and group
sharing in B2B direct connect or B2B collaboration might be allowed.Autogeneration of cross-tenant access setting s&lt;/p&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization
partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy
behavior, it allows your organization to easily customize the cross-tenant access settings
for partner tenants in the multitenant organization on a per-tenant basis.
As previously described, in multitenant organizations, cross-tenant access settings are
typically expected to be trusting. For example, cross-tenant trusts for multifactor
authentication and compliant device claims might be enabled and user and group
sharing in B2B direct connect or B2B collaboration might be allowed.
While autogeneration of cross-tenant access settings, per previous section, guarantees
the existence of cross-tenant access settings for every multitenant organization partner
tenant, further maintenance of the cross-tenant access settings for multitenant
organization partner tenants is conducted individually, on a per-tenant basis.
To reduce the workload for administrators at the time of multitenant organization
formation, you can optionally use policy templates for preemptive configuration of
cross-tenant access settings. These template settings are applied at the time of your
tenant joins a multitenant organization to all external multitenant organization partner
tenants as well as at the time of any partner tenant joins your existing multitenant
organization to such new partner tenant.
Enablement or configuration of the optional policy templates , at the time of a partner
tenant joins a multitenant organization, preemptively amend the corresponding cross-
tenant access settings , for both partner configuration and identity synchronization.
As an example, consider the actions of the administrators for an anticipated multitenant
organization with three tenants, A, B, and C.
The administrators of all three tenants enable and configure their respective
optional policy templates to enable cross-tenant trusts for multifactor
authentication and compliant device claims and to allow user and group sharing in
B2B direct connect and B2B collaboration.
Administrator A creates the multitenant organization and adds tenants B and C as
pending tenants to the multitenant organization.
Administrator B joins the multitenant organization. Cross-tenant access settings in
tenant A for partner tenant B are amended, according to tenant A policy template
settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A
are amended, according to tenant B policy template settings.Policy templates at multitenant organization
formation&lt;/p&gt;
&lt;p&gt;Administrator C joins the multitenant organization. Cross-tenant access settings in
tenants A (and B) for partner tenant C are amended, according to tenant A (and B)
policy template settings. Similarly, cross-tenant access settings in tenant C for
partner tenants A and B are amended, according to tenant C policy template
settings.
Following the formation of this multitenant organization of three tenants, the
cross-tenant access settings of all tenant pairs in the multitenant organization have
preemptively been configured.
In summary, configuration of the optional policy templates enable you to
homogeneously initialize cross-tenant access settings across your multitenant
organization, while maintaining maximum flexibility to customize your cross-tenant
access settings as needed on a per-tenant basis.
To stop using the policy templates, you can reset them to their default state. For more
information, see Configure multitenant organization templates .
To provide administrators with further configurability, you can choose when cross-
tenant access settings are to be amended according to the policy templates. For
example, you can choose to apply the policy templates for the following tenants when a
tenant joins a multitenant organization:
Tenant Descr iption
Only new partner tenants Tenants whose cross-tenant access settings are autogenerated
Only existing partner tenants Tenants who already have cross-tenant access settings
All partner tenants Both new partner tenants and existing partner tenants
No partner tenants Policy templates are effectively disabled
In this context, new partners refer to tenants for which you haven&amp;#39;t yet configured cross-
tenant access settings, while existing  partners refer to tenants for which you have
already configured cross-tenant access settings. This scoping is specified with the
templateApplicationLevel property on the cross-tenant access partner configuration
template  and the templateApplicationLevel property on the cross-tenant access
identity synchronization template .Policy template scoping and additional
properties
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Finally, in terms of interpretation of template property values, any template property
value of null has no effect on the corresponding property value in the targeted cross-
tenant access settings, while a defined template property value causes the
corresponding property value in the targeted cross-tenant access settings to be
amended in accordance with the template. The following table illustrates how template
property values are being applied to corresponding cross-tenant access setting values.
Templat e Value Initial P artner Settings V alue
(Befor e joining multit enant or g)Final P artner Settings V alue
(After joining multit enant or g)
null &lt;Partner Settings V alue&gt; &lt;Partner Settings V alue&gt;
&lt;Template V alue&gt; &lt;any value&gt; &lt;Template V alue&gt;
When a multitenant organization is formed in Microsoft 365 admin center, an
administrator agrees to the following multitenant organization template settings:
Identity synchronization is set to allow users to synchronize into this tenant
Cross-tenant access is set to automatically redeem user invitations for both
inbound and outbound
This is achieved by setting the corresponding three template property values to true:
automaticUserConsentSettings.inboundAllowed
automaticUserConsentSettings.outboundAllowed
userSyncInbound
For more information, see Join or leave a multitenant organization in Microsoft 365 .
Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a
multitenant organization. When a partner tenant leaves the multitenant organization,
each tenant administrator must re-examine and amend accordingly the cross-tenant
access settings for the partner tenant that left the multitenant organization.ﾉExpand table
Policy templates used by Microsoft 365 admin
center
Cross-tenant access setting s at time of
multitenant organization disassembly&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend
accordingly the cross-tenant access settings for all former multitenant organization
partner tenants as well as consider resetting the two policy templates for cross-tenant
access settings.
Configure multitenant organization templates using the Microsoft Graph APINext steps&lt;/p&gt;
&lt;p&gt;Limitations in multitenant organizations
Article •04/24/2024
This article describes limitations to be aware of when you work with multitenant
organization functionality across Microsoft Entra ID and Microsoft 365. T o provide
feedback about the multitenant organization functionality on UserV oice, see Microsoft
Entra UserV oice . We watch UserV oice closely so that we can improve the service.
The limitations described in this article have the following scope.
Scope Descr iption
In scope - Microsoft Entra administrator limitations related to multitenant organizations
to support seamless collaboration experiences in new T eams, with reciprocally
provisioned B2B members
Related scope - Microsoft 365 admin center limitations related to multitenant organizations&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365 multitenant organization people search experiences&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization limitations related to Microsoft 365
Out of scope - Cross-tenant synchronization unrelated to Microsoft 365&lt;/li&gt;
&lt;li&gt;End user experiences in new T eams&lt;/li&gt;
&lt;li&gt;End user experiences in P ower BI&lt;/li&gt;
&lt;li&gt;Tenant migration or consolidation
Unsupported
scenarios- Seamless collaboration experience across multitenant organizations in classic
Teams&lt;/li&gt;
&lt;li&gt;Self-service for multitenant organizations larger than 100 tenants&lt;/li&gt;
&lt;li&gt;Multitenant organizations in Azure Government or Microsoft Azure operated
by 21Vianet&lt;/li&gt;
&lt;li&gt;Cross-cloud multitenant organizations
Whether you use the Microsoft 365 admin center share users functionality or
Microsoft Entra cross-tenant synchronization, the following items apply:
In the identity platform, both methods are represented as Microsoft Entra cross-
tenant synchronization jobs.
Scope
ﾉExpand table
Microsoft 365 admin center versus cross-tenant
synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Synchronization jobs created with Microsoft Entra ID will not appear in the
Microsoft 365 admin center.
If you created your synchronization job in the Microsoft 365 admin center, do
not modify the synchronization job name using Microsoft Entra ID, otherwise it
will no longer appear in the admin center.
You might adjust the attribute mappings to match your organizations&amp;#39; needs.
By default, new B2B users are provisioned as B2B members, while existing B2B
guests remain B2B guests.
You can opt to convert B2B guests into B2B members by setting Apply this
mapping  to Always .
If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your
users, rather than the Microsoft 365 admin center share users functionality,
Microsoft 365 admin center indicates an Outbound sync status  of Not configur ed.
This is expected behavior. Currently, Microsoft 365 admin center only shows the
status of Microsoft Entra cross-tenant synchronization jobs created and managed
by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant
synchronizations created and managed in Microsoft Entra ID.
If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin
center, after adding tenants to or after joining a multitenant organization in
Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization
configuration with the name MTO_Sync_&lt;TenantID&gt;. Refrain from editing or
changing the name if you want Microsoft 365 admin center to recognize the
configuration as created and managed by Microsoft 365 admin center.
Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross-
tenant synchronization configuration before the tenant in question allows inbound
synchronization in their cross-tenant access settings for identity synchronization.
Hence the usage of the cross-tenant access settings template for identity
synchronization is encouraged, with userSyncInbound set to true, as facilitated by
Microsoft 365 admin center.
There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take
control of pre-existing Microsoft Entra cross-tenant synchronization configurations
and jobs.
There are multiple reasons why a join request might fail. If the Microsoft 365 admin
center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join
request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.Join requests&lt;/p&gt;
&lt;p&gt;If you followed the correct sequence to create a multitenant organization and add
a tenant to the multitenant organization, and the added tenant&amp;#39;s join request
keeps failing, submit a support request in the Microsoft Entra or Microsoft 365
admin center.
In ShareP oint OneDrive , the promotion of B2B guests to B2B members might not
happen automatically. If faced with a user type mismatch between Microsoft Entra
ID and ShareP oint OneDrive, try Set-SPUser [-S yncFromAD] .
In ShareP oint OneDrive  user interfaces, when sharing a file with People in F abrikam,
the current user interfaces might be counterintuitive, because B2B members in
Fabrikam from Contoso count towards People in F abrikam.
In Microsoft Forms , B2B member users might not be able to access forms.
In Microsoft P ower BI , B2B member users are not yet supported. B2B guest users
can continue to access P ower BI dashboards.
In Microsoft P ower Apps , Microsoft Dynamics 365 , and related workloads, B2B
member users may have restricted functionality. For more information, see Invite
users with Microsoft Entra B2B collaboration .
The promotion of B2B guests to B2B members represents a strategic decision by
multitenant organizations to consider B2B members as trusted users of the
organization. R eview the default permissions  for B2B members.
To promote B2B guests to B2B members, a source tenant administrator can amend
the attribute mappings , or a target tenant administrator can change the userT ype if
the property is not recurringly synchronized.
As your organization rolls out the multitenant organization functionality including
provisioning of B2B users across multitenant organization tenants, you might want
to provision some users as B2B guests, while provision others users as B2B
members. T o achieve this, you might want to establish two Microsoft Entra cross-
tenant synchronization configurations in the source tenant, one with userT ype
attribute mappings configured to B2B guest, and another with userT ype attribute
mappings configured to B2B member, each with Apply this mapping  set toMicrosoft apps
B2B users or B2B members&lt;/p&gt;
&lt;p&gt;Always . By moving a user from one configuration&amp;#39;s scope to the other, you can
easily control who will be a B2B guest or a B2B member in the target tenant.
As part of a multitenant organization, reset redemption for an already redeemed
B2B user  is currently disabled.
The at-scale provisioning of B2B users might collide with contact objects. The
handling or conversion of contact objects is currently not supported.
Using Microsoft Entra cross-tenant synchronization to target hybrid identities that
have been converted to B2B users has not been tested in source of authority
conflicts and is not supported.
By default, when provisioning scope is reduced while a synchronization job is
running, users fall out of scope and are soft deleted, unless Target Object Actions
for Delete  is disabled. For more information, see Deprovisioning  and Define who is
in scope for provisioning .
Currently, SkipOutOfScopeDeletions  works for application provisioning jobs, but
not for Microsoft Entra cross-tenant synchronization. T o avoid soft deletion of
users taken out of scope of cross-tenant synchronization, set Target Object Actions
for Delete  to disabled.
Known issues for provisioning in Microsoft Entra IDCross-tenant synchronization deprovisioning
Next steps&lt;/p&gt;
&lt;p&gt;Topologies for cross-tenant
collaboration
Article •11/03/2023
Organizations often find themselves managing multiple tenants due to mergers and
acquisitions, regulatory requirements, or administrative boundaries. R egardless of your
scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning
accounts across tenants and facilitating seamless collaboration. Microsoft Entra
accommodates the following three models and can adapt to your evolving
organizational needs.
The hub and spoke topology presents two common patterns:
Option 1 (application hub):  In this option, you can integrate commonly used
applications into a central hub tenant that users from across the organization can
access.
Option 2 (user hub):  Alternatively, option 2 centralizes all your users in a single
tenant and provisions them into spoke tenants where resources are managed.
Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these
models.
During mergers and acquisitions, the ability to quickly enable collaboration is crucial,
allowing businesses to function cohesively while complex IT decisions are being made.
For instance, when a newly acquired company&amp;#39;s employees need immediate access to
applications such as the internal help desk ticketing system or benefits application,
cross-tenant synchronization proves invaluable. This synchronization process allows
users from the acquired company to be provisioned into the application hub from day
one, granting them access to SaaS apps, on-premises applications, and other cloud
resources. Within the target tenant, admins can set up access packages to grant time
limited access to additional applications such as Salesforce and Amazon W eb ServicesHub and spoke＂
Mesh＂
Just-in-time＂
Hub and spoke
Mergers and acquisitions (application hub)&lt;/p&gt;
&lt;p&gt;that contain business critical data. The following diagram shows recently acquired
tenants on the left and their users being provisioned into the parent company&amp;#39;s tenant,
which grants users access to the necessary resources.
As organizations scale their usage of Azure, they often create dedicated tenants for
managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user
provisioning. This model empowers administrators in the hub tenant to establish central
security and governance policies while granting development teams greater autonomy
and agility to deploy required Azure resources. Cross-tenant synchronization supports
this topology by enabling administrators to provision a subset of users into the spoke
tenants and manage the lifecycle of those users.Separate collaboration and resource tenants
(user hub)&lt;/p&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more
decentralized structure with applications, HR systems, and Active Directory domains
integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose
which users are provisioned into each tenant.
In this scenario, each tenant represents a different company within the same parent
organization. Administrators in each tenant choose a subset of users to provision into
the target tenant. This solution provides flexibility for each tenant to operate
independently, while facilitating collaboration when users need access to critical
resources.Mesh
Collaborate within a portfolio company (partial-mesh)&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized
into multiple tenants as an external user. When the topology shows a synchronization
going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a
separate configuration.
In this scenario, the organization has designated different tenants for each business unit.
The business units work closely together, in particular using Microsoft T eams. As a result,
each tenant has chosen to provision all users across the four tenants in the organization.
As new users join the company or leave, the provisioning service takes care of creating
and deleting users. The organization has also configured a multitenant organization that
includes all four tenants. Now when users need to collaborate in T eams, they&amp;#39;re able to
easily find users across the company and start chats and meetings with those users.Collaborate across business units (full-mesh)&lt;/p&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there
are cases where cross-organization collaboration is vital. This could be in the context of
joint ventures or organizations of independent legal entities. By employing connected
organizations and entitlement management, you can define policies for accessing
resources across connected organizations and enable users to request access to the
resources they need.
Consider Contoso and Litware, separate organizations engaged in a multi-year joint
venture. They need to collaborate closely. Administrators at Contoso have defined
access packages containing the resources required by Litware users. When a new
Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the
access package. Upon approval, they are provisioned with the necessary resources.
Access can be time-limited and subject to periodic review to ensure compliance with
Contoso&amp;#39;s governance requirements.
The following diagram shows how two organizations can just-in-time collaborate by
using connected organizations and entitlement management.Just-in-time
Joint ventures&lt;/p&gt;
&lt;p&gt;Feedb ack
Was this p age help ful?
Provide product feedback  |Get help at Microsoft Q&amp;amp;A
What is cross-tenant synchronization?
Configure cross-tenant synchronizationNext steps
YesNo&lt;/p&gt;
&lt;p&gt;Governance and cross-tenant
synchronization
Article •03/21/2024
Cross-tenant synchronization is a flexible and ready-to-use solution to provision
accounts and facilitate seamless collaboration across tenants in an organization. Cross-
tenant synchronization automatically manages user identity lifecycle across tenants. It
provisions, synchronizes, and deprovisions users in the scope of synchronization from
source tenants.
This article describes how Microsoft Entra ID Governance  customers can use cross-
tenant synchronization to manage identity and access lifecycles across multitenant
organizations.
In this example, Contoso is a multitenant organization with three production Microsoft
Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID
Governance features to address the following scenarios:
Manage employee identity lifecycles across multiple tenants
Use workflows to automate lifecycle processes for employees that originate in
other tenants
Assign resource access automatically to employees that originate in other tenants
Allow employees to request access to resources in multiple tenants
Review the access of synchronized users
From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and
Africa (Contoso EMEA) and Contoso United S tates (Contoso US) are source tenants and
Contoso is a target tenant. The following diagram illustrates the topology.Deployment example&lt;/p&gt;
&lt;p&gt;This supported topology for cross-tenant synchronization  is one of many in Microsoft
Entra ID. T enants can be a source tenant, a target tenant, or both. In the following
sections, learn how cross-tenant synchronization and Microsoft Entra ID Governance
features address several scenarios.
Cross-tenant synchronization in Microsoft Entra ID  automates creating, updating, and
deleting B2B collaboration users.
When organizations create, or provision, a B2B collaboration user in a tenant, user
access depends partly on how the organization provisioned them: Guest or Member
user type. When you select user type, consider the various properties of a Microsoft
Entra B2B collaboration user . The Member user type is suitable if users are part of the
larger multitenant organization and need member-level access to resources in the
organizational tenants. Microsoft T eams requires the Member user type in multitenant
organizations .
By default, cross-tenant synchronization includes commonly used attributes on the user
object in Microsoft Entra ID. The following diagram illustrates this scenario.Manage employee lifecycles across tenants&lt;/p&gt;
&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and
access packages in the source and target tenant. Some Microsoft Entra ID features have
user attributes to target, such as lifecycle workflow user scoping.
To remove, or deprovision, a B2B collaboration user from a tenant automatically stops
access to resources in that tenant. This configuration is relevant when employees leave
an organization.
Microsoft Entra ID lifecycle workflows are an identity governance feature to manage
Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.
With cross-tenant synchronization, multitenant organizations can configure lifecycle
workflows to run automatically for B2B collaboration users it manages. For example,
configure a user onboarding workflow, triggered by the createdDateTime event user
attribute, to request access package assignment for new B2B collaboration users. Use
attributes such as userType and userPrincipalName to scope lifecycle workflows for
users homed in other tenants the organization owns.
Multitenant organizations can ensure B2B collaboration users have access to shared
resources in a target tenant. Users can request access, where needed. In the following
scenarios, see how the identity governance feature, entitlement management  access
packages govern resource access.Automate lifecycle processes with workflows
Govern synchronized user access with access
packages
Automatically assign access in target tenants to
employees from source tenants&lt;/p&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based
on one or more user properties. T o configure birthright assignment, create automatic
assignment policies for access packages  in entitlement management and configure
resource roles to grant shared resource access.
Organizations manage cross-tenant synchronization configuration in the source tenant.
Therefore, organizations can delegate resource access management to other source
tenant administrators for synchronized B2B collaboration users:
In the source tenant, administrators configure cross-tenant synchronization
attribute mappings for the users that require cross-tenant resource access
In the target tenant, administrators use attributes in automatic assignment policies
to determine access package membership for synchronized B2B collaboration
users
To drive automatic assignment policies in the target tenant, synchronize default
attribute mappings, such as department or map directory extensions, in the source
tenant.
With identity governance access package  policies, multitenant organizations can allow
B2B collaboration users, created by cross-tenant synchronization, to request access to
shared resources in a target tenant. This process is useful if employees need just-in-time
(JIT) access to a resource that another tenant owns.
Access reviews in Microsoft Entra ID  enable organizations to manage group
memberships, access to enterprise applications, and role assignments. R egularly review
user access to ensure the right people have access.
When resource access configuration doesn’t automatically assign access, such as with
dynamic groups or access packages, configure access reviews to apply the results to
resources upon completion. The following sections describe how multitenant
organizations can configure access reviews for users across tenants in source and target
tenants.Enable source-tenant employees to request access to
target-tenant shared resources
Review synchronized-user access
Review source-tenant user access&lt;/p&gt;
&lt;p&gt;Multitenant organizations can include internal users in access reviews. This action
enables access recertification in source tenants that synchronizes users. Use this
approach for regular review of security groups assigned to cross-tenant synchronization.
Therefore, ongoing B2B collaboration access to other tenants has approval in the user
home tenant.
Use access reviews of users in source tenants to avoid potential conflicts between cross-
tenant synchronization and access reviews that remove denied users upon completion.
Organizations can include B2B collaboration users in access reviews, including users
provisioned by cross-tenant synchronization in target tenants. This option enables
access recertification of resources in target tenants. Although organizations can target
all users in access reviews, guest users can be explicitly targeted if necessary.
For organizations that synchronize B2B collaboration users, typically Microsoft doesn’t
recommend removing denied guest users automatically from access reviews. Cross-
tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.
Multitenant organizations and Microsoft 365
Multitenant organization templates
Topologies for cross-tenant synchronizationReview target-tenant user access
Next steps&lt;/p&gt;
&lt;p&gt;Govern access for security operations
center (SOC) teams in a multitenant
environment
Article •05/02/2024
Managing multitenant environments can add another layer of complexity when it comes
to keeping up with the ever-evolving security threats facing your enterprise. Navigating
across multiple tenants can be time consuming and reduce the overall efficiency of
security operation center (SOC) teams. Multitenant management in Microsoft Defender
XDR provides security operation teams with a single, unified view of all the tenants they
manage. This view enables teams to quickly investigate incidents and perform advanced
hunting across data from multiple tenants, improving their security operations.
Microsoft Entra ID Governance  enables you to govern the access and lifecycle of the
users who are members of the SOC teams and threat hunter teams. This document
explores:
The controls you can put in place for SOC teams to securely access resources
across tenants.
Example topologies for how you can implement your lifecycle and access controls.
Deployment considerations (roles, monitoring, APIs).
Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and
to securely provide access to the resources they need. In this document, the term source
tenant refers to where the SOC users originate and authenticate against. T arget tenant
refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations
have multiple target tenants due to mergers and acquisitions, aligning tenants with
business units, and aligning tenants with geos.
Entitlement management, thr ough access p ackages and connect ed or ganizations
allows the target tenant administrator to define collections of resources (ex: app roles,
directory roles, and groups) that users from the source tenant can request access to. If
the user is approved for the resources they need, but don’t yet have a B2B account,
entitlement management will automatically create a B2B account for the user in theManage the lifecycle and access of a SOC user
Lifecycle control&lt;/p&gt;
&lt;p&gt;target tenant. When they don&amp;#39;t have any remaining entitlements in the target tenant,
their B2B account will automatically be removed.
Learn more
Cross-t enant synchr onization  allows the source tenant to automate creating, updating,
and deleting B2B users across tenants in an organization.
Learn more
Comp aring entitlement management and cr oss-t enant synchr onization
Capability Entitlement management Cross-t enant
synchr onization
Create users in the target tenant ● ●
Update users in the target tenant when
their attributes change in the source
tenant●
Delete users ● ●
Assign users to groups, directory roles,
app roles●
Attributes of the user in the target
tenantMinimal, supplied by user
themself at request timeSynchronized from the
source tenant
You can use entitlement management and cross-tenant access policies to control access
to resources across tenants. Entitlement management will assign the right users to the
right resources, while cross-tenant access policies and conditional access together
perform the necessary run-time checks to ensure the right users are accessing the right
resources.
Entitlement management
Assigning Microsoft Entra roles through entitlement management access packages
helps to efficiently manage role assignments at scale and improves the role assignment
lifecycle. It provides a flexible request and approval process for gaining access to
directory roles, app roles, and groups while also enabling automatic assignment to
resources based on user attributes.ﾉExpand table
Access control&lt;/p&gt;
&lt;p&gt;Learn more
Cross-t enant access policies
External identities cross-tenant access settings manage how you collaborate with other
Microsoft Entra organizations through B2B collaboration. These settings determine both
the level of inbound access users in external Microsoft Entra organizations have to your
resources, and the level of outbound access your users have to external organizations.
Learn more
This section describes how you can use tools such as cross-tenant synchronization,
entitlement management, cross-tenant access policies, and conditional access together.
In both topologies, the target tenant admin has full control over access to resources in
the target tenant. They differ in who initiates provisioning and deprovisioning.
In topology 1, the source tenant configures entitlement management and cross-tenant
synchronization to provision users into the target tenant. Then, the administrator of the
target tenant configures access packages to provide access to the necessary directory
roles, group, and app roles in the target tenant.
Steps t o configur e topology 1Deployment topologies
Topology 1
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, configure cross-tenant synchronization  to provision internal
accounts in the source tenant as external accounts in the target tenant.
As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll
automatically be provisioned into the target tenant. As they&amp;#39;re removed from the
configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute
mappings, you can add a new mapping of type constant to provision a directory
extension  attribute on the user to indicate that they&amp;#39;re a SOC administrator.
Alternatively, if you have an attribute such as department that you can rely on for
this step, you can skip creating the extension. This attribute will be used in the
target tenant to provide them with access to the necessary roles.&lt;/li&gt;
&lt;li&gt;In the source tenant, create an access package that includes the cross-tenant
synchronization service principal as a resource.
As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant
synchronization service principal. Ensure that you set up periodic access reviews of
the access package or time-limit the assignments to ensure that only the users that
need access to the target tenant continue to have access.&lt;/li&gt;
&lt;li&gt;In the target tenant, create access packages  to provide the necessary roles for
investigating an incident.
We recommend one autoassigned  access package to provide the Security R eader
role and one request based package for the Security Operator and Security
Administrator roles.
Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com
to request time-limited access to the necessary access packages in the source tenant.
Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the
security reader role. They can then request additional access in any tenants where they
need the Security Operator or Security Administrator roles. Once their access period is
over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the
target tenants they don&amp;#39;t need access to anymore.
In topology 2 the target tenant administrator defines the access packages and resources
that the source users can request access to. If the source tenant administrator would like
to restrict which of their users can access the target tenant, you can use a cross-tenant
access policy coupled with an access package to block all access to the target tenant,
except for users that are part of a group that is included in an access package in the
home tenant.Topology 2&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Steps t o configur e topology 2&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, add the source tenant as a connected organization .
This setting allows the target tenant administrator to make access packages
available to the source tenant.&lt;/li&gt;
&lt;li&gt;In the target tenant, create an access package that provides the Security R eader,
Security Administrator, and Security Operator roles.&lt;/li&gt;
&lt;li&gt;Users from the source tenant can now request access packages in the target
tenant.
Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com
to request time-limited access to the necessary roles in each tenant.
Topologies comp ared
In both topologies, the target tenant can control what resources users have access to.
This can be accomplished using a mix of cross-tenant access policies, conditional access,
and assignment of apps and roles to users. They differ in who configures and initiates
provisioning. In topology 1, the source tenant configures provisioning and pushes users
into the target tenants. In topology 2, the target tenant defines which users are eligible
to access their tenant.
If a user needs access to several tenants at one time, topology 1 makes it easy for them
to request access to an access package in one tenant and automatically get provisioned
into several tenants. If the target tenant wants to ensure full control over who is
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;provisioned into their tenant and perform the necessary approvals in their tenant,
topology 2 will best meet their needs.
Monit oring
Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft
Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions
performed, generate alerts when specific actions are performed, and analyze actions
performed by pushing audit logs into Azure Monitor.
Learn more
Actions performed by a SOC analyst in Microsoft Defender are also audited.
Learn more
Scaling deployment with P owerShell / APIs
Every step that is configured through the user interface in Microsoft Entra has
accompanying Microsoft Graph APIs and P owerShell commandlets, enabling you to
deploy your desired policies/configuration across the tenants in your organization.
Capability Micr osoft Graph API PowerShell
Cross-tenant synchronization Link Link
Entitlement management Link Link
Cross-tenant access policies Link Link
Role-b ased access contr ol
Configuring the capabilities described in topology 1 and topology 2 require the
following roles:
Configuring cross-tenant access settings - Security Administrator
Configuring cross-tenant synchronization - Hybrid Identity Administrator
Configuring entitlement management - Identity Governance Administrator
Microsoft Defender  supports both built-in roles such as Security R eader, Security
Administrator, and Security Operator and custom roles.Deployment considerations
ﾉExpand table&lt;/p&gt;
&lt;p&gt;What is cross-tenant synchronization?
What is entitlement management?
Multitenant management in Defender XDRNext steps&lt;/p&gt;
&lt;p&gt;Known issues for provisioning in
Microsoft Entra ID
Article •02/14/2024
This article discusses known issues to be aware of when you work with app provisioning
or cross-tenant synchronization. T o provide feedback about the application provisioning
service on UserV oice, see Microsoft Entra application provision UserV oice . We watch
UserV oice closely so that we can improve the service.
After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning
mode has switched from manual to automatic. Y ou can&amp;#39;t change it back to manual. But
you can turn off provisioning through the UI. Turning off provisioning in the UI
effectively does the same as setting the dropdown to manual.
The attributes SamAccountName  and userT ype aren&amp;#39;t available as a source attribute by
default. Extend your schema to add the attributes. Y ou can add the attributes to the list
of available source attributes by extending your schema. T o learn more, see Missing
source attribute .
Extensions to your schema can sometimes be missing from the source attribute
dropdown in the UI. Go into the advanced settings of your attribute mappings and
７ Note
This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that
isn&amp;#39;t listed, provide feedback at the bottom of the page.
Auth orization
Unable to change provisioning mode back to manual
Attribute mappings
Attribute SamAccountName or userType not available as a source
attribute
Source attribute dropdown missing for schema extension&lt;/p&gt;
&lt;p&gt;manually add the attributes. T o learn more, see Customize attribute mappings .
Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the
user object, it will be skipped.
Attribute-mapping expressions can have a maximum of 10,000 characters.
The appR oleAssignments , userT ype, and accountExpir es attributes aren&amp;#39;t supported as
scoping filters.
Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.
Provisioning passwords isn&amp;#39;t supported.
Provisioning nested groups isn&amp;#39;t supported.
Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.
Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet
available in the Government cloud. W e&amp;#39;re working with app developers to onboard
their apps to all clouds.
If you create an app registration, the corresponding service principal in enterprise apps
won&amp;#39;t be enabled for automatic user provisioning. Y ou&amp;#39;ll need to either request the app
be added to the gallery, if intended for use by multiple organizations, or create a second
non-gallery app for provisioning.Null attribute can&amp;#39;t be provisioned
Maximum characters for attribute-mapping expressions
Unsupported scoping filters
Multivalue directory extensions
Service issues
Unsupported scenarios
Automatic provisioning isn&amp;#39;t available on my OIDC-based
application&lt;/p&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the
user and then updates the manager. If on day one the user is in scope and the manager
is out of scope, we&amp;#39;ll provision the user without the manager reference. When the
manager comes into scope, the manager reference won&amp;#39;t be updated until you restart
provisioning and cause the service to reevaluate all the users again.
The time between provisioning cycles is currently not configurable.
The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action
is taken to roll back. The app provisioning service relies on changes made in Microsoft
Entra ID.
After you change scope from Sync All  to Sync Assigned , make sure to also perform a
restart to ensure that the change takes effect. Y ou can do the restart from the UI.
When you set provisioning to enabled = off or select Stop, the current provisioning
cycle continues running until completion. The service stops executing any future cycles
until you turn provisioning on again.
When a group is in scope and a member is out of scope, the group will be provisioned.
The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the
service won&amp;#39;t immediately detect the change. R estarting provisioning addresses the
issue. P eriodically restart the service to ensure that all users are properly provisioned.
The Global R eader role is unable to read the provisioning configuration. Create a custom
role with the microsoft.directory/applications/synchronization/standard/readManager isn&amp;#39;t provisioned
The provisioning interval is fixed
Changes not moving from target app to Microsoft Entra ID
Switching from Sync All to Sync Assigned not working
Provisioning cycle continues until completion
Member of group not provisioned
Global Reader&lt;/p&gt;
&lt;p&gt;permission in order to read the provisioning configuration from the Microsoft Entra
admin center.
Credentials, including the secret token, notification email, and SSO certificate
notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.
The following information is a current list of known limitations with the Microsoft Entra
ECMA Connector Host and on-premises application provisioning.
The following applications and directories aren&amp;#39;t yet supported.
When a user is managed by Microsoft Entra Connect, the source of authority is on-
premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in
Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users
managed by Microsoft Entra Connect.
Attempting to use Microsoft Entra Connect and the on-premises provisioning to
provision groups or users into Active Directory Domain Services can lead to
creation of a loop, where Microsoft Entra Connect can overwrite a change that was
made by the provisioning service in the cloud. Microsoft is working on a dedicated
capability for group or user writeback. Upvote the UserV oice feedback on this
website  to track the status of the preview. Alternatively, you can use Microsoft
Identity Manager  for user or group writeback from Microsoft Entra ID to Active
Directory.
By using on-premises provisioning, you can take a user already in Microsoft Entra ID and
provision them into a third-party application. You can &amp;#39;t bring a us er int o the dir ectory
from a thir d-party application.  Customers will need to rely on our native HR integrations,
Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users
into the directory.Microsoft Azure Government Cloud
On-premises application provisioning
Application and directories
Active Directory Domain Services (user or group writeback from
Microsoft Entra ID by using the on-premises provisioning preview)
Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:
Multivalued attributes.
Reference attributes (for example, manager).
Groups.
Complex anchors (for example, ObjectT ypeName+UserName).
Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;
Binary attributes.
On-premises applications are sometimes not federated with Microsoft Entra ID and
require local passwords. The on-premises provisioning preview doesn&amp;#39;t support
password synchronization. Provisioning initial one-time passwords is supported.
Ensure that you&amp;#39;re using the Redact  function to redact the passwords from the
logs. In the SQL and LD AP connectors, the passwords aren&amp;#39;t exported on the initial
call to the application, but rather a second call with set password.
The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to
be trusted by Azure or the provisioning agent to be used. The certificate subject must
match the host name the Microsoft Entra ECMA Connector Host is installed on.
The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute
changes (renames) or target systems, which require multiple attributes to form an
anchor.
The attributes that the target application supports are discovered and surfaced in the
Microsoft Entra admin center in Attribut e Mappings . Newly added attributes will
continue to be discovered. If an attribute type has changed, for example, string to
Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically
in the Microsoft Entra admin center. Customers will need to go into advanced settings in
mappings and manually update the attribute type.Attributes and objects
SSL certificates
Anchor attributes
Attribute discovery and mapping
Provisioning agent&lt;/p&gt;
&lt;p&gt;The agent doesn&amp;#39;t currently support auto update for the on-premises application
provisioning scenario. W e&amp;#39;re actively working to close this gap and ensure that
auto update is enabled by default and required for all customers.
The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and
cloud sync / HR- driven provisioning.
How provisioning worksNext steps&lt;/p&gt;
&lt;p&gt;Configure a multitenant organization
using PowerShell or Microsoft Graph
API
Article •04/24/2024
This article describes the key steps to configure a multitenant organization using
Microsoft Graph P owerShell or Microsoft Graph API. This article uses an example owner
tenant named Cairo and two member tenants named Berlin  and Athens .
If you instead want to use the Microsoft 365 admin center to configure a multitenant
organization, see Set up a multitenant org in Microsoft 365  and Join or leave a
multitenant organization in Microsoft 365 . To learn how to configure Microsoft T eams
for your multitenant organization, see The new Microsoft T eams desktop client .
Owner t enant
For license information, see License requirements .
Security Administrator  role to configure cross-tenant access settings and templates
for the multitenant organization.
Global Administrator  role to consent to required permissions.

Prerequisites&lt;/p&gt;
&lt;p&gt;Member t enant
For license information, see License requirements .
Security Administrator  role to configure cross-tenant access settings and templates
for the multitenant organization.
Global Administrator  role to consent to required permissions.
Owner t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start P owerShell.&lt;/li&gt;
&lt;li&gt;If necessary, install the Microsoft Graph P owerShell SDK .&lt;/li&gt;
&lt;li&gt;Get the tenant ID of the owner and member tenants and initialize variables.
PowerShell&lt;/li&gt;
&lt;li&gt;Use the Connect-MgGraph  command to sign in to the owner tenant and
consent to the following required permissions.
MultiTenantOrganization.ReadWrite.All
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Application.ReadWrite.All
Directory.ReadWrite.All
PowerShellStep 1: Sign in to the owner tenant
PowerShell
$OwnerTenantId  = &amp;quot;&lt;OwnerTenantId&gt;&amp;quot;
$MemberTenantIdB  = &amp;quot;&lt;MemberTenantIdB&gt;&amp;quot;
$MemberTenantIdA  = &amp;quot;&lt;MemberTenantIdA&gt;&amp;quot;
Connect-MgGraph  -TenantId  $OwnerTenantId  -Scopes&lt;br&gt;&amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot; ,&amp;quot;Policy.Read.All&amp;quot; ,&amp;quot;Policy.R&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Owner t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Update-
MgBetaT enantR elationshipMultiT enantOrganization  command to create your
multitenant organization. This operation can take a few minutes.
PowerShell&lt;/li&gt;
&lt;li&gt;Use the Get-MgBetaT enantR elationshipMultiT enantOrganization  command to
check that the operation has completed before proceeding.
PowerShell
OutputeadWrite.CrossTenantAccess&amp;quot; ,&amp;quot;Application.ReadWrite.All&amp;quot; ,&amp;quot;Directory.
ReadWrite.All&amp;quot;
Step 2: Create a multitenant organization
PowerShell
Update-MgBetaTenantRelationshipMultiTenantOrganization  -DisplayName&lt;br&gt;&amp;quot;Cairo&amp;quot;
Get-MgBetaTenantRelationshipMultiTenantOrganization  | Format-List
CreatedDateTime      : 1/8/2024 7:47:45 PM
Description          :
DisplayName          : Cairo
Id                   : &lt;MtoIdC&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JoinRequest          :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationJoinRequestRecord
State                : active
Tenants              :
AdditionalProperties : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt;
iTenantOrganization/$entity]}&lt;/p&gt;
&lt;p&gt;Owner t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the New-
MgBetaT enantR elationshipMultiT enantOrganizationT enant  command to add
tenants to your multitenant organization.
PowerShell
PowerShell&lt;/li&gt;
&lt;li&gt;Use the Get-MgBetaT enantR elationshipMultiT enantOrganizationT enant
command to verify that the operation has completed before proceeding.
PowerShell
OutputStep 3: Add tenants
PowerShell
New-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -TenantID&lt;br&gt;$MemberTenantIdB  -DisplayName  &amp;quot;Berlin&amp;quot;  | Format-List
New-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -TenantID&lt;br&gt;$MemberTenantIdA  -DisplayName  &amp;quot;Athens&amp;quot;  | Format-List
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant  | Format-
List
AddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 7:47:45 PM
DeletedDateTime      :
DisplayName          : Cairo
Id                   : &lt;MtoIdC&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JoinedDateTime       :
Role                 : owner
State                : active
TenantId             : &lt;OwnerTenantId&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;Owner t enant
By default, tenants added to the multitenant organization are member tenants.
Optionally, you can change them to owner tenants, which allow them to add other
tenants to the multitenant organization. Y ou can also change an owner tenant to a
member tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Update-
MgBetaT enantR elationshipMultiT enantOrganizationT enant  command to
change a member tenant to an owner tenant.
PowerShellAddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 8:05:25 PM
DeletedDateTime      :
DisplayName          : Berlin
Id                   : &lt;MtoIdB&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JoinedDateTime       :
Role                 : member
State                : pending
TenantId             : &lt;MemberTenantIdB&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
AddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 8:08:47 PM
DeletedDateTime      :
DisplayName          : Athens
Id                   : &lt;MtoIdA&gt;
JoinedDateTime       :
Role                 : member
State                : pending
TenantId             : &lt;MemberTenantIdA&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
Step 4: (Optional) Change the role of a tenant
PowerShell&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaT enantR elationshipMultiT enantOrganizationT enant
command to verify the change.
PowerShell
Output
Owner t enant
You can remove any member tenant, including your own. Y ou can&amp;#39;t remove owner
tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed
from owner to member.Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  $MemberTenantIdB  -Role &amp;quot;Owner&amp;quot; | 
Format-List
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  $MemberTenantIdB  | Format-List
AddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 8:05:25 PM
DeletedDateTime      :
DisplayName          : Berlin
Id                   : &lt;MtoIdB&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JoinedDateTime       :
Role                 : owner
State                : pending
TenantId             : &lt;MemberTenantIdB&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt;
iTenantOrganization/tenants/$entity],
                       [multiTenantOrgLabelType, none]}
Step 5: (Optional) Remove a member tenant
PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the owner tenant, use the Remove-
MgBetaT enantR elationshipMultiT enantOrganizationT enant  command to
remove any member tenant. This operation takes a few minutes.
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgBetaT enantR elationshipMultiT enantOrganizationT enant
command to verify the change.
PowerShell
After the remove command completes, the output is similar to the following.
This is an expected error message. It indicates that the tenant has been
removed from the multitenant organization.
Output
Member t enant
The Cairo tenant created a multitenant organization and added the Berlin and Athens
tenants. In these steps, you sign in to the Berlin tenant and join the multitenant
organization created by Cairo.Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  &lt;MemberTenantIdD&gt;
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  &lt;MemberTenantIdD&gt;
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get:&lt;br&gt;Unable to read the company information from the directory.
Status: 404 (NotFound)
ErrorCode: Directory_ObjectNotFound
Date: 2024-01-08T20:35:11
...
Step 6: Sign in to a member tenant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start P owerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph  command to sign in to the member tenant and
consent to the following required permissions.
MultiTenantOrganization.ReadWrite.All
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Application.ReadWrite.All
Directory.ReadWrite.All
PowerShell
Member t enant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the member tenant, use the Update-
MgBetaT enantR elationshipMultiT enantOrganizationJoinR equest  command to
join the multitenant organization.
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgBetaT enantR elationshipMultiT enantOrganizationJoinR equest
command to verify the join.PowerShell
Connect-MgGraph  -TenantId  $MemberTenantIdB  -Scopes&lt;br&gt;&amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot; ,&amp;quot;Policy.Read.All&amp;quot; ,&amp;quot;Policy.R
eadWrite.CrossTenantAccess&amp;quot; ,&amp;quot;Application.ReadWrite.All&amp;quot; ,&amp;quot;Directory.
ReadWrite.All&amp;quot;
Step 7: Join the multitenant organization
PowerShell
Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest  -
AddedByTenantId  $OwnerTenantId  | Format-List&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell
Output
3. Use the Get-MgBetaT enantR elationshipMultiT enantOrganizationT enant
command to check the multitenant organization itself. It should reflect the
join operation.
PowerShell
OutputGet-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest  | 
Format-List
AddedByTenantId      : &lt;OwnerTenantId&gt;
Id                   : &lt;MtoJoinRequestIdB&gt;
MemberState          : active
Role                 : member
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationJoinRequestTransitionDetails
AdditionalProperties : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt;
iTenantOrganization/joinRequest/$entity]}
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant  | Format-
List
AddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 8:05:25 PM
DeletedDateTime      :
DisplayName          : Berlin
Id                   : &lt;MtoJoinRequestIdB&gt;
JoinedDateTime       : 1/8/2024 9:53:55 PM
Role                 : member
State                : active
TenantId             : &lt;MemberTenantIdB&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
AddedByTenantId      : &lt;OwnerTenantId&gt;
AddedDateTime        : 1/8/2024 7:47:45 PM
DeletedDateTime      :
DisplayName          : Cairo
Id                   : &lt;Id&gt;
JoinedDateTime       :&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hour s before joining a
multitenant organization is completed.
Member t enant
You can leave a multitenant organization that you have joined. The process for removing
your own tenant from the multitenant organization is the same as the process for
removing another tenant from the multitenant organization.
If your tenant is the only multitenant organization owner, you must designate a new
tenant to be the multitenant organization owner. For steps, see Step 4: (Optional)
Change the role of a tenant .
In the tenant, use the Remove-
MgBetaT enantR elationshipMultiT enantOrganizationT enant  command to
remove the tenant. This operation takes a few minutes.
PowerShellRole                 : owner
State                : active
TenantId             : &lt;OwnerTenantId&gt;
TransitionDetails    :&lt;br&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
Step 8: (Optional) Leave the multitenant
organization
PowerShell
Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  &lt;MemberTenantId&gt;
Step 9: (Optional) Delete the multitenant
organization&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Owner t enant
You delete a multitenant organization by removing all tenants. The process for removing
the final owner tenant is the same as the process for removing all other member
tenants.
In the final owner tenant, use the Remove-
MgBetaT enantR elationshipMultiT enantOrganizationT enant  command to
remove the tenant. This operation takes a few minutes.
PowerShell
Set up a multitenant org in Microsoft 365
Synchronize users in multitenant organizations in Microsoft 365
The new Microsoft T eams desktop client
Configure multitenant organization templates using the Microsoft Graph APIPowerShell
Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant  -
MultiTenantOrganizationMemberId  $OwnerTenantId
Next steps&lt;/p&gt;
&lt;p&gt;Configure mu ltitenant organization
policy templates using the Microsoft
Graph API
Article •04/24/2024
This article describes how to configure a policy template for your multitenant
organization.
For license information, see License requirements .
Security Administrator  role to configure cross-tenant access settings and templates
for the multitenant organization.
Global Administrator  role to consent to required permissions.
The cross-tenant access partner configuration  handles trust settings and automatic user
consent settings between partner tenants. For example, you can use these settings to
trust multifactor authentication claims for inbound users from the target partner tenant.
With the template in an unconfigured state, partner configurations for partner tenants in
the multitenant organization won&amp;#39;t be amended, with all trust settings passed through
from default settings. However, if you configure the template, then partner
configurations will be amended corresponding to the policy template.
To specify which trust settings and automatic user consent settings to apply to your
policy template, use the Update multiT enantOrganizationP artnerConfigurationT emplate
API. If you create or join a multitenant organization using the Microsoft 365 admin
center, this configuration is handled automatically.
Request
HTTPPrerequisites
Cross-tenant access policy partner template
Configure inbound and outbound automatic redemption
PATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationPartnerConfiguration&lt;/p&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude
existing partners, set the templateApplicationLevel parameter to new partners only.
Request
HTTP
To disable the template completely, set the templateApplicationLevel parameter to null.
Request
HTTP{
    &amp;quot;inboundTrust&amp;quot; : {
        &amp;quot;isMfaAccepted&amp;quot; : true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot; : true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot; : true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot; : {
        &amp;quot;inboundAllowed&amp;quot; : true,
        &amp;quot;outboundAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;newPartners,existingPartners&amp;quot;
}
Disable the template for existing partners
PATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationPartnerConfiguration
{
    &amp;quot;inboundTrust&amp;quot; : {
        &amp;quot;isMfaAccepted&amp;quot; : true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot; : true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot; : true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot; : {
        &amp;quot;inboundAllowed&amp;quot; : true,
        &amp;quot;outboundAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;newPartners&amp;quot;
}
Disable the template completely&lt;/p&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent),
use the multiT enantOrganizationP artnerConfigurationT emplate: resetT oDefaultSettings
API.
HTTP
The identity synchronization policy governs cross-tenant synchronization , which allows
you to share users and groups across tenants in your organization. Y ou can use these
settings to allow inbound user synchronization. With the template in an unconfigured
state, the identity synchronization policy for partner tenants in the multitenant
organization won&amp;#39;t be amended. However, if you configure the template, then the
identity synchronization policy will be amended corresponding to the policy template.
To allow inbound user synchronization in the policy template, use the Update
multiT enantOrganizationIdentityS yncPolicyT emplate  API. If you create or join aPATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationPartnerConfiguration
{
    &amp;quot;inboundTrust&amp;quot; : {
        &amp;quot;isMfaAccepted&amp;quot; : true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot; : true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot; : true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot; : {
        &amp;quot;inboundAllowed&amp;quot; : true,
        &amp;quot;outboundAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;&amp;quot;
}
Reset the template
POST 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings
Cross-tenant synchronization template
Configure inbound user synchronization&lt;/p&gt;
&lt;p&gt;multitenant organization using the Microsoft 365 admin center, this configuration is
handled automatically.
Request
HTTP
To apply this template only to new multitenant organization members and exclude
existing partners, set the templateApplicationLevel parameter to new partners only.
Request
HTTP
To disable the template completely, set the templateApplicationLevel parameter to null.
Request
HTTPPATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationIdentitySynchronization
{
    &amp;quot;userSyncInbound&amp;quot; : {
        &amp;quot;isSyncAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;newPartners,existingPartners&amp;quot;
}
Disable the template for existing partners
PATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationIdentitySynchronization
{
    &amp;quot;userSyncInbound&amp;quot; : {
        &amp;quot;isSyncAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;newPartners&amp;quot;
}
Disable the template completely&lt;/p&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the
multiT enantOrganizationIdentityS yncPolicyT emplate: resetT oDefaultSettings  API.
Request
HTTP
Configure cross-tenant synchronizationPATCH 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationIdentitySynchronization
{
    &amp;quot;userSyncInbound&amp;quot; : {
        &amp;quot;isSyncAllowed&amp;quot; : true
    },
    &amp;quot;templateApplicationLevel&amp;quot; : &amp;quot;&amp;quot;
}
Reset the template
POST 
&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt;
multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings
Next steps&lt;/p&gt;
&lt;p&gt;Configure cross-tenant synchronization
Article •03/11/2024
This article describes the steps to configure cross-tenant synchronization using the
Microsoft Entra admin center. When configured, Microsoft Entra ID automatically
provisions and de-provisions B2B users in your target tenant. For important details on
what this service does, how it works, and frequently asked questions, see Automate user
provisioning and deprovisioning to SaaS applications with Microsoft Entra ID .
By the end of this article, you&amp;#39;ll be able to:
Create B2B users in your target tenant
Remove B2B users in your target tenant
Keep user attributes synchronized between your source and target tenants
Sour ce tenant

Learning objectives
Prerequisites&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID P1 or P2 license. For more information, see License
requirements .
Security Administrator  role to configure cross-tenant access settings.
Hybrid Identity Administrator  role to configure cross-tenant synchronization.
Cloud Application Administrator  or Application Administrator  role to assign users
to a configuration and to delete a configuration.
Target t enant
Microsoft Entra ID P1 or P2 license. For more information, see License
requirements .
Security Administrator  role to configure cross-tenant access settings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Define how you would like to structure the tenants in your organization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn about how the provisioning service works .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine who will be in scope for provisioning .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine what data to map between tenants .
Target t enant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center  of the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant access settings .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings  tab, select Add or ganization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the source tenant by typing the tenant ID or domain name and selecting Add.Step 1: Plan your provisioning deployment
Step 2: Enable user synchronization in the
target tenant
 Tip
Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Inbound access  of the added organization, select Inherit ed fr om default .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Cross-t enant sync  tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Allow user s sync int o this t enant  check box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see an Enable cr oss-t enant sync and aut o-redemption  dialog box asking if
you want to enable auto-redemption, select Yes.
Selecting Yes will automatically redeem invitations in the target tenant.

&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Target t enant
In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t
have to accept the consent prompt. This setting must be checked in both the source
tenant (outbound) and target tenant (inbound). For more information, see Automatic
redemption setting .&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, on the same Inbound access settings  page, select the Trust
settings  tab.&lt;/li&gt;
&lt;li&gt;Check the Automatically r edeem invitations with the t enant  &lt;tenant&gt; check box.
This box might already be checked if you previously selected Yes in the Enable
cross-t enant sync and aut o-redemption  dialog box.&lt;/li&gt;
&lt;li&gt;Select Save.

Step 3: Automatically redeem invitations in the
target tenant
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sour ce tenant
In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center  of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant access settings .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings  tab, select Add or ganization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Outbound access  for the target organization, select Inherit ed fr om default .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Trust settings  tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically r edeem invitations with the t enant  &lt;tenant&gt; check box.Step 4: Automatically redeem invitations in the
source tenant
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.
Sour ce tenant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant
synchr onization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, select New configuration .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a name for the configuration and select Create.
It can take up to 15 seconds for the configuration that you just created to appear
in the list.
Sour ce tenant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, you should see your new configuration. If not, in the
configuration list, select your configuration.

Step 5: Create a configuration in the source
tenant
Step 6: Test the connection to the target tenant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Get star ted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the Provisioning Mode  to Automatic .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the Admin Cr edentials  section, change the Authentication Method  to
Cross T enant S ynchr onization P olicy .

&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Tenant Id  box, enter the tenant ID of the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Test Connection  to test the connection.
You should see a message that the supplied credentials are authorized to enable
provisioning. If the test connection fails, see Troubleshooting tips  later in this
article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.
Mappings and Settings sections appear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Close the Provisioning  page.
Sour ce tenant
The Microsoft Entra provisioning service allows you to define who will be provisioned in
one or both of the following ways:
Based on assignment to the configuration
Based on attributes of the user
Start small. T est with a small set of users before rolling out to everyone. When the scope
for provisioning is set to assigned users and groups, you can control it by assigning one
or two users to the configuration. Y ou can further refine who is in scope for provisioning
by creating attribute-based scoping filters, described in the next step .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, select Provisioning  and expand the Settings  section.

Step 7: Define who is in scope for provisioning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Scope  list, select whether to synchronize all users in the source tenant or
only users assigned to the configuration.
It&amp;#39;s recommended that you select Sync only assigned user s and gr oups  instead of
Sync all user s and gr oups . Reducing the number of users in scope improves
performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you made any changes, select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the configuration page, select Users and gr oups .
For cross-tenant synchronization to work, at least one internal user must be
assigned to the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Add user/gr oup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Add Assignment  page, under Users and gr oups , select None Select ed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Users and gr oups  pane, search for and select one or more internal users or
groups you want to assign to the configuration.
If you select a group to assign to the configuration, only users that are direct
members in the group will be in scope for provisioning. Y ou can select a static
group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Select .
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Assign .
For more information, see Assign users and groups to an application .
Sour ce tenant
Regardless of the value you selected for Scope  in the previous step, you can further limit
which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, select Provisioning  and expand the Mappings  section.

Step 8: (Optional) Define who is in scope for
provisioning with scoping filters&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Micr osoft Entra ID User s to open the Attribut e Mapping  page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Sour ce Object Scope , select All records.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Sour ce Object Scope  page, select Add scoping filt er.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add any scoping filters to define which users are in scope for provisioning.

&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To configure scoping filters, refer to the instructions provided in Scoping users or
groups to be provisioned with scoping filters .
6. Select Ok and Save to save any changes.
If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all
assigned users and groups being resynchronized. This may take a long time
depending on the size of your directory.
7. Select Yes and close the Attribut e Mapping  page.
Sour ce tenant
Attribute mappings allow you to define how data should flow between the source
tenant and target tenant. For information on how to customize the default attribute
mappings, see Tutorial - Customize user provisioning attribute-mappings for SaaS
applications in Microsoft Entra ID .&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning  and expand the Mappings  section.&lt;/li&gt;
&lt;li&gt;Select Provision Micr osoft Entra ID User s.&lt;/li&gt;
&lt;li&gt;On the Attribut e Mapping  page, scroll down to review the user attributes that are
synchronized between tenants in the Attribut e Mappings  section.

Step 9: Review attribute mappings&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first attribute, alternativeSecurityIdentifier, is an internal attribute used to
uniquely identify the user across tenants, match users in the source tenant with
existing users in the target tenant, and ensure that each user only has one account.
The matching attribute cannot be changed. Attempting to change the matching
attribute or adding additional matching attributes will result in a schemaInvalid
error.
4. Select the Member (userT ype) attribute to open the Edit A ttribut e page.
5. Review the Constant V alue setting for the userT ype attribute.
This setting defines the type of user that will be created in the target tenant and
can be one of the values in the following table. By default, users will be created as
external member (B2B collaboration users). For more information, see Properties of
a Microsoft Entra B2B collaboration user .
Constant
ValueDescr iption
Member Default. Users will be created as external member (B2B collaboration users) in
the target tenant. Users will be able to function as any internal member of
the target tenant.
Guest Users will be created as external guests (B2B collaboration users) in the
target tenant.

ﾉExpand table&lt;/p&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services (but
aren&amp;#39;t limited to):
App or
serviceLimitations
Power BI - Support for UserT ype Member in P ower BI is currently in preview. For
more information, see Distribute P ower BI content to external guest users
with Microsoft Entra B2B .
Azure Virtual
Desktop- External member and external guest aren&amp;#39;t supported in Azure Virtual
Desktop.
6. If you want to define any transformations, on the Attribut e Mapping  page, select
the attribute you want to transform, such as displayName .７ Note
If the B2B user already exists in the target tenant then Member (userT ype) will
not changed to Member , unless the Apply this mapping  setting is set to
Always .
ﾉExpand table
&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;Set the Mapping type  to Expression .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Expression  box, enter the transformation expression. For example with the
display name, you can do the following:
Flip the first name and last name and add a comma in between.
Add the domain name in parentheses at the end of the display name.
For examples, see Reference for writing expressions for attribute mappings in
Microsoft Entra ID .
Sour ce tenant

 Tip
You can map directory extensions by updating the schema of the cross-tenant
synchronization. For more information, see Map dir ectory ext ensions in cr oss-
tenant synchr onization .
Step 10: Specify additional provisioning
setting s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, select Provisioning  and expand the Settings  section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Send an email notification when a failur e occur s check box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Notification Email  box, enter the email address of a person or group who
should receive provisioning error notifications.
Email notifications are sent within 24 hours of the job entering quarantine state.
For custom alerts, see Understand how provisioning integrates with Azure Monitor
logs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To prevent accidental deletion, select Prevent accidental deletion  and specify a
threshold value. By default, the threshold is set to 500.
For more information, see Enable accidental deletions prevention in the Microsoft
Entra provisioning service .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save to save any changes.
Sour ce tenant

Step 11: Test provision on demand&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of
your users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant
synchr onization .&lt;/li&gt;
&lt;li&gt;Select Configurations  and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select Provision on demand .&lt;/li&gt;
&lt;li&gt;In the Select a user or gr oup box, search for and select one of your test users.&lt;/li&gt;
&lt;li&gt;Select Provision .
After a few moments, the Perform action  page appears with information about the
provisioning of the test user in the target tenant.
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why test user
was skipped.
On the Provision on demand  page, you can view details about the provision and
have the option to retry.

&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;In the target tenant, verify that the test user was provisioned.&lt;/li&gt;
&lt;li&gt;If all is working as expected, assign additional users to the configuration.
For more information, see On-demand provisioning in Microsoft Entra ID .


Step 12: Start the provisioning job&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sour ce tenant
The provisioning job starts the initial synchronization cycle of all users defined in Scope
of the Settings  section. The initial cycle takes longer to perform than subsequent cycles,
which occur approximately every 40 minutes as long as the Microsoft Entra provisioning
service is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant
synchr onization .&lt;/li&gt;
&lt;li&gt;Select Configurations  and then select your configuration.&lt;/li&gt;
&lt;li&gt;On the Overview  page, review the provisioning details.&lt;/li&gt;
&lt;li&gt;Select Start provisioning  to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sour ce and tar get t enants
Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, on the Overview  page, check the progress bar to see the
status of the provisioning cycle and how close it&amp;#39;s to completion. For more
information, see Check the status of user provisioning .

Step 13: Monitor provisioning&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If provisioning seems to be in an unhealthy state, the configuration will go into
quarantine. For more information, see Application provisioning in quarantine
status .
2. Select Provisioning logs  to determine which users have been provisioned
successfully or unsuccessfully. By default, the logs are filtered by the service
principal ID of the configuration. For more information, see Provisioning logs in
Microsoft Entra ID .
3. Select Audit logs  to view all logged events in Microsoft Entra ID. For more
information, see Audit logs in Microsoft Entra ID .

&lt;/p&gt;
&lt;p&gt;You can also view audit logs in the target tenant.
4. In the target tenant, select Users &amp;gt; Audit logs  to view logged events for user
management.
Target t enant
Even though users are being provisioned in the target tenant, they still might be able to
remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be
provisioned again during the next provisioning cycle. If you want to disallow the ability
for users to remove themselves from your organization, you must configure the External
user leav e settings .&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, browse to Identity  &amp;gt; External Identities  &amp;gt; External
collaboration settings .&lt;/li&gt;
&lt;li&gt;Under External user leav e settings , choose whether to allow external users to
leave your organization themselves.


Step 14: Configure leave setting s&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting also applies to B2B collaboration and B2B direct connect, so if you set
External user leav e settings  to No, B2B collaboration users and B2B direct connect users
can&amp;#39;t leave your organization themselves. For more information, see Leave an
organization as an external user .
Follows these steps to delete a configuration on the Configurations  page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant
synchr onization .&lt;/li&gt;
&lt;li&gt;On the Configurations  page, add a check mark next to the configuration you want
to delete.&lt;/li&gt;
&lt;li&gt;Select Delet e and then OK to delete the configuration.
When configuring cross-tenant synchronization in the source tenant and you test the
connection, it fails with the following error message:Troubleshooting tips
Delete a configuration

Symptom - Test connection fails with
AzureDirectoryB2BManagementPolicyCheckFailure
You appear to have entered invalid credentials. Please confirm you are using&lt;br&gt;the correct information for an administrative account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cause
This error indicates the policy to automatically redeem invitations in both the source and
target tenants wasn&amp;#39;t set up.
Solution
Follow the steps in Step 3: Automatically redeem invitations in the target tenant  and
Step 4: Automatically redeem invitations in the source tenant .
When configuring cross-tenant synchronization, the Automatic r edemption  check box
is disabled.Error code: AzureDirectoryB2BManagementPolicyCheckFailure
Details: Policy permitting auto-redemption of invitations not configured.

Symptom - Automatic redemption check box is disabled&lt;/p&gt;
&lt;p&gt;Cause
Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.
Solution
You must have Microsoft Entra ID P1 or P2 to configure trust settings.
After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored
during the next synchronization cycle. If you try to soft delete a user with on-demand
provisioning and then restore the user, it can result in duplicate users.
Cause
Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.
Solution
Manually restore the soft-deleted user in the target tenant. For more information, see
Restore or remove a recently deleted user using Microsoft Entra ID .

Symptom - Recently deleted user in the target tenant is not
restored
Symptom - Users are skipped because SMS sign-in is enabled on
the user&lt;/p&gt;
&lt;p&gt;Users are skipped from synchronization. The scoping step includes the following filter
with status false: &amp;quot;Filter external users.alternativeSecurityIds EQU ALS &amp;#39;None&amp;#39;&amp;quot;
Cause
If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.
Solution
Disable SMS Sign-in for the users. The script below shows how you can disable SMS
Sign-in using P owerShell.
PowerShell&lt;/p&gt;
&lt;h5&gt;Disable SMS Sign-in options for the users&lt;/h5&gt;
&lt;h4&gt;Import module&lt;/h4&gt;
&lt;p&gt;Install-Module  Microsoft.Graph.Users.Actions
Install-Module  Microsoft.Graph.Identity.SignIns
Import-Module  Microsoft.Graph.Users.Actions
Connect-MgGraph  -Scopes  &amp;quot;User.Read.All&amp;quot; , &amp;quot;Group.ReadWrite.All&amp;quot; , 
&amp;quot;UserAuthenticationMethod.Read.All&amp;quot; ,&amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot; ,&amp;quot;Us
erAuthenticationMethod.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h5&gt;The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-&lt;/h5&gt;
&lt;p&gt;87b9720928f7
$phoneAuthenticationMethodId  = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;&lt;/p&gt;
&lt;h4&gt;Get the User Details&lt;/h4&gt;
&lt;p&gt;$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;&lt;/p&gt;
&lt;h4&gt;validate the value for SmsSignInState&lt;/h4&gt;
&lt;p&gt;$smssignin  = Get-MgUserAuthenticationPhoneMethod  -UserId  $userId
{
    if($smssignin .SmsSignInState  -eq &amp;quot;ready&amp;quot;){&lt;br&gt;      #### Disable Sms Sign-In for the user is set to ready&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  Disable-MgUserAuthenticationPhoneMethodSmsSignIn  -UserId  $userId -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PhoneAuthenticationMethodId  $phoneAuthenticationMethodId
      Write-Host  &amp;quot;SMS sign-in disabled for the user&amp;quot;  -ForegroundColor  Green
    }
    else{
    Write-Host  &amp;quot;SMS sign-in status not set or found for the user &amp;quot;  -
ForegroundColor  Yellow
    }
}&lt;/p&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error
message:
Cause
This error indicates the Guest invite settings in the target tenant are configured with the
most restrictive setting: &amp;quot;No one in the organization can invite guest users including
admins (most restrictive)&amp;quot;.
Solution
Change the Guest invite settings in the target tenant to a less restrictive setting. For
more information, see Configure external collaboration settings .
Tutorial: R eporting on automatic user account provisioning
Managing user account provisioning for enterprise apps in the Azure portal
What is single sign-on in Microsoft Entra ID?##### End the script
Symptom - Users fail to provision with error
&amp;quot;AzureActiveDirectoryForbidden&amp;quot;
Guest invitations not allowed for your company. Contact your company&lt;br&gt;administrator for more details.
Next steps&lt;/p&gt;
&lt;p&gt;Configure cross-tenant synchronization
using PowerShell or Microsoft Graph
API
Article •04/23/2024
This article describes the key steps to configure cross-tenant synchronization using
Microsoft Graph P owerShell or Microsoft Graph API. When configured, Microsoft Entra
ID automatically provisions and de-provisions B2B users in your target tenant. For
detailed steps using the Microsoft Entra admin center, see Configure cross-tenant
synchronization .
Sour ce tenant
Microsoft Entra ID P1 or P2 license. For more information, see License
requirements .
Security Administrator  role to configure cross-tenant access settings.
Hybrid Identity Administrator  role to configure cross-tenant synchronization.

Prerequisites&lt;/p&gt;
&lt;p&gt;Cloud Application Administrator  or Application Administrator  role to assign users
to a configuration and to delete a configuration.
Global Administrator  role to consent to required permissions.
Target t enant
Microsoft Entra ID P1 or P2 license. For more information, see License
requirements .
Security Administrator  role to configure cross-tenant access settings.
Global Administrator  role to consent to required permissions.
Target t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start P owerShell.&lt;/li&gt;
&lt;li&gt;If necessary, install the Microsoft Graph P owerShell SDK .&lt;/li&gt;
&lt;li&gt;Get the tenant ID of the source and target tenants and initialize variables.
PowerShell&lt;/li&gt;
&lt;li&gt;Use the Connect-MgGraph  command to sign in to the target tenant and
consent to the following required permissions.
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
PowerShellStep 1: Sign in to the target tenant
PowerShell
$SourceTenantId  = &amp;quot;&lt;SourceTenantId&gt;&amp;quot;
$TargetTenantId  = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;
Connect-MgGraph  -TenantId  $TargetTenantId  -Scopes&lt;br&gt;&amp;quot;Policy.Read.All&amp;quot; ,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Target t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, use the New-MgP olicyCrossT enantAccessP olicyP artner
command to create a new partner configuration in a cross-tenant access
policy between the target tenant and the source tenant. Use the source tenant
ID in the request.
If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create:
Another object with the same value for property tenantId already exists,
you might already have an existing configuration. For more information, see
Symptom - New-MgP olicyCrossT enantAccessP olicyP artner_Create error .
PowerShell
OutputStep 2: Enable user synchronization in the
target tenant
PowerShell
$Params = @{
 TenantId = $SourceTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner  -BodyParameter  $Params | 
Format-List
AutomaticUserConsentSettings :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPoli
cyConfiguration
B2BCollaborationInbound      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BCollaborationOutbound     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BDirectConnectInbound      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BDirectConnectOutbound     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
IdentitySynchronization      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Invoke-MgGraphR equest  command to enable user synchronization in
the target tenant.
If you get an Request_MultipleObjectsWithSameKeyValue error, you might
already have an existing policy. For more information, see Symptom -
Request_MultipleObjectsWithSameK eyValue error .
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgP olicyCrossT enantAccessP olicyP artnerIdentityS ynchronization
command to verify IsSyncAllowed is set to T rue.
PowerShell
OutputSyncPolicyPartner
InboundTrust                 :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyInboundTrust
IsServiceProvider            :
TenantId                     : &lt;SourceTenantId&gt;
TenantRestrictions           :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyTenantRestrictions
AdditionalProperties         : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&lt;/a&gt;
ssPolicy/partners/$entity],
                        [crossCloudMeetingConfiguration,&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;System.Collections.Generic.Dictionary`2[System.String,System.Object
]], [protectedContentSharing,&lt;/p&gt;
&lt;p&gt;System.Collections.Generic.Dictionary`2[System.String,System.Object
]]}
$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest  -Method  PUT -Uri 
&amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/&lt;/a&gt;
partners/ $SourceTenantId /identitySynchronization&amp;quot;  -Body $Params
(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;br&gt;-CrossTenantAccessPolicyConfigurationPartnerTenantId&lt;br&gt;$SourceTenantId ).UserSyncInbound&lt;/p&gt;
&lt;p&gt;Target t enant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the Update-MgP olicyCrossT enantAccessP olicyP artner
command to automatically redeem invitations and suppress consent prompts
for inbound access.
PowerShell
Sour ce tenant&lt;/li&gt;
&lt;li&gt;Start an instance of P owerShell.&lt;/li&gt;
&lt;li&gt;Get the tenant ID of the source and target tenants and initialize variables.IsSyncAllowed&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;True
Step 3: Automatically redeem invitations in the
target tenant
PowerShell
$AutomaticUserConsentSettings  = @{
    &amp;quot;InboundAllowed&amp;quot; =&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner  -
CrossTenantAccessPolicyConfigurationPartnerTenantId  $SourceTenantId&lt;br&gt;-AutomaticUserConsentSettings  $AutomaticUserConsentSettings
Step 4: Sign in to the source tenant
PowerShell&lt;/p&gt;
&lt;p&gt;PowerShell
3. Use the Connect-MgGraph  command to sign in to the source tenant and
consent to the following required permissions.
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Application.ReadWrite.All
Directory.ReadWrite.All
AuditLog.Read.All
PowerShell
Sour ce tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgP olicyCrossT enantAccessP olicyP artner
command to create a new partner configuration in a cross-tenant access
policy between the source tenant and the target tenant. Use the target tenant
ID in the request.
If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create:
Another object with the same value for property tenantId already exists,
you might already have an existing configuration. For more information, see
Symptom - New-MgP olicyCrossT enantAccessP olicyP artner_Create error .
PowerShell$SourceTenantId  = &amp;quot;&lt;SourceTenantId&gt;&amp;quot;
$TargetTenantId  = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;
Connect-MgGraph  -TenantId  $SourceTenantId  -Scopes&lt;br&gt;&amp;quot;Policy.Read.All&amp;quot; ,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot; ,&amp;quot;Application
.ReadWrite.All&amp;quot; ,&amp;quot;Directory.ReadWrite.All&amp;quot; ,&amp;quot;AuditLog.Read.All&amp;quot;
Step 5: Automatically redeem invitations in the
source tenant
PowerShell&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Output
2. Use the Update-MgP olicyCrossT enantAccessP olicyP artner  command to
automatically redeem invitations and suppress consent prompts for outbound
access.$Params = @{
    TenantId = $TargetTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner  -BodyParameter  $Params | 
Format-List
AutomaticUserConsentSettings :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPoli
cyConfiguration
B2BCollaborationInbound      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BCollaborationOutbound     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BDirectConnectInbound      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
B2BDirectConnectOutbound     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyB2BSetting
IdentitySynchronization      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity
SyncPolicyPartner
InboundTrust                 :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyInboundTrust
IsServiceProvider            :
TenantId                     : &lt;TargetTenantId&gt;
TenantRestrictions           :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo
licyTenantRestrictions
AdditionalProperties         : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&lt;/a&gt;
ssPolicy/partners/$entity],
                               [crossCloudMeetingConfiguration,&lt;/p&gt;
&lt;p&gt;System.Collections.Generic.Dictionary`2[System.String,System.Object
]], [protectedContentSharing,&lt;/p&gt;
&lt;p&gt;System.Collections.Generic.Dictionary`2[System.String,System.Object
]]}&lt;/p&gt;
&lt;p&gt;PowerShell
Sour ce tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, use the Invoke-MgInstantiateApplicationT emplate
command to add an instance of a configuration application from the
Microsoft Entra application gallery into your tenant.
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgServicePrincipal  command to get the service principal ID and
app role ID.
PowerShell
Output$AutomaticUserConsentSettings  = @{
 &amp;quot;OutboundAllowed&amp;quot; =&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner  -
CrossTenantAccessPolicyConfigurationPartnerTenantId  $TargetTenantId&lt;br&gt;-AutomaticUserConsentSettings  $AutomaticUserConsentSettings
Step 6: Create a configuration application in
the source tenant
PowerShell
Invoke-MgInstantiateApplicationTemplate  -ApplicationTemplateId&lt;br&gt;&amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot;  -DisplayName  &amp;quot;Fabrikam&amp;quot;
Get-MgServicePrincipal  -Filter  &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot;  | 
Format-List
AccountEnabled                      : True
AddIns                              : {}
AlternativeNames                    : {}
AppDescription                      :
AppDisplayName                      : Fabrikam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize a variable for the service principal ID.
Be sure to use the service principal ID instead of the application ID.
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize a variable for the app role ID.
PowerShellAppId                               : &lt;AppId&gt;
AppManagementPolicies               :
AppOwnerOrganizationId              : &lt;AppOwnerOrganizationId&gt;
AppRoleAssignedTo                   :
AppRoleAssignmentRequired           : True
AppRoleAssignments                  :
AppRoles                            : {&lt;AppRoleId&gt;}
ApplicationTemplateId               : 518e5f48-1fc8-4c48-9387-
9fdf28b0dfe7
ClaimsMappingPolicies               :
CreatedObjects                      :
CustomSecurityAttributes            :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttri
buteValue
DelegatedPermissionClassifications  :
DeletedDateTime                     :
Description                         :
DisabledByMicrosoftStatus           :
DisplayName                         : Fabrikam
Endpoints                           :
ErrorUrl                            :
FederatedIdentityCredentials        :
HomeRealmDiscoveryPolicies          :
Homepage                            :&lt;br&gt;&lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/d&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/d&lt;/a&gt;
efault.aspx?metadata=aad2aadsync|ISV9.1|primary|z
Id                                  : &lt;ServicePrincipalId&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Info                                :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl
KeyCredentials                      : {}
LicenseDetails                      :
...
$ServicePrincipalId  = &amp;quot;&lt;ServicePrincipalId&gt;&amp;quot;
$AppRoleId = &amp;quot;&lt;AppRoleId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Sour ce tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphR equest  command to test the
connection to the target tenant and validate the credentials.
PowerShell
Sour ce tenant
In the source tenant, to enable provisioning, create a provisioning job.&lt;/li&gt;
&lt;li&gt;Determine the synchronization template to use, such as Azure2Azure.Step 7: Test the connection to the target tenant
PowerShell
$Params = @{
 &amp;quot;useSavedCredentials&amp;quot;  = $false
 &amp;quot;templateId&amp;quot;  = &amp;quot;Azure2Azure&amp;quot;
 &amp;quot;credentials&amp;quot;  = @(
 @{
     &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
     &amp;quot;value&amp;quot; = $TargetTenantId
 }
 @{
     &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
     &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
 }
 )
}
Invoke-MgGraphRequest  -Method  POST -Uri 
&amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/servicePrincipals/&quot;&gt;https://graph.microsoft.com/v1.0/servicePrincipals/&lt;/a&gt; $ServicePrincip
alId/synchronization/jobs/validateCredentials&amp;quot;  -Body $Params
Step 8: Create a provisioning job in the source
tenant
PowerShell&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A template has pre-configured synchronization settings.
2. In the source tenant, use the New-MgServicePrincipalS ynchronizationJob
command to create a provisioning job based on a template.
PowerShell
Output
3. Initialize a variable for the job ID.
PowerShell
Sour ce tenantNew-MgServicePrincipalSynchronizationJob  -ServicePrincipalId&lt;br&gt;$ServicePrincipalId  -TemplateId  &amp;quot;Azure2Azure&amp;quot;  | Format-List
Id                         : &lt;JobId&gt;
Schedule                   :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSche
dule
Schema                     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSche
ma
Status                     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStat
us
SynchronizationJobSettings : {AzureIngestionAttributeOptimization,&lt;br&gt;LookaheadQueryEnabled}
TemplateId                 : Azure2Azure
AdditionalProperties       : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv
icePrincipalId&gt;&amp;#39;)/synchro
                             nization/jobs/$entity]}
$JobId = &amp;quot;&lt;JobId&gt;&amp;quot;
Step 9: Save your credentials
PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphR equest  command to save your
credentials.
PowerShell
Sour ce tenant
For cross-tenant synchronization to work, at least one internal user must be assigned to
the configuration.&lt;/li&gt;
&lt;li&gt;In the source tenant, use the New-MgServicePrincipalAppR oleAssignedT o
command to assign an internal user to the configuration.
PowerShell$Params = @{
 &amp;quot;value&amp;quot; = @(
 @{
     &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
     &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
 }
 @{
     &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
     &amp;quot;value&amp;quot; = $TargetTenantId
 }
 )
}
Invoke-MgGraphRequest  -Method  PUT -Uri 
&amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/servicePrincipals/&quot;&gt;https://graph.microsoft.com/v1.0/servicePrincipals/&lt;/a&gt; $ServicePrincip
alId/synchronization/secrets&amp;quot;  -Body $Params
Step 10: Assign a user to the configuration
PowerShell
$Params = @{
 PrincipalId = &amp;quot;&lt;PrincipalId&gt;&amp;quot;
 ResourceId = $ServicePrincipalId
 AppRoleId = $AppRoleId
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Output
Sour ce tenant
Now that you have a configuration, you can test on-demand provisioning with one of
your users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Get-
MgServicePrincipalS ynchronizationJobSchema  command to get the schema
rule ID.
PowerShell
OutputNew-MgServicePrincipalAppRoleAssignedTo  -ServicePrincipalId&lt;br&gt;$ServicePrincipalId  -BodyParameter  $Params | Format-List
AppRoleId            : &lt;AppRoleId&gt;
CreatedDateTime      : 7/31/2023 10:27:12 PM
DeletedDateTime      :
Id                   : &lt;Id&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PrincipalDisplayName : User1
PrincipalId          : &lt;PrincipalId&gt;
PrincipalType        : User
ResourceDisplayName  : Fabrikam
ResourceId           : &lt;ServicePrincipalId&gt;
AdditionalProperties : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&lt;/a&gt;
ty]}
Step 11: Test provision on demand
PowerShell
$SynchronizationSchema  = Get-
MgServicePrincipalSynchronizationJobSchema  -ServicePrincipalId&lt;br&gt;$ServicePrincipalId  -SynchronizationJobId  $JobId
$SynchronizationSchema .SynchronizationRules | Format-List
ContainerFilter      :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphContainerFilter&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Initialize a variable for the rule ID.
PowerShell&lt;/li&gt;
&lt;li&gt;Use the New-MgServicePrincipalS ynchronizationJobOnDemand  command to
provision a test user on demand.
PowerShell
OutputEditable             : True
GroupFilter          :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroupFilter
Id                   : &lt;RuleId&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Metadata             : {defaultSourceObjectMappings,&lt;br&gt;supportsProvisionOnDemand}
Name                 : USER_INBOUND_USER
ObjectMappings       : {Provision Azure Active Directory Users, , ,&lt;br&gt;…}
Priority             : 1
SourceDirectoryName  : Azure Active Directory
TargetDirectoryName  : Azure Active Directory (target tenant)
AdditionalProperties : {}
$RuleId = &amp;quot;&lt;RuleId&gt;&amp;quot;
$Params = @{
    Parameters = @(
        @{
            Subjects = @(
                @{
                    ObjectId = &amp;quot;&lt;UserObjectId&gt;&amp;quot;
                    ObjectTypeName = &amp;quot;User&amp;quot;
                }
            )
            RuleId = $RuleId
        }
    )
}
New-MgServicePrincipalSynchronizationJobOnDemand  -
ServicePrincipalId  $ServicePrincipalId  -SynchronizationJobId  $JobId 
-BodyParameter  $Params | Format-List
Key                  :&lt;br&gt;Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.Statu
sInfo
Value                : [{&amp;quot;provisioningSteps&amp;quot;:
[{&amp;quot;name&amp;quot;:&amp;quot;EntryImport&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Import&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;Success&amp;quot;,&amp;quot;descript
ion&amp;quot;:&amp;quot;Retrieved User&lt;/p&gt;
&lt;p&gt;Sour ce tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is configured, in the source tenant, use the
Start-MgServicePrincipalS ynchronizationJob  command to start the
provisioning job.
PowerShell
Sour ce tenant&lt;/li&gt;
&lt;li&gt;Now that the provisioning job is running, in the source tenant, use the Get-
MgServicePrincipalS ynchronizationJob  command to monitor the progress of
the current provisioning cycle as well as statistics to date such as the number
of users and groups that have been created in the target system.                       &amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; from Azure Active&lt;br&gt;Directory&amp;quot;,&amp;quot;timestamp&amp;quot;:&amp;quot;2023-07-31T22:31:15.9116590Z&amp;quot;,&amp;quot;details&amp;quot;:
{&amp;quot;objectId&amp;quot;:
                &amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;UserObjectId&gt;&amp;quot;,&amp;quot;accountEnabled&amp;quot;:&amp;quot;True&amp;quot;,&amp;quot;displayName&amp;quot;:&amp;quot;User1&amp;quot;,&amp;quot;mail
Nickname&amp;quot;:&amp;quot;user1&amp;quot;,&amp;quot;userPrincipalName&amp;quot;:&amp;quot;use
                       ...
AdditionalProperties : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&lt;/a&gt;
yStringValuePair]}
Step 12: Start the provisioning job
PowerShell
Start-MgServicePrincipalSynchronizationJob  -ServicePrincipalId&lt;br&gt;$ServicePrincipalId  -SynchronizationJobId  $JobId
Step 13: Monitor provisioning
PowerShell&lt;/p&gt;
&lt;p&gt;PowerShell
Output
2. In addition to monitoring the status of the provisioning job, use the Get-
MgAuditLogProvisioning  command to retrieve the provisioning logs and get
all the provisioning events that occur. For example, query for a particular user
and determine if they were successfully provisioned.
PowerShell
OutputGet-MgServicePrincipalSynchronizationJob  -ServicePrincipalId&lt;br&gt;$ServicePrincipalId  -SynchronizationJobId  $JobId | Format-List
Id                         : &lt;JobId&gt;
Schedule                   :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSche
dule
Schema                     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSche
ma
Status                     :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStat
us
SynchronizationJobSettings : {AzureIngestionAttributeOptimization,&lt;br&gt;LookaheadQueryEnabled}
TemplateId                 : Azure2Azure
AdditionalProperties       : {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv
icePrincipalId&gt;&amp;#39;)/synchro
                             nization/jobs/$entity]}
Get-MgAuditLogDirectoryAudit  | Select  -First 10 | Format-List
ActivityDateTime     : 7/31/2023 12:08:17 AM
ActivityDisplayName  : Export
AdditionalDetails    : {Details, ErrorCode, EventName, ipaddr...}
Category             : ProvisioningManagement
CorrelationId        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-
8f9dc271c5ec_L5BFV_161778479
InitiatedBy          :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitia
tor1
LoggedByService      : Account Provisioning
OperationType        :
Result               : success&lt;/p&gt;
&lt;p&gt;ResultReason         : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in&lt;br&gt;Azure Active Directory (target tenant)
TargetResources      : {&lt;ServicePrincipalId&gt;, }
AdditionalProperties : {}
ActivityDateTime     : 7/31/2023 12:08:17 AM
ActivityDisplayName  : Export
AdditionalDetails    : {Details, ErrorCode, EventName, ipaddr...}
Category             : ProvisioningManagement
CorrelationId        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-
8f9dc271c5ec_L5BFV_161778264
InitiatedBy          :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitia
tor1
LoggedByService      : Account Provisioning
OperationType        :
Result               : success
ResultReason         : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in&lt;br&gt;Azure Active Directory (target tenant)
TargetResources      : {&lt;ServicePrincipalId&gt;, }
AdditionalProperties : {}
ActivityDateTime     : 7/31/2023 12:08:14 AM
ActivityDisplayName  : Synchronization rule action
AdditionalDetails    : {Details, ErrorCode, EventName, ipaddr...}
Category             : ProvisioningManagement
CorrelationId        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-
8f9dc271c5ec_L5BFV_161778395
InitiatedBy          :&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitia
tor1
LoggedByService      : Account Provisioning
OperationType        :
Result               : success
ResultReason         : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in&lt;br&gt;Azure Active Directory (target tenant) (User is active and assigned
                       in Azure Active Directory, but no matching&lt;br&gt;User was found in Azure Active Directory (target tenant))
TargetResources      : {&lt;ServicePrincipalId&gt;, }
AdditionalProperties : {}
Troubleshooting tips
PowerShell&lt;/p&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the
following:
Cause
Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent
to one of the required permissions.
Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites  earlier in this
article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you sign in with Connect-MgGraph , make sure you specify the required
scopes. See Step 1: Sign in to the target tenant  and Step 4: Sign in to the
source tenant  earlier in this article.
When you try to create a new partner configuration, you receive an error message
similar to the following:
Cause
You are likely trying to create a configuration or object that already exists, possibly
from a previous configuration.
Solution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.Symptom - Insufficient privileges error
code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
Symptom - New-
MgPolicyCrossTenantAccessPolicyPartner_Create error
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with&lt;br&gt;the same value for property tenantId already exists.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgP olicyCrossT enantAccessP olicyP artner  command to list the
existing object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing object, you might need to make an update using
Update-MgP olicyCrossT enantAccessP olicyP artner
When you try to enable user synchronization, you receive an error message similar
to the following:
Cause
You are likely trying to create a policy that already exists, possibly from a previous
configuration.
Solution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgP olicyCrossT enantAccessP olicyP artnerIdentityS ynchronization
command to list the IsSyncAllowed setting.
PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing policy, you might need to make an update using Set-
MgPolicyCrossT enantAccessP olicyP artnerIdentityS ynchronization  command to
enable user synchronization.Symptom - Request_MultipleObjectsWithSameKeyValue error
Invoke-MgGraphRequest: PUT&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partne&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partne&lt;/a&gt;
rs/&lt;SourceTenantId&gt;/identitySynchronization
HTTP/1.1 409 Conflict
...
{&amp;quot;error&amp;quot;:{&amp;quot;code&amp;quot;:&amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;A&lt;br&gt;conflicting object with one or more of the specified property values is&lt;br&gt;present in the directory.&amp;quot;,&amp;quot;details&amp;quot;:
[{&amp;quot;code&amp;quot;:&amp;quot;ConflictingObjects&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one&lt;br&gt;or more of the specified property values is present in the directory.&amp;quot;,&lt;br&gt;... }}}
(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;br&gt;-CrossTenantAccessPolicyConfigurationPartnerTenantId&lt;br&gt;$SourceTenantId ).UserSyncInbound&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell
Microsoft Entra synchronization API overview
Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization  -
CrossTenantAccessPolicyConfigurationPartnerTenantId  $SourceTenantId&lt;br&gt;-BodyParameter  $Params
Next steps&lt;/p&gt;
&lt;p&gt;Scoping users or groups to be
provisioned with scoping filters
Article •01/18/2024
Learn how to use scoping filters in the Microsoft Entra provisioning service to define
attribute based rules. The rules are used to determine which users or groups are
provisioned.
You use scoping filters to prevent objects in applications that support automated user
provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business
requirements. A scoping filter allows you to include or exclude any users who have an
attribute that matches a specific value. For example, when provisioning users from
Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only
users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.
Scoping filters can be used differently depending on the type of provisioning connector:
Outbound pr ovisioning fr om Micr osoft Entra ID t o SaaS applications . When
Microsoft Entra ID is the source system, user and group assignments  are the most
common method for determining which users are in scope for provisioning. These
assignments also are used for enabling single sign-on and provide a single method
to manage access and provisioning. Scoping filters can be used optionally, in
addition to assignments or instead of them, to filter users based on attribute
values.
Inbound pr ovisioning fr om HCM applications t o Micr osoft Entra ID and Activ e
Directory. When an HCM application such as W orkday  is the source system,
scoping filters are the primary method for determining which users should be
provisioned from the HCM application to Active Directory or Microsoft Entra ID.Scoping filter use cases
 Tip
The more users and groups in scope for provisioning, the longer the
synchronization process can take. Setting the scope to sync assigned users
and groups, limiting the number of groups assigned to the app, and limiting
the size of the groups will reduce the time it takes to synchronize everyone
that is in scope.&lt;/p&gt;
&lt;p&gt;By default, Microsoft Entra provisioning connectors don&amp;#39;t have any attribute-based
scoping filters configured.
A scoping filter consists of one or more claus es. Clauses determine which users are
allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For
example, you might have one clause that requires that a user&amp;#39;s &amp;quot;S tate&amp;quot; attribute equals
&amp;quot;New Y ork&amp;quot;, so only New Y ork users are provisioned into the application.
A single clause defines a single condition for a single attribute value. If multiple clauses
are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The
&amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be
provisioned.
Finally, multiple scoping filters can be created for a single application. If multiple
scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot;
logic means that if all the clauses in any of the configured scoping filters evaluate to
&amp;quot;true&amp;quot;, the user is provisioned.
Each user or group processed by the Microsoft Entra provisioning service is always
evaluated individually against each scoping filter.
As an example, consider the following scoping filter:
According to this scoping filter, users must satisfy the following criteria to be
provisioned:
They must be in New Y ork.Scoping filter construction&lt;/p&gt;
&lt;p&gt;They must work in the Engineering department.
Their company employee ID must be between 1,000,000 and 2,000,000.
Their job title must not be null or empty.
Scoping filters are configured as part of the attribute mappings for each Microsoft Entra
user provisioning connector. The following procedure assumes that you already set up
automatic provisioning for one of the supported applications  and are adding a scoping
filter to it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center  as at least a Application
Administrator .&lt;/li&gt;
&lt;li&gt;Browse to Identity  &amp;gt; Applications  &amp;gt; Enterprise applications  &amp;gt; All applications .&lt;/li&gt;
&lt;li&gt;Select the application for which you have configured automatic provisioning: for
example, &amp;quot;ServiceNow&amp;quot;.&lt;/li&gt;
&lt;li&gt;Select the Provisioning  tab.&lt;/li&gt;
&lt;li&gt;In the Mappings  section, select the mapping that you want to configure a scoping
filter for: for example, &amp;quot;S ynchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/li&gt;
&lt;li&gt;Select the Sour ce object scope  menu.&lt;/li&gt;
&lt;li&gt;Select Add scoping filt er.&lt;/li&gt;
&lt;li&gt;Define a clause by selecting a source Attribut e Name , an Operat or, and an
Attribut e Value to match against. The following operators are supported:
a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.
b. !&amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input
string value.Create scoping filters
Create a scoping filter
 Tip
Steps in this article might vary slightly based on the portal you start from.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;c. ENDS_WITH . Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input
string value.
d. EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string
value exactly (case sensitive).
e. Greater_Than.  Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the
value. The value specified on the scoping filter must be an integer and the
attribute on the user must be an integer [0,1,2,...].
f. Greater_Than_OR_EQU ALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is
greater than or equal to the value. The value specified on the scoping filter must
be an integer and the attribute on the user must be an integer [0,1,2,...].
g. Includes.  Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string
value (case sensitive) as described here.
h. IS FALSE . Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean
value of false.
i. IS NO T NULL . Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.
j. IS NULL . Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.
k. IS TRUE . Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value
of true.
l. NOT EQU ALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the
input string value (case sensitive).
m. NOT REGE X MA TCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t
match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.
n. REGE X MA TCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular
expression pattern. For example: ([1-9][0-9]) matches any number between 10
and 99 (case sensitive).
） Impor tant
The IsMemberOf filter is not supported currently.
The members attribute on a group is not supported currently.
Filtering is not supported for multi-valued attributes.
Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/li&gt;
&lt;li&gt;In Scoping Filt er Title , add a name for your scoping filter.&lt;/li&gt;
&lt;li&gt;Select OK.&lt;/li&gt;
&lt;li&gt;Select OK again on the Scoping Filt ers screen. Optionally, repeat steps 6-11 to add
another scoping filter.&lt;/li&gt;
&lt;li&gt;Select Save on the Attribut e Mapping  screen.
Target A ttribute Operat or Value Descr iption
userPrincipalName REGEX
MATCH.&lt;em&gt;@domain.com All users with userPrincipal that
have the domain @domain.com are in
scope for provisioning.
userPrincipalName NOT REGEX
MATCH.&lt;/em&gt;@domain.com All users with userPrincipal that has
the domain @domain.com are out of
scope for provisioning.
department EQUALS sales All users from the sales department
are in scope for provisioning
workerID REGEX
MATCH(1[0-9][0-9][0-9]
[0-9][0-9][0-9])All employees with workerID
between 1000000 and 2000000 are in
scope for provisioning.
Automate user provisioning and deprovisioning to SaaS applications） Impor tant
Saving a new scoping filter triggers a new full sync for the application, where all
users in the source system are evaluated again against the new scoping filter. If a
user in the application was previously in scope for provisioning, but falls out of
scope, their account is disabled or deprovisioned in the application. T o override this
default behavior, refer to Skip deletion for user accounts that go out o f scope .
Common scoping filters
ﾉExpand table
Related articles&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Customize attribute mappings for user provisioning
Write expressions for attribute mappings
Account provisioning notifications
Use SCIM to enable automatic provisioning of users and groups from Microsoft
Entra ID to applications
List of tutorials on how to integrate SaaS apps&lt;/p&gt;
&lt;p&gt;Enable accidental deletions prevention
in the Microsoft Entra provisioning
service
Article •10/23/2023
The Microsoft Entra provisioning service includes a feature to help avoid accidental
deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application
unexpectedly.
You use accidental deletions to specify a deletion threshold. Anything above the
threshold that you set requires an admin to explicitly allow the processing of the
deletions.
To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center  as at least a Application
Administrator .&lt;/li&gt;
&lt;li&gt;Browse to Identity  &amp;gt; Applications  &amp;gt; Enterprise applications .&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning  and then on the provisioning page select Edit pr ovisioning .&lt;/li&gt;
&lt;li&gt;Under Settings , select the Prevent accidental deletions  check box and specify a
deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the Notification Email  address is completed. If the deletion threshold is
met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select Save to save the changes.
When the deletion threshold is met, the job goes into quarantine, and a notification
email is sent. The quarantined job can then be allowed or rejected. T o learn more about
quarantine behavior, see Application provisioning in quarantine status .
When you encounter an accidental deletion, you see it on the provisioning status page.
It says Provisioning has been quarantined. See quarantine details for more
information.Configure accidental deletion prevention
Recovering from an accidental deletion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can click either Allow delet es or View pr ovisioning logs .
The Allow delet es action deletes the objects that triggered the accidental delete
threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Allow delet es.&lt;/li&gt;
&lt;li&gt;Click Yes on the confirmation to allow the deletions.&lt;/li&gt;
&lt;li&gt;View the confirmation that the deletions were accepted. The status returns to
healthy with the next cycle.
Investigate and reject deletions as necessary:
Investigate the source of the deletions. Y ou can use the provisioning logs for
details.
Prevent the deletion by assigning the user / group to the application (or
configuration) again, restoring the user / group, or updating your provisioning
configuration.
Once you&amp;#39;ve made the necessary changes to prevent the user / group from being
deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the
necessary changes to prevent the users / groups from being deleted.
You can test the feature by triggering disable / deletion events by setting the threshold
to a low number, for example 3, and then changing scoping filters, unassigning users,
and deleting users from the directory (see common scenarios in next section).
Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page.
Check the provisioning job in quarantine and choose to allow the deletions or review
the provisioning logs to understand why the deletions occurred.
Delete a user / put them into the recycle bin.
Block sign in for a user.
Unassign a user or group from the application (or configuration).Allowing deletions
Rejecting deletions
Test deletion prevention
Common deprovisioning scenarios to test&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Feedb ack
Was this p age help ful?Remove a user from a group that&amp;#39;s provides them access to the application (or
configuration).
To learn more about deprovisioning scenarios, see How Application Provisioning W orks.
When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted
against the deletion threshold. Scenarios that could lead to a user being removed from
the target application (or target tenant) could include: unassigning the user from the
application (or configuration) and soft / hard deleting a user in the directory. Groups
evaluated for deletion count towards the deletion threshold. In addition to deletions, the
same functionality also works for disables.
It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during
a single cycle, the “circuit breaker” isn&amp;#39;t triggered. If multiple cycles are needed to reach
a steady state, the deletion threshold is evaluated per cycle.
You can find users that should be disabled / deleted but haven’t due to the deletion
threshold. Navigation to Provisioning logs  and then filter Action  with StagedAction  or
StagedDelet e.
How application provisioning works
Plan an application provisioning deploymentFrequently Asked Questions
What scenarios count toward the deletion threshold?
What is the interval that the deletion threshold is
evaluated on?
How are these deletion events logged?
Next steps
Yes No&lt;/p&gt;
&lt;p&gt;Provide product feedback  |Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;p&gt;On-demand provisioning in Microsoft
Entra ID
Article •10/23/2023
Use on-demand provisioning to provision a user or group in seconds. Among other
things, you can use this capability to:
Troubleshoot configuration issues quickly.
Validate expressions that you&amp;#39;ve defined.
Test scoping filters.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center  as at least a Application
Administrator .&lt;/li&gt;
&lt;li&gt;Browse to Identity  &amp;gt; Applications  &amp;gt; Enterprise applications  &amp;gt; select your
application.&lt;/li&gt;
&lt;li&gt;Select Provisioning .&lt;/li&gt;
&lt;li&gt;Configure provisioning by providing your admin credentials.&lt;/li&gt;
&lt;li&gt;Select Provision on demand .&lt;/li&gt;
&lt;li&gt;Search for a user by first name, last name, display name, user principal name, or
email address. Alternatively, you can search for a group and pick up to five users.&lt;/li&gt;
&lt;li&gt;Select Provision  at the bottom of the page.How to use on-demand provisioning
 Tip
Steps in this article may vary slightly based on the portal you start from.
７ Note
For Cloud HR provisioning app (W orkday / SuccessF actors to Active Directory
/ Microsoft Entra ID), the input value is different. For W orkday scenario, please
provide &amp;quot;W orkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in W orkday. For SuccessF actors
scenario, please provide &amp;quot;personIdExternal&amp;quot; of the user in SuccessF actors.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning
service takes when provisioning a user. There are typically five steps to provision a user.
One or more of those steps, explained in the following sections, are shown during the
on-demand provisioning experience.
The provisioning service attempts to authorize access to the target system by making a
request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that
the service authorized to continue with the provisioning steps. This step is shown only
when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the
step is successful.
Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant
URL, to the target system. The required credentials vary by application. For detailed
configuration tutorials, see the tutorial list .
Make sure that the target system supports filtering on the matching attributes
defined in the Attribut e mappings  pane. Y ou might need to check the API
documentation provided by the application developer to understand the
supported filters.
For S ystem for Cross-domain Identity Management (SCIM) applications, you can
use a tool like P ostman. Such tools help you ensure that the application responds

Understand the provisioning steps
Step 1: Test connection
Troubleshooting tips&lt;/p&gt;
&lt;p&gt;to authorization requests in the way that the Microsoft Entra provisioning service
expects. Have a look at an example request .
Next, the provisioning service retrieves the user from the source system. The user
attributes that the service retrieves are used later to:
Evaluate whether the user is in scope for provisioning.
Check the target system for an existing user.
Determine what user attributes to export to the target system.
The View details  section shows the properties of the user that were imported from the
source system (for example, Microsoft Entra ID).
Importing the user can fail when the matching attribute is missing on the user
object in the source system. T o resolve this failure, try one of these approaches:
Update the user object with a value for the matching attribute.
Change the matching attribute in your provisioning configuration.
If an attribute that you expected is missing from the imported list, ensure that the
attribute has a value on the user object in the source system. The provisioning
service currently doesn&amp;#39;t support provisioning null attributes.
Make sure that the Attribut e mapping  page of your provisioning configuration
contains the attribute that you expect.
Next, the provisioning service determines whether the user is in scope  for provisioning.
The service considers aspects such as:
Whether the user is assigned to the application.
Whether scope is set to Sync assigned  or Sync all .
The scoping filters defined in your provisioning configuration.Step 2: Import user
View details
Troubleshooting tips
Step 3: Determine if user is in scope
View details&lt;/p&gt;
&lt;p&gt;The View details  section shows the scoping conditions that were evaluated. Y ou might
see one or more of the following properties:
Activ e in sour ce syst em indicates that the user has the property IsActive set to
true in Microsoft Entra ID.
Assigned t o application  indicates that the user is assigned to the application in
Microsoft Entra ID.
Scope sync all  indicates that the scope setting allows all users and groups in the
tenant.
User has r equir ed role indicates that the user has the necessary roles to be
provisioned into the application.
Scoping filt ers are also shown if you have defined scoping filters for your
application. The filter is displayed with the following format: {scoping filter title}
{scoping filter attribute} {scoping filter operator} {scoping filter value}.
Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the
Greater_Than operator  with a noninteger value.
If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users
assigned to the default access role .
In this step, the service attempts to match the user that was retrieved in the import step
with a user in the target system.
The View details  page shows the properties of the users that were matched in the target
system. The context pane changes as follows:
If no users are matched in the target system, no properties are shown.
If one user matches in the target system, the properties of that user are shown.
If multiple users match, the properties of both users are shown.
If multiple matching attributes are part of your attribute mappings, each matching
attribute is evaluated sequentially and the matched users for that attribute are
shown.Troubleshooting tips
Step 4: Match user between source and target
View details
Troubleshooting tips&lt;/p&gt;
&lt;p&gt;The provisioning service might not be able to match a user in the source system
uniquely with a user in the target. R esolve this problem by ensuring that the
matching attribute is unique.
Make sure that the target system supports filtering on the attribute that&amp;#39;s defined
as the matching attribute.
Finally, the provisioning service takes an action, such as creating, updating, deleting, or
skipping the user.
Here&amp;#39;s an example of what you might see after the successful on-demand provisioning
of a user:
The View details  section displays the attributes that were modified in the target system.
This display represents the final output of the provisioning service activity and the
attributes that were exported. If this step fails, the attributes displayed represent the
attributes that the provisioning service attempted to modify.
Failures for exporting changes can vary greatly. Check the documentation for
provisioning logs  for common failures.
On-demand provisioning says the group or user can&amp;#39;t be provisioned because
they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a fewStep 5: Perform action

View details
Troubleshooting tips&lt;/p&gt;
&lt;p&gt;minutes between when an object is assigned to an application and when that
assignment is honored in on-demand provisioning. Y ou may need to wait a few
minutes and try again.
Do y ou need t o turn pr ovisioning o ff to use on-demand pr ovisioning?  For
applications that use a long-lived bearer token or a user name and password for
authorization, no more steps are required. Applications that use O Auth for
authorization currently require the provisioning job to be stopped before using
on-demand provisioning. Applications such as G Suite, Box, W orkplace by
Facebook, and Slack fall into this category. W ork is in progress to support on-
demand provisioning for all applications without having to stop provisioning jobs.
How long does on-demand pr ovisioning tak e? On-demand provisioning typically
takes less than 30 seconds.
There are currently a few known limitations to on-demand provisioning. P ost your
suggestions and feedback  so we can better determine what improvements to make
next.
On-demand provisioning of groups supports updating up to five members at a
time. Connectors for cross-tenant synchronization, W orkday, etc. do not support
group provisioning and as a result do not support on-demand provisioning of
groups.
On-demand provisioning supports provisioning one user at a time through the
Microsoft Entra admin center.
Restoring a previously soft-deleted user in the target tenant with on-demand
provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand
provisioning and then restore the user, it can result in duplicate users.
On-demand provisioning of roles isn&amp;#39;t supported.Frequently asked questions
Known limitations
７ Note
The following limitations are specific to the on-demand provisioning capability. For
information about whether an application supports provisioning groups, deletions,
or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;p&gt;Feedb ack
Was this p age help ful?
Provide product feedback  |Get help at Microsoft Q&amp;amp;AOn-demand provisioning supports disabling users that have been unassigned from
the application. However, it doesn&amp;#39;t support disabling or deleting users that have
been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when
you search for a user.
On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly
assigned to the application.
The on-demand provisioning request API can only accept a single group with up to
5 members at a time.
Troubleshooting provisioningNext steps
Yes No&lt;/p&gt;
&lt;p&gt;What are the Microsoft Entra user
provisioning logs?
Article •01/25/2024
Microsoft Entra ID integrates with several third party services to provision users into
your tenant. If you need to troubleshoot an issue with a provisioned user, you can use
the information captured in the Microsoft Entra provisioning logs to help find a solution.
Two other activity logs are also available to help monitor the health of your tenant:
Sign-ins  - Information about sign-ins and how your resources are used by your
users.
Audit  - Information about changes applied to your tenant such as users and group
management or updates applied to your tenant’s resources.
This article gives you an overview of the user provisioning logs.
The required roles and licenses might vary based on the report. Global Administrator
can access all reports, but we recommend using a role with least privilege access to
align with the Zero T rust guidance .
Log / R epor t Roles Licenses
Audit Report R eader
Security R eader
Security Administrator
Global R eader
A custom role with AuditLogsRead or
CustomSecAuditLogsRead permissionAll editions of
Microsoft Entra ID
Sign-ins Report R eader
Security R eader
Security Administrator
Global R eader
A custom role with SignInLogsRead permissionAll editions of
Microsoft Entra ID
Provisioning Same as audit and sign-ins, plus
Security Operator
Application Administrator
Cloud App AdministratorMicrosoft Entra ID
P1/P2License and role requirements
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Log / R epor t Roles Licenses
A custom role with ProvisioningLogsRead
permission
Usage and insights Security R eader
Reports R eader
Security AdministratorMicrosoft Entra ID
P1/P2
Identity Protection* Security Administrator
Security Operator
Security R eader
Global R eader
A custom role with IdentityRiskEventReadWrite
permissionMicrosoft Entra ID
Free
Microsoft 365 Apps
Microsoft Entra ID
P1/P2
Microsoft Graph
activity logsSecurity Administrator
A custom role with ListKeys permissionMicrosoft Entra ID
P1/P2
*The level of access and capabilities for Identity Protection varies with the role and
license. For more information, see the license requirements for Identity Protection .
You can use the provisioning logs to find answers to questions like:
What groups were successfully created in ServiceNow?
What users were successfully removed from Adobe?
What users from W orkday were successfully created in Active Directory?
When you select an item in the provisioning list view, you get more details about this
item, such as the steps taken to provision the user and tips for troubleshooting issues.
The details are grouped into four tabs.
Steps: This tab outlines the steps taken to provision an object. Provisioning an
object can include the following steps, but not all steps are applicable to all
provisioning events.What can you do with the provisioning logs?
７ Note
Entries in the provisioning logs are system generated and can&amp;#39;t be changed or
deleted.
What do the logs show?&lt;/p&gt;
&lt;p&gt;Import the object.
Match the object between source and target.
Determine if the object is in scope.
Evaluate the object before synchronization.
Provision the object (create, update, delete, or disable).
Troubleshooting &amp;amp; R ecommendations : If there was an error, this tab provides the
error code and reason.
Modified Pr oper ties: If there were changes, this tab shows the old value and the
new value.
Summar y: Provides an overview of what happened and identifiers for the object in
the source and target systems.&lt;/p&gt;
&lt;p&gt;Map directory extensions in cross-
tenant synchronization
Article •01/30/2024
Directory extensions enable you to extend the schema in Microsoft Entra ID with your
own attributes. Y ou can map these directory extensions when provisioning users in
cross-tenant synchronization. Custom security attributes  are different and aren&amp;#39;t
supported in cross-tenant synchronization.
This article describes how to map directory extensions in cross-tenant synchronization.
Hybrid Identity Administrator  role to configure cross-tenant synchronization.
Cloud Application Administrator  or Application Administrator  role to assign users
to a configuration and to delete a configuration.
If you don&amp;#39;t already have directory extensions, you must create one or more directory
extensions in the source or target tenant. Y ou can create extensions using Microsoft
Entra Connect or Microsoft Graph API. For information on how to create directory
extensions, see Syncing extension attributes for Microsoft Entra Application
Provisioning .
Sour ce tenant
Once you have one or more directory extensions, you can use them when mapping
attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center  of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant synchr onization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations  and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning  and expand the Mappings  section.Prerequisites
Create directory extensions
Map directory extensions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Micr osoft Entra ID User s to open the Attribut e Mapping  page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom of the page and select Add new mapping .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Sour ce attribut e drop-down list, select a source attribute.
If you created a directory extension in the source tenant, select the directory
extension.

&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was
created successfully. Y ou can also try to manually add the directory extension to
the attribute list as described in the next section.
8. In the Target attribut e drop-down list, select a target attribute.
If you created a directory extension in the target tenant, select the directory
extension.
9. Select Ok to save the mapping.
Sour ce tenant
If your directory extension wasn&amp;#39;t automatically discovered, you can try the following
steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant using the
following link:

Manually add directory extensions to the
attribute list&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://entra.microsoft.com/&quot;&gt;https://entra.microsoft.com/&lt;/a&gt;?
Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true
2. Browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant synchr onization .
3. Select Configurations  and then select your configuration.
4. Select Provisioning  and expand the Mappings  section.
5. Select Provision Micr osoft Entra ID User s to open the Attribut e Mapping  page.
6. Scroll to the bottom and select the Show adv anced settings  check box.
7. If you created a directory extension in the source tenant, select the Edit attribut e
list for Micr osoft Entra ID  link.
8. If you created an extension in the target tenant, select the Edit attribut e list for
Azur e Activ e Dir ectory (tar get t enant)  link.
9. Add the directory extension and select the appropriate options.

 Tip
If you don&amp;#39;t see the Edit attribut e list  links, be sure that you are signed in to
the Microsoft Entra admin center using the link in S tep 1.&lt;/p&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribut e mappings  page and try to map the directory extension as
described earlier in this article.
Sour ce tenant
Follow these steps to manually add directory extensions to the schema by using the
schema editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center  of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity  &amp;gt; External Identities  &amp;gt; Cross-t enant synchr onization .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations  and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning  and expand the Mappings  section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Micr osoft Entra ID User s to open the Attribut e Mapping  page.

Manually add directory extensions by editing
the schema&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom and select the Show adv anced settings  check box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Review y our schema her e link to open the Schema edit or page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download an original copy of the schema as a backup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the schema following your required configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.

&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribut e mappings  page and try to map the directory extension as
described earlier in this article.
Syncing extension attributes for Microsoft Entra Application Provisioning
Configure cross-tenant synchronizationNext steps&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Reference for writing expressions for
attribute ma ppings in Microsoft Entra ID
Article •01/26/2024
When you configure provisioning to a SaaS application, one of the types of attribute
mappings that you can specify is an expression mapping. For these mappings, you must
write a script-like expression that allows you to transform your users&amp;#39; data into formats
that are more acceptable for the SaaS application.
The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for
Applications (VBA) functions.
The entire expression must be defined in terms of functions, which consist of a
name followed by arguments in parentheses: FunctionName( &amp;lt;&amp;lt;argument 1&amp;gt;&amp;gt;,
&amp;lt;&lt;argument N&gt;&amp;gt;)
You can nest functions within each other. For example:
FunctionOne(FunctionT wo(&amp;lt;&lt;argument1&gt;&amp;gt;))
You can pass three different types of arguments into functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example:
[attributeName]&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example:
&amp;quot;United S tates&amp;quot;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: FunctionOne( &amp;lt;&lt;argument1&gt;&amp;gt;,
FunctionT wo(&amp;lt;&lt;argument2&gt;&amp;gt;))
For string constants, if you need a backslash ( \ ) or quotation mark ( &amp;quot; ) in the
string, it must be escaped with the backslash ( \ ) symbol. For example: &amp;quot;Company
name: &amp;quot;Contoso&amp;quot;&amp;quot;
The syntax is case-sensitive, which must be considered while typing them as strings
in a function vs copy pasting them directly from here.Syntax overview
List of Functions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Append       AppR oleAssignmentsComplex       BitAnd       CBool       CDate       Coalesce      
ConvertT oBase64       ConvertT oUTF8Hex       Count       CStr      DateAdd       DateDiff      
DateFromNum   FormatDateTime       Guid       IgnoreFlowIfNullOrEmpty      IIF     InStr     
IsNull       IsNullOrEmpty       IsPresent       IsString       Item      Join      Left      Mid     
NormalizeDiacritics        Not      Now       NumFromDate       PCase       RandomS tring      
Redact       RemoveDuplicates       Replace       SelectUniqueV alue    
SingleAppR oleAssignment      Split    StripSpaces       Switch      ToLower      ToUpper     
Word
Function:  Append(source, suffix)
Description:  Takes a source string value and appends the suffix to the end of it.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute from the source object.
suffix Required String The string that you want to append to the end of the
source value.
Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix
to all your user names before synchronizing them.
Expression:  Append([userPrincipalName], &amp;quot;.test&amp;quot;)
Sample input/output:
INPUT : (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;
Function:  AppR oleAssignmentsComplex([appR oleAssignments])Append
ﾉExpand table
Append constant suffix to user name
AppRoleAssignmentsComplex&lt;/p&gt;
&lt;p&gt;Description:  Used to configure multiple roles for a user. For detailed usage, see Tutorial&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customize user provisioning attribute-mappings for SaaS applications in Microsoft
Entra ID .
Paramet ers:
Name Requir ed/ R epeating Type Notes
[appR oleAssignments] Required String [appR oleAssignments]  object.
Function:  BitAnd(value1, value2)
Description:  This function converts both parameters to the binary representation and
sets a bit to:
0 - if one or both of the corresponding bits in value1 and value2 are 0
1 - if both of the corresponding bits are 1.
In other words, it returns 0 in all cases except when the corresponding bits of both
parameters are 1.
Paramet ers:
Name Requir ed/ R epeating Type Notes
value1 Required Num Numeric value that should be AND&amp;#39;ed with value2
value2 Required Num Numeric value that should be AND&amp;#39;ed with value1
Example:  BitAnd(&amp;amp;HF, &amp;amp;HF7)
11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;111&quot;&gt;
&lt;li&gt;Function:  CBool(Expression)ﾉExpand table
BitAnd
ﾉExpand table
CBool&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Description:  CBool returns a boolean based on the evaluated expression. If the
expression evaluates to a non-zero value, then CBool returns True, else it returns False.
Paramet ers:
Name Requir ed/ R epeating Type Notes
Expression Required expression Any valid expression
Example:  CBool([attribute1] = [attribute2])
Returns T rue if both attributes have the same value.
Function:
CDate(expression)
Description:
The CDate function returns a UT C DateTime from a string. DateTime isn&amp;#39;t a native
attribute type but it can be used within date functions such as FormatDateTime  and
DateAdd .
Paramet ers:
Name Requir ed/
RepeatingType Notes
Expression Required Expression Any valid string that represents a date/time. For
supported formats, refer to .NET custom date and
time format strings .
Remarks:
The returned string is always in UT C and follows the format M/d/yyyy h:mm:ss tt .
Example 1:
CDate([StatusHireDate])
Sample input/output:
INPUT  (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;ﾉExpand table
CDate
ﾉExpand table&lt;/p&gt;
&lt;p&gt;OUTPUT : &amp;quot;3/16/2020 7:00:00 AM&amp;quot; &amp;lt;-- Note the UT C equiv alent o f the abo ve
DateTime is r eturned
Example 2:
CDate(&amp;quot;2021-06-30+08:00&amp;quot;)
Sample input/output:
INPUT : &amp;quot;2021-06-30+08:00&amp;quot;
OUTPUT : &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UT C equiv alent o f the abo ve
DateTime is r eturned
Example 3:
CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)
Sample input/output:
INPUT : &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;
OUTPUT : &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UT C equiv alent o f the abo ve
DateTime is r eturned
Function:  Coalesce(source1, source2, ..., defaultV alue)
Description:  Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and
defaultV alue is present, the defaultV alue is returned. If all arguments are NULL and
defaultV alue isn&amp;#39;t present, Coalesce returns NULL.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source1 …
sourceNRequired String Required, variable-number of times. Usually name
of the attribute from the source object.
defaultV alue Optional String Default value to be used when all source values are
NULL. Can be empty string (&amp;quot;&amp;quot;).Coalesce
ﾉExpand table
Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;p&gt;Example: Y ou wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the
value of userPrincipalName instead.
Expression:  Coalesce([mail],[userPrincipalName])
Sample input/output:
INPUT  (mail): NULL
INPUT  (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;
Function:  ConvertT oBase64(source)
Description:  The ConvertT oBase64 function converts a string to a Unicode base64 string.
Paramet ers:
Name Requir ed/ R epeating Type Notes
source Required String String to be converted to base 64
Example:  ConvertToBase64(&amp;quot;Hello world!&amp;quot;)
Returns &amp;quot;SABlA GwAbABvA CAAdwBvAHIAbABkA CEA&amp;quot;
Function:  ConvertT oUTF8Hex(source)
Description:  The ConvertT oUTF8Hex function converts a string to a UTF8 Hex encoded
value.
Paramet ers:
Name Requir ed/ R epeating Type Notes
source Required String String to be converted to UTF8 HexConvertToBase64
ﾉExpand table
ConvertToUTF8Hex
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Example:  ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)
Returns 48656C6C6F20776F726C6421
Function:  Count(attribute)
Description:  The Count function returns the number of elements in a multi-valued
attribute
Paramet ers:
Name Requir ed/
RepeatingType Notes
attribut eRequired attribute Multi-valued attribute that will have elements
counted
Function:  CStr(value)
Description:  The CS tr function converts a value to a string data type.
Paramet ers:
Name Requir ed/
RepeatingType Notes
value Required numeric, reference, or
booleanCan be a numeric value, reference
attribute, or Boolean.
Example:  CStr([dn])
Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;Count
ﾉExpand table
CStr
ﾉExpand table
DateAdd&lt;/p&gt;
&lt;p&gt;Function:
DateAdd(interval, value, dateTime)
Description:
Returns a date/time string representing a date to which a specified time interval has
been added. The returned date is in the format: M/d/yyyy h:mm:ss tt .
Paramet ers:
Name Requir ed/
RepeatingType Notes
interval Required String Interval of time you want to add. See accepted values
below this table.
value Required Number The number of units you want to add. It can be positive
(to get dates in the future) or negative (to get dates in
the past).
dateTime Required DateTime DateTime representing date to which the interval is
added.
When passing a date string as input, use CDate  function to wrap the datetime string. T o
get system time in UT C, use the Now  function.
The interval string must have one of the following values:
yyyy Y ear
m Month
d Day
ww W eek
h Hour
n Minute
s Second
Example 1: Generat e a dat e value b ased on incoming S tatusHir eDat e from W orkday
DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))ﾉExpand table
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Example intervalvalue dateTime (v alue o f variable
StatusHir eDat e)output
Add 7 days to hire date &amp;quot;d&amp;quot; 7 2012-03-16-07:00 3/23/2012
7:00:00 AM
Get a date ten days
prior to hire date&amp;quot;d&amp;quot; -10 2012-03-16-07:00 3/6/2012
7:00:00 AM
Add two weeks to hire
date&amp;quot;ww&amp;quot; 2 2012-03-16-07:00 3/30/2012
7:00:00 AM
Add ten months to hire
date&amp;quot;m&amp;quot; 10 2012-03-16-07:00 1/16/2013
7:00:00 AM
Add two years to hire
date&amp;quot;yyyy&amp;quot; 2 2012-03-16-07:00 3/16/2014
7:00:00 AM
Function:
DateDiff(interval, date1, date2)
Description:
This function uses the interval parameter to return a number that indicates the
difference between the two input dates. It returns
a positive number if date2 &amp;gt; date1,
a negative number if date2 &amp;lt; date1,
0 if date2 == date1
Paramet ers:
Name Requir ed/Optional Type Notes
intervalRequired String Interval of time to use for calculating the difference.
date1 Required DateTime DateTime representing a valid date.
date2 Required DateTime DateTime representing a valid date.
When passing a date string as input, use CDate  function to wrap the datetime string. T o
get system time in UT C, use the Now  function.
The interval string must have one of the following values:DateDiff
ﾉExpand table&lt;/p&gt;
&lt;p&gt;yyyy Y ear
m Month
d Day
ww W eek
h Hour
n Minute
s Second
Example 1: Comp are curr ent dat e with hir e dat e from W orkday with differ ent int ervals
DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))
Example intervaldate1 date2 output
Positive difference in days between
two datesd 2021-08-18+08:00 2021-08-
31+08:0013
Negative difference in days between
two datesd 8/25/2021 5:41:18
PM2012-03-16-
07:00-3449
Difference in weeks between two
datesww 8/25/2021 5:41:18
PM2012-03-16-
07:00-493
Difference in months between two
datesm 8/25/2021 5:41:18
PM2012-03-16-
07:00-113
Difference in years between two
datesyyyy 8/25/2021 5:41:18
PM2012-03-16-
07:00-9
Difference when both dates are same d 2021-08-31+08:00 2021-08-
31+08:000
Difference in hours between two
datesh 2021-08-24 2021-08-25 24
Difference in minutes between two
datesn 2021-08-24 2021-08-25 1440
Difference in seconds between two
datess 2021-08-24 2021-08-25 86400
Example 2: Combine Dat eDiff with IIF function t o set attribut e value
If an account is Active in W orkday, set the accountEnabled  attribute of the user to T rue
only if hire date is within the next five days.ﾉExpand table&lt;/p&gt;
&lt;p&gt;Function:  DateFromNum(value)
Description:  The DateFromNum function converts a value in AD&amp;#39;s date format to a
DateTime type.
Paramet ers:
Name Requir ed/ R epeating Type Notes
value Required Date AD Date to be converted to DateTime type
Example:  DateFromNum([lastLogonTimestamp])
DateFromNum(129699324000000000)
Returns a DateTime representing January 1, 2012 at 11:00PM.
Function:  FormatDateTime(source, dateTimeS tyles, inputFormat, outputFormat)
Description:  Takes a date string from one format and converts it into a different format.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute from the source object.
dateTimeS tyles Optional String Use this parameter to specify the formatting options that
customize string parsing for some date and time parsing
methods. For supported values, see DateTimeS tyles doc .
If left empty, the default value used isSwitch([Active], , 
  &amp;quot;1&amp;quot;, IIF(DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate])) &amp;gt; 5, &amp;quot;False&amp;quot;,&lt;br&gt;&amp;quot;True&amp;quot;), 
  &amp;quot;0&amp;quot;, &amp;quot;False&amp;quot;)
DateFromNum
ﾉExpand table
FormatDateTime
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
DateTimeS tyles.R oundtripKind,
DateTimeS tyles.AllowLeadingWhite,
DateTimeS tyles.AllowT railingWhite
inputFormat Required String Expected format of the source value. For supported
formats, see .NET custom date and time format strings .
outputFormat Required String Format of the output date.
Example: Y ou want to send dates to a SaaS application like ServiceNow in a certain
format. Y ou can consider using the following expression.
Expression:
FormatDateTime([extensionAttribute1], , &amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)
Sample input/output:
INPUT  (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;
OUTPUT : &amp;quot;2015-01-23&amp;quot;
Function:  Guid()
Description:  The function Guid generates a new random GUID
Example:
Guid()
Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;
Function:  IgnoreFlowIfNullOrEmpty(expression)
Description:  The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to
ignore the attribute and drop it from the flow if the enclosed function or attribute is
NULL or empty.Output date as a string in a certain format
Guid
IgnoreFlowIfNullOrEmpty&lt;/p&gt;
&lt;p&gt;Paramet ers:
Name Requir ed/ R epeating Type Notes
Expression Required Expression Expression to be evaluated
Example 1: Don &amp;#39;t flow an attribut e if it is null
IgnoreFlowIfNullOrEmpty([department])
The above expression will drop the department attribute from the provisioning flow if it
is null or empty.
Example 2: Don &amp;#39;t flow an attribut e if the expr ession mapping ev aluat es to empty
string or null
Let&amp;#39;s say the SuccessF actors attribute prefix is mapped to the on-premises Active
Directory attribute personalTitle  using the following expression mapping:
IgnoreFlowIfNullOrEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr.&amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;,
&amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))
The above expression first evaluates the Switch  function. If the prefix attribute doesn&amp;#39;t
have any of the values listed within the Switch function, then Switch will return an empty
string and the attribute personalTitle  will not be included in the provisioning flow to on-
premises Active Directory.
Function:  IIF(condition,valueIfT rue,valueIfF alse)
Description:  The IIF function returns one of a set of possible values based on a specified
condition.
Paramet ers:
Name Requir ed/
RepeatingType Notes
condition Required Variable or
ExpressionAny value or expression that can be
evaluated to true or false.
valueIfT rue Required Variable or S tring If the condition evaluates to true, the
returned value.ﾉExpand table
IIF
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
valueIfF alse Required Variable or S tring If the condition evaluates to false, the
returned value.
The following comparison operators can be used in the condition :
Equal to (=) and not equal to (&amp;lt;&amp;gt;)
Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)
Less than (&amp;lt;) and less than equal to (&amp;lt;=)
Example:  Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;,
else set target attribute value to source department attribute. IIF([country]=&amp;quot;USA&amp;quot;,
[country],[department])
This section includes limitations and workarounds for the IIF function. For information
about troubleshooting user creation issues, see Creation fails due to null / empty values .
The IIF function currently doesn&amp;#39;t support AND and OR logical operators.
To implement AND logic, use nested IIF statement chained along the trueValue
path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;T rue&amp;quot;, else return
&amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;,IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;,&amp;quot;False&amp;quot;),&amp;quot;False&amp;quot;)
To implement OR logic, use nested IIF statement chained along the falseValue
path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;T rue&amp;quot;, else return
&amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;,&amp;quot;True&amp;quot;,IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;,&amp;quot;False&amp;quot;))
If the source attribute used within the IIF function is empty or null, the condition
check fails.
Unsupported IIF expression examples:
IIF([country]=&amp;quot;&amp;quot;,&amp;quot;Other&amp;quot;,[country])
IIF(IsNullOrEmpty([country]),&amp;quot;Other&amp;quot;,[country])
IIF(IsPresent([country]),[country],&amp;quot;Other&amp;quot;)
Recommended workaround: Use the Switch  function to check for empty/null
values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present,
pass the country attribute value to target attribute.
Switch([country],[country],&amp;quot;&amp;quot;,&amp;quot;Other&amp;quot;)Known limitations
InStr&lt;/p&gt;
&lt;p&gt;Function:  InStr(value1, value2, start, compareT ype)
Description:  The InS tr function finds the first occurrence of a substring in a string
Paramet ers:
Name Requir ed/ R epeating Type Notes
value1 Required String String to be searched
value2 Required String String to be found
start Optional Integer Starting position to find the substring
comp areType Optional Enum Can be vbT extCompare or vbBinaryCompare
Example:  InStr(&amp;quot;The quick brown fox&amp;quot;,&amp;quot;quick&amp;quot;)
Evaluates to 5
InStr(&amp;quot;repEated&amp;quot;,&amp;quot;e&amp;quot;,3,vbBinaryCompare)
Evaluates to 7
Function:  IsNull(Expression)
Description:  If the expression evaluates to Null, then the IsNull function returns true. For
an attribute, a Null is expressed by the absence of the attribute.
Paramet ers:
Name Requir ed/ R epeating Type Notes
Expression Required Expression Expression to be evaluated
Example:  IsNull([displayName])
Returns T rue if the attribute isn&amp;#39;t present.ﾉExpand table
IsNull
ﾉExpand table
IsNullorEmpty&lt;/p&gt;
&lt;p&gt;Function:  IsNullOrEmpty(Expression)
Description:  If the expression is null or an empty string, then the IsNullOrEmpty function
returns true. For an attribute, this would evaluate to T rue if the attribute is absent or is
present but is an empty string. The inverse of this function is named IsPresent.
Paramet ers:
Name Requir ed/ R epeating Type Notes
Expression Required Expression Expression to be evaluated
Example:  IsNullOrEmpty([displayName])
Returns T rue if the attribute isn&amp;#39;t present or is an empty string.
Function:  IsPresent(Expression)
Description:  If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then
the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.
Paramet ers:
Name Requir ed/ R epeating Type Notes
Expression Required Expression Expression to be evaluated
Example:  Switch(IsPresent([directManager]),[directManager],
IsPresent([skiplevelManager]),[skiplevelManager], IsPresent([director]),[director])
Function:  IsString(Expression)
Description:  If the expression can be evaluated to a string type, then the IsS tring
function evaluates to T rue.
Paramet ers:ﾉExpand table
IsPresent
ﾉExpand table
IsString&lt;/p&gt;
&lt;p&gt;Name Requir ed/ R epeating Type Notes
Expression Required Expression Expression to be evaluated
Function:  Item(attribute, index)
Description:  The Item function returns one item from a multi-valued string/attribute.
Paramet ers:
Name Requir ed/ R epeating Type Notes
attribut e Required Attribute Multi-valued attribute to be searched
index Required Integer Index to an item in the multi-valued string
Example:  Item([proxyAddresses], 1) returns the first item in the multi-valued attribute.
Index 0 shouldn&amp;#39;t be used.
Function:  Join(separator, source1, source2, …)
Description:  Join() is similar to Append(), except that it can combine multiple source
string values into a single string, and each value will be separated by a separator string.
If one of the source values is a multi-value attribute, then every value in that attribute
will be joined together, separated by the separator value.
Paramet ers:
Name Requir ed/
RepeatingType Notes
separator Required String String used to separate source values when they
are concatenated into one string. Can be &amp;quot;&amp;quot; if no
separator is required.ﾉExpand table
Item
ﾉExpand table
Join
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
source1 …
sourceNRequired, variable-
number of timesString String values to be joined together.
Function:  Left(S tring, NumChars)
Description:  The Left function returns a specified number of characters from the left of a
string. If numChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If
string is null, return empty string. If string contains fewer characters than the number
specified in numChars, a string identical to string (that is, containing all characters in
parameter 1) is returned.
Paramet ers:
Name Requir ed/
RepeatingType Notes
String Required Attribute The string to return characters from
NumChar sRequired Integer A number identifying the number of characters to
return from the beginning (left) of string
Example:  Left(&amp;quot;John Doe&amp;quot;, 3)
Returns &amp;quot;Joh&amp;quot;.
Function:  Mid(source, start, length)
Description:  Returns a substring of the source value. A substring is a string that contains
only some of the characters from the source string.
Paramet ers:Left
ﾉExpand table
Mid
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute.
start Required Integer Index in the source string where substring should start. First
character in the string has an index of 1, second character
has an index 2, and so on.
length Required Integer Length of the substring. If length ends outside the source
string, function returns substring from start index until end
of source string.
Function:  NormalizeDiacritics(source)
Description:  Requires one string argument. R eturns the string, but with any diacritical
characters replaced with equivalent nondiacritical characters. T ypically used to convert
first names and last names containing diacritical characters (accent marks) into legal
values that can be used in various user identifiers such as user principal names, SAM
account names, and email addresses.
Paramet ers:
Name Requir ed/ R epeating Type Notes
source Required String Usually a first name or last name attribute.
Charact er with Diacr itic Normalized
charact erCharact er with Diacr itic Normalized
charact er
ä, à, â, ã, å, á, ą, ă, ā, ā ́, ā̀,
ā̂, ā̃, ǟ, ā̈, ǡ, a̱, å̄a Ä, À, Â, Ã, Å, Á, Ą, Ă, Ā, Ā́, Ā̀,
Ā̂, Ā̃, Ǟ, Ā̈, Ǡ, A̱, Å̄A
æ, ǣ ae Æ, Ǣ AE
ç, č, ć, c ̄, c̱ c Ç, Č, Ć, C ̄, C̱ C
ď, d̄, ḏ d Ď, D̄, Ḏ D
ë, è, é, ê, ę, ě, ė, ē, ḗ, ḕ, ē ̂,
ē̃, ê̄, e̱, ë̄, e̊̄e Ë, È, É, Ê, Ę, Ě, Ė, Ē, Ḗ, Ḕ, Ē̂, Ē̃, Ê̄,
E̱, Ë̄, E̊̄ENormalizeDiacritics
ﾉExpand table
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Charact er with Diacr itic Normalized
charact erCharact er with Diacr itic Normalized
charact er
ğ, ḡ, g ̱ g Ğ, Ḡ, G ̱ G
ï, î, ì, í, ı, ī, ī ́, ī̀, ī̂, ī̃, i̱ i Ï, Î, Ì, Í, İ, Ī, Ī́, Ī̀, Ī̂, Ī̃, I̱ I
ľ, ł, l̄, ḹ, ḻ l Ł, Ľ, L ̄, Ḹ, Ḻ L
ñ, ń, ň, n ̄, ṉ n Ñ, Ń, Ň, N ̄, Ṉ N
ö, ò, ő, õ, ô, ó, ō, ṓ, ṑ, ō ̂,
ō̃, ȫ, ō̈, ǭ, ȭ, ȱ, o ̱o Ö, Ò, Ő, Õ, Ô, Ó, Ō, Ṓ, Ṑ, Ō̂,
Ō̃, Ȫ, Ō̈, Ǭ, Ȭ, Ȱ, O ̱O
ø, ø̄, œ̄ oe Ø, Ø̄, Œ̄ OE
ř, r̄, ṟ, ṝ r Ř, R̄, Ṟ, Ṝ R
ß ss
š, ś, ș, ş, s ̄, s̱ s Š, Ś, Ș, Ş, S ̄, S̱ S
ť, ț, t̄, ṯ t Ť, Ț, T ̄, Ṯ T
ü, ù, û, ú, ů, ű, ū, ū ́, ū̀, ū̂,
ū̃, u̇̄, ǖ, ṻ, ṳ ̄, u̱u Ü, Ù, Û, Ú, Ů, Ű, Ū, Ū́, Ū̀, Ū̂, Ū̃,
U̇̄, Ǖ, Ṻ, Ṳ ̄, U̱U
ÿ, ý, ȳ, ȳ ́, ȳ̀, ȳ̃, y̱ y Ÿ, Ý, Ȳ, Ȳ́, Ȳ̀, Ȳ̃, Y̱ Y
ź, ž, ż, z ̄, ẕ z Ź, Ž, Ż, Z ̄, Ẕ Z
Example: R eplace characters containing accent marks with equivalent characters that
don&amp;#39;t contain accent marks.
Expression:  NormalizeDiacritics([givenName])
Sample input/output:
INPUT  (givenName): &amp;quot;Zoë&amp;quot;
OUTPUT : &amp;quot;Zoe&amp;quot;
Function:  Not(source)Remove diacritics from a string
Not&lt;/p&gt;
&lt;p&gt;Description:  Flips the boolean value of the source. If source value is T rue, returns F alse.
Otherwise, returns T rue.
Paramet ers:
Name Requir ed/ R epeating Type Notes
source Required Boolean S tring Expected source values are &amp;quot;T rue&amp;quot; or &amp;quot;F alse&amp;quot;.
Function:  Now()
Description:
The Now function returns a string representing the current UT C DateTime in the format
M/d/yyyy h:mm:ss tt .
Example:  Now()
Example value returned 7/2/2021 3:33:38 PM
Function:  NumFromDate(value)
Description:  The NumFromDate function converts a DateTime value to Active Directory
format that is required to set attributes like accountExpires . Use this function to convert
DateTime values received from cloud HR apps like W orkday and SuccessF actors to their
equivalent AD representation.
Paramet ers:
Name Requir ed/
RepeatingType Notes
value Required String Date time string in ISO 8601  format. If the date variable is in
a different format, use FormatDateTime  function to convert the
date to ISO 8601 format.
Example:ﾉExpand table
Now
NumFromDate
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Workday example Assuming you want to map the attribute ContractEndDat e from
Workday, which is in the format 2020-12-31-08:00  to accountExpir es field in AD,
here&amp;#39;s how you can use this function and change the timezone offset to match
your locale. NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], ,&amp;quot;yyyy-MM-
ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))
SuccessF actors example Assuming you want to map the attribute endDat e from
SuccessF actors, which is in the format M/d/yyyy hh:mm:ss tt  to accountExpir es field
in AD, here&amp;#39;s how you can use this function and change the time zone offset to
match your locale. NumFromDate(Join(&amp;quot;&amp;quot;,FormatDateTime([endDate], ,&amp;quot;M/d/yyyy
hh:mm:ss tt&amp;quot;,&amp;quot;yyyy-MM-dd&amp;quot;),&amp;quot; 23:59:59-08:00&amp;quot;))
Function:  PCase(source, wordSeparators)
Description:  The PCase function converts the first character of each word in a string to
upper case, and all other characters are converted to lower case.
Paramet ers:
Name Requir ed/Optional Type Notes
source Required String source value to convert to proper case.
wordSep aratorsOptional String Specify a set of characters that is used as word
separators (example: &amp;quot; ,-&amp;#39;&amp;quot;)
Remarks:
If the wordSep arators parameter isn&amp;#39;t specified, then PCase internally invokes the
.NET function ToTitleCase  to convert the source string to proper case. The .NET
function ToTitleCas e supports a comprehensive set of the Unicode character
categories  as word separators.
Space character
New line character
Control characters like CRLF
Format control characters
Connect orPunctuation  characters like underscore
DashPunctuation  characters like dash and hyphen (including characters such En
Dash, Em Dash, double hyphen, etc.)PCase
ﾉExpand table&lt;/p&gt;
&lt;p&gt;OpenPunctuation  and ClosePunctuation  characters that occur in pairs like
parenthesis, curly bracket, angle bracket, etc.
InitialQuot ePunctuation  and FinalQuot ePunctuation  characters like single
quotes, double quotes and angular quotes.
OtherPunctuation  characters like exclamation mark, number sign, percent sign,
ampersand, asterisk, comma, full stop, colon, semi-colon, etc.
MathS ymbol  characters like plus sign, less-than and greater-than sign, vertical
line, tilde, equals sign, etc.
CurrencyS ymbol  characters like dollar sign, cent sign, pound sign, euro sign, etc.
Modi fierSymbol  characters like macron, accents, arrow heads, etc.
OtherS ymbol  characters like copyright sign, degree sign, registered sign, etc.
If the wordSep arators parameter is specified, then PCase only uses the characters
specified as word separators.
Example:
Let&amp;#39;s say you&amp;#39;re sourcing the attributes firstName  and lastName  from SAP
SuccessF actors and in HR both these attributes are in upper-case. Using the PCase
function, you can convert the name to proper case as shown below.
Expr ession Input Output Notes
PCase([firstName]) firstName  =
&amp;quot;PABLO
GONSAL VES
(SECOND)&amp;quot;&amp;quot;Pablo
Gonsalves
(Second)&amp;quot;As the wordSep arators parameter
isn&amp;#39;t specified, the PCas e function
uses the default word separators
character set.
PCase([lastName],&amp;quot; &amp;#39;-
&amp;quot;)lastName  =
&amp;quot;PINT O-
DE&amp;#39;SIL VA&amp;quot;&amp;quot;Pinto-
De&amp;#39;Silva&amp;quot;The PCas e function uses characters
in the wordSep arators parameter to
identify words and transform them
to proper case.
PCase(Join(&amp;quot; &amp;quot;,
[firstName],
[lastName]))firstName  =
GREGOR Y,
lastName  =
&amp;quot;JAMES&amp;quot;&amp;quot;Gregory
James&amp;quot;You can nest the Join function within
PCase. As the wordSep arators
parameter isn&amp;#39;t specified, the PCas e
function uses the default word
separators character set.
Function:  RandomS tring(Length, MinimumNumbers, MinimumSpecialCharacters,
MinimumCapital, MinimumLowerCase, CharactersT oAvoid)ﾉExpand table
RandomString&lt;/p&gt;
&lt;p&gt;Description:  The RandomS tring function generates a random string based on the
conditions specified. Characters allowed can be identified here.
Paramet ers:
Name Requir ed/
RepeatingType Notes
Length Required Number Total length of the random string. This
should be greater than or equal to the
sum of MinimumNumbers,
MinimumSpecialCharacters, and
MinimumCapital. 256 characters max.
MinimumNumber s Required Number Minimum numbers in the random string.
MinimumSpecialCharact ersRequired Number Minimum number of special characters.
MinimumCapital Required Number Minimum number of capital letters in the
random string.
MinimumLow erCase Required Number Minimum number of lower case letters in
the random string.
Charact ersToAvoid Optional String Characters to be excluded when
generating the random string.
Example 1:  - Generate a random string without special character restrictions:
RandomString(6,3,0,0,3) Generates a random string with 6 characters. The string
contains 3 numbers and 3 lower case characters (1a73qt).
Example 2:  - Generate a random string with special character restrictions:
RandomString(10,2,2,2,1,&amp;quot;?,&amp;quot;) Generates a random string with 10 characters. The
string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case
letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaR g53).
Function:  Redact()
Description:  The R edact function replaces the attribute value with the string literal &amp;quot;
[Redact]&amp;quot; in the provisioning logs.
Paramet ers:ﾉExpand table
Redact&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
attribut e/value Required String Specify the attribute or constant / string to redact
from the logs.
Example 1:  Redact an attribute: Redact([userPrincipalName]) Removes the
userPrincipalName from the provisioning logs.
Example 2:  Redact a string: Redact(&amp;quot;StringToBeRedacted&amp;quot;) Removes a constant string
from the provisioning logs.
Example 3:  Redact a random string: Redact(RandomString(6,3,0,0,3)) Removes the
random string from the provisioning logs.
Function:  RemoveDuplicates(attribute)
Description:  The R emoveDuplicates function takes a multi-valued string and make sure
each value is unique.
Paramet ers:
Name Requir ed/
RepeatingType Notes
attribut eRequired Multi-valued
AttributeMulti-valued attribute that has duplicates
removed
Example:  RemoveDuplicates([proxyAddresses]) Returns a sanitized proxyAddress
attribute where all duplicate values are removed.
Function:  Replace(source, oldV alue, regexP attern, regexGroupName, replacementV alue,
replacementAttributeName, template)
Description:  Replaces values within a string in a case-sensitive manner. The function
behaves differently depending on the parameters provided:ﾉExpand table
RemoveDuplicates
ﾉExpand table
Replace&lt;/p&gt;
&lt;p&gt;When oldValue and replacementV alue are provided:
Replaces all occurrences of oldValue in the source with replacementV alue
When oldValue and templat e are provided:
Replaces all occurrences of the oldValue in the templat e with the source value
When regexP attern and replacementV alue are provided:
The function applies the regexP attern to the source string and you can use the
regex group names to construct the string for replacementV alue
When regexP attern, regexGr oupName , replacementV alue are provided:
The function applies the regexP attern to the source string and replaces all
values matching regexGr oupName  with replacementV alue
When regexP attern, regexGr oupName , replacementA ttribut eName  are provided:
If source has a value, source is returned
If source has no value, the function applies the regexP attern to the
replacementA ttribut eName  and returns the value matching regexGr oupName
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute from the
source object.
oldValue Optional String Value to be replaced in source or templat e.
regexP attern Optional String Regex pattern for the value to be replaced
in source. When
replacementA ttribut eName  is used, the
regexP attern is applied to extract a value
from replacementA ttribut eName .
regexGr oupName Optional String Name of the group inside regexP attern.
When named replacementA ttribut eName  is
used, we&amp;#39;ll extract the value of the named
regex group from the７ Note
To learn more about regex grouping constructs and named sub-expressions, see
Grouping Constructs in R egular Expr essions .
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Name Requir ed/
RepeatingType Notes
replacementA ttribut eName  and return it as
the replacement value.
replacementV alue Optional String New value to replace old one with.
replacementA ttribut eName Optional String Name of the attribute to be used for
replacement value
templat e Optional String When templat e value is provided, we&amp;#39;ll look
for oldValue inside the template and replace
it with source value.
Example 1:  Using oldValue and replacementV alue to replace the entire source string
with another string.
Let&amp;#39;s say your HR system has an attribute BusinessTitle. As part of recent job title
changes, your company wants to update anyone with the business title &amp;quot;Product
Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following
expression in your attribute mapping.
Replace([BusinessTitle],&amp;quot;Product Developer&amp;quot;, , , &amp;quot;Software Engineer&amp;quot;, , )
source: [BusinessTitle]
oldValue: &amp;quot;Product Developer&amp;quot;
replacementV alue: &amp;quot;Software Engineer&amp;quot;
Expression output : Software Engineer
Example 2:  Using oldValue and templat e to insert the source string into another
templatized  string.
The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets
replaced.
Let&amp;#39;s say you want to always generate login ID in the format &lt;username&gt;@contoso.com.
There is a source attribute called UserID  and you want that value to be used for the
&lt;username&gt; portion of the login ID. Then in this case, you can use the following
expression in your attribute mapping.
Replace([UserID],&amp;quot;&lt;username&gt;&amp;quot;, , , , , &amp;quot;&lt;username&gt;@contoso.com&amp;quot;)
source: [UserID] = &amp;quot;jsmith&amp;quot;Replace characters using a regular expression&lt;/p&gt;
&lt;p&gt;oldValue:  &amp;quot;&lt;username&gt;&amp;quot;
templat e: &amp;quot;&lt;username&gt;@contoso.com&amp;quot;
Expression output:  &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;
Example 3:  Using regexP attern and replacementV alue to extract a portion of the source
string and replace it with an empty string or a custom value built using regex patterns or
regex group names.
Let&amp;#39;s say you have a source attribute telephoneNumber that has components country
code and phone number separated by a space character. For example, +91 9998887777
Then in this case, you can use the following expression in your attribute mapping to
extract the 10 digit phone number.
Replace([telephoneNumber], , &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;, ,
&amp;quot;${phoneNumber}&amp;quot;, , )
source: [telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;
regexP attern: &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;
replacementV alue:  &amp;quot;${phoneNumber}&amp;quot;
Expression output:  9998887777
You can also use this pattern to remove characters and collapse a string. For example,
the expression below removes parenthesis, dashes and space characters in the mobile
number string and returns only digits.
Replace([mobile], , &amp;quot;[()\s-]+&amp;quot;, , &amp;quot;&amp;quot;, , )
source: [mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;
regexP attern: &amp;quot;[()\s-]+&amp;quot;
replacementV alue:  &amp;quot;&amp;quot; (empty string)
Expression output:  19998887777
Example 4:  Using regexP attern, regexGr oupName  and replacementV alue to extract a
portion of the source string and replace it with another literal value or empty string.
Let&amp;#39;s say your source system has an attribute AddressLineData with two components
street number and street name. As part of a recent move, let&amp;#39;s say the street number of
the address changed, and you want to update only the street number portion of the
address line. Then in this case, you can use the following expression in your attribute
mapping to extract the street number.
Replace([AddressLineData], ,&amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;,&amp;quot;streetNumber&amp;quot;, &amp;quot;888&amp;quot;, , )
source: [AddressLineData] = &amp;quot;545 T remont S treet&amp;quot;&lt;/p&gt;
&lt;p&gt;regexP attern: &amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;
regexGr oupName:  &amp;quot;streetNumber&amp;quot;
replacementV alue:  &amp;quot;888&amp;quot;
Expression output:  888 T remont S treet
Here is another example where the domain suffix from a UPN is replaced with an empty
string to generate login ID without domain suffix.
Replace([userPrincipalName], , &amp;quot;(?&lt;Suffix&gt;@(.)&lt;em&gt;)&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, , )
source: [userPrincipalName] = &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;
regexP attern: &amp;quot;(?&lt;Suffix&gt;@(.)&lt;/em&gt;)&amp;quot;
regexGr oupName:  &amp;quot;Suffix&amp;quot;
replacementV alue:  &amp;quot;&amp;quot; (empty string)
Expression output:  jsmith
Example 5:  Using regexP attern, regexGr oupName  and replacementA ttribut eName  to
handle scenarios when the source attribute is empty or doesn&amp;#39;t have a value.
Let&amp;#39;s say your source system has an attribute telephoneNumber. If telephoneNumber is
empty, you want to extract the 10 digits of the mobile number attribute. Then in this
case, you can use the following expression in your attribute mapping.
Replace([telephoneNumber], , &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;,
&amp;quot;phoneNumber&amp;quot; , , [mobile], )
source: [telephoneNumber] = &amp;quot;&amp;quot; (empty string)
regexP attern: &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;
regexGr oupName:  &amp;quot;phoneNumber&amp;quot;
replacementA ttribut eName:  [mobile] = &amp;quot;+91 8887779999&amp;quot;
Expression output:  8887779999
Example 6:  You need to find characters that match a regular expression value and
remove them.
Replace([mailNickname], , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, , )
source [mailNickname]
oldValue: &amp;quot;john_doe72&amp;quot;
replaceV alue: &amp;quot;&amp;quot;
Expression output : 72&lt;/p&gt;
&lt;p&gt;Function:  SelectUniqueV alue(uniqueV alueRule1, uniqueV alueRule2, uniqueV alueRule3,
…)
Description:  Requires a minimum of two arguments, which are unique value generation
rules defined using expressions. The function evaluates each rule and then checks the
value generated for uniqueness in the target app/directory. The first unique value found
will be the one returned. If all of the values already exist in the target, the entry will get
escrowed, and the reason gets logged in the audit logs. There is no upper bound to the
number of arguments that can be provided.
This function must be at the top-level and cannot be nested.
This function cannot be applied to attributes that have a matching precedence.
This function is only meant to be used for entry creations. When using it with an
attribute, set the Apply Mapping  property to Only during object cr eation .
This function is currently only supported for &amp;quot;W orkday to Active Directory User
Provisioning&amp;quot; and &amp;quot;SuccessF actors to Active Directory User Provisioning&amp;quot;. It cannot
be used with other provisioning applications.
The LD AP search that SelectUniqueV alue function performs in on-premises Active
Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like
&amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing
errors. Nest the NormalizeDiacritics  function as shown in the example below to
normalize special characters.
Paramet ers:
Name Requir ed/ R epeating Type Notes
uniqueV alueRule1 …
uniqueV alueRuleNAt least 2 are required,
no upper boundString List of unique value
generation rules to evaluate.
Example: Based on the user&amp;#39;s first name, middle name and last name, you need to
generate a value for the UPN attribute and check for its uniqueness in the target AD
directory before assigning the value to the UPN attribute.
Expression:
ad-attr-mapping-exprSelectUniqueValue
ﾉExpand table
Generate unique value for userPrincipalName (UPN) attribute&lt;/p&gt;
&lt;p&gt;Sample input/output:
INPUT  (PreferredFirstName): &amp;quot;John&amp;quot;
INPUT  (PreferredLastName): &amp;quot;Smith&amp;quot;
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;
doesn&amp;#39;t already exist in the directory
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;
already exists in the directory
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in
the directory
Function:  SingleAppR oleAssignment([appR oleAssignments])
Description:  Returns a single appR oleAssignment from the list of all
appR oleAssignments assigned to a user for a given application. This function is required
to convert the appR oleAssignments object into a single role name string. The best
practice is to ensure only one appR oleAssignment is assigned to one user at a time. This
function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.
Paramet ers:
Name Requir ed/ R epeating Type Notes
[appR oleAssignments] Required String [appR oleAssignments]  object.
Function:  Split(source, delimiter)    SelectUniqueValue( 
        Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,&lt;br&gt;[PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;), 
        Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,&lt;br&gt;Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
        Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,&lt;br&gt;Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;)
    )
SingleAppRoleAssignment
ﾉExpand table
Split&lt;/p&gt;
&lt;p&gt;Description:  Splits a string into a multi-valued array, using the specified delimiter
character.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String source value to update.
delimit erRequired String Specifies the character that will be used to split the
string (example: &amp;quot;,&amp;quot;)
Example: Y ou need to take a comma-delimited list of strings, and split them into an
array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s P ermissionSets
attribute. In this example, a list of permission sets has been populated in
extensionAttribute5 in Microsoft Entra ID.
Expression:  Split([extensionAttribute5], &amp;quot;,&amp;quot;)
Sample input/output:
INPUT  (extensionAttribute5): &amp;quot;P ermissionSetOne, P ermissionSetT wo&amp;quot;
OUTPUT : [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;P ermissionSetT wo&amp;quot;]
Function:  StripSpaces(source)
Description:  Removes all space (&amp;quot; &amp;quot;) characters from the source string.
Paramet ers:
Name Requir ed/ R epeating Type Notes
source Required String source value to update.ﾉExpand table
Split a string into a multi-valued array
StripSpaces
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Function:  Switch(source, defaultV alue, key1, value1, key2, value2, …)
Description:  When source value matches a key, returns value for that key. If source
value doesn&amp;#39;t match any keys, returns defaultV alue. Key and value parameters must
always come in pairs. The function always expects an even number of parameters. The
function shouldn&amp;#39;t be used for referential attributes such as manager.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Sour ce value to update.
defaultV alue Optional String Default value to be used when source doesn&amp;#39;t match
any keys. Can be empty string (&amp;quot;&amp;quot;).
key Required String Key to compare source value with.
value Required String Replacement value for the source matching the key.Switch
７ Note
Switch function performs a case-sensitive string comparison of the source and key
values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source
string before comparison using a nested T oLower function and ensure that all key
strings use lowercase. Example: Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;,
&amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;). In this example, the source attribute statusFlag may have values
(&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the S witch function will always convert it to
lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.
Ｕ Caution
For the source parameter, do not use the nested functions IsPresent, IsNull or
IsNullOrEmpty. Instead use a literal empty string as one of the key values.
Example: Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;). In this
example, if the source attribute statusFlag is empty, the S witch function will return
the value 0.
ﾉExpand table&lt;/p&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft
Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default
value of &amp;quot;Australia/S ydney&amp;quot;.
Expression:  Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;,&amp;quot;QLD&amp;quot;,
&amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)
Sample input/output:
INPUT  (state): &amp;quot;QLD&amp;quot;
OUTPUT : &amp;quot;Australia/Brisbane&amp;quot;
Function:  ToLower(source, culture)
Description:  Takes a source string value and converts it to lower case using the culture
rules that are specified. If there is no cultur e info specified, then it will use Invariant
culture.
If you would like to set existing values in the target system to lower case, update the
schema for your target application  and set the property caseExact to &amp;#39;true&amp;#39; for the
attribute that you&amp;#39;re interested in.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute from the source object
cultur eOptional String The format for the culture name based on RFC 4646 is
languagec ode2-c ountr y/regionc ode2 , where languagec ode2  is the
two-letter language code and countr y/regionc ode2  is the two-
letter subculture code. Examples include ja-JP for Japanese
(Japan) and en-US for English (United S tates). In cases where a
two-letter language code isn&amp;#39;t available, a three-letter code
derived from ISO 639-2 is used.Replace a value based on predefined set of options
ToLower
ﾉExpand table
Convert generated userPrincipalName (UPN) value to lower case&lt;/p&gt;
&lt;p&gt;Example: Y ou would like to generate the UPN value by concatenating the
PreferredFirstName and PreferredLastName source fields and converting all characters
to lower case.
ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName],
[PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))
Sample input/output:
INPUT  (PreferredFirstName): &amp;quot;John&amp;quot;
INPUT  (PreferredLastName): &amp;quot;Smith&amp;quot;
OUTPUT : &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;
Function:  ToUpper(source, culture)
Description:  Takes a source string value and converts it to upper case using the culture
rules that are specified. If there is no cultur e info specified, then it will use Invariant
culture.
If you would like to set existing values in the target system to upper case, update the
schema for your target application  and set the property caseExact to &amp;#39;true&amp;#39; for the
attribute that you&amp;#39;re interested in.
Paramet ers:
Name Requir ed/
RepeatingType Notes
source Required String Usually name of the attribute from the source object.
cultur eOptional String The format for the culture name based on RFC 4646 is
languagec ode2-c ountr y/regionc ode2 , where languagec ode2  is the
two-letter language code and countr y/regionc ode2  is the two-
letter subculture code. Examples include ja-JP for Japanese
(Japan) and en-US for English (United S tates). In cases where a
two-letter language code isn&amp;#39;t available, a three-letter code
derived from ISO 639-2 is used.ToUpper
ﾉExpand table
Word&lt;/p&gt;
&lt;p&gt;Function:  Word(S tring,W ordNumber,Delimiters)
Description:  The W ord function returns a word contained within a string, based on
parameters describing the delimiters to use and the word number to return. Each string
of characters in string separated by the one of the characters in delimiters are identified
as words:
If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string
contains less than number words, or string doesn&amp;#39;t contain any words identified by
delimiters, an empty string is returned.
Paramet ers:
Name Requir ed/
RepeatingType Notes
String Required Multi-valued
AttributeString to return a word from.
WordNumber Required Integer Number identifying which word number
should return
delimit ers Required String A string representing the delimiter(s) that
should be used to identify words
Example:  Word(&amp;quot;The quick brown fox&amp;quot;,3,&amp;quot; &amp;quot;)
Returns &amp;quot;brown&amp;quot;.
Word(&amp;quot;This,string!has&amp;amp;many separators&amp;quot;,3,&amp;quot;,!&amp;amp;#&amp;quot;)
Returns &amp;quot;has&amp;quot;.
This section provides more expression function usage examples.
Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if
the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:
Expression:  Replace([mail], &amp;quot;@contoso.com&amp;quot;, , ,&amp;quot;&amp;quot;, ,)ﾉExpand table
Examples
Strip known domain name&lt;/p&gt;
&lt;p&gt;Sample input / output:
INPUT  (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;
OUTPUT : &amp;quot;john.doe&amp;quot;
Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters
of user&amp;#39;s last name.
Expression:  Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))
Sample input/output:
INPUT  (givenName): &amp;quot;John&amp;quot;
INPUT  (surname): &amp;quot;Doe&amp;quot;
OUTPUT : &amp;quot;JohDoe&amp;quot;
Add a comma between last name and first name.
Expression:  Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])
Sample input/output:
INPUT  (givenName): &amp;quot;John&amp;quot;
INPUT  (surname): &amp;quot;Doe&amp;quot;
OUTPUT : &amp;quot;Doe, John&amp;quot;
This expression allows you to generate an identifier for a user that starts with 1000 and
is likely to be unique.
Expression:  Join(&amp;quot;&amp;quot;, 1000, R eplace(ConvertT oUTF8Hex([objectId]), , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, , ))
Sample input/output:
INPUT : &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;Generate user alias by concatenating parts of first and
last name
Add a comma between last name and first name.
Generate an ID for a user based on their Microsoft Entra
ID object ID. Remove any letters from the ID and add
1000 at the beginning.&lt;/p&gt;
&lt;p&gt;OUTPUT :
&amp;quot;100064303565343762312333930392343435612626135652636136306362633065346234&amp;quot;
Automate User Provisioning/Deprovisioning to SaaS Apps
Customizing Attribute Mappings for User Provisioning
Scoping Filters for User Provisioning
Using SCIM to enable automatic provisioning of users and groups from Microsoft
Entra ID to applications
Account Provisioning Notifications
List of Tutorials on How to Integrate SaaS AppsRelated Articles&lt;/p&gt;
</content:encoded></item><item><title>mtoGPT4TurboWithDocIntelOCR</title><link>https://www.elumenotion.com/journal/mtogpt4turbowithdocintelocr/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtogpt4turbowithdocintelocr/</guid><pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Multitenant organizations documentation&lt;/h1&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h1&gt;About multitenant organizations&lt;/h1&gt;
&lt;h2&gt;OVERVIEW&lt;/h2&gt;
&lt;p&gt;Multitenant organization capabilities&lt;/p&gt;
&lt;p&gt;Compare multitenant capabilities&lt;/p&gt;
&lt;p&gt;Configure a multitenant organization&lt;/p&gt;
&lt;h2&gt;OVERVIEW&lt;/h2&gt;
&lt;p&gt;What is a multitenant organization?&lt;/p&gt;
&lt;h2&gt;HOW-TO GUIDE&lt;/h2&gt;
&lt;p&gt;Microsoft 365 admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;Configure cross-tenant synchronization&lt;/p&gt;
&lt;h2&gt;OVERVIEW&lt;/h2&gt;
&lt;p&gt;What is cross-tenant synchronization?&lt;/p&gt;
&lt;h2&gt;HOW-TO GUIDE&lt;/h2&gt;
&lt;p&gt;Microsoft Entra admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;Collaborate in Microsoft 365&lt;/p&gt;
&lt;p&gt;CONCEPT&lt;/p&gt;
&lt;p&gt;Identity provisioning for Microsoft 365&lt;br&gt;Microsoft 365 multitenant people search&lt;br&gt;Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;At the top of the image, there is a heading titled “Collaborate in Microsoft 365” which is underlined. Below it, the section labeled “CONCEPT” includes a list of related topics, which are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identity provisioning for Microsoft 365  &lt;/li&gt;
&lt;li&gt;Microsoft 365 multitenant people search  &lt;/li&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This describes the textual content and organization of the information on the page.&lt;/p&gt;
&lt;h1&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;What is a tenant?&lt;/h1&gt;
&lt;p&gt;A tenant is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h1&gt;What is a multitenant organization?&lt;/h1&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;p&gt;· Conglomerates: Organizations with multiple subsidiaries or business units that operate independently.&lt;/p&gt;
&lt;p&gt;· Mergers and acquisitions: Organizations that merge or acquire companies.&lt;/p&gt;
&lt;p&gt;· Divestiture activity: In a divestiture, one organization splits off part of its business to form a new organization or sell it to an existing organization.&lt;/p&gt;
&lt;p&gt;· Multiple clouds: Organizations that have compliance or regulatory needs to exist in multiple cloud environments.&lt;/p&gt;
&lt;p&gt;· Multiple geographical boundaries: Organizations that operate in multiple geographic locations with various residency regulations.&lt;/p&gt;
&lt;p&gt;· Test or staging tenants: Organizations that need multiple tenants for testing or staging purposes before deploying more broadly to primary tenants.&lt;/p&gt;
&lt;p&gt;· Department or employee-created tenants: Organizations where departments or employees have created tenants for development, testing, or separate control.&lt;/p&gt;
&lt;p&gt;Multitenant challenges&lt;/p&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Figure Description: The diagram illustrates access issues in a multitenant environment. It shows two tenant symbols, &amp;quot;Tenant&amp;quot; and &amp;quot;Primary Tenant,&amp;quot; with bidirectional arrows between them indicating potential communication or access paths. Red crosses on some arrows suggest barriers to this access.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Tenant --&amp;gt;|Access Denied| PrimaryTenant[Primary Tenant]
    PrimaryTenant --&amp;gt;|Access Denied| Tenant
    Tenant --&amp;gt;|Access Allowed| PrimaryTenant
    PrimaryTenant --&amp;gt;|Access Allowed| Tenant
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;p&gt;B2B direct connect&lt;/p&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use Microsoft Entra B2B direct connect. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;h1&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figure: A flow diagram showing &amp;quot;B2B direct connect users&amp;quot; moving between a &amp;quot;Tenant&amp;quot; and a &amp;quot;Primary tenant&amp;quot;, both connected to &amp;quot;Teams Connect shared channels&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    B2B_direct_connect_users--&amp;gt;Tenant;
    Tenant--&amp;gt;Primary_tenant;
    Primary_tenant--&amp;gt;Teams_Connect_shared_channels;
    Teams_Connect_shared_channels--&amp;gt;B2B_direct_connect_users;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see B2B direct connect overview.&lt;/p&gt;
&lt;h1&gt;B2B collaboration&lt;/h1&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use Microsoft Entra B2B collaboration. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using B2B collaboration across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrators must invite users using the B2B invitation process or build an onboarding experience using the B2B collaboration invitation manager.&lt;/li&gt;
&lt;li&gt;Administrators might have to synchronize users using custom scripts.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figure: Diagram showing &amp;quot;B2B collab users&amp;quot; in a flow between &amp;quot;Tenant&amp;quot; and &amp;quot;Primary tenant&amp;quot; linked to &amp;quot;Microsoft apps&amp;quot; and &amp;quot;Non-Microsoft apps&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    Tenant--&amp;gt;Primary_tenant;
    Primary_tenant--&amp;gt;Microsoft_apps;
    Primary_tenant--&amp;gt;Non_Microsoft_apps;
    B2B_collab_users--&amp;gt;Tenant;
    Tenant--&amp;gt;B2B_collab_users;
    B2B_collab_users--&amp;gt;Primary_tenant;
    Primary_tenant--&amp;gt;B2B_collab_users;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see B2B collaboration overview.&lt;/p&gt;
&lt;h1&gt;Cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use cross-tenant synchronization. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits with using cross-tenant synchronization:&lt;/p&gt;
&lt;p&gt;· Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/p&gt;
&lt;p&gt;· Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/p&gt;
&lt;p&gt;· Automatically update users and remove them when they leave the organization.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using cross-tenant synchronization across multiple tenants:&lt;/p&gt;
&lt;p&gt;· Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;p&gt;· Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/p&gt;
&lt;p&gt;The figure demonstrates the process of cross-tenant synchronization for B2B collaboration users between source and target tenants. It shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;B2B collaboration users are used as External members.&lt;/li&gt;
&lt;li&gt;These users move between a source tenant and a target tenant.&lt;/li&gt;
&lt;li&gt;The synchronization includes Microsoft apps but excludes non-Microsoft apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    SourceTenant(&amp;quot;Source tenant&amp;quot;) --&amp;gt;|B2B collab users (External members)| CrossTenantSync1(&amp;quot;Cross-tenant sync&amp;quot;);
    CrossTenantSync1 --&amp;gt; TargetTenant(&amp;quot;Target tenant&amp;quot;);
    TargetTenant --&amp;gt;|Access to| MicrosoftApps(&amp;quot;Microsoft apps&amp;quot;);
    src(TargetTenant) --&amp;gt;|No access to| NonMicrosoftApps(&amp;quot;Non-Microsoft apps&amp;quot;);
    SourceTenant --&amp;gt; CrossTenantSync2(&amp;quot;Cross-tenant sync&amp;quot;);
    CrossTenantSync2 --&amp;gt; SourceTenant;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see What is cross-tenant synchronization?.&lt;/p&gt;
&lt;h1&gt;Multitenant organization&lt;/h1&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;p&gt;· Differentiate in-organization and out-of-organization external users&lt;/p&gt;
&lt;p&gt;· Improved collaborative experience in new Microsoft Teams&lt;/p&gt;
&lt;p&gt;· Improved people search experience across tenants&lt;/p&gt;
&lt;p&gt;Figure: The image represents a network diagram showing the relationships between an owner tenant and two member tenants, all interconnected through cross-tenant access settings. The owner tenant (C) is depicted with links to both member tenants (A and B), indicating the pathways for access and information flow.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see What is a multitenant organization in Microsoft Entra ID?.&lt;/p&gt;
&lt;h1&gt;Compare multitenant capabilities&lt;/h1&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature. For more information about different external identity scenarios, see Comparing External Identities feature sets.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Users can access Teams Connect shared channels hosted in external tenants.&lt;/td&gt;
&lt;td&gt;Users can access apps/resources hosted in external tenants, usually with limited guest privileges. Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant.&lt;/td&gt;
&lt;td&gt;Users can seamlessly access apps/resources across the same organization, even if they&amp;#39;re hosted in different tenants.&lt;/td&gt;
&lt;td&gt;Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Enables external collaboration within Teams Connect shared channels only. More convenient for administrators because they don&amp;#39;t have to manage B2B external users.&lt;/td&gt;
&lt;td&gt;Enables external collaboration. More control and monitoring for administrators by managing the B2B collaboration users. Administrators can limit the access that these external users have to their apps/resources.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators don&amp;#39;t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators continue to have full configuration ability via cross-tenant access settings. Optional cross-tenant access templates allow pre-configuration of cross-tenant access settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary administrator workflow&lt;/td&gt;
&lt;td&gt;Configure cross-tenant access to provide external users inbound access to tenant the credentials for their home tenant.&lt;/td&gt;
&lt;td&gt;Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration&lt;/td&gt;
&lt;td&gt;Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Create a multitenant organization, add (invite) tenants, join a multitenant organization. Leverage existing B2B collaboration users or use cross-tenant synchronization to ensure continuous access to resources across tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;invitation manager.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;provision B2B collaboration users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust level&lt;/td&gt;
&lt;td&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/td&gt;
&lt;td&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on users&lt;/td&gt;
&lt;td&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/td&gt;
&lt;td&gt;External users are added to a tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User type&lt;/td&gt;
&lt;td&gt;B2B direct connect user - N/A&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External member (default) - External guest (default)&lt;/td&gt;
&lt;td&gt;- External member (default) - External guest&lt;/td&gt;
&lt;td&gt;- External member (default) - External guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The diagram illustrates the interaction and application of B2B direct connect, B2B collaboration, and cross-tenant synchronization. It shows a graphical representation of the collaboration and synchronization flows between different organizational models and how they facilitate various user interactions and trust levels in a multi-tenant environment.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    B2B_Direct_Connect[&amp;quot;B2B Direct Connect (Org-to-org external/internal)&amp;quot;]
    B2B_Collaboration[&amp;quot;B2B Collaboration (Org-to-org external/internal)&amp;quot;]
    Cross_Tenant_Synchronization[&amp;quot;Cross-Tenant Synchronization (Org Internal)&amp;quot;]

    B2B_Direct_Connect --&amp;gt;|Facilitates connection without creating user objects in resource tenant| B2B_Collaboration
    B2B_Collaboration --&amp;gt;|Provides detailed user management and member/guest roles| Cross_Tenant_Synchronization
    Cross_Tenant_Synchronization --&amp;gt;|Involves synchronization of users within the same org| B2B_Collaboration
&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;

&lt;p&gt;The diagram illustrates various business and collaboration scenarios across multiple organizations and how they are interconnected. It specifically shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An internal organizational chart which connects to different tenant instances and collaborations.&lt;/li&gt;
&lt;li&gt;Business-to-business (B2B) collaboration featuring:&lt;ul&gt;
&lt;li&gt;External members and guests associating with Adatum Corporation as an external collaborator.&lt;/li&gt;
&lt;li&gt;Direct B2B connections involving Fabrikam (labeled as acquired) and Trey Research (labeled as an external collaborator).&lt;/li&gt;
&lt;li&gt;A primary tenant labeled &amp;quot;Contoso&amp;quot; with a cross-tenant synchronization to Fabrikam, and external collaborations with Adatum Corporation and Trey Research.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OrgInternal(&amp;quot;Org internal&amp;quot;)
    Contoso(&amp;quot;Contoso (Primary tenant)&amp;quot;)
    Fabrikam(&amp;quot;Fabrikam (Acquired)&amp;quot;)
    AdatumCorp(&amp;quot;Adatum Corporation (External collaborator)&amp;quot;)
    TreyResearch(&amp;quot;Trey Research (External collaborator)&amp;quot;)
    B2BCollabUsersMembers(&amp;quot;B2B collab users (External members)&amp;quot;)
    B2BCollabUsersGuests(&amp;quot;B2B collab users (External guests)&amp;quot;)
    B2BDirectConnect(&amp;quot;B2B direct connect&amp;quot;)
    B2BDirectConnectUsers(&amp;quot;B2B direct connect users&amp;quot;)
    CrossTenantSync(&amp;quot;Cross-tenant sync&amp;quot;)

    OrgInternal --&amp;gt;|B2B collaboration| AdatumCorp
    OrgInternal --&amp;gt;|B2B collaboration| B2BCollabUsersMembers
    OrgInternal --&amp;gt;|B2B collaboration| B2BCollabUsersGuests
    OrgInternal --&amp;gt;|Cross-tenant sync| Fabrikam
    Fabrikam --&amp;gt;|B2B direct connect| Contoso 
    AdatumCorp --&amp;gt;|B2B direct connect| Contoso 
    TreyResearch --&amp;gt;|B2B direct connect| B2BDirectConnect
    B2BDirectConnect --&amp;gt; Contoso
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Terminology&lt;/h1&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, you can refer back to the following list of terms.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expand table&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but that hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don&amp;#39;t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· What is a multitenant organization in Microsoft Entra ID?&lt;/p&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;h1&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;Why use multitenant organization?&lt;/h1&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;p&gt;· Define a group of tenants belonging to your organization&lt;/p&gt;
&lt;p&gt;· Collaborate across your tenants in new Microsoft Teams&lt;/p&gt;
&lt;p&gt;· Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/p&gt;
&lt;h1&gt;Who should use it?&lt;/h1&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for external identities.&lt;/p&gt;
&lt;h1&gt;Benefits&lt;/h1&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;p&gt;· Differentiate in-organization and out-of-organization external users&lt;/p&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.&lt;/p&gt;
&lt;h1&gt;Improved collaborative experience in Microsoft Teams&lt;/h1&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations and Microsoft Teams: Advantages of the new architecture.&lt;/p&gt;
&lt;h1&gt;Improved people search experience across tenants&lt;/h1&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards. For more information, see Microsoft 365 multitenant organization people search.&lt;/p&gt;
&lt;h1&gt;How does a multitenant organization work?&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;h2&gt;Define a multitenant organization&lt;/h2&gt;
&lt;p&gt;One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;h2&gt;Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Leave a multitenant organization&lt;/h2&gt;
&lt;p&gt;Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.&lt;/p&gt;
&lt;p&gt;A multitenant organization is established as a collaboration of equals. Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access settings&lt;/h1&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to- tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;p&gt;· Cross-tenant access partner configurations&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;p&gt;· Cross-tenant access identity synchronization&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and crossTenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;h1&gt;Multitenant organization example&lt;/h1&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization. It depicts a triangle where the three tenants (A, B, and C) are corners. The Owner tenant (C) is at the top corner, and the Member tenants (A) and (B) are at the left and right bottom corners respectively. Arrows between these tenants represent &amp;quot;Cross-tenant access settings&amp;quot;. There is a bi-directional arrow between each tenant, indicating the mutual settings configuration for access between them.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Templates for cross-tenant access settings&lt;/h1&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h1&gt;Tenant role and state&lt;/h1&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tenant role&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Owner[&amp;quot;Owner (creates organization, adds/removes tenants, changes roles)&amp;quot;] --&amp;gt; Member[&amp;quot;Member (joins and may leave the organization, starts from pending to active)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tenant state&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator&amp;#39;s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user&amp;#39;s view of a multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Constraints&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any given tenant can only create or join a single multitenant organization.&lt;/li&gt;
&lt;li&gt;Any multitenant organization must have at least one active owner tenant.&lt;/li&gt;
&lt;li&gt;Each active tenant must have cross-tenant access settings for all active tenants.&lt;/li&gt;
&lt;li&gt;Any active tenant may leave a multitenant organization by removing themselves from it.&lt;/li&gt;
&lt;li&gt;A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Limits&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;External user segmentation&lt;/h1&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External members originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External guests originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External members originating from outside of your organization&lt;/li&gt;
&lt;li&gt;External guests originating from outside of your organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h1&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/li&gt;
&lt;li&gt;If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Get started&lt;/h1&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h2&gt;Step 1: Plan your deployment&lt;/h2&gt;
&lt;p&gt;For more information, see Plan for multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;h1&gt;Step 2: Create your multitenant organization&lt;/h1&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/li&gt;
&lt;li&gt;Owner tenant adds one or more joiner tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/li&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;h1&gt;Step 4: Synchronize users&lt;/h1&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;li&gt;Your alternative bulk provisioning engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;License requirements&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;What is cross-tenant synchronization?&lt;/h1&gt;
&lt;p&gt;Article · 01/03/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting Microsoft Entra B2B collaboration users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;p&gt;· Seamless collaboration for a multitenant organization&lt;/p&gt;
&lt;p&gt;· Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/p&gt;
&lt;p&gt;· Automatically remove B2B accounts when a user leaves the organization&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBcz&quot;&gt;https://www.youtube-nocookie.com/embed/7B-PQwNfGBcz&lt;/a&gt;  &lt;/p&gt;
&lt;h1&gt;Why use cross-tenant synchronization?&lt;/h1&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as ServiceNow, Adobe, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as Microsoft Entra Conditional Access and cross-tenant access settings, and can be governed through features such as Microsoft Entra entitlement management.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;h3&gt;Diagram Description:&lt;/h3&gt;
&lt;p&gt;The diagram illustrates the process of cross-tenant synchronization allowing multiple individual users in separate tenants to access diverse applications across these tenants seamlessly. The diagram likely presents various nodes representing different tenants and the connections between these nodes illustrate the flow of data or user access permissions that enable the cross-tenant functionality.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantA(&amp;quot;Tenant A - User &amp;amp; Application Data Flow&amp;quot;) --&amp;gt; TenantB(&amp;quot;Tenant B - Seamless User Access&amp;quot;)
    TenantB --&amp;gt; TenantC(&amp;quot;Tenant C - Data and Security Integration&amp;quot;)
    TenantA --&amp;gt; TenantC
&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;

&lt;p&gt;The image shows a diagram of cross-tenant synchronization between multiple organizations and applications. There are three main sections depicted:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On the left, two separate locations of Fabrikam (Mexico and US) with users marked as internal or external are represented by green and purple triangles. These sections link to a middle segment labeled &amp;quot;Cross-tenant sync.&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The middle section features a central location labeled &amp;quot;Contoso&amp;quot; with four users (User1, User2, User3, User4) represented by shapes, depicting their status as internal or external. This connects to another segment also labeled &amp;quot;Cross-tenant sync.&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The rightmost section illustrates connectivity between Microsoft apps and non-Microsoft apps, signifying the integration provided across the depicted organizations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Fabrikam_Mexico --&amp;gt; Cross_tenant_sync1[Cross-tenant sync]
    Fabrikam_US --&amp;gt; Cross_tenant_sync2[Cross-tenant sync]
    Cross_tenant_sync1 --&amp;gt; Contoso
    Cross_tenant_sync2 --&amp;gt; Contoso
    Contoso --&amp;gt; Microsoft_apps[Microsoft apps]
    Contoso --&amp;gt; Non_Microsoft_apps[Non-Microsoft apps]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Who should use?&lt;/h1&gt;
&lt;p&gt;· Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/p&gt;
&lt;h1&gt;Benefits&lt;/h1&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;p&gt;· Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/p&gt;
&lt;p&gt;· Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/p&gt;
&lt;p&gt;· Automatically update users and remove them when they leave the organization.&lt;/p&gt;
&lt;h1&gt;Teams and Microsoft 365&lt;/h1&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the member userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.&lt;/p&gt;
&lt;h1&gt;Properties&lt;/h1&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;p&gt;· Based on the Microsoft Entra provisioning engine.&lt;/p&gt;
&lt;p&gt;· Is a push process from the source tenant, not a pull process from the target tenant.&lt;/p&gt;
&lt;p&gt;· Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/p&gt;
&lt;p&gt;· Users in scope for synchronization are configured in the source tenant.&lt;/p&gt;
&lt;p&gt;· Attribute mapping is configured in the source tenant.&lt;/p&gt;
&lt;p&gt;· Extension attributes are supported.&lt;/p&gt;
&lt;p&gt;· Target tenant administrators can stop a synchronization at any time.&lt;/p&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:heavy_check_mark:&lt;/td&gt;
&lt;td&gt;:heavy_check_mark:&lt;/td&gt;
&lt;td&gt;:heavy_check_mark:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;:heavy_check_mark:&lt;/td&gt;
&lt;td&gt;:heavy_check_mark:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Cross-tenant synchronization setting&lt;/h1&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a check box with the name Allow users sync into this tenant that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;h1&gt;Inbound access settings - Contoso&lt;/h1&gt;
&lt;p&gt;X
 ✅
B2B collaboration B2B direct connect Trust settings Cross-tenant sync&lt;/p&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.
 ✅
V Allow users sync into this tenant&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantIdentitySyncPolicyPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Automatic redemption setting&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a check box with the following name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Text Description of Figure:
In the image, under the &amp;quot;Automatic redemption&amp;quot; section, there is a check box with a label &amp;quot;Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&amp;#39;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well.&amp;quot; Below this description is an activation checkbox labeled &amp;quot;Automatically redeem invitations with the tenant fc16b9b2-c752-43d3-a1aa-c75e9a85a7dc.&amp;quot; There are options to &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot; the settings.&lt;/p&gt;
&lt;p&gt;mermaidjs Diagram:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    AutomaticRedemption[&amp;quot;Automatic redemption setting&amp;quot;]
    Checkbox[&amp;quot;Check this setting if you want to...&amp;quot;]
    TenantID[&amp;quot;Automatically redeem invitations with the tenant fc16b9b2-c752-43d3-a1aa-c75e9a85a7dc&amp;quot;]
    
    AutomaticRedemption --&amp;gt; Checkbox --&amp;gt; TenantID
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Compare setting for different scenarios&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;p&gt;· When users are created in a target tenant using cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· When users are added to a resource tenant using B2B collaboration.&lt;/p&gt;
&lt;p&gt;· When users access resources in a resource tenant using B2B direct connect.&lt;/p&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see Consent experience for applications in Microsoft Entra ID. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h3&gt;When is consent prompt suppressed?&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure Content:&lt;/strong&gt;
Illustration of workflow between &amp;quot;Source tenant&amp;quot; and &amp;quot;Target tenant.&amp;quot; Arrows indicate direction of access settings with flags showing that both tenants have selected the option to &amp;quot;Automatically redeem invitations.&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    Source_tenant[&amp;quot;Source tenant&amp;quot;] --&amp;gt; Target_tenant[&amp;quot;Target tenant&amp;quot;]
    subgraph Source_tenant
        Outbound_access_settings[&amp;quot;Outbound access settings ✅&amp;gt; Automatically redeem invitations&amp;quot;]
    end
    subgraph Target_tenant
        Inbound_access_settings[&amp;quot;Inbound access settings ✅&amp;gt; Automatically redeem invitations&amp;quot;]
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home/source tenant&lt;/th&gt;
&lt;th&gt;Resource/target tenant&lt;/th&gt;
&lt;th&gt;Consent prompt behavior for source tenant users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantAccessPolicyConfigurationPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;How do users know what tenants they belong to?&lt;/h1&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their My Account page and select Organizations. In the Microsoft Entra admin center, users can open their Portal settings, view their Directories + subscriptions, and switch directories.&lt;/p&gt;
&lt;p&gt;For more information, including privacy information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h1&gt;Get started&lt;/h1&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Step 1: Define how to structure the tenants in your organization&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Text Description of Figure: The illustration shows various tenant structures possible within an organization. It includes diagrams representing central, satellite, and mesh topologies with arrows indicating possible synchronization paths between tenants.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CentralTenant(&amp;quot;Central Tenant&amp;quot;) --&amp;gt; SatelliteTenant1(&amp;quot;Satellite Tenant 1&amp;quot;);
    CentralTenant --&amp;gt; SatelliteTenant2(&amp;quot;Satellite Tenant 2&amp;quot;);
    SatelliteTenant1 --&amp;gt; MeshTenant1(&amp;quot;Mesh Tenant 1&amp;quot;);
    SatelliteTenant2 --&amp;gt; MeshTenant1;
    MeshTenant1 --&amp;gt; MeshTenant2(&amp;quot;Mesh Tenant 2&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/p&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Text Description of Figure: This image depicts a settings interface titled &amp;quot;Target tenant&amp;quot;, under the sub-heading &amp;quot;Inbound access settings&amp;quot;. It shows two checked options: &amp;quot;Allow users sync into this tenant&amp;quot; and &amp;quot;Automatically redeem invitations&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TargetTenant(&amp;quot;Target Tenant&amp;quot;) --&amp;gt; InboundAccessSettings(&amp;quot;Inbound Access Settings&amp;quot;);
    InboundAccessSettings --&amp;gt; AllowUsersSync(&amp;quot;Allow users sync into this tenant: selected&amp;quot;);
    InboundAccessSettings --&amp;gt; AutomaticallyRedeemInvitations(&amp;quot;Automatically redeem invitations: selected&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/p&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;p&gt;· Which users you want to synchronize&lt;/p&gt;
&lt;p&gt;· What attributes you want to include&lt;/p&gt;
&lt;p&gt;· Any transformations&lt;/p&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured,&lt;/p&gt;
&lt;p&gt;you can start testing with a few users and make sure they&amp;#39;re created with all the attributes that you need. When testing is complete, you can quickly add additional users to synchronize and roll out across your organization. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Source tenant is depicted to the left sending information to Cross-tenant synchronization depicted in the middle, which in turn sends information to the Target tenant on the right. Below the tenants, different settings are depicted: Outbound access settings -&amp;gt; Automatically redeem invitations; Inbound access settings -&amp;gt; Allow users sync into this tenant, Automatically redeem invitations.&lt;/p&gt;
&lt;!-- mermaid
graph LR;
    Source_tenant --&gt;|Cross-tenant synchronization| Target_tenant;
&lt;pre&gt;&lt;code&gt;Outbound_access_settings -.-&amp;gt;|Automatically redeem invitations| Cross_tenant_synchronization;
Inbound_access_settings -.-&amp;gt;|Allow users sync into this tenant| Target_tenant;
Inbound_access_settings -.-&amp;gt;|Automatically redeem invitations| Target_tenant;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;--&amp;gt;&lt;/p&gt;
&lt;/figure&gt;



&lt;h1&gt;License requirements&lt;/h1&gt;
&lt;p&gt;In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing model. To understand the external identities licensing model, see MAU billing model for Microsoft Entra External ID. You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/p&gt;
&lt;h1&gt;Frequently asked questions&lt;/h1&gt;
&lt;h1&gt;Clouds&lt;/h1&gt;
&lt;p&gt;Which clouds can cross-tenant synchronization be used in?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/p&gt;
&lt;p&gt;· Synchronization is only supported between two tenants in the same cloud.&lt;/p&gt;
&lt;p&gt;· Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/p&gt;
&lt;h1&gt;Existing B2B users&lt;/h1&gt;
&lt;p&gt;Will cross-tenant synchronization manage existing B2B users?&lt;/p&gt;
&lt;p&gt;Yes. Cross-tenant synchronization uses an internal attribute called the alternativeSecurityIdentifier to uniquely match an internal user in the source tenant with an external / B2B user in the target tenant. Cross-tenant synchronization can update existing B2B users, ensuring that each user has only one account.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization cannot match an internal user in the source tenant with an internal user in the target tenant (both type member and type guest).&lt;/p&gt;
&lt;h1&gt;Synchronization frequency&lt;/h1&gt;
&lt;p&gt;How often does cross-tenant synchronization run?&lt;/p&gt;
&lt;p&gt;· The sync interval is currently fixed to start at 40-minute intervals. Sync duration varies based on the number of in-scope users. The initial sync cycle is likely to take significantly longer than the following incremental sync cycles.&lt;/p&gt;
&lt;h1&gt;Scope&lt;/h1&gt;
&lt;p&gt;How do I control what is synchronized into the target tenant?&lt;/p&gt;
&lt;p&gt;· In the source tenant, you can control which users are provisioned with the configuration or attribute-based filters. You can also control what attributes on the user object are synchronized. For more information, see Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;p&gt;If a user is removed from the scope of sync in a source tenant, will cross-tenant synchronization soft delete them in the target?&lt;/p&gt;
&lt;p&gt;· Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant synchronization will soft delete them in the target tenant.&lt;/p&gt;
&lt;h1&gt;Object types&lt;/h1&gt;
&lt;p&gt;What object types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Microsoft Entra users can be synchronized between tenants. (Groups, devices, and contacts aren&amp;#39;t currently supported.)&lt;/p&gt;
&lt;p&gt;What user types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t be synchronized from source tenants.&lt;/p&gt;
&lt;p&gt;· Users can be synchronized to target tenants as external members (default) or external guests.&lt;/p&gt;
&lt;p&gt;For more information about the UserType definitions, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;p&gt;I have existing B2B collaboration users. What will happen to them?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/p&gt;
&lt;h1&gt;Attributes&lt;/h1&gt;
&lt;p&gt;What user attributes can be synchronized?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including (but not limited to) displayName, userPrincipalName, and directory extension attributes.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024 with the default schema / attribute mappings:&lt;/p&gt;
&lt;p&gt;o The manager attribute will automatically be added to the mappings.&lt;/p&gt;
&lt;p&gt;o This does not trigger an initial sync cycle.&lt;/p&gt;
&lt;p&gt;o Manager updates will apply on the incremental cycle for users that are undergoing changes (e.g. manager change). The sync engine doesn&amp;#39;t automatically update all existing users that were provisioned previously.&lt;/p&gt;
&lt;p&gt;o To update the manager for existing users that are in scope for provisioning, you can use on-demand provisioning for specific users or do a restart to provision the manager for all users.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024 with a custom schema / attribute mappings (e.g. you added an attribute to the mappings or changed the default mappings):&lt;/p&gt;
&lt;p&gt;o You need to manually add the manager attribute to your attribute mappings. This will trigger a restart and update all users that are in scope for provisioning. This should be a direct mapping of the manager attribute in the source tenant to the manager in the target tenant.&lt;/p&gt;
&lt;p&gt;o If the manager of a user is removed in the source tenant and no new manager is assigned in the source tenant, the manager attribute will not be updated in the target tenant.&lt;/p&gt;
&lt;p&gt;What attributes can&amp;#39;t be synchronized?&lt;/p&gt;
&lt;p&gt;· Attributes including (but not limited to) photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Can I control where user attributes are sourced/managed?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority. The user and its attributes are deemed authoritative at the source tenant. There are parallel sources of authority workstreams that will evolve source of authority controls for users down to the attribute level and a user object at the source may ultimately reflect multiple underlying sources. For the tenant-to-tenant process, this is still treated as the source tenant&amp;#39;s values being authoritative for the sync process (even if pieces actually originate elsewhere) into the target tenant. Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.
· Cross-tenant synchronization only supports source of authority at the object level. That means all attributes of a user must come from the same source, including credentials. It isn&amp;#39;t possible to reverse the source of authority or federation direction of a synchronized object.&lt;/p&gt;
&lt;p&gt;What happens if attributes for a synced user are changed in the target tenant?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no changes are made to the synced user in the source tenant, then user attribute changes made in the target tenant will persist. However, if changes are made to the user in the source tenant, then during the next synchronization cycle, the user in the target tenant will be updated to match the user in the source tenant.&lt;/p&gt;
&lt;p&gt;Can the target tenant manually block sign-in for a specific home/source tenant user that is synced?&lt;/p&gt;
&lt;p&gt;· If no changes are made to the synced user in the source tenant, then the block sign-in setting in the target tenant will persist. If a change is detected for the user in the source tenant, cross-tenant synchronization will re-enable that user blocked from sign-in in the target tenant.&lt;/p&gt;
&lt;p&gt;Structure&lt;/p&gt;
&lt;p&gt;Can I sync a mesh between multiple tenants?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is configured as a single-direction peer-to-peer sync, meaning sync is configured between one source and one target tenant. Multiple instances of cross-tenant synchronization can be configured to sync from a single&lt;/p&gt;
&lt;p&gt;source to multiple targets and from multiple sources into a single target. But only one sync instance can exist between a source and a target.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization only synchronizes users that are internal to the home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is written back to the same tenant.&lt;/p&gt;
&lt;p&gt;· Multiple topologies are supported. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/p&gt;
&lt;p&gt;· For privacy reasons, cross-tenant synchronization is intended for use within an organization. We recommend using entitlement management for inviting B2B collaboration users across organizations.&lt;/p&gt;
&lt;p&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/p&gt;
&lt;p&gt;· No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. In addition, tenant migrations would require migrating user data such as SharePoint and OneDrive.&lt;/p&gt;
&lt;p&gt;B2B collaboration&lt;/p&gt;
&lt;p&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/p&gt;
&lt;p&gt;Since cross-tenant synchronization is built on existing B2B collaboration technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App or service&lt;/td&gt;
&lt;td&gt;Limitations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;B2B direct connect&lt;/p&gt;
&lt;p&gt;How does cross-tenant synchronization relate to B2B direct connect?&lt;/p&gt;
&lt;p&gt;B2B direct connect is the underlying identity technology required for Teams Connect shared channels.&lt;/p&gt;
&lt;p&gt;We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/p&gt;
&lt;p&gt;B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/p&gt;
&lt;p&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/p&gt;
&lt;p&gt;There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/p&gt;
&lt;h2&gt;Microsoft 365&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/p&gt;
&lt;p&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;p&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/p&gt;
&lt;p&gt;Yes, but you must set the value for the showInAddressList attribute of synchronized users to True, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology. For more information, see Step 9: Review attribute mappings.&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/p&gt;
&lt;h2&gt;Teams&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/p&gt;
&lt;p&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;!-- PageHeader=&quot;Integration&quot; --&gt;

&lt;p&gt;What federation options are supported for users in the target tenant back to the source tenant?&lt;/p&gt;
&lt;p&gt;· For each internal user in the source tenant, cross-tenant synchronization creates a federated external user (commonly used in B2B) in the target. It supports syncing internal users. This includes internal users federated to other identity systems using domain federation (such as Active Directory Federation Services). It doesn&amp;#39;t support syncing external users.&lt;/p&gt;
&lt;p&gt;Does cross-tenant synchronization use System for Cross-Domain Identity Management (SCIM)?&lt;/p&gt;
&lt;p&gt;. No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For more information, see SCIM synchronization with Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Deprovisioning&lt;/h1&gt;
&lt;p&gt;Does cross-tenant synchronization support deprovisioning users?&lt;/p&gt;
&lt;p&gt;· Yes, when the below actions occur in the source tenant, the user will be soft deleted in the target tenant.&lt;/p&gt;
&lt;p&gt;o Delete the user in the source tenant
 ❌
o Unassign the user from the cross-tenant synchronization configuration
 ❌
o Remove the user from a group that is assigned to the cross-tenant synchronization configuration
 ❌&lt;/p&gt;
&lt;p&gt;o An attribute on the user changes such that they do not meet the scoping filter conditions defined on the cross-tenant synchronization configuration anymore
 ❌&lt;/p&gt;
&lt;p&gt;. If the user is blocked from sign-in in the source tenant (accountEnabled = false) they will be blocked from sign-in in the target. This is not a deletion, but an updated to the accountEnabled property.&lt;/p&gt;
&lt;p&gt;· Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a user to a group and assign it to the cross-tenant synchronization configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Update the account enabled status to false on the user in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle. The account enabled status is changed to false in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.
❌ ❌ ❌ ✅ ✅ ✅&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Does cross-tenant synchronization support restoring users?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the user in the source tenant is restored, reassigned to the app, meets the scoping condition again within 30 days of soft deletion, it will be restored in the target tenant.&lt;/li&gt;
&lt;li&gt;IT admins can also manually restore the user directly in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unassign all users and / or groups from the cross-tenant synchronization configuration. This will trigger all the users that were unassigned, either directly or through group membership, to be deprovisioned in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to Sync all users and groups, you will also need to change it to Sync only assigned users and groups. The users will be automatically soft deleted by cross-tenant synchronization. The users will be automatically hard deleted after 30 days or you can choose to hard delete the users directly from the target tenant. You can choose to hard delete the users directly in the target tenant or wait 30 days for the users to be automatically hard deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the sync relationship is severed, are external users previously managed by cross-tenant synchronization deleted in the target tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No. No changes are made to the external users previously managed by cross-tenant synchronization if the relationship is severed (for example, if the cross-tenant synchronization policy is deleted).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next steps&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Multitenant organization identity provisioning for Microsoft 365&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h1&gt;Microsoft 365 people search&lt;/h1&gt;
&lt;p&gt;Teams external access and Teams shared channels excluded, Microsoft 365 people search is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h1&gt;New Microsoft Teams&lt;/h1&gt;
&lt;p&gt;The new Microsoft Teams experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members.&lt;/p&gt;
&lt;h1&gt;Collaborating user set&lt;/h1&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;p&gt;For people search to succeed, while scoped to local tenant boundaries, the entire collaborating user set must be represented within the scope of each multitenant organization tenant A, B, and C, in the form of either internal or B2B identities.&lt;/p&gt;
&lt;p&gt;Text description of figure: Three distinct sections, each representing &amp;quot;Tenant A&amp;quot;, &amp;quot;Tenant B&amp;quot;, and &amp;quot;Tenant C&amp;quot;. In each, certain users are shown as &amp;quot;Internal&amp;quot;, and others as shared between the tenants, represented as &amp;quot;External&amp;quot;. Each user is represented by a colored circle and labeled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tenant A shows: Annie (Internal)&lt;/li&gt;
&lt;li&gt;Tenant B shows: Bob, Barbara (Internal)&lt;/li&gt;
&lt;li&gt;Tenant C shows: Charles (Internal)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;Tenant A&amp;quot;] --&amp;gt;|Internal| Annie
    B[&amp;quot;Tenant B&amp;quot;] --&amp;gt;|Internal| Bob
    B --&amp;gt;|Internal| Barbara
    C[&amp;quot;Tenant C&amp;quot;] --&amp;gt;|Internal| Charles
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Depending on your organization&amp;#39;s needs, the collaborating user set may contain a subset of collaborating employees, or eventually all employees.&lt;/p&gt;
&lt;p&gt;Text description of figure: Similar to the previous figure with Tenant sections, but this time indicating the flow of external users among the tenants, showing which external identities are recognized by which tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tenant A shows Bob, Barbara, and Charles as External&lt;/li&gt;
&lt;li&gt;Tenant B shows Annie and Charles as External&lt;/li&gt;
&lt;li&gt;Tenant C shows Annie, Bob, and Barbara as External&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A1[&amp;quot;Tenant A&amp;quot;] --&amp;gt;|External| Bob
    A1 --&amp;gt;|External| Barbara
    A1 --&amp;gt;|External| Charles
    B1[&amp;quot;Tenant B&amp;quot;] --&amp;gt;|External| Annie
    B1 --&amp;gt;|External| Charles
    C1[&amp;quot;Tenant C&amp;quot;] --&amp;gt;|External| Annie
    C1 --&amp;gt;|External| Bob
    C1 --&amp;gt;|External| Barbara
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sharing your users&lt;/p&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization them outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator A contributes or shares Annie&lt;/li&gt;
&lt;li&gt;Administrator B contributes or shares Bob and Barbara&lt;/li&gt;
&lt;li&gt;Administrator C contributes or shares Charles&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;

&lt;p&gt;Figure: This is a diagram showing the orchestration of users across multiple tenants in an organization. It illustrates Tenant A (represented by a purple diamond), Tenant B (represented by a blue triangle), and Tenant C (represented by a green square), each containing internal and external users (internal users shown in blue icons, external users in green). Solid lines indicate the bi-directional relationship between the tenants and their users in terms of data or collaboration flow.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantA[Tenant A] --&amp;gt;|Internal Annie, External Bob Barbara Charles| TenantB[Tenant B]
    TenantB --&amp;gt;|Internal Bob Barbara, External Annie Charles| TenantC[Tenant C]
    TenantC --&amp;gt;|Internal Charles, External Annie Bob Barbara| TenantA
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set across multitenant organization tenants. For more information, see Synchronize users in multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;p&gt;Alternatively, pair-wise configuration of inbound and outbound cross-tenant synchronization can be used to orchestrate such collating user set across multitenant organization tenants. For more information, see What is a cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;B2B member users&lt;/h1&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User synchronization method&lt;/th&gt;
&lt;th&gt;Default userType property&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see Compare member and guest default permissions.&lt;/p&gt;
&lt;p&gt;To change the userType from Guest to Member (or vice versa), a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;h1&gt;Unsharing your users&lt;/h1&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Multitenant organization optional policy templates&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Autogeneration of cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional cross-tenant access settings, for both, partner configuration and identity synchronization. These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross-tenant access settings pass through the default settings.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy behavior, it allows your organization to easily customize the cross-tenant access settings for partner tenants in the multitenant organization on a per-tenant basis.&lt;/p&gt;
&lt;h1&gt;Policy templates at multitenant organization formation&lt;/h1&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding cross-tenant access settings, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/li&gt;
&lt;li&gt;Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/li&gt;
&lt;li&gt;Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Administrator C joins the multitenant organization. Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/p&gt;
&lt;p&gt;Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/p&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see Configure multitenant organization templates.&lt;/p&gt;
&lt;p&gt;Policy template scoping and additional properties&lt;/p&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross- tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, new partners refer to tenants for which you haven&amp;#39;t yet configured cross-tenant access settings, while existing partners refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the templateApplicationLevel property on the cross-tenant access partner configuration template and the templateApplicationLevel property on the cross-tenant access identity synchronization template.&lt;/p&gt;
&lt;p&gt;Finally, in terms of interpretation of template property values, any template property value of null has no effect on the corresponding property value in the targeted cross-tenant access settings, while a defined template property value causes the corresponding property value in the targeted cross-tenant access settings to be amended in accordance with the template. The following table illustrates how template property values are being applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;any value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Policy templates used by Microsoft 365 admin center&lt;/p&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity synchronization is set to allow users to synchronize into this tenant&lt;/li&gt;
&lt;li&gt;Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;automaticUserConsentSettings.inboundAllowed&lt;/li&gt;
&lt;li&gt;automaticUserConsentSettings.outboundAllowed&lt;/li&gt;
&lt;li&gt;userSyncInbound&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see Join or leave a multitenant organization in Microsoft 365.&lt;/p&gt;
&lt;p&gt;Cross-tenant access settings at time of multitenant organization disassembly&lt;/p&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Limitations in multitenant organizations&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see &lt;a href=&quot;https://feedbackportal.microsoft.com/feedback/forum/06735c62-321c-ec11-b6e6-0022481f8472&quot;&gt;Microsoft Entra UserVoice&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;h3&gt;Expand table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;Microsoft 365 admin center limitations related to multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Microsoft 365 multitenant organization people search experiences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cross-tenant synchronization limitations related to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;Cross-tenant synchronization unrelated to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;End user experiences in new Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;End user experiences in Power BI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Tenant migration or consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported scenarios&lt;/td&gt;
&lt;td&gt;Seamless collaboration experience across multitenant organizations in classic Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Self-service for multitenant organizations larger than 100 tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cross-cloud multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the identity platform, both methods are represented as Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Synchronization jobs created with Microsoft Entra ID will not appear in the Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By default, new B2B users are provisioned as B2B members, while existing B2B guests remain B2B guests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can opt to convert B2B guests into B2B members by setting Apply this mapping to Always.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an Outbound sync status of Not configured. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants to or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name MTO_Sync_&lt;TenantID&gt;. Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross-tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with userSyncInbound set to true, as facilitated by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Join requests&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you followed the correct sequence to create a multitenant organization and add a tenant to the multitenant organization, and the added tenant&amp;#39;s join request keeps failing, submit a support request in the Microsoft Entra or Microsoft 365 admin center.&lt;/p&gt;
&lt;h1&gt;Microsoft apps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In SharePoint OneDrive, the promotion of B2B guests to B2B members might not happen automatically. If faced with a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try Set-SPUser [-SyncFromAD].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In SharePoint OneDrive user interfaces, when sharing a file with People in Fabrikam, the current user interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards People in Fabrikam.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Forms, B2B member users might not be able to access forms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Power BI, B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Power Apps, Microsoft Dynamics 365, and related workloads, B2B member users may have restricted functionality. For more information, see Invite users with Microsoft Entra B2B collaboration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the default permissions for B2B members.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To promote B2B guests to B2B members, a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As your organization rolls out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others users as B2B members. To achieve this, you might want to establish two Microsoft Entra cross-tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with Apply this mapping set to ✅ ❌ ❌ ✅ ❌ ❌ ❌ ❌ ❌ ✅ ❌ ❌ ✅ ❌ ❌ ❌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Always. By moving a user from one configuration&amp;#39;s scope to the other, you can easily control who will be a B2B guest or a B2B member in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;As part of a multitenant organization, reset redemption for an already redeemed B2B user is currently disabled.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The at-scale provisioning of B2B users might collide with contact objects. The handling or conversion of contact objects is currently not supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Microsoft Entra cross-tenant synchronization to target hybrid identities that have been converted to B2B users has not been tested in source of authority conflicts and is not supported.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Cross-tenant synchronization deprovisioning&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Currently, SkipOutOfScopeDeletions works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set Target Object Actions for Delete to disabled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Known issues for provisioning in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Topologies for cross-tenant collaboration&lt;/h1&gt;
&lt;p&gt;Article · 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;p&gt;✔ Hub and spoke&lt;/p&gt;
&lt;p&gt;✔ Mesh&lt;/p&gt;
&lt;p&gt;✔ Just-in-time&lt;/p&gt;
&lt;h1&gt;Hub and spoke&lt;/h1&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Option 1 (application hub): In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Option 2 (user hub): Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h1&gt;Mergers and acquisitions (application hub)&lt;/h1&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time limited access to additional applications such as Salesforce and Amazon Web Services&lt;/p&gt;
&lt;p&gt;that contain business critical data. The following diagram shows recently acquired tenants on the left and their users being provisioned into the parent company&amp;#39;s tenant, which grants users access to the necessary resources.&lt;/p&gt;
&lt;p&gt;The diagram illustrates various software and platform components linking to Active Directory.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At the top, it lists HR with two connecting lines extending outward to other applications grouped into three categories:&lt;ul&gt;
&lt;li&gt;SaaS apps (represented by Salesforce and AWS logos)&lt;/li&gt;
&lt;li&gt;Microsoft apps (showing logos of various Microsoft services including Azure)&lt;/li&gt;
&lt;li&gt;On-premises apps (displaying SQL and Active Directory icons)
These categories then connect to an Active Directory icon at the bottom, indicating gateway for assimilating users of acquired tenants into the main corporate environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    HR --&amp;gt; SaaS_apps;
    HR --&amp;gt; Microsoft_apps;
    HR --&amp;gt; On_premises_apps;
    SaaS_apps --&amp;gt; ActiveDirectory;
    Microsoft_apps --&amp;gt; ActiveDirectory;
    On_premises_apps --&amp;gt; ActiveDirectory;
    subgraph SaaS_apps
        Salesforce;
        AWS;
    end
    subgraph Microsoft_apps
        Azure;
        Others[&amp;quot;Various Microsoft services&amp;quot;];
    end
    subgraph On_premises_apps
        SQL;
        ActiveDirectory1(&amp;quot;Active Directory (On-prem)&amp;quot;);
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Separate collaboration and resource tenants (user hub)&lt;/h1&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;figure&gt;
The figure illustrates a model of cross-tenant synchronization in a decentralized organizational structure. It shows a central pyramid-like structure labeled &quot;Active Directory&quot; with arrows pointing to and from four smaller pyramid structures labeled &quot;A&quot;. Additionally, there are icons representing &quot;HR&quot; systems and &quot;salesforce&quot; suggesting integration with these platforms. The overall diagram emphasizes the interconnected nature of different systems within a decentralized environment.

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ActiveDirectory(&amp;quot;Active Directory&amp;quot;) --&amp;gt;|Synchronization| A1(&amp;quot;Tenant A&amp;quot;)
    ActiveDirectory --&amp;gt;|Synchronization| A2(&amp;quot;Tenant A&amp;quot;)
    ActiveDirectory --&amp;gt;|Synchronization| A3(&amp;quot;Tenant A&amp;quot;)
    ActiveDirectory --&amp;gt;|Synchronization| A4(&amp;quot;Tenant A&amp;quot;)
    HR --&amp;gt; ActiveDirectory
    Salesforce --&amp;gt; ActiveDirectory
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Mesh&lt;/h1&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h1&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h1&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;figure&gt;
    The diagram illustrates a cross-tenant synchronization model between four tenants. Three tenants are each represented by a diagram consisting of three components: a main blue pyramid, a Salesforce icon, and a secondary pyramid component. Arrows are shown indicating two-way synchronization processes: one between a tenant labeled with both &quot;aws&quot; and &quot;salesforce&quot; icons and the other tenants, and bi-directional synchronization exists among all the three other tenants.

&lt;pre&gt;&lt;code&gt;```mermaid
graph LR;
    AWS_Salesforce(&amp;quot;AWS &amp;amp; Salesforce Tenant&amp;quot;) -- Bidirectional --&amp;gt; Salesforce_Tenant1(&amp;quot;Salesforce Tenant 1&amp;quot;)
    Salesforce_Tenant1 -- Bidirectional --&amp;gt; Salesforce_Tenant2(&amp;quot;Salesforce Tenant 2&amp;quot;)
    Salesforce_Tenant2 -- Bidirectional --&amp;gt; Salesforce_Tenant3(&amp;quot;Salesforce Tenant 3&amp;quot;)
    Salesforce_Tenant3 -- Bidirectional --&amp;gt; AWS_Salesforce
```
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a separate configuration.&lt;/p&gt;
&lt;h1&gt;Collaborate across business units (full-mesh)&lt;/h1&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;figure&gt;
Figure Description: The diagram shows interconnected organizations represented by geometric icons, specifically triangles with accompanying logos. There are two main triangles, each labeled with a corporate logo: one represents &quot;aws&quot; and the other &quot;salesforce&quot;. Both these triangles are connected via arrows indicating a flow of collaboration or data exchange between &quot;aws&quot; and &quot;salesforce&quot;. Additionally, each triangle connects to a smaller purple circle with graphical symbols inside, possibly indicating user groups or data sources.
&lt;/figure&gt;

&lt;h1&gt;Just-in-time&lt;/h1&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h1&gt;Joint ventures&lt;/h1&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;p&gt;The following diagram shows how two organizations can just-in-time collaborate by using connected organizations and entitlement management.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OrganizationA[aws] --&amp;gt; |&amp;quot;Collaboration/Data exchange&amp;quot;| OrganizationB[salesforce]
    OrganizationB[salesforce] --&amp;gt; |&amp;quot;Collaboration/Data exchange&amp;quot;| OrganizationA[aws]
    aws --&amp;gt; |&amp;quot;Data/Resources access&amp;quot;| UserGroupA[&amp;quot;Purple circle (aws)&amp;quot;]
    salesforce --&amp;gt; |&amp;quot;Data/Resources access&amp;quot;| UserGroupB[&amp;quot;Purple circle (salesforce)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;| | ||&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;user 1&lt;/td&gt;
&lt;td&gt;user 2&lt;/td&gt;
&lt;td&gt;user 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The figure represents a document diagramming connections and access within an organizational setting, titled &amp;quot;Contoso&amp;quot; which is connected to &amp;quot;Litware.&amp;quot; It outlines the various resources such as marketing and sales catalogs and groups, detailing access levels and policies for team members. Users labeled as &amp;quot;User 1,&amp;quot; &amp;quot;User 2,&amp;quot; and &amp;quot;User 3&amp;quot; are shown with specific connections to resources like the marketing app and sales app, along with roles like site member or contributor, documenting access permissions and separation of duties policies.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Contoso --&amp;gt;|Connected to| Litware;
    Contoso --&amp;gt;|Marketing group| Marketing_catalog;
    Contoso --&amp;gt;|Sales group| Sales_catalog;
    Marketing_catalog --&amp;gt; Marketing_app;
    Sales_catalog --&amp;gt; Sales_app;
    Sales_catalog --&amp;gt; Sales_team_group;
    Sales_team_group --&amp;gt;|Member| Sales_site;
    Sales_site --&amp;gt;|Contributor| Sales_app;
    Sales_app --&amp;gt;|Access package| Salesperson_access_package;
    Sales_app --&amp;gt;|Access package| Sales_support_access_package;
    User1 --&amp;gt;|Can request| Policies_for_access_request;
    User2 --&amp;gt;|Can request| Policies_for_access_request;
    User3 --&amp;gt;|Can request| Policies_for_access_request;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;p&gt;Provide product feedback  |  Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;h1&gt;Governance and cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/21/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross- tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how Microsoft Entra ID Governance customers can use cross- tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h2&gt;Deployment example&lt;/h2&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage employee identity lifecycles across multiple tenants&lt;/li&gt;
&lt;li&gt;Use workflows to automate lifecycle processes for employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Assign resource access automatically to employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Allow employees to request access to resources in multiple tenants&lt;/li&gt;
&lt;li&gt;Review the access of synchronized users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant.&lt;/p&gt;
&lt;p&gt;The following diagram illustrates the topology:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt;
The diagram depicts the cross-tenant synchronization topology. Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are shown as source tenants directing synchronization flows towards Contoso, which is the target tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Contoso_EMEA[&amp;quot;Contoso Europe, Middle East, and Africa (Contoso EMEA)&amp;quot;] --&amp;gt; Contoso[&amp;quot;Contoso (Target Tenant)&amp;quot;];
    Contoso_US[&amp;quot;Contoso United States (Contoso US)&amp;quot;] --&amp;gt; Contoso[&amp;quot;Contoso (Target Tenant)&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;

&lt;p&gt;This diagram depicts the supported topology for cross-tenant synchronization in Microsoft Entra ID. It includes two administrators, one for Contoso EMEA and one for Contoso US, both of whom are engaged in cross-tenant sync activities with a central system labeled as Contoso. This central system is depicted as providing access to several services including marketing catalogs, automatic assignment policies, access reviews, and lifecycle workflows.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ContosoEMEA[Contoso EMEA Hybrid Identity Administrator] --&amp;gt; Contoso[Contoso]
    ContosoUS[Contoso US Hybrid Identity Administrator] --&amp;gt; Contoso[Contoso]
    Contoso --&amp;gt; MarketingCatalogs[Marketing catalogs]
    Contoso --&amp;gt; AutomaticAssignmentPolicies[Automatic assignment policies]
    Contoso --&amp;gt; AccessReviews[Access Reviews]
    Contoso --&amp;gt; LifecycleWorkflows[Lifecycle Workflows]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;This supported topology for cross-tenant synchronization is one of many in Microsoft Entra ID. Tenants can be a source tenant, a target tenant, or both. In the following sections, learn how cross-tenant synchronization and Microsoft Entra ID Governance features address several scenarios.&lt;/p&gt;
&lt;h1&gt;Manage employee lifecycles across tenants&lt;/h1&gt;
&lt;p&gt;Cross-tenant synchronization in Microsoft Entra ID automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various properties of a Microsoft Entra B2B collaboration user. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in multitenant organizations.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.&lt;/p&gt;
&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;This figure illustrates the process of cross-tenant synchronization and application provisioning related to access packages. It shows three main components connected through directional arrows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cross-tenant Synchronization (syncs user attribute data) - represented by the first diagram that includes two overlaid blue triangles pointing towards a central platform.&lt;/li&gt;
&lt;li&gt;Application Provisioning - represented by the central diagram featuring a cloud icon with arrows pointing inward.&lt;/li&gt;
&lt;li&gt;Automatic Assignment Policies for Access Packages - represented by the final diagram showing a grid layout within a square.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    CrossTenantSync(&amp;quot;Cross-tenant Synchronization (syncs user attribute data)&amp;quot;) --&amp;gt; AppProvisioning(&amp;quot;Application Provisioning&amp;quot;)
    AppProvisioning --&amp;gt; AutoAssignPolicies(&amp;quot;Automatic Assignment Policies for Access Packages&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Automate lifecycle processes with workflows&lt;/h1&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the createdDateTime event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as userType and userPrincipalName to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h1&gt;Govern synchronized user access with access packages&lt;/h1&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;p&gt;Automatically assign access in target tenants to employees from source tenants&lt;/p&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create automatic assignment policies for access packages in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users:&lt;/p&gt;
&lt;p&gt;· In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access&lt;/p&gt;
&lt;p&gt;· In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users&lt;/p&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;p&gt;Enable source-tenant employees to request access to target-tenant shared resources&lt;/p&gt;
&lt;p&gt;With identity governance access package policies, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;p&gt;Review synchronized-user access&lt;/p&gt;
&lt;p&gt;Access reviews in Microsoft Entra ID enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn&amp;#39;t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;p&gt;Review source-tenant user access&lt;/p&gt;
&lt;p&gt;Multitenant organizations can include internal users in access reviews. This action enables access recertification in source tenants that synchronizes users. Use this approach for regular review of security groups assigned to cross-tenant synchronization. Therefore, ongoing B2B collaboration access to other tenants has approval in the user home tenant.&lt;/p&gt;
&lt;p&gt;Use access reviews of users in source tenants to avoid potential conflicts between cross-tenant synchronization and access reviews that remove denied users upon completion.&lt;/p&gt;
&lt;h1&gt;Review target-tenant user access&lt;/h1&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users provisioned by cross-tenant synchronization in target tenants. This option enables access recertification of resources in target tenants. Although organizations can target all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn’t recommend removing denied guest users automatically from access reviews. Cross-tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organizations and Microsoft 365&lt;/li&gt;
&lt;li&gt;Multitenant organization templates&lt;/li&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h1&gt;
&lt;p&gt;Article · 05/02/2024&lt;/p&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/li&gt;
&lt;li&gt;Example topologies for how you can implement your lifecycle and access controls.&lt;/li&gt;
&lt;li&gt;Deployment considerations (roles, monitoring, APIs).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Manage the lifecycle and access of a SOC user&lt;/h1&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h1&gt;Lifecycle control&lt;/h1&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don&amp;#39;t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the&lt;/p&gt;
&lt;p&gt;target tenant. When they don&amp;#39;t have any remaining entitlements in the target tenant, their B2B account will automatically be removed. Learn more&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Comparing entitlement management and cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Entitlement management&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Access control&lt;/p&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;p&gt;Entitlement management&lt;/p&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access policies&lt;/h1&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;h1&gt;Deployment topologies&lt;/h1&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h1&gt;Topology 1&lt;/h1&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant.&lt;/p&gt;
&lt;h3&gt;Text description of the figure:&lt;/h3&gt;
&lt;p&gt;The image illustrates the process flow between a source tenant and a target tenant for configuring access in Topology 1. There are 3 key steps highlighted:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source Tenant:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SoC Users&amp;#39; Governance:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Users are added to the SoC security groups through access packages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-Tenant Synchronization:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inject Attributes to Map to SoC Access Package:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Users are provisioned automatically through cross-tenant sync.&lt;/li&gt;
&lt;li&gt;SoC users will have eligible access for Security Operator and Security Admin roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Target Tenant:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Guest Accounts Provisioning:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access Packages Assignment:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Access Package 1 provides Security Reader access.&lt;/li&gt;
&lt;li&gt;Access Package 2 provides Security Operator access.&lt;/li&gt;
&lt;li&gt;Access Package 3 provides Security Admin access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TB
    SourceTenant(Source Tenant)
    TargetTenant(Target Tenant)
    SoC_1_Users(&amp;quot;SoC 1 Access Package 1 Security Reader&amp;quot;)
    SoC_2_Users(&amp;quot;SoC 2 Access Package 2 Security Operator&amp;quot;)
    SoC_3_Users(&amp;quot;SoC 3 Access Package 3 Security Admin&amp;quot;)
    SourceTenant --&amp;gt; |&amp;quot;1. SoC users&amp;#39; governance&amp;quot;| SoC_1_Users
    SourceTenant --&amp;gt; |&amp;quot;2. SoC users are provisioned through cross-tenant sync, eligible for Security Operator &amp;amp; Admin roles&amp;quot;| SoC_2_Users
    SourceTenant --&amp;gt; |&amp;quot;2. SoC users are provisioned through cross-tenant sync, eligible for Security Operator &amp;amp; Admin roles&amp;quot;| SoC_3_Users
    TargetTenant --&amp;gt; |&amp;quot;3. Provide Security Reader access through Access Package 1&amp;quot;| SoC_1_Users
    TargetTenant --&amp;gt; |&amp;quot;3. Provide Security Operator access through Access Package 2&amp;quot;| SoC_2_Users
    TargetTenant --&amp;gt; |&amp;quot;3. Provide Security Admin access through Access Package 3&amp;quot;| SoC_3_Users
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Steps to configure topology 1&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, configure cross-tenant synchronization to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll automatically be provisioned into the target tenant. As they&amp;#39;re removed from the configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute mappings, you can add a new mapping of type constant to provision a directory extension attribute on the user to indicate that they&amp;#39;re a SOC administrator. Alternatively, if you have an attribute such as department that you can rely on for this step, you can skip creating the extension. This attribute will be used in the target tenant to provide them with access to the necessary roles.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the source tenant, create an access package that includes the cross-tenant synchronization service principal as a resource.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant synchronization service principal. Ensure that you set up periodic access reviews of the access package or time-limit the assignments to ensure that only the users that need access to the target tenant continue to have access.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;In the target tenant, create access packages to provide the necessary roles for investigating an incident.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We recommend one autoassigned access package to provide the Security Reader role and one request based package for the Security Operator and Security Administrator roles.&lt;/p&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary access packages in the source tenant. Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the security reader role. They can then request additional access in any tenants where they need the Security Operator or Security Administrator roles. Once their access period is over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the target tenants they don&amp;#39;t need access to anymore.&lt;/p&gt;
&lt;p&gt;In topology 2 the target tenant administrator defines the access packages and resources that the source users can request access to. If the source tenant administrator would like to restrict which of their users can access the target tenant, you can use a cross-tenant access policy coupled with an access package to block all access to the target tenant, except for users that are part of a group that is included in an access package in the home tenant.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Text description of the figure:&lt;/p&gt;
&lt;p&gt;The image presents a flowchart diagram illustrating the steps and procedures between a &amp;quot;Source tenant&amp;quot; and a &amp;quot;Target tenant.&amp;quot; Three main steps are depicted: (1) SoC users&amp;#39; governance, (2) Guest accounts provisioning, and (3) Access packages assignment. The first step involves establishing a connected organization between the tenants. The second step outlines defining access packages within the target tenant that are necessary for various roles and ensuring they are accessible by the connected organization. The third step shows that upon requesting an access package, SoC users will automatically receive Security Reader access and will be eligible for Security Operator and Security Admin roles. The roles are represented by three access packages: Security Reader, Security Operator, and Security Admin.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant(&amp;quot;Source Tenant&amp;quot;) --&amp;gt;|&amp;quot;1. Establish a connected organization&amp;quot;| ConnectedOrganization(&amp;quot;Connected Organization&amp;quot;);
    ConnectedOrganization --&amp;gt;|&amp;quot;2. Define access packages for necessary roles&amp;quot;| PackageDefinition(&amp;quot;Access Packages Defined&amp;quot;);
    PackageDefinition --&amp;gt;|&amp;quot;3. Access Packages Assignment&amp;quot;| PackageAssignment(&amp;quot;Access Packages Assigned&amp;quot;);
    PackageAssignment --&amp;gt; SecurityReader(&amp;quot;Security Reader&amp;quot;);
    PackageAssignment --&amp;gt; SecurityOperator(&amp;quot;Security Operator&amp;quot;);
    PackageAssignment --&amp;gt; SecurityAdmin(&amp;quot;Security Admin&amp;quot;);
    SecurityReader --&amp;gt;|&amp;quot;SoC users auto-assigned upon request&amp;quot;| Users(&amp;quot;SoC Users&amp;quot;);
    SecurityOperator --&amp;gt;|&amp;quot;Eligible access&amp;quot;| Users;
    SecurityAdmin --&amp;gt;|&amp;quot;Eligible access&amp;quot;| Users;
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Steps to configure topology 2&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, add the source tenant as a connected organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users from the source tenant can now request access packages in the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h1&gt;Topologies compared&lt;/h1&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;h1&gt;Deployment considerations&lt;/h1&gt;
&lt;p&gt;Monitoring&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Defender are also audited.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;h1&gt;Scaling deployment with PowerShell / APIs&lt;/h1&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell commandlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Role-based access control&lt;/h1&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuring cross-tenant access settings - Security Administrator&lt;/li&gt;
&lt;li&gt;Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/li&gt;
&lt;li&gt;Configuring entitlement management - Identity Governance Administrator&lt;/li&gt;
&lt;li&gt;Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;· What is entitlement management?&lt;/p&gt;
&lt;p&gt;· Multitenant management in Defender XDR&lt;/p&gt;
&lt;h1&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 02/14/2024&lt;/p&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see Microsoft Entra application provision UserVoice ZZ. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h1&gt;Note&lt;/h1&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;h1&gt;Authorization&lt;/h1&gt;
&lt;h2&gt;Unable to change provisioning mode back to manual&lt;/h2&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h1&gt;Attribute mappings&lt;/h1&gt;
&lt;h2&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/h2&gt;
&lt;p&gt;The attributes SamAccountName and userType aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see Missing source attribute.&lt;/p&gt;
&lt;h2&gt;Source attribute dropdown missing for schema extension&lt;/h2&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and&lt;/p&gt;
&lt;h1&gt;Null attribute can&amp;#39;t be provisioned&lt;/h1&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h1&gt;Maximum characters for attribute-mapping expressions&lt;/h1&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h2&gt;Unsupported scoping filters&lt;/h2&gt;
&lt;p&gt;The appRoleAssignments, userType, and accountExpires attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h1&gt;Multivalue directory extensions&lt;/h1&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h1&gt;Service issues&lt;/h1&gt;
&lt;p&gt;Unsupported scenarios&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provisioning passwords isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning nested groups isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/li&gt;
&lt;li&gt;Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h1&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h1&gt;Manager isn&amp;#39;t provisioned&lt;/h1&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h1&gt;The provisioning interval is fixed&lt;/h1&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h1&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Switching from Sync All to Sync Assigned not working&lt;/h1&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h1&gt;Provisioning cycle continues until completion&lt;/h1&gt;
&lt;p&gt;When you set provisioning to enabled = off or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h1&gt;Member of group not provisioned&lt;/h1&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h1&gt;Global Reader&lt;/h1&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the microsoft.directory/applications/synchronization/standard/read&lt;/p&gt;
&lt;h1&gt;Microsoft Azure Government Cloud&lt;/h1&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h1&gt;On-premises application provisioning&lt;/h1&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h1&gt;Application and directories&lt;/h1&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;p&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/p&gt;
&lt;p&gt;· When a user is managed by Microsoft Entra Connect, the source of authority is on-premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/p&gt;
&lt;p&gt;· Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on this &lt;a href=&quot;https://your-link-here.com&quot;&gt;website 4&lt;/a&gt; to track the status of the preview. Alternatively, you can use &lt;a href=&quot;https://your-link-here.com&quot;&gt;Microsoft Identity Manager&lt;/a&gt; for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/p&gt;
&lt;h1&gt;Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. You can&amp;#39;t bring a user into the directory from a third-party application. Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.&lt;/p&gt;
&lt;h1&gt;Attributes and objects&lt;/h1&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multivalued attributes.&lt;/li&gt;
&lt;li&gt;Reference attributes (for example, manager).&lt;/li&gt;
&lt;li&gt;Groups.&lt;/li&gt;
&lt;li&gt;Complex anchors (for example, ObjectTypeName+UserName).&lt;/li&gt;
&lt;li&gt;Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;&lt;/li&gt;
&lt;li&gt;Binary attributes.&lt;/li&gt;
&lt;li&gt;On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSL certificates&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h2&gt;Anchor attributes&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h2&gt;Attribute discovery and mapping&lt;/h2&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;h2&gt;Provisioning agent&lt;/h2&gt;
&lt;p&gt;· The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/p&gt;
&lt;p&gt;· The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR- driven provisioning.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;How provisioning works&lt;/p&gt;
&lt;h1&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named Cairo and two member tenants named Berlin and Athens.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see Set up a multitenant org in Microsoft 365 and Join or leave a multitenant organization in Microsoft 365. To learn how to configure Microsoft Teams for your multitenant organization, see The new Microsoft Teams desktop client.&lt;/p&gt;
&lt;p&gt;Figure: Illustration showing the Cross-tenant access settings between the example owner tenant, Cairo, and member tenants, Athens and Berlin. The owner tenant Cairo is at the top, with directional arrows pointing towards the member tenants, Athens on the left and Berlin on the right, demonstrating the access configuration among them. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantCairo[&amp;quot;Owner tenant (Cairo)&amp;quot;] --&amp;gt; MemberTenantAthens[&amp;quot;Member tenant (Athens)&amp;quot;]
    OwnerTenantCairo[&amp;quot;Owner tenant (Cairo)&amp;quot;] --&amp;gt; MemberTenantBerlin[&amp;quot;Member tenant (Berlin)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h3&gt;Step 1: Sign in to the owner tenant&lt;/h3&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start PowerShell.&lt;/li&gt;
&lt;li&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/li&gt;
&lt;li&gt;Get the tenant ID of the owner and member tenants and initialize variables.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$OwnerTenantId = &amp;quot;&amp;lt;OwnerTenantId&amp;gt;&amp;quot;
$MemberTenantIdB = &amp;quot;&amp;lt;MemberTenantIdB&amp;gt;&amp;quot;
$MemberTenantIdA = &amp;quot;&amp;lt;MemberTenantIdA&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the owner tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Connect-MgGraph -TenantId $OwnerTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;eadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 2: Create a multitenant organization&lt;/h1&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;A diagram shows a multitenant organization creation flow. A blue triangle points downwards, symbolizing the initiation or start of the process in an Owner tenant environment.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Start(&amp;quot;Start - Owner Tenant&amp;quot;) --&amp;gt; Command1[&amp;quot;Update-MgBetaTenantRelationshipMultiTenantOrganization - DisplayName &amp;#39;Cairo&amp;#39;&amp;quot;]
    Command1 --&amp;gt; Check[&amp;quot;Get-MgBetaTenantRelationshipMultiTenantOrganization - Format List&amp;quot;]
    Check --&amp;gt; ActiveState[&amp;quot;State: active&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Update-&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MgBetaTenantRelationshipMultiTenantOrganization command to create your multitenant organization. This operation can take a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganization command to check that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;CreatedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Cairo&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdC&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinRequest&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell.Models.MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationJoinRequestRecord&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;Tenants&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;iTenantOrganization/$entity]}&lt;/p&gt;
&lt;h1&gt;Step 3: Add tenants&lt;/h1&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the New- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to add tenants to your multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdB -DisplayName &amp;quot;Berlin&amp;quot; | Format-List&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdA -DisplayName &amp;quot;Athens&amp;quot; | Format-List&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AddedByTenantId: &lt;OwnerTenantId&gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime:&lt;/p&gt;
&lt;p&gt;DisplayName: Cairo&lt;/p&gt;
&lt;p&gt;Id: &lt;MtoIdC&gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime:&lt;/p&gt;
&lt;p&gt;Role: owner&lt;/p&gt;
&lt;p&gt;State: active&lt;/p&gt;
&lt;p&gt;TenantId: &lt;OwnerTenantId&gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails: Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties: {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h3&gt;Diagram description&lt;/h3&gt;
&lt;p&gt;The figure represents a flowchart or diagram delineating the relationships or operations described in the PowerShell commands text involving tenants management in a multitenant setup.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenant[&amp;quot;Owner Tenant&amp;quot;] --&amp;gt; Berlin[&amp;quot;Tenant: Berlin&amp;quot;]
    OwnerTenant --&amp;gt; Athens[&amp;quot;Tenant: Athens&amp;quot;]
    Berlin --&amp;gt; Cairo[&amp;quot;Tenant: Cairo&amp;quot;]
    Athens --&amp;gt; Cairo
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;: 1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;: Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;: pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails AdditionalProperties : {[multiTenantOrgLabelType, none] }&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:08:47 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Athens&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: pending&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell.Models. MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h1&gt;Step 4: (Optional) Change the role of a tenant&lt;/h1&gt;
&lt;p&gt;Description of the figure: Diagram showing the potential transitions between roles in a multi-tenant organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    MemberTenant --&amp;gt; OwnerTenant[&amp;quot;Change member tenant to owner tenant&amp;quot;];
    OwnerTenant --&amp;gt; MemberTenant[&amp;quot;Change owner tenant to member tenant&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the Update- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to change a member tenant to an owner tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; Format-List&lt;/p&gt;
&lt;h1&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/h1&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -
MultiTenantOrganizationMemberId $MemberTenantIdB
Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;AddedByTenantId
: &amp;lt; OwnerTenantId&amp;gt;
AddedDateTime
: 1/8/2024 8:05:25 PM
DeletedDateTime
:
DisplayName
: Berlin
Id
: &amp;lt; MtoIdB&amp;gt;
JoinedDateTime
:
Role
: owner
State
: pending
TenantId
: &amp;lt; MemberTenantIdB&amp;gt;
TransitionDetails
:
Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity%5D&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity]&lt;/a&gt;, [multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h1&gt;Step 5: (Optional) Remove a member tenant&lt;/h1&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h3&gt;Description of the Missing Figure&lt;/h3&gt;
&lt;p&gt;The figure likely illustrates a diagram or flowchart showing the relationship between the owner tenant and member tenants within an organization, demonstrating the process or authorization required to remove a member tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA --&amp;gt; MemberTenantB
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove any member tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get: Unable to read the company information from the directory.&lt;/p&gt;
&lt;p&gt;Status: 404 (NotFound) ErrorCode: Directory_ObjectNotFound Date: 2024-01-08T20:35:11&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Step 6: Sign in to a member tenant&lt;/p&gt;
&lt;p&gt;Text Description for Figure: The figure illustrates a graphical user interface depicting the process of signing into a member tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CairoTenant --&amp;gt; BerlinTenant;
    CairoTenant --&amp;gt; AthensTenant;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $MemberTenantIdB -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 7: Join the multitenant organization&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt;
A diagram showing the process to join the multitenant organization. The diagram contains an arrow pointing downwards which symbolizes the action of joining.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Start[Join Process Start] --&amp;gt; End[Join Process End]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the member tenant, use the Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to join the multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest - AddedByTenantId $OwnerTenantId | Format-List&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to verify the join.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest Format-List&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemberState&lt;/td&gt;
&lt;td&gt;: active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationJoinRequestTransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties : {[@odata.context,&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt; iTenantOrganization/joinRequest/$entity]}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;3. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/p&gt;
&lt;p&gt;command to check the multitenant organization itself. It should reflect the&lt;/p&gt;
&lt;p&gt;join operation.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-&lt;/p&gt;
&lt;p&gt;List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:05:25 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Berlin&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 9:53:55 PM&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Cairo&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; Id&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: owner&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell.Models.MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours before joining a multitenant organization is completed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 8: (Optional) Leave the multitenant organization&lt;/h1&gt;
&lt;p&gt;Figure contains a downward-pointing triangle icon, symbolizing the option to leave or exit an organization. This figurative representation likely emphasizes the action of leaving or exiting as one moves away from the apex of involvement, symbolized by the broad end of the triangle.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;Member Tenant (current state)&amp;quot;] --&amp;gt; B[&amp;quot;Exited State&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.&lt;/p&gt;
&lt;p&gt;If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see Step 4: (Optional) Change the role of a tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;. In the tenant, use the Remove- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId &lt;MemberTenantId&gt;&lt;/p&gt;
&lt;p&gt;Step 9: (Optional) Delete the multitenant organization&lt;/p&gt;
&lt;h1&gt;Owner tenant&lt;/h1&gt;
&lt;p&gt;You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the final owner tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $OwnerTenantId&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;The new Microsoft Teams desktop client&lt;/li&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access policy partner template&lt;/h1&gt;
&lt;p&gt;The cross-tenant access partner configuration handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h1&gt;Configure inbound and outbound automatic redemption&lt;/h1&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the Update multiTenantOrganizationPartnerConfigurationTemplate API. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationPartnerConfiguration&lt;/p&gt;
&lt;p&gt;{
&amp;quot;inboundTrust&amp;quot;: {
&amp;quot;isMfaAccepted&amp;quot;: true,
&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
},
&amp;quot;automaticUserConsentSettings&amp;quot;: {
&amp;quot;inboundAllowed&amp;quot;: true,
&amp;quot;outboundAllowed&amp;quot;: true
},
&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners,existingPartners&amp;quot;
}&lt;/p&gt;
&lt;h1&gt;Disable the template for existing partners&lt;/h1&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;HTTP PATCH request to modify cross tenant access policy templates, specifically targeting the configuration for multi-tenant organization partner. The inbound trust accepts multifactor authentication, compliant devices, and hybrid Azure AD joined devices. Both inbound and outbound automatic user consent is allowed. The application level is set specifically for new partners.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    API[HTTP PATCH Request] --&amp;gt;|URL| URL[https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration]
    API --&amp;gt;|Body| Body1[Inbound Trust: MFA, Compliant Device, Hybrid Azure AD joined Device]
    Body1 --&amp;gt; Body2[Automatic User Consent Settings: Inbound Allowed, Outbound Allowed]
    Body2 --&amp;gt; Body3[Template Application Level: newPartners]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Disable the template completely&lt;/h1&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;{
&amp;quot;inboundTrust&amp;quot;: {
&amp;quot;isMfaAccepted&amp;quot;: true,
&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
},
&amp;quot;automaticUserConsentSettings&amp;quot;: {
&amp;quot;inboundAllowed&amp;quot;: true,
&amp;quot;outboundAllowed&amp;quot;: true
},
&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}&lt;/p&gt;
&lt;h1&gt;Reset the template&lt;/h1&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the multiTenantOrganizationPartnerConfigurationTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;POST&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Cross-tenant synchronization template&lt;/h1&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h1&gt;Configure inbound user synchronization&lt;/h1&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the Update multiTenantOrganizationIdentitySyncPolicyTemplate API. If you create or join a&lt;/p&gt;
&lt;p&gt;multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization 
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners,existingPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Disable the template for existing partners&lt;/p&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization 
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Disable the template completely&lt;/p&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PATCH&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;{ &amp;quot;userSyncInbound&amp;quot;: { &amp;quot;isSyncAllowed&amp;quot;: true }, &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot; }  &lt;/p&gt;
&lt;p&gt;Reset the template  &lt;/p&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings API.  &lt;/p&gt;
&lt;p&gt;Request  &lt;/p&gt;
&lt;p&gt;HTTP  &lt;/p&gt;
&lt;p&gt;POST&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;Next steps  &lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;Configure cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/11/2024&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Figure 0: Diagram showing the flow between Source Tenant and Target Tenant with details on internal and external users and their respective settings. The Source Tenant (left) includes &amp;#39;UserS1&amp;#39;, &amp;#39;UserS2&amp;#39;, &amp;#39;UserS3&amp;#39; within the &amp;#39;Internal&amp;#39; category and their &amp;#39;Outbound access settings&amp;#39; are configured to &amp;#39;Automatically redeem invitations&amp;#39;. The &amp;#39;Cross-tenant synchronization&amp;#39; arrow points towards the Target Tenant, which contains &amp;#39;UserT1&amp;#39;, &amp;#39;UserT2&amp;#39;, &amp;#39;UserT3&amp;#39;, and &amp;#39;GroupT1&amp;#39; within the &amp;#39;Internal&amp;#39; section, and external users &amp;#39;UserS1&amp;#39; and &amp;#39;UserS3&amp;#39;. The &amp;#39;Inbound access settings&amp;#39; of the Target Tenant allow synchronization into this tenant and &amp;#39;Automatically redeem invitations&amp;#39; is active. Configuration settings are highlighted, including &amp;#39;Scope&amp;#39; and &amp;#39;Scoping filters&amp;#39; for department EQUALS Marketing with &amp;#39;Attribute mappings&amp;#39; for &amp;#39;accountEnabled&amp;#39;, &amp;#39;employeeld&amp;#39;, &amp;#39;userPrincipalName + extensionName&amp;#39; as &amp;#39;companyName&amp;#39;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    UserS1_Internal(Source Tenant: UserS1 Internal) --&amp;gt;|Cross-tenant synchronization| UserS1_Internal_Target(Target Tenant: UserS1 Internal)
    UserS2_Internal(Source Tenant: UserS2 Internal) --&amp;gt;|Cross-tenant synchronization| UserS2_Internal_Target(Target Tenant: UserS2 Internal)
    UserS3_Internal(Source Tenant: UserS3 Internal) --&amp;gt;|Cross-tenant synchronization| UserS3_Internal_Target(Target Tenant: UserS3 Internal)
    UserS1_Internal -.-&amp;gt;|Automatically redeem invitations| UserS1_External_Target(Target Tenant: UserS1 External)
    UserS3_Internal -.-&amp;gt;|Automatically redeem invitations| UserS3_External_Target(Target Tenant: UserS3 External)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Learning objectives&lt;/h1&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Remove B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Keep user attributes synchronized between your source and target tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prerequisites&lt;/p&gt;
&lt;p&gt;Figure 1: Placeholder representing prerequisites for implementing cross-tenant synchronization, likely indicating necessary configurations or initial settings within the Source Tenant.&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Step 1: Plan your provisioning deployment&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Define how you would like to structure the tenants in your organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn about how the provisioning service works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine who will be in scope for provisioning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine what data to map between tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the source tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Inbound access settings - Contoso &amp;gt; External Identities&lt;/p&gt;
&lt;p&gt;Figure: The screenshot shows the settings interface for &amp;quot;External Identities | Cross-tenant access settings&amp;quot; under Microsoft Entra for the Contoso organization. It includes various options like &amp;quot;Add organization&amp;quot;, &amp;quot;Refresh&amp;quot;, and &amp;quot;Columns&amp;quot;. Below these, there are sections labeled &amp;quot;Organizational settings&amp;quot;, &amp;quot;Default settings&amp;quot;, and &amp;quot;Microsoft cloud settings&amp;quot;. The interface allows adding an external Microsoft Entra tenant by typing one of its domain names or tenant ID. There is also an informational message discussing the usage of cross-tenant access settings to manage collaboration with external Microsoft cloud tenants. The document interface seems to be set to add or manage settings.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Settings[&amp;quot;External Identities | Cross-tenant access settings&amp;quot;]
    AddOrganization[&amp;quot;Add organization&amp;quot;]
    Refresh[&amp;quot;Refresh&amp;quot;]
    Columns[&amp;quot;Columns&amp;quot;]

    Settings --&amp;gt; AddOrganization
    Settings --&amp;gt; Refresh
    Settings --&amp;gt; Columns
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Under Inbound access of the added organization, select Inherited from default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Cross-tenant sync tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Allow users sync into this tenant check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Figure: The image depicts the interface for &amp;quot;Inbound access settings - Fabrikam&amp;quot; with tabs for B2B collaboration, B2B direct connect, Trust settings, and Cross-tenant sync. In the Cross-tenant sync tab, it describes the function enabling the admin of one tenant to sync objects into another tenant. Options to allow this feature are displayed with a checkbox labeled &amp;quot;Allow users sync into this tenant&amp;quot;. The snapshot captures buttons for &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    B2BCollab[&amp;quot;B2B collaboration&amp;quot;]
    B2BDirectConnect[&amp;quot;B2B direct connect&amp;quot;]
    TrustSettings[&amp;quot;Trust settings&amp;quot;]
    CrossTenantSync[&amp;quot;Cross-tenant sync - Allow users sync into this tenant&amp;quot;]

    B2BCollab --&amp;gt; CrossTenantSync
    B2BDirectConnect --&amp;gt; CrossTenantSync
    TrustSettings --&amp;gt; CrossTenantSync
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see an Enable cross-tenant sync and auto-redemption dialog box asking if you want to enable auto-redemption, select Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selecting Yes will automatically redeem invitations in the target tenant.&lt;/p&gt;
&lt;p&gt;✅
X&lt;/p&gt;
&lt;h1&gt;Inbound access settings - Fabrikam ..&lt;/h1&gt;
&lt;p&gt;Figure: The image depicts a mock-up of a user interface for &amp;quot;Inbound access settings&amp;quot; in a software application. The primary focus is on tabs labeled &amp;quot;B2B collaboration&amp;quot;, &amp;quot;B2B direct connect&amp;quot;, &amp;quot;Trust settings&amp;quot;, and &amp;quot;Cross-tenant sync&amp;quot;. A dialog box titled &amp;quot;Enable cross-tenant sync and auto-redemption?&amp;quot; is prominently displayed, offering a &amp;quot;Yes&amp;quot; and &amp;quot;No&amp;quot; option. Additional text within the dialog explains the implications of enabling or disabling cross-tenant synchronization and auto-redemption.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Settings[&amp;quot;Inbound Access Settings Page&amp;quot;] --&amp;gt; B2BCollaboration[&amp;quot;Tab: B2B Collaboration&amp;quot;];
    Settings --&amp;gt; B2BDirectConnect[&amp;quot;Tab: B2B Direct Connect&amp;quot;];
    Settings --&amp;gt; TrustSettings[&amp;quot;Tab: Trust Settings&amp;quot;];
    Settings --&amp;gt; CrossTenantSync[&amp;quot;Tab: Cross-tenant Sync&amp;quot;];
    CrossTenantSync --&amp;gt; EnableSyncDialog[&amp;quot;Dialog: Enable Cross-tenant Sync and Auto-redemption&amp;quot;];
    EnableSyncDialog --&amp;gt; YesOption[&amp;quot;Option: Yes&amp;quot;];
    EnableSyncDialog --&amp;gt; NoOption[&amp;quot;Option: No&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;p&gt;Figure: A generic placeholder icon for a document or operations step is shown, suggesting this part of the document deals with a procedural step regarding &amp;quot;Automatically redeem invitations in the target tenant&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Step[&amp;quot;Procedural Step: Automatically Redeem Invitations&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;p&gt;In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt. This setting must be checked in both the source tenant (outbound) and target tenant (inbound). For more information, see Automatic redemption setting.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, on the same Inbound access settings page, select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This box might already be checked if you previously selected Yes in the Enable cross-tenant sync and auto-redemption dialog box.&lt;/p&gt;
&lt;p&gt;Figure: The image displays a section of a user interface focusing on a setting labeled &amp;quot;Automatic redemption&amp;quot;. A checkbox next to the text indicates the option to &amp;quot;Automatically redeem invitations with the tenant Fabrikam&amp;quot;. Additional text below the checkbox explains that selecting this option will suppress the consent prompt for first-time access through cross-tenant synchronization, B2B collaborations, or B2B direct connect, requiring that the setting is also enabled for outbound access.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SettingSection[&amp;quot;Automatic Redemption Setting Section&amp;quot;] --&amp;gt; Checkbox[&amp;quot;Checkbox: Automatically Redeem Invitations with Tenant Fabrikam&amp;quot;];
    SettingSection --&amp;gt; ExplanationText[&amp;quot;Explanation: Helps suppress consent prompt on first-time access&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Save.
❌ ❌ ❌&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 4: Automatically redeem invitations in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Figure Description&lt;/strong&gt;: The screenshot depicts a browser window with Microsoft Entra admin center opened to the &amp;quot;External Identities | Cross-tenant access settings&amp;quot; page. The &amp;quot;Add organization&amp;quot; modal dialog is displayed, prompting the user to type a tenant ID or domain name. The screen also shows tabs for &amp;quot;Organizational settings,&amp;quot; &amp;quot;Default settings,&amp;quot; and various other options on the sidebar including &amp;quot;Overview,&amp;quot; &amp;quot;All identity providers,&amp;quot; and &amp;quot;User flows.&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Under Outbound access for the target organization, select Inherited from default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Home &amp;gt; Fabrikam &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;h1&gt;Outbound access settings - Contoso&lt;/h1&gt;
&lt;p&gt; ✅
X&lt;/p&gt;
&lt;p&gt;B2B collaboration ❌ B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more
 ✅ ✅
V Automatically redeem invitations with the tenant Contoso.&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Select Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step 5: Create a configuration in the source tenant&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure Description&lt;/strong&gt;: The image is a screenshot depicting the user interface for creating a new configuration in the source tenant on a web-based platform. It displays options like &amp;quot;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&amp;quot;, with a navigation path shown at the top. There are buttons such as &amp;quot;Configurations&amp;quot;, and &amp;quot;New configuration&amp;quot;, with steps listed for creating a configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, select New configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a name for the configuration and select Create.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It can take up to 15 seconds for the configuration that you just created to appear in the list.&lt;/p&gt;
&lt;p&gt;Step 6: Test the connection to the target tenant&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Figure Description&lt;/strong&gt;: This image illustrates the user interface for testing a configuration between the source and target tenant. The user interface shows that a new configuration appears in a list, highlighting the ability to select and test connectivity between the source and the target tenant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Outbound access settings - Contoso &amp;gt; Cross-tenant synchronization | Configurations &amp;gt;&lt;/p&gt;
&lt;p&gt;Fabrikam to Contoso Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Overview
 ✅
X&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Got feedback?&lt;/p&gt;
&lt;p&gt;Overview&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage
Users and groups
Provisioning
Expression builder
Activity
Audit logs
Provisioning logs
Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support
New support request&lt;/p&gt;
&lt;p&gt;Automate identity lifecycle management with Microsoft Entra&lt;/p&gt;
&lt;p&gt;Automatically create, update, and delete accounts when users join, leave, and move within your organization. Learn more.&lt;/p&gt;
&lt;p&gt;Get started&lt;/p&gt;
&lt;p&gt;What is provisioning? Plan an application deployment.&lt;/p&gt;
&lt;p&gt;Configure automatic provisioning.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Get started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the Provisioning Mode to Automatic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the Admin Credentials section, change the Authentication Method to Cross Tenant Synchronization Policy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first image shows the Fabrikam to Contoso Overview page within a software interface, displaying sections like Overview, Manage (including Users and groups, Provisioning, and other options), Activity, and Troubleshooting + Support. It highlights features for automating identity lifecycle management by allowing administrators to automatically create, update, and delete user accounts as needed within an organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; Provision_On_Demand[&amp;quot;Provision on demand&amp;quot;];
    Overview --&amp;gt; Manage;
    Manage --&amp;gt; Users_and_groups[&amp;quot;Users and groups&amp;quot;];
    Manage --&amp;gt; Provisioning;
    Manage --&amp;gt; Expression_builder[&amp;quot;Expression builder&amp;quot;];
    Overview --&amp;gt; Activity;
    Activity --&amp;gt; Audit_logs[&amp;quot;Audit logs&amp;quot;];
    Activity --&amp;gt; Provisioning_logs[&amp;quot;Provisioning logs&amp;quot;];
    Activity --&amp;gt; Insights;
    Overview --&amp;gt; Troubleshooting_Support[&amp;quot;Troubleshooting + Support&amp;quot;];
    Troubleshooting_Support --&amp;gt; New_support_request[&amp;quot;New support request&amp;quot;];
    Overview --&amp;gt; Automate_identity_management[&amp;quot;Automate identity lifecycle management&amp;quot;];
    Automate_identity_management --&amp;gt; Automatic_creation[&amp;quot;Automatically create, update, delete accounts&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second image is a detailed view of the Provisioning settings in the Microsoft Entra platform, indicating how to set up automatic user account provisioning between Fabrikam and Contoso. The screenshot includes options to select provisioning mode, configure admin credentials, and set an authentication method specifically tailored for Cross Tenant Synchronization Policy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Provisioning_Page[&amp;quot;Provisioning Page&amp;quot;] --&amp;gt; Provisioning_Mode_Select[&amp;quot;Provisioning Mode: Automatic&amp;quot;];
    Provisioning_Page --&amp;gt; Admin_Credentials_Section[&amp;quot;Admin Credentials Section&amp;quot;];
    Admin_Credentials_Section --&amp;gt; Authentication_Method_Selection[&amp;quot;Authentication Method: Cross Tenant Synchronization Policy&amp;quot;];
    Admin_Credentials_Section --&amp;gt; Tenant_Id_Input[&amp;quot;Tenant Id Input&amp;quot;];
    Admin_Credentials_Section --&amp;gt; Test_Connection_Button[&amp;quot;Test Connection Button&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5. In the Tenant Id box, enter the tenant ID of the target tenant.&lt;/p&gt;
&lt;p&gt;6. Select Test Connection to test the connection.&lt;/p&gt;
&lt;p&gt;You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see Troubleshooting tips later in this article.&lt;/p&gt;
&lt;p&gt;Figure: A screenshot of a notifications panel. The upper section shows a link for &amp;quot;More events in the activity log&amp;quot; and a &amp;quot;Dismiss all&amp;quot; button. The main focus is on a confirmation message stating &amp;quot;Testing connection to Fabrikam to Contoso&amp;quot; with a green check mark, and beneath this text, &amp;quot;The supplied credentials are authorized to enable provisioning&amp;quot; followed by a timestamp of &amp;quot;a few seconds ago&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    ConnectionTest(Fabrikam to Contoso Connection Test) --&amp;gt;|Status| Authorized{Credentials Authorized}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;7. Select Save.&lt;/p&gt;
&lt;p&gt;Mappings and Settings sections appear.&lt;/p&gt;
&lt;p&gt;8. Close the Provisioning page.&lt;/p&gt;
&lt;h1&gt;Step 7: Define who is in scope for provisioning&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:&lt;/p&gt;
&lt;p&gt;· Based on assignment to the configuration&lt;/p&gt;
&lt;p&gt;. Based on attributes of the user&lt;/p&gt;
&lt;p&gt;Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Settings section.&lt;/p&gt;
&lt;figure&gt;
The image shows a screenshot of a digital interface for &quot;Fabrikam to Contoso&quot; provisioning settings within a software application. Key visible elements include:  
- navigation tabs such as &apos;Overview&apos;, &apos;Provision on demand&apos;, &apos;Users and groups&apos;, &apos;Provisioning&apos;, etc.  
- a selected option in settings &apos;Sync only assigned users and groups&apos; under the &apos;Scope&apos;.  
- various toggles for &apos;Prevent accidental deletion&apos;, &apos;Provisioning Status&apos;, and checkboxes for &apos;Send an email notification when a failure occurs&apos;.  
- buttons for &apos;Save&apos; and &apos;Discard&apos; at the top of the interface.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; ProvisionOnDemand[&amp;quot;Provision on demand&amp;quot;];
    ProvisionOnDemand --&amp;gt; UsersAndGroups[&amp;quot;Users and groups&amp;quot;];
    UsersAndGroups --&amp;gt; Provisioning;
    Provisioning --&amp;gt; Settings;
    Settings --&amp;gt; Scope[&amp;quot;Scope&amp;quot;];
    Scope --&amp;gt; &amp;quot;Sync only assigned users and groups&amp;quot;;
    Scope --&amp;gt; &amp;quot;Prevent accidental deletion&amp;quot;;
    Scope --&amp;gt; &amp;quot;Send an email notification when a failure occurs&amp;quot;;
    Settings --&amp;gt; &amp;quot;Provisioning Status&amp;quot;;
    Overview --&amp;gt; &amp;quot;Save/Discard&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the Scope list, select whether to synchronize all users in the source tenant or only users assigned to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;#39;s recommended that you select Sync only assigned users and groups instead of Sync all users and groups. Reducing the number of users in scope improves performance.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;p&gt;If you made any changes, select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the configuration page, select Users and groups.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Add user/group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Add Assignment page, under Users and groups, select None Selected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Users and groups pane, search for and select one or more internal users or groups you want to assign to the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you select a group to assign to the configuration, only users that are direct members in the group will be in scope for provisioning. You can select a static group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Select Select.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;9. Select Assign.&lt;/p&gt;
&lt;figure&gt;
The figure displays a user interface with the title &quot;Fabrikam to Contoso | Users and groups&quot;, part of an outbound access settings configuration for cross-tenant synchronization. Visible menu items include Overview, Provision on demand, Manage (expanded with sub-menu items for Users and groups, Provisioning, Expression builder), Activity (containing Audit logs, Provisioning logs, Insights, Troubleshooting + Support with an option for New support request). The main panel shows a table titled &quot;Display Name, Object Type, Role assigned&quot; with entries for &quot;US User3, User, Default Access&quot;, &quot;US User1, User, Default Access&quot;, and &quot;GR Group1, Group, Default Access&quot;. Additionally, a message box reminds that the application will not be visible in My Apps unless the &apos;visible to users?&apos; setting is enabled in properties.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Manage --&amp;gt; UsersAndGroups[Users and groups];
    Manage --&amp;gt; Provisioning;
    Manage --&amp;gt; ExpressionBuilder[Expression builder];
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Display Name&lt;/th&gt;
&lt;th&gt;Object Type&lt;/th&gt;
&lt;th&gt;Role assigned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;US User3&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US User1&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GR Group1&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For more information, see Assign users and groups to an application.&lt;/p&gt;
&lt;p&gt;Step 8: (Optional) Define who is in scope for provisioning with scoping filters&lt;/p&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Regardless of the value you selected for Scope in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;h1&gt;Fabrikam to Contoso | Provisioning&lt;/h1&gt;
&lt;p&gt; ✅
X&lt;/p&gt;
&lt;p&gt;Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Save ✅ Discard&lt;/p&gt;
&lt;p&gt;1 Overview&lt;/p&gt;
&lt;p&gt;V Admin Credentials&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;1 Mappings&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Mappings Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Activity - Audit logs&lt;/p&gt;
&lt;p&gt;Provisioning logs ❌ Restore default mappings&lt;/p&gt;
&lt;p&gt;Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support v Settings&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;p&gt;Provisioning Status
 ✅
+&lt;/p&gt;
&lt;p&gt;On&lt;/p&gt;
&lt;p&gt;Off&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Source Object Scope, select All records.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
The image depicts a user interface for cross-tenant synchronization under the configuration from Fabrikam to Contoso, focusing on the section titled &quot;Attribute Mapping&quot;. It features UI elements such as input checkboxes and dropdown lists. The attributes displayed allow the user to configure settings where the source object is defined as &quot;User&quot; and the scope is set for &quot;All records&quot;. Actions like &quot;Create&quot;, &quot;Update&quot;, and &quot;Delete&quot; can be toggled for the target object actions, and the setting &quot;Provision Microsoft Entra ID Users&quot; is enabled.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceObjectUser[&amp;quot;Source Object: User&amp;quot;] --&amp;gt; SourceObjectScopeAllRecords[&amp;quot;Source Object Scope: All Records&amp;quot;];
    SourceObjectScopeAllRecords --&amp;gt; TargetObjectActionsCreate[&amp;quot;Target Object Actions: Create&amp;quot;];
    SourceObjectScopeAllRecords --&amp;gt; TargetObjectActionsUpdate[&amp;quot;Target Object Actions: Update&amp;quot;];
    SourceObjectScopeAllRecords --&amp;gt; TargetObjectActionsDelete[&amp;quot;Target Object Actions: Delete&amp;quot;];
    ProvisionMicrosoftEntraIDUsersEnabled[&amp;quot;Provision Microsoft Entra ID Users: Enabled&amp;quot;] -.-&amp;gt; TargetObjectActionsCreate;
    ProvisionMicrosoftEntraIDUsersEnabled -.-&amp;gt; TargetObjectActionsUpdate;
    ProvisionMicrosoftEntraIDUsersEnabled -.-&amp;gt; TargetObjectActionsDelete;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;p&gt;On the Source Object Scope page, select Add scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add any scoping filters to define which users are in scope for provisioning.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To configure scoping filters, refer to the instructions provided in Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Add/Remove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;No scoping filters found&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;Add New Scoping Clause&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;6. Select Ok and Save to save any changes.&lt;/p&gt;
&lt;p&gt;If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.&lt;/p&gt;
&lt;p&gt;7. Select Yes and close the Attribute Mapping page.&lt;/p&gt;
&lt;p&gt;Step 9: Review attribute mappings&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;2. Select Provision Microsoft Entra ID Users.&lt;/p&gt;
&lt;p&gt;3. On the Attribute Mapping page, scroll down to review the user attributes that are synchronized between tenants in the Attribute Mappings section.&lt;/p&gt;
&lt;p&gt;The first attribute, alternativeSecurityIdentifier, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a schemaInvalid error.&lt;/p&gt;
&lt;p&gt;Figure: The image shows a screenshot of a user interface for &amp;quot;Attribute Mapping&amp;quot; in a cross-tenant synchronization tool. The UI is part of a provisioning process between &amp;quot;Fabrikam&amp;quot; and &amp;quot;Contoso&amp;quot;. The displayed section includes a list of attribute mappings with options to save or discard changes. It defines how attributes like alternativeSecurityIdentifier and accountEnabled are synchronized between Azure Active Directory of one tenant (source) and another (target). Each row contains the names of the attributes in both source and target directory, a precedence for matching, and a &amp;#39;delete&amp;#39; button to remove the attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Attribute Mapping UI] --&amp;gt; B[Fabrikam to Contoso]
    B --&amp;gt; C[Provisioning]
    C --&amp;gt; D[Save Options]
    C --&amp;gt; E[Discard Changes]
    A --&amp;gt; F[Attribute List]
    F --&amp;gt; G[AlternativesecurityIdentifier]
    F --&amp;gt; H[AccountEnabled]
    F --&amp;gt; I[Delete Button]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Active Directory Attribute&lt;/th&gt;
&lt;th&gt;Azure Active Directory (target tenant) Attribute&lt;/th&gt;
&lt;th&gt;Matching precedence&lt;/th&gt;
&lt;th&gt;Remove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AltSecldFromNetid([netid])&lt;/td&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;p&gt;Select the Member (userType) attribute to open the Edit Attribute page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review the Constant Value setting for the userType attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Constant Value&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;Users will be created as external guests (B2B collaboration users) in the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;1 Note&lt;/p&gt;
&lt;p&gt;If the B2B user already exists in the target tenant then Member (userType) will not changed to Member, unless the Apply this mapping setting is set to Always.&lt;/p&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App or service&lt;/td&gt;
&lt;td&gt;Limitations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;... &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h1&gt;Edit Attribute&lt;/h1&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type 
: Constant&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Constant Value *&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target attribute *&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Matching precedence 0&lt;/p&gt;
&lt;p&gt;Apply this mapping 
Only during object creation&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;p&gt;If you want to define any transformations, on the Attribute Mapping page, select the attribute you want to transform, such as displayName.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the Mapping type to Expression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Expression box, enter the transformation expression. For example with the display name, you can do the following:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;· Flip the first name and last name and add a comma in between.&lt;/p&gt;
&lt;p&gt;. Add the domain name in parentheses at the end of the display name.&lt;/p&gt;
&lt;p&gt;For examples, see Reference for writing expressions for attribute mappings in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Figure: The image shows a software interface for editing an attribute in a configuration setting for cross-tenant synchronization. The interface includes options for setting the mapping type to &amp;quot;Expression&amp;quot; and entering an expression for an attribute named &amp;quot;displayName&amp;quot;. The filled out expression field shows &amp;quot;[displayName]&amp;quot; and indicates that the expression was correctly parsed. Below are options for default value if null, using the expression builder, and selecting the target attribute.&lt;/p&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see Map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Step 10: Specify additional provisioning settings&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Settings section.&lt;/p&gt;
&lt;p&gt;Figure: The interface for provisioning settings in a software application, specifically showing a section labeled &amp;quot;Fabrikam to Contoso | Provisioning&amp;quot;. It includes various configurable options such as &amp;quot;Admin Credentials&amp;quot;, &amp;quot;Provision on demand&amp;quot;, &amp;quot;Mappings&amp;quot;, &amp;quot;Users and groups&amp;quot;, &amp;quot;Audit logs&amp;quot;, &amp;quot;Provisioning logs&amp;quot;, and toggles for &amp;quot;Send an email notification when a failure occurs&amp;quot;, &amp;quot;Prevent accidental deletion&amp;quot; with a threshold setting at 500, and &amp;quot;Sync only assigned users and groups&amp;quot;. The lower part of the interface displays a toggle for &amp;quot;Provisioning Status&amp;quot; set to Off.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    FabrikamToContoso(&amp;quot;Fabrikam to Contoso | Provisioning&amp;quot;) --&amp;gt; Settings;
    Settings --&amp;gt; AdminCred[Admin Credentials]
    Settings --&amp;gt; ProvisionOnDemand(&amp;quot;Provision on demand&amp;quot;)
    Settings --&amp;gt; Mappings
    Settings --&amp;gt; UsersAndGroups(&amp;quot;Users and groups&amp;quot;)
    Settings --&amp;gt; Provisioning
    Settings --&amp;gt; ExpressionBuilder(&amp;quot;Expression builder&amp;quot;)
    Settings --&amp;gt; Activity;
    Activity --&amp;gt; AuditLogs(&amp;quot;Audit logs&amp;quot;)
    Activity --&amp;gt; ProvisioningLogs(&amp;quot;Provisioning logs&amp;quot;)
    Activity --&amp;gt; Insights
    Settings --&amp;gt; Troubleshooting;
    Troubleshooting --&amp;gt; NewSupportRequest(&amp;quot;New support request&amp;quot;)
    Settings --&amp;gt; EmailNotification(&amp;quot;Send an email notification when a failure occurs&amp;quot;)
    Settings --&amp;gt; PreventDeletion(&amp;quot;Prevent accidental deletion&amp;quot;)
    PreventDeletion --&amp;gt; Threshold(&amp;quot;Threshold: 500&amp;quot;)
    Settings --&amp;gt; SyncSettings(&amp;quot;Sync only assigned users and groups&amp;quot;)
    Settings --&amp;gt; ProvisioningStatus;
    ProvisioningStatus --&amp;gt; On
    ProvisioningStatus --&amp;gt; Off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. Check the Send an email notification when a failure occurs check box.&lt;/p&gt;
&lt;p&gt;3. In the Notification Email box, enter the email address of a person or group who should receive provisioning error notifications.&lt;/p&gt;
&lt;p&gt;Email notifications are sent within 24 hours of the job entering quarantine state. For custom alerts, see Understand how provisioning integrates with Azure Monitor logs.&lt;/p&gt;
&lt;p&gt;4. To prevent accidental deletion, select Prevent accidental deletion and specify a threshold value. By default, the threshold is set to 500.&lt;/p&gt;
&lt;p&gt;For more information, see Enable accidental deletions prevention in the Microsoft Entra provisioning service.&lt;/p&gt;
&lt;p&gt;5. Select Save to save any changes.&lt;/p&gt;
&lt;p&gt;Step 11: Test provision on demand&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision on demand.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Select a user or group box, search for and select one of your test users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Figure: The UI screen depicts a navigation path within a software application from &amp;quot;Fabrikam to Contoso | Provisioning &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provision on demand&amp;quot;. It illustrates various options such as “Overview”, “Provision on demand”, &amp;quot;Manage&amp;quot;, &amp;quot;Users and groups&amp;quot;, &amp;quot;Provisioning&amp;quot;, &amp;quot;Expression builder&amp;quot;, &amp;quot;Activity&amp;quot;, &amp;quot;Audit logs&amp;quot;, &amp;quot;Provisioning logs&amp;quot;, &amp;quot;Insights&amp;quot;, &amp;quot;Troubleshooting + Support&amp;quot;, and “New support request”. The provision tab is focused with procedures to proceed with on-demand provisioning for &amp;quot;User1&amp;quot;. There is also a “Provision” button located at the bottom right of the pane.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; Provision_on_demand;
    Manage --&amp;gt; &amp;quot;Users and groups&amp;quot;;
    Manage --&amp;gt; Provisioning;
    Manage --&amp;gt; Expression_builder;
    Activity --&amp;gt; Audit_logs;
    Activity --&amp;gt; Provisioning_logs;
    Troubleshooting_Support --&amp;gt; New_support_request;
    Provision_on_demand --&amp;gt; &amp;quot;Selected user User1&amp;quot;;
    &amp;quot;Selected user User1&amp;quot; --&amp;gt; Provision_button[ Provision ];
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Select Provision.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After a few moments, the Perform action page appears with information about the provisioning of the test user in the target tenant.&lt;/p&gt;
&lt;h1&gt;Perform action&lt;/h1&gt;
&lt;p&gt;Modified attributes (successful) Data flow&lt;/p&gt;
&lt;p&gt;User &amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target attribute name&lt;/th&gt;
&lt;th&gt;Source attribute value&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Original target attribute value&lt;/th&gt;
&lt;th&gt;Modified target attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;[IsSoftDeleted]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;[accountEnabled]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;[displayName]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mailNickname&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;[mailNickname]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;AltSecIdFromNetid(&amp;quot;1003&amp;quot;)&lt;/td&gt;
&lt;td&gt;AltSecIdFromNetid([netid])&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;[preferredLanguage]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why test user was skipped.&lt;/p&gt;
&lt;p&gt;The image shows a popup titled &amp;quot;Determine if user is in scope&amp;quot;, detailing the reasons for skipping user &amp;#39;&lt;a href=&quot;mailto:alice@fabrikam.com&quot;&gt;alice@fabrikam.com&lt;/a&gt;&amp;#39;. These reasons include the user not being assigned to the application and lacking required entitlement for provisioning. Below are attributes like SkipReason (NotEffectivelyEntitled), IsActive (True), Assigned to the application (False), and IsInProvisioningScope (True).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    User_NotAssigned[&amp;quot;Assigned to the application: False&amp;quot;] --&amp;gt; SkipReason[&amp;quot;Skip Reason: NotEffectivelyEntitled&amp;quot;]
    User_InScope[&amp;quot;Is In Provisioning Scope: True&amp;quot;] --&amp;gt; IsActive[&amp;quot;Is Active: True&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the Provision on demand page, you can view details about the provision and have the option to retry.&lt;/p&gt;
&lt;p&gt;✅
Fabrikam to Contoso | Provisioning &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/p&gt;
&lt;h3&gt;Figure 1: Provision on demand - User Management Interface&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Description: The interface for &amp;quot;Provision on demand&amp;quot; in the Microsoft Entra ID shows a flow for user management, with steps including user import, determination of scope, matching between source and target system, and performing actions such as user creation or update. It marks all steps shown with a &amp;quot;Success&amp;quot; status.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ImportUser(&amp;quot;Import user - Success&amp;quot;)
    DetermineScope(&amp;quot;Determine if user is in scope - Success&amp;quot;)
    MatchUser(&amp;quot;Match user between source and target system - Success&amp;quot;)
    PerformAction(&amp;quot;Perform action in target application - Success&amp;quot;)

    ImportUser --&amp;gt; DetermineScope
    DetermineScope --&amp;gt; MatchUser
    MatchUser --&amp;gt; PerformAction
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;h3&gt;Figure 2: User Provisioning Log Details&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Description: The screenshot displays detailed logs of the provisioning activities, showing specific user activities such as &amp;#39;Import user&amp;#39;, &amp;#39;Determine if user is in scope&amp;#39;, &amp;#39;Match user between source and target system&amp;#39;, and &amp;#39;Perform action&amp;#39;. Each step has a success status and a button for viewing more details or retrying the process. A button to provision another object is also visible.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Import(&amp;quot;1. Import user - Success&amp;quot;)
    InScope(&amp;quot;2. Determine if user is in scope - Success&amp;quot;)
    Match(&amp;quot;3. Match user between source and target system - Success&amp;quot;)
    Action(&amp;quot;4. Perform action - Success&amp;quot;)

    Import --&amp;gt; InScope
    InScope --&amp;gt; Match
    Match --&amp;gt; Action
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. In the target tenant, verify that the test user was provisioned.&lt;/h2&gt;
&lt;h3&gt;Figure 3: User Verification in Microsoft Entra ID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Description: Interface showing the user1&amp;#39;s entry in the Microsoft Entra ID under Contoso tenant, verifying the user provisioning status. Contains options like &amp;#39;Download users&amp;#39;, &amp;#39;Bulk operations&amp;#39;, &amp;#39;Manage view&amp;#39;, and specific user details like display name, principal name, and company name without any classified data.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    AD(&amp;quot;Azure Directory - Microsoft Entra ID&amp;quot;)
    User(&amp;quot;User1 - Provisioned&amp;quot;)

    AD --&amp;gt; User
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;If all is working as expected, assign additional users to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information, see On-demand provisioning in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Step 12: Start the provisioning job
❌ ❌ ✅ ❌ ❌ ❌ ✅&lt;/p&gt;
&lt;h1&gt;Source tenant&lt;/h1&gt;
&lt;p&gt;The provisioning job starts the initial synchronization cycle of all users defined in Scope of the Settings section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Overview page, review the provisioning details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Description of Figure 1:&lt;/em&gt; The image shows a user interface with options for &amp;quot;Fabrikam to Contoso Provisioning&amp;quot; under &amp;quot;Cross-tenant synchronization&amp;quot;. The user interface includes tabs and buttons such as &amp;quot;Start provisioning&amp;quot;, &amp;quot;Stop provisioning&amp;quot;, &amp;quot;Restart provisioning&amp;quot;, and a progress bar indicating that the initial cycle is not run and 0% complete. It also contains links to view provisioning logs and technical information.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Select Start provisioning to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 13: Monitor provisioning&lt;/h1&gt;
&lt;p&gt;Source and target tenants&lt;/p&gt;
&lt;p&gt;Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, on the Overview page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see Check the status of user provisioning.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Description of Figure Image:&lt;/em&gt; The image captures an Overview page where the user can observe the current cycle status through a progress bar.&lt;/p&gt;
&lt;p&gt;If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;figure&gt;
Description of Figure: The interface screenshot displays the overview of &quot;Fabrikam to Contoso&quot; provisioning in Microsoft Entra ID. Key features visible include tabs for overview, provision on demand, and various user activity. The screen highlights options such as start, stop, and restart provisioning, with a visual indication that the initial cycle is completed and current users status showing &quot;2&quot;. The sidebar offers access to other areas such as Users and groups, Audit logs, Provisioning logs, and more.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview[&amp;quot;Fabrikam to Contoso | Overview&amp;quot;] --&amp;gt;|Provisioning options| Start_provisioning[Start provisioning]
    Overview --&amp;gt;|Provisioning options| Stop_provisioning[Stop provisioning]
    Overview --&amp;gt;|Provisioning options| Restart_provisioning[Restart provisioning]
    Overview --&amp;gt;|Users count| View_provisioning_logs[View provisioning logs]
    View_provisioning_logs --&amp;gt;|Logs link| Provisioning_logs
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Select Provisioning logs to determine which users have been provisioned successfully or unsuccessfully. By default, the logs are filtered by the service principal ID of the configuration. For more information, see Provisioning logs in Microsoft Entra ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
Description of Figure: The detailed view of the Provisioning logs under the &quot;Fabrikam to Contoso&quot; provisioning shows a list of provisioning actions for specific users. The interface provides options to download, learn more, refresh, and custom settings for columns. Additional filter options include Identity Name or ID, Date, Show dates as, Status, and Action.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Provisioning_logs[&amp;quot;Fabrikam to Contoso | Provisioning logs&amp;quot;] --&amp;gt; User_entries
    User_entries --&amp;gt;|Filter by| Identity_ID[Identity Name or ID]
    User_entries --&amp;gt;|Filter by| Date[Date]
    User_entries --&amp;gt;|Filter by| Status[Status]
    User_entries --&amp;gt;|Filter by| Action[Action]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Users and groups Provisioning&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Source System&lt;/th&gt;
&lt;th&gt;Target System&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression builder Activity&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning logs 0 Insights Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID ❌&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success +&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New support request&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID ❌ ❌&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Audit logs to view all logged events in Microsoft Entra ID. For more information, see Audit logs in Microsoft Entra ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also view audit logs in the target tenant.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;In the target tenant, select Users &amp;gt; Audit logs to view logged events for user management.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Figure 1: Screenshot of the audit logs interface in Microsoft Entra showing various user-related activities under the audit log section. The interface includes options to filter by date, service category, activity, and has a feedback button. Each log entry details actions such as user provisioning and synchronization activities between &amp;#39;Fabrikam&amp;#39; and &amp;#39;Contoso&amp;#39;. The interface has options to download, refresh, and manage columns.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ActivityLogs[&amp;quot;Audit Logs Interface&amp;quot;]
    UserProvisioning[&amp;quot;User Provisioning Activities&amp;quot;]
    SyncActivities[&amp;quot;Synchronization Activities&amp;quot;]
    Filters[&amp;quot;Filter Options: Date, Service, Category, Activity&amp;quot;]
    LogDetails[&amp;quot;Log Entries Detailing Actions&amp;quot;]
    Interactions[&amp;quot;Interactions: Download, Refresh, Manage Columns&amp;quot;]

    ActivityLogs --&amp;gt; UserProvisioning
    ActivityLogs --&amp;gt; SyncActivities
    ActivityLogs --&amp;gt; Filters
    ActivityLogs --&amp;gt; LogDetails
    ActivityLogs --&amp;gt; Interactions
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Step 14: Configure leave settings&lt;/p&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, browse to Identity &amp;gt; External Identities &amp;gt; External collaboration settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under External user leave settings, choose whether to allow external users to leave your organization themselves.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: An illustration of the settings interface for configuring external user leave settings in a system management tool. Shows options to allow or prevent external users from self-removing from an organization with check-options for configuring per the administrator&amp;#39;s preference.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    LeaveSettings[&amp;quot;External User Leave Settings Interface&amp;quot;]
    ConfigureOptions[&amp;quot;Configuration Options: Allow or Prevent Self-removal&amp;quot;]
    AdminControl[&amp;quot;Administrator Preference Check-options&amp;quot;]

    LeaveSettings --&amp;gt; ConfigureOptions
    ConfigureOptions --&amp;gt; AdminControl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This setting also applies to B2B collaboration and B2B direct connect, so if you set External user leave settings to No, B2B collaboration users and B2B direct connect users can&amp;#39;t leave your organization themselves. For more information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;h2&gt;Delete a configuration&lt;/h2&gt;
&lt;p&gt;Follows these steps to delete a configuration on the Configurations page.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. On the Configurations page, add a check mark next to the configuration you want to delete.&lt;/p&gt;
&lt;p&gt;3. Select Delete and then OK to delete the configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt;
 The figure shows a user interface of the &amp;quot;Cross-tenant synchronization | Configurations&amp;quot; panel on a computer screen. It displays an overview and a list of configurations with the option buttons &amp;quot;New configuration&amp;quot;, &amp;quot;Refresh&amp;quot;, and &amp;quot;Delete&amp;quot;. Three configurations named &amp;quot;Fabrikam3&amp;quot;, &amp;quot;Fabrikam4&amp;quot;, and &amp;quot;Fabrikam5&amp;quot; are listed under the &amp;quot;Name&amp;quot; column, each associated with the &amp;quot;Default Directory&amp;quot; under the &amp;quot;Tenant Name&amp;quot; column. The &amp;quot;Fabrikam3&amp;quot; is checked, indicating selection for deletion.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; Configurations;
    Configurations --&amp;gt; &amp;quot;|New configuration|&amp;quot;;
    Configurations --&amp;gt; Refresh;
    Configurations --&amp;gt; Delete;
    Delete --&amp;gt; Fabrikam3[(&amp;quot;Fabrikam3 (Default Directory)&amp;quot;)];
    Delete --&amp;gt; Fabrikam4[(&amp;quot;Fabrikam4 (Default Directory)&amp;quot;)];
    Delete --&amp;gt; Fabrikam5[(&amp;quot;Fabrikam5 (Default Directory)&amp;quot;)];
    Click[Fabrikam3] --&amp;gt; Delete;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Tenant Name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Fabrikam3&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Fabrikam4&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Fabrikam5&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure&lt;/p&gt;
&lt;p&gt;When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:&lt;/p&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;h1&gt;Notifications&lt;/h1&gt;
&lt;p&gt;More events in the activity log -&amp;gt;&lt;/p&gt;
&lt;p&gt;Dismiss all&lt;/p&gt;
&lt;h3&gt;Testing connection to Fabrikam&lt;/h3&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;p&gt;Error code: AzureDirectoryB2BManagementPolicyCheckFailure&lt;br&gt;Details: Policy permitting auto-redemption of invitations not configured.&lt;br&gt;Request-id:&lt;/p&gt;
&lt;h4&gt;Time Indication for the Testing Connection Activity&lt;/h4&gt;
&lt;p&gt;This is a notification message stating the policy error and includes a timestamp indicating the event occurred &amp;quot;16 minutes ago&amp;quot;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ErrorEvent(&amp;quot;Error Event: Testing connection to Fabrikam - 16 minutes ago&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Follow the steps in Step 3: Automatically redeem invitations in the target tenant and Step 4: Automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;h2&gt;Symptom - Automatic redemption check box is disabled&lt;/h2&gt;
&lt;p&gt;When configuring cross-tenant synchronization, the Automatic redemption check box is disabled.&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt; Outbound access settings - Contoso&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;You need Azure AD Premium to configure trust settings and target select users, groups and applications in cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;B2B collaboration&lt;/p&gt;
&lt;p&gt;B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more ❌ Automatically redeem invitations with the tenant aa5eaf5a-ecc3-49f6-aac8-e50a26e228de.&lt;/p&gt;
&lt;p&gt;Save Discard&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;You must have Microsoft Entra ID P1 or P2 to configure trust settings.&lt;/p&gt;
&lt;p&gt;Symptom - Recently deleted user in the target tenant is not restored&lt;/p&gt;
&lt;p&gt;After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Manually restore the soft-deleted user in the target tenant. For more information, see Restore or remove a recently deleted user using Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Symptom - Users are skipped because SMS sign-in is enabled on the user
✅&lt;/p&gt;
&lt;p&gt;Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecurityIds EQUALS &amp;#39;None&amp;#39;&amp;quot;&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h5&gt;Disable SMS Sign-in options for the users&lt;/h5&gt;
&lt;h5&gt;Import module&lt;/h5&gt;
&lt;p&gt;Install-Module Microsoft.Graph.Users.Actions
Install-Module Microsoft.Graph.Identity.SignIns
Install-Module Microsoft.Graph.Users.Actions&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -Scopes &amp;quot;User.Read.All&amp;quot;, &amp;quot;Group.ReadWrite.All&amp;quot;, &amp;quot;UserAuthenticationMethod.Read.All&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h5&gt;The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-87b9720928f7&lt;/h5&gt;
&lt;p&gt;$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;&lt;/p&gt;
&lt;h5&gt;Get the User Details&lt;/h5&gt;
&lt;p&gt;$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;&lt;/p&gt;
&lt;h5&gt;validate the value for SmsSignInState&lt;/h5&gt;
&lt;p&gt;$smssignin = Get-MgUserAuthenticationPhoneMethod -UserId $userId
{
    if($smssignin.SmsSignInState -eq &amp;quot;ready&amp;quot;){
        ##### Disable Sms Sign-In for the user is set to ready
        Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId - PhoneAuthenticationMethodId $phoneAuthenticationMethodId
        Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green
    } else{
        Write-Host &amp;quot;SMS sign-in status not set or found for the user &amp;quot; - ForegroundColor Yellow
    }
}&lt;/p&gt;
&lt;h1&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h1&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Cause&lt;/h1&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Solution&lt;/h1&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see Configure external collaboration settings.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial: Reporting on automatic user account provisioning&lt;/li&gt;
&lt;li&gt;Managing user account provisioning for enterprise apps in the Azure portal&lt;/li&gt;
&lt;li&gt;What is single sign-on in Microsoft Entra ID?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see &lt;a href=&quot;https://example.com/configure-cross-tenant-synchronization&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first figure demonstrates the configuration and synchronization process from a source tenant to a target tenant. It shows internal users UserS1, UserS2, and UserS3 in the source tenant with outbound access settings set to automatically redeem invitations. These users synchronize with UserT1, UserT2, and UserT3 in the target tenant as well as a group GroupT1. The diagram also includes configuration details such as scoping filters where the department equals Marketing and attribute mappings for accountEnabled, employeeld, userPrincipalName, and extensionName (companyName).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    SourceTenant(&amp;quot;Source tenant&amp;quot;) --&amp;gt; |&amp;quot;Cross-tenant synchronization&amp;quot;| TargetTenant(&amp;quot;Target tenant&amp;quot;);
    SourceTenant --&amp;gt;|Internal Users| UserS1(&amp;quot;User S1 Internal&amp;quot;);
    SourceTenant --&amp;gt;|Internal Users| UserS2(&amp;quot;User S2 Internal&amp;quot;);
    SourceTenant --&amp;gt;|Internal Users| UserS3(&amp;quot;User S3 Internal&amp;quot;);
    SourceTenant -.-&amp;gt;|&amp;quot;Configuration&amp;quot;| Configuration;
    Configuration --&amp;gt;|Outbound access settings: Automatically redeem invitations| TargetTenant;
    Configuration --&amp;gt;|Scoping filters: department EQUALS Marketing| TargetTenant;
    Configuration --&amp;gt;|Attribute mappings| TargetTenant;
    TargetTenant --&amp;gt;|Internal Users| UserT1(&amp;quot;User T1&amp;quot;);
    TargetTenant --&amp;gt;|Internal Users| UserT2(&amp;quot;User T2&amp;quot;);
    TargetTenant --&amp;gt;|Internal Users| UserT3(&amp;quot;User T3&amp;quot;);
    TargetTenant --&amp;gt;|&amp;quot;Group T1&amp;quot;| GroupT1(&amp;quot;Group T1&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;Source tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see &lt;a href=&quot;https://example.com/license-requirements&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;p&gt;Figure 1: An infographics displaying the role requirements under a header that reads &amp;quot;Target tenant&amp;quot;. The roles listed include: Microsoft Entra ID P1 or P2 license information, Security Administrator role for configuring cross-tenant access, and Global Administrator role for consents. It visually emphasizes the roles with distinct icons next to each bullet point.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantRoles[ &amp;quot;Target Tenant Roles&amp;quot; ]
    License[&amp;quot;Microsoft Entra ID P1 or P2 License&amp;quot;]
    SecAdminRole[&amp;quot;Security Administrator Role&amp;quot;]
    GlobalAdminConsent[&amp;quot;Global Administrator Role to Consent&amp;quot;]
    
    TenantRoles --&amp;gt; License
    TenantRoles --&amp;gt; SecAdminRole
    TenantRoles --&amp;gt; GlobalAdminConsent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h1&gt;Step 1: Sign in to the target tenant&lt;/h1&gt;
&lt;p&gt;Figure 2: A screenshot of a PowerShell interface with steps and commands typed. It includes commands starting PowerShell, installing Microsoft Graph PowerShell SDK, retrieving tenant IDs of source and target tenants, initializing variables, and using Connect-MgGraph command to sign into the tenant and consent to permissions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    PowerShellLoginStep1(&amp;quot;Start PowerShell&amp;quot;)
    PowerShellLoginStep2(&amp;quot;Install Microsoft Graph PowerShell SDK&amp;quot;)
    PowerShellLoginStep3(&amp;quot;Retrieve and Initialize Tenant IDs&amp;quot;)
    PowerShellLoginStep4(&amp;quot;Sign in and Consent Permissions using Connect-MgGraph&amp;quot;)
    
    PowerShellLoginStep1 --&amp;gt; PowerShellLoginStep2
    PowerShellLoginStep2 --&amp;gt; PowerShellLoginStep3
    PowerShellLoginStep3 --&amp;gt; PowerShellLoginStep4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell &lt;/p&gt;
&lt;p&gt;$SourceTenantId = &amp;quot;&lt;SourceTenantId&gt;&amp;quot; $TargetTenantId = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the target tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;· Policy.Read.All&lt;/p&gt;
&lt;p&gt;· Policy.ReadWrite.CrossTenantAccess&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 2: Enable user synchronization in the target tenant&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Figure: A diagram illustrating the process of enabling user synchronization in the target tenant. This diagram likely includes symbols and text that clarify the steps involved in the process, such as initiating commands in PowerShell and handling potential errors.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    NewConfig[Create New Configuration] --&amp;gt; CheckError{Check for Existing Configuration}
    CheckError -- &amp;quot;Error Found&amp;quot; --&amp;gt; ExistingConfig[Handle Existing Configuration]
    CheckError -- &amp;quot;No Error&amp;quot; --&amp;gt; Success[Configuration Successful]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$Params = @{ TenantId = $SourceTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models.MicrosoftGraphInboundOutboundPolicyConfiguration&lt;/p&gt;
&lt;p&gt;B2BCollaborationInbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BCollaborationOutbound&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectInbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectOutbound : Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/p&gt;
&lt;p&gt;IdentitySynchronization :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell.Models.MicrosoftGraphCrossTenantIdentity&lt;/p&gt;
&lt;p&gt;SyncPolicyPartner InboundTrust :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust IsServiceProvider :
TenantId : &lt;SourceTenantId&gt; TenantRestrictions : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity%5D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity]&lt;/a&gt;, 
[crossCloudMeetingConfiguration, 
System.Collections.Generic.Dictionary2[System.String, System.Object ]], [protectedContentSharing, 
System.Collections.Generic.Dictionary 2[System.String, System.Object ]]}&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Invoke-MgGraphRequest command to enable user synchronization in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get an Request_MultipleObjectsWithSameKeyValue error, you might already have an existing policy. For more information, see Symptom - Request_MultipleObjectsWithSameKeyValue error.&lt;/p&gt;
&lt;p&gt;PowerShell
$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&lt;/a&gt;&amp;quot; -Body $Params&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to verify IsSyncAllowed is set to True.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell
(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;IsSyncAllowed
True&lt;/p&gt;
&lt;h1&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h1&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;The figure shows a structured layout of Step 3, starting with the section title &amp;quot;Automatically redeem invitations in the target tenant.&amp;quot; It has icons and labels indicating it deals with the target tenant and PowerShell commands. The main content details the PowerShell command for the Update-MgPolicyCrossTenantAccessPolicyPartner to handle cross-tenant access by automatically redeeming invitations and suppressing consent prompts.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TargetTenantCommand[&amp;quot;PowerShell Command: Update-MgPolicyCrossTenantAccessPolicyPartner&amp;quot;] --&amp;gt; Parameters{&amp;quot;Parameters: Automatically redeeming and suppressing prompts&amp;quot;}
    Parameters --&amp;gt; InboundAllowedSet[&amp;quot;Setting: InboundAllowed=True&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the Update-MgPolicyCrossTenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for inbound access.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$AutomaticUserConsentSettings = @{ &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
} Update-MgPolicyCrossTenantAccessPolicyPartner - CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 4: Sign in to the source tenant&lt;/h1&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;The figure illustrates Step 4, labeled &amp;quot;Sign in to the source tenant.&amp;quot; It includes an icon and label indicating it involves the source tenant and PowerShell commands on initializing and retrieving tenant IDs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenantCommand[&amp;quot;PowerShell Command: Initialize and Retrieve IDs&amp;quot;] --&amp;gt; InitialSetup{&amp;quot;Initial Setup: Get tenant IDs&amp;quot;}
    InitialSetup --&amp;gt; SourceTenant[&amp;quot;Action: Start PowerShell in source tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start an instance of PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$SourceTenantId = &amp;quot;&lt;SourceTenantId&gt;&amp;quot; $TargetTenantId = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the source tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;li&gt;AuditLog.Read.All&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;, &amp;quot;AuditLog.Read.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h1&gt;
&lt;p&gt;Text description of figure: Step 5 involves a diagram or a flow chart that potentially illustrates the process of automatically redeeming invitations in the source tenant. Exact details are not displayed.&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{
    TenantId = $TargetTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
B2BCollaborationInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BCollaborationOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
IdentitySynchronization :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner
InboundTrust :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
IsServiceProvider :
TenantId : &lt;TargetTenantId&gt;
TenantRestrictions :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
AdditionalProperties : {[[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity%5D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity]&lt;/a&gt;, [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary2[System.String, System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String, System.Object]]}&lt;/p&gt;
&lt;p&gt;Use the Update-MgPolicyCrossTenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for outbound access.&lt;/p&gt;
&lt;p&gt;$AutomaticUserConsentSettings = @{ &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot; } Update-MgPolicyCrossTenantAccessPolicyPartner -
CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings&lt;/p&gt;
&lt;h1&gt;Step 6: Create a configuration application in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgInstantiateApplicationTemplate command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgServicePrincipal command to get the service principal ID and app role ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot; | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AccountEnabled&lt;/td&gt;
&lt;td&gt;: True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddIns&lt;/td&gt;
&lt;td&gt;: {}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlternativeNames&lt;/td&gt;
&lt;td&gt;: {}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDescription&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDisplayName&lt;/td&gt;
&lt;td&gt;: Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;AppId
: &lt;AppId&gt;&lt;/p&gt;
&lt;p&gt;AppManagementPolicies&lt;/p&gt;
&lt;p&gt;AppOwnerOrganizationId
: &lt;AppOwnerOrganizationId&gt;&lt;/p&gt;
&lt;p&gt;AppRoleAssignedTo&lt;/p&gt;
&lt;p&gt;AppRoleAssignmentRequired
: True&lt;/p&gt;
&lt;p&gt;AppRoleAssignments&lt;/p&gt;
&lt;p&gt;AppRoles
: {&lt;AppRoleId&gt;}&lt;/p&gt;
&lt;p&gt;ApplicationTemplateId
: 518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&lt;/p&gt;
&lt;p&gt;ClaimsMappingPolicies&lt;/p&gt;
&lt;p&gt;CreatedObjects&lt;/p&gt;
&lt;p&gt;CustomSecurityAttributes
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttributeValue&lt;/p&gt;
&lt;p&gt;DelegatedPermissionClassifications&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;p&gt;DisabledByMicrosoftStatus&lt;/p&gt;
&lt;p&gt;DisplayName
: Fabrikam&lt;/p&gt;
&lt;p&gt;Endpoints&lt;/p&gt;
&lt;p&gt;ErrorUrl&lt;/p&gt;
&lt;p&gt;FederatedIdentityCredentials&lt;/p&gt;
&lt;p&gt;HomeRealmDiscoveryPolicies&lt;/p&gt;
&lt;p&gt;Homepage
&lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync%7CISV9.1%7Cprimary%7Cz&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync|ISV9.1|primary|z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Id
: &lt;ServicePrincipalId&gt;&lt;/p&gt;
&lt;p&gt;Info
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl&lt;/p&gt;
&lt;p&gt;KeyCredentials&lt;/p&gt;
&lt;p&gt;LicenseDetails&lt;/p&gt;
&lt;p&gt;$ServicePrincipalId = &amp;quot;&lt;ServicePrincipalId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;$AppRoleId= &amp;quot;&lt;AppRoleId&gt;&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 7: Test the connection to the target tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphRequest command to test the connection to the target tenant and validate the credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The figure shows a PowerShell script including a parameter configuration block and an Invoke-MgGraphRequest command. The parameters are set to not use saved credentials, specify the &amp;quot;Azure2Azure&amp;quot; template ID, and include credentials specified as a company ID and a target tenant ID. The command performs a POST request to the Microsoft Graph API’s servicePrincipal endpoint to validate credentials.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ParamsConfig[&amp;quot;Parameters Configuration (Azure2Azure, CompanyID, SyncPolicy)&amp;quot;] --&amp;gt; InvokeMgGraph[&amp;quot;Invoke-MgGraphRequest POST&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 8: Create a provisioning job in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine the synchronization template to use, such as Azure2Azure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The figure likely illustrates setting up a PowerShell command for creating a provisioning job, potentially with parameters specifying the synchronization template.&lt;/p&gt;
&lt;p&gt;A template has pre-configured synchronization settings.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the source tenant, use the New-MgServicePrincipalSynchronizationJob command to create a provisioning job based on a template.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;Id : &amp;lt; JobId&amp;gt;&lt;br&gt;Schedule :&lt;br&gt;Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationSchedule  &lt;/p&gt;
&lt;p&gt;Schema&lt;br&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSchema  &lt;/p&gt;
&lt;p&gt;Status&lt;br&gt;Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationStatus&lt;br&gt;SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}&lt;br&gt;TemplateId : Azure2Azure&lt;br&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv icePrincipalId&gt;&amp;#39;)/synchro nization/jobs/$entity]}&lt;/p&gt;
&lt;p&gt;3. Initialize a variable for the job ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$JobId = &amp;quot;&lt;JobId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Step 9: Save your credentials&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In the image, a purple directional arrow labeled &amp;#39;Save your credentials&amp;#39; points downwards. This visual element symbolizes an instruction or step focusing on securely storing or saving credentials relating to the source tenant.&lt;/em&gt; &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Step9[&amp;quot;Step 9: Save your credentials&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphRequest command to save your credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    &amp;quot;value&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        }
    )
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Step 10: Assign a user to the configuration&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgServicePrincipalAppRoleAssignedTo command to assign an internal user to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    PrincipalId = &amp;quot;&amp;lt;PrincipalId&amp;gt;&amp;quot;
    ResourceId = $ServicePrincipalId
    AppRoleId = $AppRoleId
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;AppRoleId&lt;br&gt;: &amp;lt; AppRoleId&amp;gt;  &lt;/p&gt;
&lt;p&gt;CreatedDateTime&lt;br&gt;: 7/31/2023 10:27:12 PM  &lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;br&gt;:  &lt;/p&gt;
&lt;p&gt;Id&lt;br&gt;: &amp;lt; Id&amp;gt;  &lt;/p&gt;
&lt;p&gt;PrincipalDisplayName&lt;br&gt;: User1  &lt;/p&gt;
&lt;p&gt;PrincipalId&lt;br&gt;: &amp;lt; PrincipalId&amp;gt;  &lt;/p&gt;
&lt;p&gt;PrincipalType&lt;br&gt;: User  &lt;/p&gt;
&lt;p&gt;ResourceDisplayName&lt;br&gt;: Fabrikam  &lt;/p&gt;
&lt;p&gt;ResourceId&lt;br&gt;: &amp;lt; ServicePrincipalId&amp;gt;  &lt;/p&gt;
&lt;p&gt;AdditionalProperties&lt;br&gt;: {[@odata.context,&lt;br&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity%5D%7D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity]}&lt;/a&gt;  &lt;/p&gt;
&lt;h1&gt;Step 11: Test provision on demand&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Text description of figure&lt;/strong&gt;: The figure shows a graphical representation of a diamond-shaped icon with an arrow pointing downward, situated above the heading &amp;quot;Source tenant&amp;quot;. This symbolizes the action of provisioning on demand.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Action[Download arrow (Provision on demand)] --&amp;gt; Heading[&amp;quot;Source tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Get-MgServicePrincipalSynchronizationJobSchema command to get the schema rule ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$SynchronizationSchema = Get-MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId&lt;br&gt;$SynchronizationSchema.SynchronizationRules | Format-List  &lt;/p&gt;
&lt;p&gt;Output  &lt;/p&gt;
&lt;p&gt;ContainerFilter&lt;br&gt;:&lt;br&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphContainerFilter  &lt;/p&gt;
&lt;p&gt;Editable: True&lt;/p&gt;
&lt;p&gt;GroupFilter: Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroupFilter&lt;/p&gt;
&lt;p&gt;Id: &lt;RuleId&gt;&lt;/p&gt;
&lt;p&gt;Metadata: {defaultSourceObjectMappings, supportsProvisionOnDemand}&lt;/p&gt;
&lt;p&gt;Name: USER_INBOUND_USER&lt;/p&gt;
&lt;p&gt;ObjectMappings: {Provision Azure Active Directory Users, , , .. }&lt;/p&gt;
&lt;p&gt;Priority: 1&lt;/p&gt;
&lt;p&gt;SourceDirectoryName: Azure Active Directory&lt;/p&gt;
&lt;p&gt;TargetDirectoryName: Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;AdditionalProperties: {}&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Initialize a variable for the rule ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$RuleId = &amp;quot;&amp;lt;RuleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the New-MgServicePrincipalSynchronizationJobOnDemand command to provision a test user on demand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$Params = @{
    Parameters = @(
        @{
            Subjects = @(
                @{
                    ObjectId = &amp;quot;&amp;lt;UserObjectId&amp;gt;&amp;quot;
                    ObjectTypeName = &amp;quot;User&amp;quot;
                }
            )
            RuleId = $RuleId
        }
    )
    New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Key : Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo
Value : [{&amp;quot;provisioningSteps&amp;quot;: [{ &amp;quot;name&amp;quot; : &amp;quot;EntryImport&amp;quot;, &amp;quot;type&amp;quot; : &amp;quot;Import&amp;quot;, &amp;quot;status&amp;quot; : &amp;quot;Success&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;Retrieved User
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; from Azure Active Directory&amp;quot;, &amp;quot;timestamp&amp;quot; : &amp;quot;2023-07-31T22 : 31:15.9116590Z&amp;quot;, &amp;quot;details&amp;quot; : {&amp;quot;objectId&amp;quot;:&lt;/p&gt;
&lt;p&gt;=&lt;/p&gt;
&lt;p&gt;&lt;UserObjectId&gt;&amp;quot;, &amp;quot;accountEnabled&amp;quot;: &amp;quot;True&amp;quot;, &amp;quot;displayName&amp;quot; : &amp;quot;User1&amp;quot;, &amp;quot;mail Nickname&amp;quot; : &amp;quot;user1&amp;quot;, &amp;quot;userPrincipalName&amp;quot; : &amp;quot;use&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&lt;/a&gt; yStringValuePair]}&lt;/p&gt;
&lt;h1&gt;Step 12: Start the provisioning job&lt;/h1&gt;
&lt;p&gt;Figure: An illustrative step-by-step diagram or flowchart indicating the process to start the provisioning job in the source tenant using PowerShell Commands.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    Configured[&amp;quot;Provisioning Job Configured&amp;quot;] --&amp;gt; StartCmd[Start-MgServicePrincipalSynchronizationJob]
    StartCmd --&amp;gt; JobStarted[&amp;quot;Provisioning Job Started&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Now that the provisioning job is configured, in the source tenant, use the Start-MgServicePrincipalSynchronizationJob command to start the provisioning job.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId&lt;/p&gt;
&lt;h1&gt;Step 13: Monitor provisioning&lt;/h1&gt;
&lt;p&gt;Figure: A diagram showing a timeline or process flow that details monitoring the provisioning status using PowerShell commands.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    JobStarted --&amp;gt; CheckStatus[Get-MgServicePrincipalSynchronizationJob]
    CheckStatus --&amp;gt; Monitoring[&amp;quot;Monitoring Progress &amp;amp; Statistics&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Now that the provisioning job is running, in the source tenant, use the Get- MgServicePrincipalSynchronizationJob command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;Id : &lt;JobId&gt;
Schedule : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule
Schema : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema
Status : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus
SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}
TemplateId : Azure2Azure
AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;ServicePrincipalId&gt;&amp;#39;)/synchronization/jobs/$entity]}&lt;/p&gt;
&lt;p&gt;In addition to monitoring the status of the provisioning job, use the Get-MgAuditLogProvisioning command to retrieve the provisioning logs and get all the provisioning events that occur. For example, query for a particular user and determine if they were successfully provisioned.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List&lt;/p&gt;
&lt;p&gt;| Output |
| - | - |
| ActivityDateTime | : 7/31/2023 12:08:17 AM |
| ActivityDisplayName | : Export |
| AdditionalDetails | : {Details, ErrorCode, EventName, ipaddr...} |
| Category | : ProvisioningManagement |
| CorrelationId | : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec |
| Id | : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778479 |
| InitiatedBy | : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 |
| LoggedByService | : Account Provisioning |
| OperationType | : |
| Result | : success |&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;ActivityDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 12:08:17 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName&lt;/p&gt;
&lt;p&gt;: Export&lt;/p&gt;
&lt;p&gt;AdditionalDetails&lt;/p&gt;
&lt;p&gt;: {Details, ErrorCode, EventName, ipaddr ... }&lt;/p&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;p&gt;: ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId&lt;/p&gt;
&lt;p&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/p&gt;
&lt;p&gt;8f9dc271c5ec_L5BFV_161778264&lt;/p&gt;
&lt;p&gt;InitiatedBy&lt;/p&gt;
&lt;p&gt;: Microsoft. Graph. PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/p&gt;
&lt;p&gt;LoggedByService&lt;/p&gt;
&lt;p&gt;: Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType&lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;: success&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;ActivityDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 12:08:14 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName&lt;/p&gt;
&lt;p&gt;: Synchronization rule action&lt;/p&gt;
&lt;p&gt;AdditionalDetails&lt;/p&gt;
&lt;p&gt;: {Details, ErrorCode, EventName, ipaddr ... }&lt;/p&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;p&gt;: ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId&lt;/p&gt;
&lt;p&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/p&gt;
&lt;p&gt;8f9dc271c5ec_L5BFV_161778395&lt;/p&gt;
&lt;p&gt;InitiatedBy&lt;/p&gt;
&lt;p&gt;: Microsoft. Graph. PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/p&gt;
&lt;p&gt;LoggedByService&lt;/p&gt;
&lt;p&gt;: Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType&lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;: success&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant))&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;Troubleshooting tips&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h1&gt;Symptom - Insufficient privileges error&lt;/h1&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;code: Authorization_RequestDenied message: Insufficient privileges to complete the operation.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Symptom - New- MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/p&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartner command to list the existing object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing object, you might need to make an update using Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Symptom - Request_MultipleObjectsWithSameKeyValue error&lt;/h1&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;Invoke-MgGraphRequest: PUT&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&lt;/a&gt;&lt;SourceTenantId&gt;/identitySynchronization HTTP/1.1 409 Conflict&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;{&amp;quot;error&amp;quot; : { &amp;quot;code&amp;quot; : &amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;, &amp;quot;message&amp;quot; : &amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;, &amp;quot;details&amp;quot;:&lt;/p&gt;
&lt;p&gt;[{ &amp;quot;code&amp;quot; : &amp;quot;ConflictingObjects&amp;quot;, &amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to list the IsSyncAllowed setting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId) . UserSyncInbound&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;If you have an existing policy, you might need to make an update using Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to enable user synchronization.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;$Params = @{ 
    userSyncInbound = @{ 
        isSyncAllowed = $true 
    } 
} 
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra synchronization API overview&lt;/li&gt;
&lt;li&gt;Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h1&gt;
&lt;p&gt;Article · 01/18/2024&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h1&gt;Scoping filter use cases&lt;/h1&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outbound provisioning from Microsoft Entra ID to SaaS applications. When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Tip&lt;/h1&gt;
&lt;p&gt;The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory. When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, Microsoft Entra provisioning connectors don&amp;#39;t have any attribute-based scoping filters configured.&lt;/p&gt;
&lt;h1&gt;Scoping filter construction&lt;/h1&gt;
&lt;p&gt;A scoping filter consists of one or more clauses. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;p&gt;As an example, consider the following scoping filter:&lt;/p&gt;
&lt;p&gt;Figure: The image shows a graphical user interface for defining a scoping filter. It includes areas for adding and deleting scoping filters, specifying target attributes, operators, and values. The example shown has a scoping filter group named &amp;quot;New York Engineering&amp;quot; with the criteria: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TARGET ATTRIBUTE &amp;quot;City&amp;quot; OPERATOR &amp;quot;EQUALS&amp;quot; VALUE &amp;quot;New York&amp;quot;&lt;/li&gt;
&lt;li&gt;TARGET ATTRIBUTE &amp;quot;Department&amp;quot; OPERATOR &amp;quot;EQUALS&amp;quot; VALUE &amp;quot;Engineering&amp;quot;&lt;/li&gt;
&lt;li&gt;TARGET ATTRIBUTE &amp;quot;EmployeeID (extension)&amp;quot; OPERATOR &amp;quot;REGEX MATCH&amp;quot; VALUE pattern matching IDs&lt;/li&gt;
&lt;li&gt;TARGET ATTRIBUTE &amp;quot;Job Title&amp;quot; OPERATOR &amp;quot;IS NOT NULL&amp;quot;
There&amp;#39;s a notation that if multiple scoping clauses are present, they are evaluated using &amp;quot;AND&amp;quot; logic, and if multiple scoping filters are present, they are evaluated using &amp;quot;OR&amp;quot; logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mermaid Diagram:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ScopingFilterGroup1(&amp;quot;Scoping Filter Group: New York Engineering&amp;quot;)
    Condition1(&amp;quot;City EQUALS New York&amp;quot;) --&amp;gt; ScopingFilterGroup1
    Condition2(&amp;quot;Department EQUALS Engineering&amp;quot;) --&amp;gt; ScopingFilterGroup1
    Condition3(&amp;quot;EmployeeID (extension) REGEX MATCH ID pattern&amp;quot;) --&amp;gt; ScopingFilterGroup1
    Condition4(&amp;quot;Job Title IS NOT NULL&amp;quot;) --&amp;gt; ScopingFilterGroup1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;p&gt;· They must be in New York.&lt;/p&gt;
&lt;p&gt;· They must work in the Engineering department.&lt;/p&gt;
&lt;p&gt;· Their company employee ID must be between 1,000,000 and 2,000,000.&lt;/p&gt;
&lt;p&gt;· Their job title must not be null or empty.&lt;/p&gt;
&lt;h1&gt;Create scoping filters&lt;/h1&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for one of the supported applications and are adding a scoping filter to it.&lt;/p&gt;
&lt;h2&gt;Create a scoping filter&lt;/h2&gt;
&lt;p&gt;Q Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; All applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Provisioning tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Mappings section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Source object scope menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Add scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define a clause by selecting a source Attribute Name, an Operator, and an Attribute Value to match against. The following operators are supported:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/p&gt;
&lt;p&gt;b. !&amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/p&gt;
&lt;p&gt;c. ENDS_WITH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;p&gt;d. EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;p&gt;e. Greater Than. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;f. Greater_Than_OR_EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;g. Includes. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described here.&lt;/p&gt;
&lt;p&gt;h. IS FALSE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;p&gt;i. IS NOT NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;p&gt;j. IS NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;p&gt;k. IS TRUE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;p&gt;l. NOT EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;p&gt;m. NOT REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;p&gt;n. REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: ([1-9][0-9]) matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important Notes on Filter Support:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IsMemberOf filter is not supported currently.&lt;/li&gt;
&lt;li&gt;The members attribute on a group is not supported currently.&lt;/li&gt;
&lt;li&gt;Filtering is not supported for multi-valued attributes.&lt;/li&gt;
&lt;li&gt;Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;9. Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/p&gt;
&lt;p&gt;10. In Scoping Filter Title, add a name for your scoping filter.&lt;/p&gt;
&lt;p&gt;11. Select OK.&lt;/p&gt;
&lt;p&gt;12. Select OK again on the Scoping Filters screen. Optionally, repeat steps 6-11 to add another scoping filter.&lt;/p&gt;
&lt;p&gt;13. Select Save on the Attribute Mapping screen.&lt;/p&gt;
&lt;h1&gt;Important&lt;/h1&gt;
&lt;p&gt;Saving a new scoping filter triggers a new full sync for the application, where all users in the source system are evaluated again against the new scoping filter. If a user in the application was previously in scope for provisioning, but falls out of scope, their account is disabled or deprovisioned in the application. To override this default behavior, refer to Skip deletion for user accounts that go out of scope.&lt;/p&gt;
&lt;h1&gt;Common scoping filters&lt;/h1&gt;
&lt;p&gt;( Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*\@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that have the domain @domain.com are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*\@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that has the domain @domain.com are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9][0-9][0-9][0-9])&lt;/td&gt;
&lt;td&gt;All employees with workerID between 1000000 and 2000000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Related articles&lt;/h1&gt;
&lt;p&gt;· Automate user provisioning and deprovisioning to SaaS applications&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customize attribute mappings for user provisioning&lt;/li&gt;
&lt;li&gt;Write expressions for attribute mappings&lt;/li&gt;
&lt;li&gt;Account provisioning notifications&lt;/li&gt;
&lt;li&gt;Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;List of tutorials on how to integrate SaaS apps&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h1&gt;Configure accidental deletion prevention&lt;/h1&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning and then on the provisioning page select Edit provisioning.&lt;ol&gt;
&lt;li&gt;Under Settings, select the Prevent accidental deletions check box and specify a deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the Notification Email address is completed. If the deletion threshold is met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select Save to save the changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. To learn more about quarantine behavior, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;h1&gt;Recovering from an accidental deletion&lt;/h1&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says Provisioning has been quarantined. See quarantine details for more information.&lt;/p&gt;
&lt;h1&gt;Allowing deletions&lt;/h1&gt;
&lt;p&gt;The Allow deletes action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Allow deletes.&lt;/li&gt;
&lt;li&gt;Click Yes on the confirmation to allow the deletions.&lt;/li&gt;
&lt;li&gt;View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Rejecting deletions&lt;/h1&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/li&gt;
&lt;li&gt;Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/li&gt;
&lt;li&gt;Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test deletion prevention&lt;/h2&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h2&gt;Common deprovisioning scenarios to test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Delete a user / put them into the recycle bin.&lt;/li&gt;
&lt;li&gt;Block sign in for a user.&lt;/li&gt;
&lt;li&gt;Unassign a user or group from the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Remove a user from a group that&amp;#39;s provides them access to the application (or configuration).&lt;/p&gt;
&lt;p&gt;To learn more about deprovisioning scenarios, see How Application Provisioning Works.&lt;/p&gt;
&lt;h1&gt;Frequently Asked Questions&lt;/h1&gt;
&lt;h2&gt;What scenarios count toward the deletion threshold?&lt;/h2&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h2&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the &amp;quot;circuit breaker&amp;quot; isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h1&gt;How are these deletion events logged?&lt;/h1&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven&amp;#39;t due to the deletion threshold. Navigation to Provisioning logs and then filter Action with StagedAction or StagedDelete.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· How application provisioning works&lt;/p&gt;
&lt;p&gt;· Plan an application provisioning deployment&lt;/p&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;3 Yes&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;p&gt;Provide product feedback | Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;h1&gt;On-demand provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshoot configuration issues quickly.&lt;/li&gt;
&lt;li&gt;Validate expressions that you&amp;#39;ve defined.&lt;/li&gt;
&lt;li&gt;Test scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to use on-demand provisioning&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Steps in this article may vary slightly based on the portal you start from.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning.&lt;/li&gt;
&lt;li&gt;Configure provisioning by providing your admin credentials.&lt;/li&gt;
&lt;li&gt;Select Provision on demand.&lt;/li&gt;
&lt;li&gt;Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &amp;quot;WorkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in Workday. For SuccessFactors scenario, please provide &amp;quot;personldExternal&amp;quot; of the user in SuccessFactors.&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select Provision at the bottom of the page.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;

&lt;p&gt;A screenshot from Microsoft Azure&amp;#39;s Portal. It depicts an interface for the &amp;quot;Provision on demand&amp;quot; feature. The page is displaying options to select users or groups for provisioning. Two members are selected: Alex Wilber and Nestor Wilke, indicated with a green tick, and their respective email addresses are shown. There are also buttons labeled &amp;quot;Learn More&amp;quot; and &amp;quot;Provision&amp;quot; visible for operational actions.&lt;/p&gt;
&lt;!-- FigureContent=&quot;A Provision on demand - Microsoft × + X C https://portal.azure.com/?Microsoft_AAD_Connect_Provisioning=tip&amp;feature.provisionondemandsupportmember=true#view/Microsoft_AAD_Connect_Provisioning/UserPr ... A ... Microsoft Azure P Search resources, services, and docs (G+/) Home &gt; scimreftest &gt; AHCustom &gt; Provision on demand ... × Learn More A Got feedback? Provision on-demand for a subset of users or groups before rolling it out broadly to your organization. When provisioning a group you can select 5 members at a time. ✅ No user or group will be provisioned on-demand that would not have been provisioned through the regular provisioning cycles. Selected group P On-demand provisioning Selected members 2 selected v p ✅ Alex Wilber AlexW@scimreftest.onmicrosoft.com MEMBER ✅ Nestor Wilke NestorW@scimreltest.onmicrosoft.com MEMBER + Provision&quot; --&gt;

&lt;/figure&gt;

&lt;h1&gt;Understand the provisioning steps&lt;/h1&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h2&gt;Step 1: Test connection&lt;/h2&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the tutorial list.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the matching attributes defined in the Attribute mappings pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/li&gt;
&lt;li&gt;For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to authorization requests in the way that the Microsoft Entra provisioning service expects. Have a look at an example request.&lt;/p&gt;
&lt;h1&gt;Step 2: Import user&lt;/h1&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;p&gt;· Evaluate whether the user is in scope for provisioning.&lt;/p&gt;
&lt;p&gt;· Check the target system for an existing user.&lt;/p&gt;
&lt;p&gt;· Determine what user attributes to export to the target system.&lt;/p&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;p&gt;· Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update the user object with a value for the matching attribute.
❌&lt;/li&gt;
&lt;li&gt;Change the matching attribute in your provisioning configuration.
❌
· If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Make sure that the Attribute mapping page of your provisioning configuration contains the attribute that you expect.&lt;/p&gt;
&lt;h1&gt;Step 3: Determine if user is in scope&lt;/h1&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;p&gt;· Whether the user is assigned to the application.&lt;/p&gt;
&lt;p&gt;· Whether scope is set to Sync assigned or Sync all.&lt;/p&gt;
&lt;p&gt;· The scoping filters defined in your provisioning configuration.&lt;/p&gt;
&lt;p&gt;The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active in source system indicates that the user has the property IsActive set to true in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;Assigned to application indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;Scope sync all indicates that the scope setting allows all users and groups in the tenant.&lt;/li&gt;
&lt;li&gt;User has required role indicates that the user has the necessary roles to be provisioned into the application.&lt;/li&gt;
&lt;li&gt;Scoping filters are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/li&gt;
&lt;li&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Step 4: Match user between source and target&lt;/h1&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If no users are matched in the target system, no properties are shown.&lt;/li&gt;
&lt;li&gt;If one user matches in the target system, the properties of that user are shown.&lt;/li&gt;
&lt;li&gt;If multiple users match, the properties of both users are shown.&lt;/li&gt;
&lt;li&gt;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· The provisioning service might not be able to match a user in the source system uniquely with a user in the target. Resolve this problem by ensuring that the matching attribute is unique.&lt;/p&gt;
&lt;p&gt;· Make sure that the target system supports filtering on the attribute that&amp;#39;s defined as the matching attribute.&lt;/p&gt;
&lt;h1&gt;Step 5: Perform action&lt;/h1&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:
Figure: The image represents a user interface of Microsoft Azure showing the &amp;quot;Perform Action&amp;quot; panel with details of a group in a provisioning process. It includes tabs like &amp;quot;Group details&amp;quot;, &amp;quot;Group membership operations&amp;quot;, and &amp;quot;User operations&amp;quot;. Each tab displays relevant details, statuses, and options like &amp;quot;Success&amp;quot; and &amp;quot;View Details&amp;quot; for actions performed during user or group provisioning.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ImportGroup[&amp;quot;Import group&amp;quot;] --&amp;gt;|Success| ScopeDetermination[&amp;quot;Determine if group is in scope&amp;quot;]
    ScopeDetermination --&amp;gt;|Success| MatchGroup[&amp;quot;Match group between source and target system&amp;quot;]
    MatchGroup --&amp;gt;|Success| ActionResult[&amp;quot;Perform action&amp;quot;]
    ActionResult --&amp;gt;|Success| ProvisionAnother[&amp;quot;Provision another object&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;p&gt;· Failures for exporting changes can vary greatly. Check the documentation for provisioning logs for common failures.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few&lt;/p&gt;
&lt;p&gt;minutes between when an object is assigned to an application and when that assignment is honored in on-demand provisioning. You may need to wait a few minutes and try again.&lt;/p&gt;
&lt;h1&gt;Frequently asked questions&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Do you need to turn provisioning off to use on-demand provisioning? For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on-demand provisioning for all applications without having to stop provisioning jobs.&lt;/li&gt;
&lt;li&gt;How long does on-demand provisioning take? On-demand provisioning typically takes less than 30 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Known limitations&lt;/h1&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your suggestions and feedback so we can better determine what improvements to make next.&lt;/p&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/li&gt;
&lt;li&gt;On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/li&gt;
&lt;li&gt;Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/li&gt;
&lt;li&gt;On-demand provisioning of roles isn&amp;#39;t supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/p&gt;
&lt;p&gt;· The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· Troubleshooting provisioning&lt;/p&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful? Yes 5 No&lt;/p&gt;
&lt;p&gt;Provide product feedback 4 | Get help at Microsoft Q&amp;amp;A
❌ ❌ ✅ ❌ ❌&lt;/p&gt;
&lt;h1&gt;What are the Microsoft Entra user provisioning logs?&lt;/h1&gt;
&lt;p&gt;Article · 01/25/2024&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign-ins - Information about sign-ins and how your resources are used by your users.&lt;/li&gt;
&lt;li&gt;Audit - Information about changes applied to your tenant such as users and group management or updates applied to your tenant’s resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h2&gt;License and role requirements&lt;/h2&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the Zero Trust guidance.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with AuditLogsRead or&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;CustomSecAuditLogsRead permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with SignInLogsRead permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Application Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cloud App Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ProvisioningLogsRead permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage and insights&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Reports Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection*&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with IdentityRiskEventReadWrite&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph activity logs&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ListKeys permission&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the license requirements for Identity Protection.&lt;/p&gt;
&lt;h1&gt;What can you do with the provisioning logs?&lt;/h1&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What groups were successfully created in ServiceNow?&lt;/li&gt;
&lt;li&gt;What users were successfully removed from Adobe?&lt;/li&gt;
&lt;li&gt;What users from Workday were successfully created in Active Directory?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;h1&gt;What do the logs show?&lt;/h1&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steps:&lt;/strong&gt; This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;o Import the object.
o Match the object between source and target.
o Determine if the object is in scope.
o Evaluate the object before synchronization.
o Provision the object (create, update, delete, or disable).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The figure shows a tabbed interface with four steps. The steps shown are:&lt;ol&gt;
&lt;li&gt;Import User from Azure Active Directory with a success status indicator.&lt;/li&gt;
&lt;li&gt;Determine if User is in scope with a scope checked indicator.&lt;/li&gt;
&lt;li&gt;Match User between Azure Active Directory and Box with a matched status indicator.&lt;/li&gt;
&lt;li&gt;Provision User in Box with a &amp;#39;X&amp;#39; indicating an error in this step.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Below the steps, a detailed entry in a table format with headers &amp;quot;EntryExportAdd&amp;quot; includes columns for Result, Description, and Reportable Identifier. The row indicates a successful result where a user &amp;#39;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;#39; was created in Box, and the reportable identifier is &amp;#39;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;#39;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Import[&amp;quot;1. Import User from Azure Active Directory ✓&amp;quot;]
    Scope[&amp;quot;2. Determine if User is in scope ✓&amp;quot;]
    Match[&amp;quot;3. Match User between Azure Active Directory and Box ✓&amp;quot;]
    Provision[&amp;quot;4. Provision User in Box ✕&amp;quot;]

    Import --&amp;gt; Scope --&amp;gt; Match --&amp;gt; Provision
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Troubleshooting &amp;amp; Recommendations: If there was an error, this tab provides the error code and reason.&lt;/p&gt;
&lt;p&gt;Modified Properties: If there were changes, this tab shows the old value and the new value.&lt;/p&gt;
&lt;p&gt;Summary: Provides an overview of what happened and identifiers for the object in the source and target systems.&lt;/p&gt;
&lt;h1&gt;Map directory extensions in cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. Custom security attributes are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;h1&gt;Create directory extensions&lt;/h1&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see Syncing extension attributes for Microsoft Entra Application Provisioning.&lt;/p&gt;
&lt;h1&gt;Map directory extensions&lt;/h1&gt;
&lt;figure&gt;
Figure: Illustration showing the process of mapping directory extensions between source and target tenants in a cross-tenant synchronization setup. The diagram likely represents a flowchart or sequence of actions to be taken for successful integration.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source Tenant&amp;quot;] --&amp;gt;|Maps| DirectoryExtensions[&amp;quot;Directory Extensions&amp;quot;];
    DirectoryExtensions --&amp;gt;|Integrate| TargetTenant[&amp;quot;Target Tenant&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Select Configurations and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select Provisioning and expand the Mappings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;h1&gt;Fabrikam to Contoso | Provisioning&lt;/h1&gt;
&lt;p&gt;X
 ✅
Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Save ✅ Discard&lt;/p&gt;
&lt;p&gt;1 Overview&lt;/p&gt;
&lt;p&gt;V Admin Credentials&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;1 Mappings&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Mappings&lt;/p&gt;
&lt;p&gt;Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restore default mappings&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Provisioning logs&lt;/p&gt;
&lt;p&gt;Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support&lt;/p&gt;
&lt;p&gt;v Settings&lt;/p&gt;
&lt;p&gt;Activity - Audit logs&lt;/p&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;p&gt;Provisioning Status
 ✅
+&lt;/p&gt;
&lt;p&gt;On Off&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt; A screenshot of a provisioning interface under the section titled &amp;quot;Attribute Mapping&amp;quot;. It shows a table with various user attributes such as preferredLanguage, surname, telephoneNumber, userPrincipalName, showInAddressList, mail, and userType, each paired with a delete button and an option to add new mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    Provision_Microsoft_Entra_ID_Users[(&amp;quot;Provision Microsoft Entra ID Users&amp;quot;)]
    Add_New_Mapping[&amp;quot;Add New Mapping&amp;quot;]
    Source_Attribute_Dropdown[&amp;quot;Source Attribute Dropdown&amp;quot;]
    Show_Advanced_Options[&amp;quot;Show Advanced Options&amp;quot;]

    Provision_Microsoft_Entra_ID_Users --&amp;gt; Add_New_Mapping
    Add_New_Mapping --&amp;gt; Source_Attribute_Dropdown
    Add_New_Mapping --&amp;gt; Show_Advanced_Options
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom of the page and select Add new mapping.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Source attribute drop-down list, select a source attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you created a directory extension in the source tenant, select the directory extension.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ ❌ ❌&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Edit Attribute&lt;/h1&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type 0&lt;/p&gt;
&lt;p&gt;Direct&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Source attribute *&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeHireDate&lt;/p&gt;
&lt;p&gt;employeeld&lt;/p&gt;
&lt;p&gt;employeeLeaveDateTime&lt;/p&gt;
&lt;p&gt;employeeOrgData.costCenter&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeOrgData.division&lt;/p&gt;
&lt;p&gt;employeeType&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;testExtension (extension_c44d2adc1ddd43f29f29248e8de53937_testExtension)&lt;/p&gt;
&lt;p&gt;extensionAttribute1&lt;/p&gt;
&lt;p&gt;extensionAttribute10&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;In the Target attribute drop-down list, select a target attribute.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you created a directory extension in the target tenant, select the directory extension.&lt;/p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Select Ok to save the mapping.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Manually add directory extensions to the attribute list&lt;/h1&gt;
&lt;p&gt;Figure: Screenshot showing part of the configuration interface in a software application. It includes drop-down menus for selecting source attributes with a focus on handling attributes such as employee hire date, ID, leave date and time, cost center, and division among others. There is also an option to add directory extensions manually if they are not automatically listed.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceAttribute[&amp;quot;Source Attribute Dropdown&amp;quot;] --&amp;gt; |Select| EmployeeHireDate
    EmployeeHireDate --&amp;gt; EmployeeID
    EmployeeID --&amp;gt; EmployeeLeaveDateTime
    EmployeeLeaveDateTime --&amp;gt; EmployeeOrgData_CostCenter[&amp;quot;EmployeeOrgData.costCenter&amp;quot;]
    EmployeeOrgData_CostCenter --&amp;gt; EmployeeOrgData_Division[&amp;quot;EmployeeOrgData.division&amp;quot;]
    EmployeeOrgData_Division --&amp;gt; EmployeeType
    EmployeeType --&amp;gt; TestExtension
    TestExtension --&amp;gt; ExtensionAttribute1
    ExtensionAttribute1 --&amp;gt; ExtensionAttribute10
    ExtensionAttribute10 --&amp;gt; DirectoryExtensions[&amp;quot;Manually Add Directory Extensions&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;If your directory extension wasn&amp;#39;t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true --&gt;

&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom and select the Show advanced settings check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h1&gt;Attribute Mapping&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping&lt;/p&gt;
&lt;p&gt;Figure: Screenshot showing the &amp;quot;Show advanced settings&amp;quot; checkbox located below the attribute mapping table in the Microsoft Entra configuration page. Additionally, the focus is on an interface with &amp;#39;Save&amp;#39; and &amp;#39;Discard&amp;#39; buttons, emphasizing functionality allowing users to apply or discard changes to attribute mappings.&lt;/p&gt;
&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;p&gt;Figure: Schematic illustration or flowchart that demonstrates the process of reviewing, downloading, and editing the JSON representation of a schema using an option from the user interface provided in the Entra admin center. The focus of this figure is likely on the interaction between the user and the software via relevant interface elements.&lt;/p&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.&lt;/p&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;If you don&amp;#39;t see the Edit attribute list links, be sure that you are signed in to the Microsoft Entra admin center using the link in Step 1.&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;If you created a directory extension in the source tenant, select the Edit attribute list for Microsoft Entra ID link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created an extension in the target tenant, select the Edit attribute list for Azure Active Directory (target tenant) link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the directory extension and select the appropriate options.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Save ✅ Discard ❌ ❌&lt;/p&gt;
&lt;figure&gt;
    The image shows a software interface for attribute mapping in a provisioning system titled &quot;Fabrikam to Contoso | Provisioning &gt; Attribute Mapping &gt; Edit Attribute List&quot;. It features a modal dialog box with a list of attribute names and their corresponding types (like &apos;String&apos; or &apos;Boolean&apos;), with checkboxes next to them indicating different settings. Below the list is a dropdown that is currently selecting a String attribute with some identifier, and another dropdown is blank. There are tips provided on the side which emphasize the functionality of the attribute list editor mentioning to leave some fields blank depending on the attribute type or new addition. There&apos;s also an option to save or discard changes at the top of the dialog box.
&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;alternativeSecuritylds&lt;/th&gt;
&lt;th&gt;String&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;❌&lt;/th&gt;
&lt;th&gt;❌&lt;/th&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userState&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extension_c44d2adc1ddd4&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Manually add directory extensions by editing the schema&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema by using the schema editor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/h1&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Attribute Mapping
 ✅
X&lt;/p&gt;
&lt;p&gt;Save ✅ Discard&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping
 ✅&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;The first figure shows the &amp;quot;Attribute Mapping&amp;quot; interface with various attributes listed such as userPrincipalName, mail, and userType. Each attribute has a corresponding action button for deletion. Notably, there is a button highlighted for &amp;quot;Show advanced options&amp;quot; within the user interface.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    AttributeScreen[&amp;quot;Attribute Mapping Screen&amp;quot;] --&amp;gt;|Highlights| ShowAdvancedOptionsButton[&amp;quot;Show advanced options button&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;


&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.&lt;/p&gt;
&lt;h1&gt;7. Select the Review your schema here link to open the Schema editor page.&lt;/h1&gt;
&lt;p&gt;... Fabrikam to Contoso | Provisioning Attribute Mapping &amp;gt;&lt;/p&gt;
&lt;p&gt;Schema editor&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt; ✅
The schema below is a JSON representation of your provisioning configuration. You can use it to define what objects you want to provision, map objects between your source and target system, and specify who should be provisioned. We recommend making these changes directly through our configuration experience. The schema below is only used for saving your configuration and making changes in it.&lt;/p&gt;
&lt;p&gt;We recommend downloading and saving the current configuration prior to making changes. A backup copy can be used to roll back to a known good state.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;×&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure&gt;

&lt;p&gt;The second figure displays the &amp;quot;Schema Editor&amp;quot; page with the JSON schema visible including various attributes such as &amp;quot;id&amp;quot;, &amp;quot;version&amp;quot;, and detailed synchronization rules. The interface also features options to save, discard, or download the schema.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SchemaView[&amp;quot;Schema Editor View&amp;quot;] --&amp;gt;|Contains| JsonSchema[&amp;quot;JSON Schema Details&amp;quot;]
    JsonSchema --&amp;gt;|Includes| SyncRules[&amp;quot;Synchronization Rules&amp;quot;]
    SchemaView --&amp;gt;|Action Options| SaveOption[&amp;quot;Save&amp;quot;]
    SchemaView --&amp;gt;|Action Options| DiscardOption[&amp;quot;Discard&amp;quot;]
    SchemaView --&amp;gt;|Action Options| DownloadOption[&amp;quot;Download&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;


&lt;p&gt;8. Download an original copy of the schema as a backup.&lt;/p&gt;
&lt;p&gt;9. Modify the schema following your required configuration.&lt;/p&gt;
&lt;p&gt;10. Select Save.&lt;/p&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 01/26/2024&lt;/p&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h1&gt;Syntax overview&lt;/h1&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: FunctionName(&amp;lt;&amp;lt;argument 1&amp;gt;&amp;gt;, &amp;lt;&lt;argument N&gt;&amp;gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can nest functions within each other. For example: FunctionOne(FunctionTwo(&amp;lt;&lt;argument1&gt;&amp;gt;))&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can pass three different types of arguments into functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example: [attributeName]&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example: &amp;quot;United States&amp;quot;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: FunctionOne(&amp;lt;&lt;argument1&gt;&amp;gt;, FunctionTwo(&amp;lt;&lt;argument2&gt;&amp;gt;))&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For string constants, if you need a backslash () or quotation mark (&amp;quot;) in the string, it must be escaped with the backslash () symbol. For example: &amp;quot;Company name: &amp;quot;Contoso&amp;quot;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of Functions&lt;/p&gt;
&lt;p&gt;Append AppRoleAssignmentsComplex BitAnd CBool CDate Coalesce ConvertToBase64 ConvertToUTF8Hex Count CStr DateAdd DateDiff DateFromNum FormatDateTime Guid IgnoreFlowlfNullOrEmpty IIF InStr IsNull IsNullOrEmpty IsPresent IsString Item Join Left Mid NormalizeDiacritics Not Now NumFromDate PCase RandomString Redact RemoveDuplicates Replace SelectUnique Value SingleAppRoleAssignment Split StripSpaces Switch ToLower ToUpper Word&lt;/p&gt;
&lt;h1&gt;Append&lt;/h1&gt;
&lt;p&gt;Function: Append(source, suffix)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Append constant suffix to user name&lt;/p&gt;
&lt;p&gt;Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;Expression: Append ([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AppRoleAssignmentsComplex&lt;/p&gt;
&lt;p&gt;Function: AppRoleAssignmentsComplex([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Used to configure multiple roles for a user. For detailed usage, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;appRoleAssignments&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;appRoleAssignments object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;BitAnd&lt;/p&gt;
&lt;p&gt;Function: BitAnd(value1, value2)&lt;/p&gt;
&lt;p&gt;Description: This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/li&gt;
&lt;li&gt;1 - if both of the corresponding bits are 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: BitAnd (&amp;amp;HF, &amp;amp;HF7)&lt;/p&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;p&gt;CBool&lt;/p&gt;
&lt;p&gt;Function: CBool(Expression)&lt;/p&gt;
&lt;p&gt;Description: CBool returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then CBool returns True, else it returns False.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: CBool([attribute1] = [attribute2])&lt;/p&gt;
&lt;p&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;p&gt;CDate&lt;/p&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;CDate(expression)&lt;/p&gt;
&lt;p&gt;Description: The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as FormatDateTime and DateAdd.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Remarks: The returned string is always in UTC and follows the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example 1: CDate([StatusHireDate]) Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· OUTPUT: &amp;quot;3/16/2020 7:00:00 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 2: CDate(&amp;quot;2021-06-30+08:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2021-06-30+08:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 3:&lt;/p&gt;
&lt;p&gt;CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;h1&gt;Coalesce&lt;/h1&gt;
&lt;p&gt;Function: Coalesce(source1, source2, ... , defaultValue)&lt;/p&gt;
&lt;p&gt;Description: Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when all source values are NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;p&gt;Example: You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;p&gt;Expression: Coalesce([mail], [userPrincipalName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;. INPUT (mail): NULL&lt;/p&gt;
&lt;p&gt;. INPUT (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;. OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;h1&gt;ConvertToBase64&lt;/h1&gt;
&lt;p&gt;Function: ConvertToBase64(source)&lt;/p&gt;
&lt;p&gt;Description: The ConvertToBase64 function converts a string to a Unicode base64 string. Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABIAGwAbABvACAAdwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h1&gt;ConvertToUTF8Hex&lt;/h1&gt;
&lt;p&gt;Function: ConvertToUTF8Hex(source)&lt;/p&gt;
&lt;p&gt;Description: The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h1&gt;Count&lt;/h1&gt;
&lt;p&gt;Function: Count(attribute)&lt;/p&gt;
&lt;p&gt;Description: The Count function returns the number of elements in a multi-valued attribute&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that will have elements counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;CStr&lt;/p&gt;
&lt;p&gt;Function: CStr(value) Description: The CStr function converts a value to a string data type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: CStr([dn])&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;p&gt;DateAdd&lt;/p&gt;
&lt;p&gt;Function:
DateAdd(interval, value, dateTime)&lt;/p&gt;
&lt;p&gt;Description:
Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. Can be positive or negative.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTime&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use CDate function to wrap the datetime string. To get system time in UTC, use the Now function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 1: Generate a date value based on incoming StatusHireDate from Workday
DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;interval value&lt;/th&gt;
&lt;th&gt;dateTime (value of variable StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Add 7 days to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a date ten days&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prior to hire date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two weeks to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;ʹww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add ten months to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two years to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;DateDiff&lt;/h1&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;DateDiff(interval, date1, date2)&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;This function uses the interval parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;p&gt;· a positive number if date2 &amp;gt; date1,&lt;/p&gt;
&lt;p&gt;· a negative number if date2 &amp;lt; date1,&lt;/p&gt;
&lt;p&gt;· 0 if date2 == date1&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;DateTime DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use CDate function to wrap the datetime string. To get system time in UTC, use the Now function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;p&gt;· yyyy Year&lt;/p&gt;
&lt;p&gt;· m Month&lt;/p&gt;
&lt;p&gt;· d Day&lt;/p&gt;
&lt;p&gt;· ww Week&lt;/p&gt;
&lt;p&gt;· h Hour&lt;/p&gt;
&lt;p&gt;· n Minute&lt;/p&gt;
&lt;p&gt;· s Second&lt;/p&gt;
&lt;p&gt;Example 1: Compare current date with hire date from Workday with different intervals DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Positive difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in weeks between two dates&lt;/td&gt;
&lt;td&gt;ww&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in months between two dates&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in years between two dates&lt;/td&gt;
&lt;td&gt;yyyy&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference when both dates are same&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in hours between two dates&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in minutes between two dates&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in seconds between two dates&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 2: Combine DateDiff with IIF function to set attribute value
If an account is Active in Workday, set the accountEnabled attribute of the user to True only if hire date is within the next five days.&lt;/p&gt;
&lt;p&gt;Switch([Active], , &amp;quot;1&amp;quot;, IIF(DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate])) &amp;gt; 5, &amp;quot;False&amp;quot;, &amp;quot;True&amp;quot;), &amp;quot;0&amp;quot;, &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;h1&gt;DateFromNum&lt;/h1&gt;
&lt;p&gt;Function: DateFromNum(value)&lt;br&gt;Description: The DateFromNum function converts a value in AD&amp;#39;s date format to a DateTime type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;AD Date to be converted to DateTime type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: DateFromNum([lastLogonTimestamp])&lt;/p&gt;
&lt;p&gt;DateFromNum(129699324000000000)&lt;/p&gt;
&lt;p&gt;Returns a DateTime representing January 1, 2012 at 11:00PM.&lt;/p&gt;
&lt;h1&gt;FormatDateTime&lt;/h1&gt;
&lt;p&gt;Function: FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)&lt;br&gt;Description: Takes a date string from one format and converts it into a different format. Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTimeStyles&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;inputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Expected format of the source value. For supported formats, see .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Format of the output date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Output date as a string in a certain format&lt;/h1&gt;
&lt;p&gt;Example: You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;p&gt;FormatDateTime([extensionAttribute1], &amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;2015-01-23&amp;quot;&lt;/p&gt;
&lt;h1&gt;Guid&lt;/h1&gt;
&lt;p&gt;Function: Guid()&lt;/p&gt;
&lt;p&gt;Description: The function Guid generates a new random GUID&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;Guid()&lt;/p&gt;
&lt;p&gt;Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;h1&gt;IgnoreFlowlfNullOrEmpty&lt;/h1&gt;
&lt;p&gt;Function: IgnoreFlowlfNullOrEmpty(expression)&lt;/p&gt;
&lt;p&gt;Description: The IgnoreFlowlfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Don&amp;#39;t flow an attribute if it is null
IgnoreFlowIfNullOrEmpty([department])
The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;p&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null
Let&amp;#39;s say the SuccessFactors attribute prefix is mapped to the on-premises Active Directory attribute personalTitle using the following expression mapping:
IgnoreFlowIfNullOrEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr. &amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))
The above expression first evaluates the Switch function. If the prefix attribute doesn&amp;#39;t have any of the values listed within the Switch function, then Switch will return an empty string and the attribute personalTitle will not be included in the provisioning flow to on-premises Active Directory.&lt;/p&gt;
&lt;p&gt;IIF&lt;/p&gt;
&lt;p&gt;Function: IIF(condition,valuelfTrue,valuelfFalse)
Description: The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valuelfTrue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;valuelfFalse&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to false, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following comparison operators can be used in the condition:&lt;/p&gt;
&lt;p&gt;· Equal to (=) and not equal to (&amp;lt;&amp;gt;)&lt;/p&gt;
&lt;p&gt;· Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)&lt;/p&gt;
&lt;p&gt;· Less than (&amp;lt;) and less than equal to ( &amp;lt;= )&lt;/p&gt;
&lt;p&gt;Example: Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute. IIF([country]=&amp;quot;USA&amp;quot;, [ country], [department])&lt;/p&gt;
&lt;h1&gt;Known limitations&lt;/h1&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For information about troubleshooting user creation issues, see Creation fails due to null / empty values.&lt;/p&gt;
&lt;p&gt;. The IIF function currently doesn&amp;#39;t support AND and OR logical operators.&lt;/p&gt;
&lt;p&gt;. To implement AND logic, use nested IIF statement chained along the trueValue path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;), &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;p&gt;· To implement OR logic, use nested IIF statement chained along the falseValue path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, &amp;quot;True&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;))&lt;/p&gt;
&lt;p&gt;. If the source attribute used within the IIF function is empty or null, the condition check fails.&lt;/p&gt;
&lt;p&gt;o Unsupported IIF expression examples:
o IIF ([country]=&amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;, [country])
o IIF (IsNullOrEmpty([country]), &amp;quot;Other&amp;quot;, [country])
o IIF (IsPresent([country]), [country], &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;p&gt;o Recommended workaround: Use the Switch function to check for empty/null values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present, pass the country attribute value to target attribute.&lt;/p&gt;
&lt;p&gt;o Switch([country], [country], &amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;p&gt;Function: InStr(value1, value2, start, compareType)&lt;/p&gt;
&lt;p&gt;Description: The InStr function finds the first occurrence of a substring in a string &lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compareType&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: InStr(&amp;quot;The quick brown fox&amp;quot;, &amp;quot;quick&amp;quot;)&lt;/p&gt;
&lt;p&gt;Evaluates to 5&lt;/p&gt;
&lt;p&gt;InStr(&amp;quot;repEated&amp;quot;, &amp;quot;e&amp;quot;, 3, vbBinaryCompare)&lt;/p&gt;
&lt;p&gt;Evaluates to 7&lt;/p&gt;
&lt;p&gt;IsNull&lt;/p&gt;
&lt;p&gt;Function: IsNull(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNull([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;p&gt;IsNullorEmpty&lt;/p&gt;
&lt;p&gt;Function: IsNullOrEmpty(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNullOrEmpty([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h1&gt;IsPresent&lt;/h1&gt;
&lt;p&gt;Function: IsPresent(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Switch(IsPresent([directManager]), [directManager],
IsPresent([skiplevelManager]), [skiplevelManager], IsPresent([director]), [director])&lt;/p&gt;
&lt;h2&gt;IsString&lt;/h2&gt;
&lt;p&gt;Function: IsString(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression can be evaluated to a string type, then the IsString function evaluates to True. &lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Item&lt;/h1&gt;
&lt;p&gt;Function: Item(attribute, index)&lt;/p&gt;
&lt;p&gt;Description: The Item function returns one item from a multi-valued string/attribute. Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Item([proxyAddresses], 1) returns the first item in the multi-valued attribute. Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h1&gt;Join&lt;/h1&gt;
&lt;p&gt;Function: Join(separator, source1, source2, ... )&lt;/p&gt;
&lt;p&gt;Description: Join() is similar to Append(), except that it can combine multiple source string values into a single string, and each value will be separated by a separator string.&lt;/p&gt;
&lt;p&gt;If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &amp;quot;&amp;quot; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required, variable- number of times&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String values to be joined together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Left&lt;/h1&gt;
&lt;p&gt;Function: Left(String, NumChars)&lt;/p&gt;
&lt;p&gt;Description: The Left function returns a specified number of characters from the left of a string. If NumChars = 0, return empty string. If NumChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in NumChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Attribute The string to return characters from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumChars&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;A number identifying the number of characters to return from the beginning (left) of string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Mid&lt;/h1&gt;
&lt;p&gt;Function: Mid(source, start, length)&lt;/p&gt;
&lt;p&gt;Description: Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string from which characters are extracted.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;The position to start the extraction. First character is 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;The number of characters to extract.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Mid(&amp;quot;Hello, World!&amp;quot;, 2, 5)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;ello,&amp;quot;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;NormalizeDiacritics&lt;/h1&gt;
&lt;p&gt;Function: NormalizeDiacritics(source)&lt;/p&gt;
&lt;p&gt;Description: Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters (accent marks) into legal values that can be used in various user identifiers such as user principal names, SAM account names, and email addresses.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ä, à, â, ã, å, á, ą, ă, ā, á, à, â, ã, ã, ä, å, a, å&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Ä, À, Â, Ã, Å, Á, Ą, Ă, Ā, Á, À, Â, Ã, Ã, Ä, Ã, A, Å&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, æ&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Ā&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, č, ć, č, c&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, Č, Ć, Č, C&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ď, d, d&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Ď, D, D&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ë, è, é, ê, ę, ě, ė, ē, é, è, ê, ẽ, ē, e̱, ē, é&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;Ë, È, É, Ê, Ę, Ě, Ė, Ē, É, È, Ê, ẽ, Ē, Ė, Ē, É&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ğ, ğ, g&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ğ, Ğ, Ģ&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ï, î, ì, í, ı, ī, Í, ì, î, ĩ, į&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;&amp;lt;1- 21&lt;/td&gt;
&lt;td&gt;- ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&amp;#39;, ł, I, [, ]&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Ł, Ľ, L, GL&lt;/td&gt;
&lt;td&gt;L ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ñ, ń, ň, n̄, ṋ&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ñ, Ń, Ň, N̄, Ņ&lt;/td&gt;
&lt;td&gt;N ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ö, ò, ő, õ, ô, ó, ō, ố, ồ, ô, õ, ô, ö, ọ, õ, ỏ, o&lt;/td&gt;
&lt;td&gt;O ❌&lt;/td&gt;
&lt;td&gt;Ö, Ò, Ő, Õ, Ô, Ó, ô, Ô, Ò, ô, ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌  Õ, Ô, Ö, Q, õ, ỏ, 0&lt;/td&gt;
&lt;td&gt;O ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ø,ø, œ ✅&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Ø,Ø, Œ ✅&lt;/td&gt;
&lt;td&gt;OE ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ř, r, r, r&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ř, Ř, R, Ř&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;SS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;š, Ś, ș, ș, š, S&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Š, Ś, Ș, Ș, Š, S&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ť, ț, t, t&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ť, Ț, Ī, Ţ&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ü, ù, û, ú, ů, ű, ū, ú, ù, û, ũ, ū, ū, ũ, u̱, u̱&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Ü, Ù, Û, Ú, Ů, Ű, Ū, Ú, Ù, Û, Õ, U&lt;/td&gt;
&lt;td&gt;Ú, Ü, Ü, Ų, U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ÿ, ý, ÿ, ý, ỳ, ỹ, y&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Ÿ, Ý, Y, Ý, Ỳ, Ý, Y&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ź, ž, ż, ž, z&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;Ź, Ž, Ż,Ż,Z&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Remove diacritics from a string&lt;/p&gt;
&lt;p&gt;Example: Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/p&gt;
&lt;p&gt;Expression: NormalizeDiacritics([givenName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INPUT (givenName): &amp;quot;Zoë&amp;quot;

OUTPUT: &amp;quot;Zoe&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not&lt;/p&gt;
&lt;p&gt;Function: Not(source)&lt;/p&gt;
&lt;p&gt;Description: Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Boolean String&lt;/td&gt;
&lt;td&gt;Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Now&lt;/h1&gt;
&lt;p&gt;Function: Now()&lt;/p&gt;
&lt;p&gt;Description: The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example: Now() Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;h1&gt;NumFromDate&lt;/h1&gt;
&lt;p&gt;Function: NumFromDate(value)&lt;/p&gt;
&lt;p&gt;Description: The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 format. If the date variable is in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;a different format, use FormatDateTime function to convert the&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Workday example Assuming you want to map the attribute ContractEndDate from Workday, which is in the format 2020-12-31-08:00 to accountExpires field in AD, here’s how you can use this function and change the timezone offset to match your locale. NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], ,&amp;quot;yyyy-MM-ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SuccessFactors example Assuming you want to map the attribute endDate from SuccessFactors, which is in the format M/d/yyyy hh:mm:ss tt to accountExpires field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale. NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([endDate], ,&amp;quot;M/d/yyyy hh:mm:ss tt&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;PCase&lt;/h1&gt;
&lt;p&gt;Function: PCase(source, wordSeparators)&lt;/p&gt;
&lt;p&gt;Description: The PCase function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify a set of characters that is used as word separators (example: &amp;quot; ,-&amp;#39;&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Remarks:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If the wordSeparators parameter isn&amp;#39;t specified, then PCase internally invokes the .NET function ToTitleCase to convert the source string to proper case. The .NET function ToTitleCase supports a comprehensive set of the Unicode character categories as word separators.&lt;ul&gt;
&lt;li&gt;Space character ❌&lt;/li&gt;
&lt;li&gt;New line character ❌&lt;/li&gt;
&lt;li&gt;Control characters like CRLF ❌&lt;/li&gt;
&lt;li&gt;Format control characters ❌&lt;/li&gt;
&lt;li&gt;ConnectorPunctuation characters like underscore ❌&lt;/li&gt;
&lt;li&gt;DashPunctuation characters like dash and hyphen (including characters such En Dash, Em Dash, double hyphen, etc.) ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;o OpenPunctuation and ClosePunctuation characters that occur in pairs like parenthesis, curly bracket, angle bracket, etc.&lt;/p&gt;
&lt;p&gt;o InitialQuotePunctuation and FinalQuotePunctuation characters like single quotes, double quotes and angular quotes.&lt;/p&gt;
&lt;p&gt;o OtherPunctuation characters like exclamation mark, number sign, percent sign, ampersand, asterisk, comma, full stop, colon, semi-colon, etc.&lt;/p&gt;
&lt;p&gt;o MathSymbol characters like plus sign, less-than and greater-than sign, vertical line, tilde, equals sign, etc.&lt;/p&gt;
&lt;p&gt;o CurrencySymbol characters like dollar sign, cent sign, pound sign, euro sign, etc.&lt;/p&gt;
&lt;p&gt;o ModifierSymbol characters like macron, accents, arrow heads, etc.&lt;/p&gt;
&lt;p&gt;o OtherSymbol characters like copyright sign, degree sign, registered sign, etc.&lt;/p&gt;
&lt;p&gt;If the wordSeparators parameter is specified, then PCase only uses the characters specified as word separators.&lt;/p&gt;
&lt;h1&gt;Example:&lt;/h1&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes firstName and lastName from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PCase([firstName])&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;PABLO&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo&lt;/td&gt;
&lt;td&gt;As the wordSeparators parameter isn&amp;#39;t specified,&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;GONSALVES (SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;Gonsalves (Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;the PCase function uses the default word separators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase([lastName],&amp;quot; &amp;#39;-&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;PINTO-&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-&lt;/td&gt;
&lt;td&gt;The PCase function uses characters in the&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;)&lt;/td&gt;
&lt;td&gt;DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;wordSeparators parameter to identify words and&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase (Join(&amp;quot; &amp;quot;,&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;GREGORY,&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory&lt;/td&gt;
&lt;td&gt;You can nest the Join function within&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[firstName],&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;James&amp;quot;&lt;/td&gt;
&lt;td&gt;PCase. As the wordSeparators parameter isn&amp;#39;t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[lastName]))&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;specified, the PCase function uses the default word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;RandomString&lt;/h1&gt;
&lt;p&gt;Function: RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)&lt;/p&gt;
&lt;p&gt;Description: The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified here.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: - Generate a random string without special character restrictions: RandomString(6,3,0,0,3) Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/p&gt;
&lt;p&gt;Example 2: - Generate a random string with special character restrictions: RandomString(10, 2,2,2,1,&amp;quot;?,&amp;quot;) Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/p&gt;
&lt;p&gt;Redact&lt;/p&gt;
&lt;p&gt;Function: Redact()&lt;/p&gt;
&lt;p&gt;Description: The Redact function replaces the attribute value with the string literal &amp;quot; [Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute/value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Redact an attribute: Redact([userPrincipalName]) Removes the userPrincipalName from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 2: Redact a string: Redact(&amp;quot;StringToBeRedacted&amp;quot;) Removes a constant string from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 3: Redact a random string: Redact(RandomString(6,3,0,0,3)) Removes the random string from the provisioning logs.&lt;/p&gt;
&lt;h1&gt;RemoveDuplicates&lt;/h1&gt;
&lt;p&gt;Function: RemoveDuplicates(attribute)&lt;/p&gt;
&lt;p&gt;Description: The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: RemoveDuplicates([proxyAddresses]) Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/p&gt;
&lt;h2&gt;Replace&lt;/h2&gt;
&lt;p&gt;Function: Replace(source, oldValue, regexPattern, regexGroupName, replacementValue, replacementAttributeName, template)&lt;/p&gt;
&lt;p&gt;Description: Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided:&lt;/p&gt;
&lt;p&gt;· When oldValue and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o Replaces all occurrences of oldValue in the source with replacementValue&lt;/p&gt;
&lt;p&gt;· When oldValue and template are provided:&lt;/p&gt;
&lt;p&gt;o Replaces all occurrences of the oldValue in the template with the source value&lt;/p&gt;
&lt;p&gt;· When regexPattern and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o The function applies the regexPattern to the source string and you can use the regex group names to construct the string for replacementValue&lt;/p&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;p&gt;To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.&lt;/p&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o The function applies the regexPattern to the source string and replaces all values matching regexGroupName with replacementValue&lt;/p&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementAttributeName are provided:&lt;/p&gt;
&lt;p&gt;o If source has a value, source is returned
o If source has no value, the function applies the regexPattern to the replacementAttributeName and returns the value matching regexGroupName&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in source or template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in source. When replacementAttributeName is used, the regexPattern is applied to extract a value from replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside regexPattern. When named replacementAttributeName is used, we&amp;#39;ll extract the value of the named regex group from the&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;New value to replace old one with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the attribute to be used for replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;When template value is provided, we&amp;#39;ll look for oldValue inside the template and replace it with source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Replace characters using a regular expression&lt;/h1&gt;
&lt;p&gt;Example 1: Using oldValue and replacementValue to replace the entire source string with another string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your HR system has an attribute BusinessTitle. As part of recent job title changes, your company wants to update anyone with the business title &amp;quot;Product Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([BusinessTitle], &amp;quot;Product Developer&amp;quot;, , , &amp;quot;Software Engineer&amp;quot;, , )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [BusinessTitle]&lt;/li&gt;
&lt;li&gt;oldValue: &amp;quot;Product Developer&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;Software Engineer&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: Software Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 2: Using oldValue and template to insert the source string into another templatized string.&lt;/p&gt;
&lt;p&gt;The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets replaced.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you want to always generate login ID in the format &lt;username&gt;@contoso.com. There is a source attribute called UserID and you want that value to be used for the &lt;username&gt; portion of the login ID. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([UserID], &amp;quot;&amp;lt;username&amp;gt;&amp;quot;, , , , , &amp;quot;&amp;lt;username&amp;gt;@contoso.com&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;source: [UserID] = &amp;quot;jsmith&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oldValue: &amp;quot;&lt;username&gt;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;template: &amp;quot;&lt;username&gt;@contoso.com&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expression output: &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 3: Using regexPattern and replacementValue to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you have a source attribute telephoneNumber that has components country code and phone number separated by a space character. For example, +91 9998887777 Then in this case, you can use the following expression in your attribute mapping to extract the 10 digit phone number.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber],, &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&amp;quot;,, &amp;quot;${ phoneNumber}&amp;quot;,, )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: [telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;&lt;/li&gt;
&lt;li&gt;regexPattern: &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;${ phoneNumber}&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: 9998887777&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also use this pattern to remove characters and collapse a string. For example, the expression below removes parenthesis, dashes and space characters in the mobile number string and returns only digits.&lt;/p&gt;
&lt;p&gt;Replace([mobile],, &amp;quot;[ ()\\s-]+&amp;quot;,, &amp;quot;&amp;quot;,, )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: [mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/li&gt;
&lt;li&gt;regexPattern: &amp;quot;[ ()\\s-]+&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/li&gt;
&lt;li&gt;Expression output: 19998887777&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 4: Using regexPattern, regexGroupName and replacementValue to extract a portion of the source string and replace it with another literal value or empty string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute AddressLineData with two components street number and street name. As part of a recent move, let&amp;#39;s say the street number of the address changed, and you want to update only the street number portion of the address line. Then in this case, you can use the following expression in your attribute mapping to extract the street number.&lt;/p&gt;
&lt;p&gt;Replace([AddressLineData],, &amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;, &amp;quot;streetNumber&amp;quot;, &amp;quot;888&amp;quot;,, )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: [AddressLineData] = &amp;quot;545 Tremont Street&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· regexPattern: &amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;streetNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;888&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 888 Tremont Street&lt;/p&gt;
&lt;p&gt;Here is another example where the domain suffix from a UPN is replaced with an empty string to generate login ID without domain suffix.&lt;/p&gt;
&lt;p&gt;Replace([userPrincipalName], , &amp;quot;(?&lt;Suffix&gt;@(.)*)&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [userPrincipalName] =&amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;(?&lt;Suffix&gt;@(.)*&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;Suffix&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· Expression output: jsmith&lt;/p&gt;
&lt;p&gt;Example 5: Using regexPattern, regexGroupName and replacementAttributeName to handle scenarios when the source attribute is empty or doesn&amp;#39;t have a value.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute telephoneNumber. If telephoneNumber is empty, you want to extract the 10 digits of the mobile number attribute. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;, &amp;quot;phoneNumber&amp;quot; , , [mobile], )&lt;/p&gt;
&lt;p&gt;· source: [telephoneNumber] = &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;\+(?&lt;isdCode&gt;\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;phoneNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementAttributeName: [mobile] = &amp;quot;+91 8887779999&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 8887779999&lt;/p&gt;
&lt;p&gt;Example 6: You need to find characters that match a regular expression value and remove them.&lt;/p&gt;
&lt;p&gt;Replace([mailNickname], , &amp;quot;[a-zA-Z_]*&amp;quot; و , , )&lt;/p&gt;
&lt;p&gt;· source [mailNickname]&lt;/p&gt;
&lt;p&gt;· oldValue: &amp;quot;john_doe72&amp;quot;&lt;/p&gt;
&lt;p&gt;· replaceValue: &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 72&lt;/p&gt;
&lt;h1&gt;SelectUniqueValue&lt;/h1&gt;
&lt;p&gt;Function: SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ... )&lt;/p&gt;
&lt;p&gt;Description: Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This function must be at the top-level and cannot be nested.&lt;/li&gt;
&lt;li&gt;This function cannot be applied to attributes that have a matching precedence.&lt;/li&gt;
&lt;li&gt;This function is only meant to be used for entry creations. When using it with an attribute, set the Apply Mapping property to Only during object creation.&lt;/li&gt;
&lt;li&gt;This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/li&gt;
&lt;li&gt;The LDAP search that SelectUniqueValue function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the NormalizeDiacritics function as shown in the example below to normalize special characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parameters:
Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1 ...&lt;/td&gt;
&lt;td&gt;At least 2 are required,&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uniqueValueRuleN&lt;/td&gt;
&lt;td&gt;no upper bound&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/h2&gt;
&lt;p&gt;Example: Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;p&gt;ad-attr-mapping-expr&lt;/p&gt;
&lt;p&gt;SelectUniqueValue(
Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, 
[PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;), Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;) )&lt;/p&gt;
&lt;h1&gt;Sample input/output:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; doesn&amp;#39;t already exist in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; already exists in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in the directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SingleAppRoleAssignment&lt;/h1&gt;
&lt;p&gt;Function: SingleAppRoleAssignment([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Split&lt;/h1&gt;
&lt;p&gt;Function: Split(source, delimiter)&lt;/p&gt;
&lt;p&gt;Description: Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiter&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Split a string into a multi-valued array&lt;/h1&gt;
&lt;p&gt;Example: You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Expression: Split([extensionAttribute5], &amp;quot;,&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;StripSpaces&lt;/h1&gt;
&lt;p&gt;Function: StripSpaces(source)&lt;/p&gt;
&lt;p&gt;Description: Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Switch&lt;/h1&gt;
&lt;p&gt;Function: Switch(source, defaultValue, key1, value1, key2, value2, ... )&lt;/p&gt;
&lt;p&gt;Description: When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;h2&gt;Note&lt;/h2&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;) . In this example, the source attribute statusFlag may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;h2&gt;Caution&lt;/h2&gt;
&lt;p&gt;For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. Example: Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;) . In this example, if the source attribute statusFlag is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when source doesn&amp;#39;t match any keys. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Replace a value based on predefined set of options&lt;/h1&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;Expression: Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (state): &amp;quot;QLD&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;Australia/Brisbane&amp;quot;&lt;/p&gt;
&lt;h1&gt;ToLower&lt;/h1&gt;
&lt;p&gt;Function: ToLower(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to lower case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two- letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/p&gt;
&lt;p&gt;Example: You would like to generate the UPN value by concatenating the PreferredFirstName and PreferredLastName source fields and converting all characters to lower case.&lt;/p&gt;
&lt;p&gt;ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ToUpper&lt;/p&gt;
&lt;p&gt;Function: ToUpper(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Word&lt;/p&gt;
&lt;p&gt;Function: Word(String,WordNumber,Delimiters)&lt;/p&gt;
&lt;p&gt;Description: The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Word(&amp;quot;The quick brown fox&amp;quot;, 3, &amp;quot; &amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;Word(&amp;quot;This, string!has&amp;amp;many separators&amp;quot;, 3, &amp;quot;, ! &amp;amp;#&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Examples&lt;/h1&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h1&gt;Strip known domain name&lt;/h1&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;p&gt;Expression: Replace([mail], &amp;quot;@contoso.com&amp;quot;, , ,&amp;quot;&amp;quot;, ,)&lt;/p&gt;
&lt;p&gt;Sample input / output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;john.doe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Generate user alias by concatenating parts of first and last name&lt;/h1&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;p&gt;Expression: Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;JohDoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;Expression: Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Doe, John&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generate an ID for a user based on their Microsoft Entra ID object ID. Remove any letters from the ID and add 1000 at the beginning.&lt;/p&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;p&gt;Expression: Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectld]), , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, , ))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· OUTPUT: &amp;quot;100064303565343762312333930392343435612626135652636136306362633065346234&amp;quot;&lt;/p&gt;
&lt;h1&gt;Related Articles&lt;/h1&gt;
&lt;p&gt;· Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/p&gt;
&lt;p&gt;· Customizing Attribute Mappings for User Provisioning&lt;/p&gt;
&lt;p&gt;· Scoping Filters for User Provisioning&lt;/p&gt;
&lt;p&gt;· Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/p&gt;
&lt;p&gt;· Account Provisioning Notifications&lt;/p&gt;
&lt;p&gt;· List of Tutorials on How to Integrate SaaS Apps&lt;/p&gt;
</content:encoded></item><item><title>mtoGPT4OmniWithDocIntelOCR</title><link>https://www.elumenotion.com/journal/mtogpt4omniwithdocintelocr/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtogpt4omniwithdocintelocr/</guid><pubDate>Sat, 18 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Multitenant organizations documentation&lt;/h1&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h1&gt;About multitenant organizations&lt;/h1&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;Multitenant organization capabilities&lt;/p&gt;
&lt;p&gt;Compare multitenant capabilities&lt;/p&gt;
&lt;p&gt;Configure a multitenant organization&lt;/p&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;What is a multitenant organization?
✅
HOW-TO GUIDE&lt;/p&gt;
&lt;p&gt;Microsoft 365 admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;Configure cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;What is cross-tenant synchronization?
✅
HOW-TO GUIDE&lt;/p&gt;
&lt;p&gt;Microsoft Entra admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API
✅&lt;/p&gt;
&lt;p&gt;Collaborate in Microsoft 365&lt;/p&gt;
&lt;!-- Image not found: concept-icon.png --&gt;
&lt;!-- ![Icon: Concept](concept-icon.png) --&gt;
&lt;h3&gt;CONCEPT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Identity provisioning for Microsoft 365&lt;/li&gt;
&lt;li&gt;Microsoft 365 multitenant people search&lt;/li&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;What is a tenant?&lt;/h1&gt;
&lt;p&gt;A tenant is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h1&gt;What is a multitenant organization?&lt;/h1&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conglomerates: Organizations with multiple subsidiaries or business units that operate independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Mergers and acquisitions: Organizations that merge or acquire companies.&lt;/p&gt;
&lt;p&gt;· Divestiture activity: In a divestiture, one organization splits off part of its business to form a new organization or sell it to an existing organization.&lt;/p&gt;
&lt;p&gt;· Multiple clouds: Organizations that have compliance or regulatory needs to exist in multiple cloud environments.&lt;/p&gt;
&lt;p&gt;· Multiple geographical boundaries: Organizations that operate in multiple geographic locations with various residency regulations.&lt;/p&gt;
&lt;p&gt;· Test or staging tenants: Organizations that need multiple tenants for testing or staging purposes before deploying more broadly to primary tenants.&lt;/p&gt;
&lt;p&gt;· Department or employee-created tenants: Organizations where departments or employees have created tenants for development, testing, or separate control.&lt;/p&gt;
&lt;h1&gt;Multitenant challenges&lt;/h1&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization.&lt;/p&gt;
&lt;p&gt;[Figure content: A diagram showing three tenants with X marks between them, indicating that users across these tenants might not be able to access resources and collaborate.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    TenantA[&amp;quot;Tenant&amp;quot;] -- X --&amp;gt; PrimaryTenant[&amp;quot;Primary tenant&amp;quot;]
    PrimaryTenant -- X --&amp;gt; TenantB[&amp;quot;Tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;h2&gt;B2B direct connect&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use Microsoft Entra B2B direct connect. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B2B direct connect users -&amp;gt; Tenant -&amp;gt; Primary tenant -&amp;gt; Teams Connect shared channels -&amp;gt; Tenant -&amp;gt; B2B direct connect users&lt;/p&gt;
&lt;p&gt;For more information, see B2B direct connect overview.&lt;/p&gt;
&lt;h1&gt;B2B collaboration&lt;/h1&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use Microsoft Entra B2B collaboration. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using B2B collaboration across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrators must invite users using the B2B invitation process or build an onboarding experience using the B2B collaboration invitation manager.&lt;/li&gt;
&lt;li&gt;Administrators might have to synchronize users using custom scripts.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B2B collab users -&amp;gt; Tenant -&amp;gt; (Microsoft apps, Non-Microsoft apps) -&amp;gt; Primary tenant -&amp;gt; B2B collab users&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    B2B_direct_connect_users1[&amp;quot;B2B direct connect users&amp;quot;] --&amp;gt; Tenant1[&amp;quot;Tenant&amp;quot;]
    Tenant1 --&amp;gt; Primary_tenant1[&amp;quot;Primary tenant&amp;quot;]
    Primary_tenant1 --&amp;gt; Teams_Connect_shared_channels[&amp;quot;Teams Connect shared channels&amp;quot;]
    Teams_Connect_shared_channels --&amp;gt; Tenant2[&amp;quot;Tenant&amp;quot;]
    Tenant2 --&amp;gt; B2B_direct_connect_users2[&amp;quot;B2B direct connect users&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    B2B_collab_users1[&amp;quot;B2B collab users&amp;quot;] --&amp;gt; Tenant3[&amp;quot;Tenant&amp;quot;]
    Tenant3 --&amp;gt; Microsoft_apps[&amp;quot;Microsoft apps&amp;quot;]
    Tenant3 --&amp;gt; Non_Microsoft_apps[&amp;quot;Non-Microsoft apps&amp;quot;]
    Microsoft_apps --&amp;gt; Primary_tenant2[&amp;quot;Primary tenant&amp;quot;]
    Non_Microsoft_apps --&amp;gt; Primary_tenant2[&amp;quot;Primary tenant&amp;quot;]
    Primary_tenant2 --&amp;gt; B2B_collab_users2[&amp;quot;B2B collab users&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;B2B collaboration overview&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use cross-tenant synchronization. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits with using cross-tenant synchronization:&lt;/p&gt;
&lt;p&gt;· Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/p&gt;
&lt;p&gt;· Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/p&gt;
&lt;p&gt;· Automatically update users and remove them when they leave the organization.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using cross-tenant synchronization across multiple tenants:&lt;/p&gt;
&lt;p&gt;· Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;p&gt;· Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram of the cross-tenant synchronization process. Shows the source tenant, cross-tenant sync, target tenant, cross-tenant sync again, and finally the source tenant with labels for Microsoft apps and Non-Microsoft apps.](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    SourceTenantA[&amp;quot;Source tenant&amp;quot;] --&amp;gt; CrossTenantSyncA[&amp;quot;Cross-tenant sync&amp;quot;]
    CrossTenantSyncA --&amp;gt; TargetTenant[&amp;quot;Target tenant&amp;quot;]
    TargetTenant --&amp;gt; CrossTenantSyncB[&amp;quot;Cross-tenant sync&amp;quot;]
    CrossTenantSyncB --&amp;gt; SourceTenantB[&amp;quot;Source tenant&amp;quot;]

    subgraph Applications
        MicrosoftApps[&amp;quot;Microsoft apps&amp;quot;]
        NonMicrosoftApps[&amp;quot;Non-Microsoft apps&amp;quot;]
    end

    CrossTenantSyncA --&amp;gt; MicrosoftApps
    CrossTenantSyncB --&amp;gt; NonMicrosoftApps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;What is cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Multitenant organization&lt;/h1&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;p&gt;· Differentiate in-organization and out-of-organization external users&lt;/p&gt;
&lt;p&gt;· Improved collaborative experience in new Microsoft Teams&lt;/p&gt;
&lt;p&gt;· Improved people search experience across tenants&lt;/p&gt;
&lt;figure&gt;
Diagram showing three tenants. The top tenant is labeled &quot;Owner tenant (C),&quot; and it&apos;s connected to two &quot;Member tenants (A and B)&quot; through cross-tenant access settings.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see What is a multitenant organization in Microsoft Entra ID?.&lt;/p&gt;
&lt;h1&gt;Compare multitenant capabilities&lt;/h1&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature. For more information about different external identity scenarios, see Comparing External Identities feature sets.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Users can access Teams Connect shared channels hosted in external tenants.&lt;/td&gt;
&lt;td&gt;Users can access apps/resources hosted in external tenants, usually with limited guest privileges. Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant.&lt;/td&gt;
&lt;td&gt;Users can seamlessly access apps/resources across the same organization, even if they&amp;#39;re hosted in different tenants.&lt;/td&gt;
&lt;td&gt;Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Enables external collaboration within Teams Connect shared channels only. More convenient for administrators because they don&amp;#39;t have to manage B2B users.&lt;/td&gt;
&lt;td&gt;Enables external collaboration. More control and monitoring for administrators by managing the B2B collaboration users. Administrators can limit the access that these external users have to their apps/resources.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators don&amp;#39;t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators continue to have full configuration ability via cross-tenant access settings. Optional cross-tenant access templates allow pre-configuration of cross-tenant access settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary administrator workflow&lt;/td&gt;
&lt;td&gt;Configure cross-tenant access to provide external users inbound access to tenant the credentials for their home tenant.&lt;/td&gt;
&lt;td&gt;Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration&lt;/td&gt;
&lt;td&gt;Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Create a multitenant organization, add (invite) tenants, join a multitenant organization. Leverage existing B2B collaboration users or use cross-tenant synchronization to&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;invitation manager.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;provision B2B collaboration users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust level&lt;/td&gt;
&lt;td&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/td&gt;
&lt;td&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on users&lt;/td&gt;
&lt;td&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/td&gt;
&lt;td&gt;External users are added to a tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User type&lt;/td&gt;
&lt;td&gt;B2B direct connect user - N/A&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External member ❌&lt;/td&gt;
&lt;td&gt;- External member (default) - External guest ❌ ❌&lt;/td&gt;
&lt;td&gt;- External member (default) ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External guest (default) ❌&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following diagram shows how B2B direct connect, B2B collaboration, and cross-tenant synchronization capabilities could be used together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt; Diagram illustrating the integration of B2B direct connect, B2B collaboration, and cross-tenant synchronization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    B2BDirectConnect[&amp;quot;B2B direct connect&amp;quot;]
    B2BCollaboration[&amp;quot;B2B collaboration&amp;quot;]
    CrossTenantSync[&amp;quot;Cross-tenant synchronization&amp;quot;]
    B2BCollabUsersA[&amp;quot;B2B collaboration users (Tenant A)&amp;quot;]
    B2BCollabUsersB[&amp;quot;B2B collaboration users (Tenant B)&amp;quot;]
    CrossTenantSyncUsers[&amp;quot;Cross-tenant sync users&amp;quot;]

    B2BCollaboration --&amp;gt; B2BCollabUsersA
    B2BCollaboration --&amp;gt; B2BCollabUsersB
    CrossTenantSync --&amp;gt; CrossTenantSyncUsers
    B2BDirectConnect --&amp;gt; B2BCollabUsersA
    B2BDirectConnect --&amp;gt; B2BCollabUsersB
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- PageHeader=&quot;Org-to-org external&quot; --&gt;

&lt;figure&gt;
Org internal B2B collaboration Adatum Corporation (External collaborator) B2B collab users (External members) B2B collab users (External guests) Fabrikam (Acquired) Cross-tenant sync Contoso (Primary tenant) B2B direct connect B2B direct connect users Trey Research + (External collaborator)
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Fabrikam[&amp;quot;Fabrikam (Acquired)&amp;quot;] --&amp;gt;|Cross-tenant sync| Contoso[&amp;quot;Contoso (Primary tenant)&amp;quot;]
    
    Contoso --&amp;gt;|B2B collaboration| Adatum_Corporation[&amp;quot;Adatum Corporation (External collaborator)&amp;quot;]
    Contoso --&amp;gt;|B2B collaboration| B2B_Collab_Users_External_Guests[&amp;quot;B2B collab users (External guests)&amp;quot;]
    
    Adatum_Corporation --&amp;gt;|B2B collaboration| B2B_Collab_Users_External_Members[&amp;quot;B2B collab users (External members)&amp;quot;]
    
    Contoso --&amp;gt;|B2B direct connect| Trey_Research[&amp;quot;Trey Research (External collaborator)&amp;quot;]
    Trey_Research --&amp;gt;|B2B direct connect| B2B_Direct_Connect_Users[&amp;quot;B2B direct connect users&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Terminology&lt;/h1&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, you can refer back to the following list of terms.&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but that hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don&amp;#39;t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;Why use multitenant organization?&lt;/h1&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define a group of tenants belonging to your organization&lt;/li&gt;
&lt;li&gt;Collaborate across your tenants in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Who should use it?&lt;/h1&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for external identities.&lt;/p&gt;
&lt;h1&gt;Benefits&lt;/h1&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.&lt;/p&gt;
&lt;h1&gt;· Improved collaborative experience in Microsoft Teams&lt;/h1&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations and Microsoft Teams: Advantages of the new architecture.&lt;/p&gt;
&lt;p&gt;· Improved people search experience across tenants&lt;/p&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards. For more information, see Microsoft 365 multitenant organization people search.&lt;/p&gt;
&lt;h1&gt;How does a multitenant organization work?&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;p&gt;· Define a multitenant organization&lt;/p&gt;
&lt;p&gt;One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;p&gt;· Join a multitenant organization&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Leave a multitenant organization&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.&lt;/p&gt;
&lt;p&gt;A multitenant organization is established as a collaboration of equals. Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access settings&lt;/h1&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant access partner configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant access identity synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and crossTenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;h1&gt;Multitenant organization example&lt;/h1&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization.&lt;/p&gt;
&lt;p&gt;The diagram describes three nodes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Owner tenant (C)&lt;/li&gt;
&lt;li&gt;Member tenant (A)&lt;/li&gt;
&lt;li&gt;Member tenant (B)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each node represents a tenant and has lines indicating cross-tenant access settings among them.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Templates for cross-tenant access settings&lt;/h1&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h1&gt;Tenant role and state&lt;/h1&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;!-- Image not found: figure.png --&gt;
&lt;!-- ![Expand table](figure.png) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- Image not found: figure.png --&gt;
&lt;!-- ![Expand table](figure.png) --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenant[&amp;quot;Owner Tenant&amp;quot;] --&amp;gt; PendingTenant[&amp;quot;Pending Tenant&amp;quot;]
    OwnerTenant[&amp;quot;Owner Tenant&amp;quot;] --&amp;gt; MemberTenant[&amp;quot;Member Tenant&amp;quot;]
    MemberTenant[&amp;quot;Member Tenant&amp;quot;] --&amp;gt; LeaveOrg[&amp;quot;Leave Organization&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tenant state&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator&amp;#39;s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user&amp;#39;s view of a multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Constraints&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any given tenant can only create or join a single multitenant organization.  &lt;/li&gt;
&lt;li&gt;Any multitenant organization must have at least one active owner tenant.  &lt;/li&gt;
&lt;li&gt;Each active tenant must have cross-tenant access settings for all active tenants.  &lt;/li&gt;
&lt;li&gt;Any active tenant may leave a multitenant organization by removing themselves from it.  &lt;/li&gt;
&lt;li&gt;A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Limits&lt;/h1&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Expand table](figure_image_description) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;External user segmentation&lt;/h1&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External members originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External guests originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External members originating from outside of your organization&lt;/li&gt;
&lt;li&gt;External guests originating from outside of your organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h1&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Get started&lt;/h1&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h1&gt;Step 1: Plan your deployment&lt;/h1&gt;
&lt;p&gt;For more information, see Plan for multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;h1&gt;Step 2: Create your multitenant organization&lt;/h1&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;p&gt;· First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/p&gt;
&lt;p&gt;· Owner tenant adds one or more joiner tenants.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Figure 1: Microsoft 365 Admin Center](image_description_here) --&gt;

&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;p&gt;· Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/p&gt;
&lt;p&gt;· To allow for asynchronous processing, wait up to 2 hours.&lt;/p&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Figure 2: Microsoft Graph API](image_description_here) --&gt;

&lt;h1&gt;Step 4: Synchronize users&lt;/h1&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;p&gt;· Synchronize users in multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;· Your alternative bulk provisioning engine&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Figure 3: Cross-Tenant Synchronization Diagram](image_description_here) --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    M365[Microsoft 365] --&amp;gt; CrossTenantSync[Cross-Tenant Synchronization]
    CrossTenantSync[Cross-Tenant Synchronization] --&amp;gt; PowerShell[PowerShell]
    CrossTenantSync[Cross-Tenant Synchronization] --&amp;gt; GraphAPI[Graph API]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;License requirements&lt;/h1&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;h1&gt;What is cross-tenant synchronization?&lt;/h1&gt;
&lt;p&gt;Article · 01/03/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting Microsoft Entra B2B collaboration users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seamless collaboration for a multitenant organization&lt;/li&gt;
&lt;li&gt;Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/li&gt;
&lt;li&gt;Automatically remove B2B accounts when a user leaves the organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBc&quot; alt=&quot;Video thumbnail with play button and text &amp;quot;Click to play&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Why use cross-tenant synchronization?&lt;/h1&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as ServiceNow, Adobe, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as Microsoft Entra Conditional Access and cross-tenant access settings, and can be governed through features such as Microsoft Entra entitlement management.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Diagram showing cross-tenant synchronization](#) --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    UserA[&amp;quot;User A&amp;quot;] --&amp;gt; MicrosoftApp1[&amp;quot;Microsoft Application 1&amp;quot;]
    UserA[&amp;quot;User A&amp;quot;] --&amp;gt; NonMicrosoftApp1[&amp;quot;Non-Microsoft Application 1&amp;quot;]
    UserB[&amp;quot;User B&amp;quot;] --&amp;gt; MicrosoftApp2[&amp;quot;Microsoft Application 2&amp;quot;]
    UserB[&amp;quot;User B&amp;quot;] --&amp;gt; NonMicrosoftApp2[&amp;quot;Non-Microsoft Application 2&amp;quot;]
    MicrosoftApp1 --&amp;gt; UserA
    NonMicrosoftApp1 --&amp;gt; UserA
    MicrosoftApp2 --&amp;gt; UserB
    NonMicrosoftApp2 --&amp;gt; UserB
&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;

&lt;p&gt;The illustration depicts the cross-tenant synchronization process among multiple Microsoft Entra tenants. It includes the following tenants: Fabrikam Mexico, Fabrikam US, Contoso. The illustration shows internal and external users, as well as the integration with Microsoft and non-Microsoft apps.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    subgraph FabrikamMexico[&amp;quot;Fabrikam Mexico&amp;quot;]
        FM_Internal_User1[&amp;quot;Internal User1&amp;quot;]
        FM_Internal_User2[&amp;quot;Internal User2&amp;quot;]
    end
    subgraph FabrikamUS[&amp;quot;Fabrikam US&amp;quot;]
        FU_Internal_User3[&amp;quot;Internal User3&amp;quot;]
    end
    subgraph Contoso[&amp;quot;Contoso&amp;quot;]
        C_Internal_User4[&amp;quot;Internal User4&amp;quot;]
        C_External_User1[&amp;quot;External User1&amp;quot;]
        C_External_User3[&amp;quot;External User3&amp;quot;]
    end
    FM_Internal_User1 --&amp;gt; C_External_User1
    FM_Internal_User2 --&amp;gt; C_External_User1
    FU_Internal_User3 --&amp;gt; C_External_User3
    C_Internal_User4 --&amp;gt; Microsoft_Apps[&amp;quot;Microsoft apps&amp;quot;]
    C_Internal_User4 --&amp;gt; Non_Microsoft_Apps[&amp;quot;Non-Microsoft apps&amp;quot;]
    FM_Internal_User1 -.-&amp;gt; FM_Internal_User2
    FU_Internal_User3 -.-&amp;gt; C_External_User3
    C_External_User1 -.-&amp;gt; C_Internal_User4
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Who should use?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Benefits&lt;/h1&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Teams and Microsoft 365&lt;/h1&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the member userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.&lt;/p&gt;
&lt;h1&gt;Properties&lt;/h1&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Microsoft Entra provisioning engine.&lt;/li&gt;
&lt;li&gt;Is a push process from the source tenant, not a pull process from the target tenant.&lt;/li&gt;
&lt;li&gt;Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/li&gt;
&lt;li&gt;Users in scope for synchronization are configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Attribute mapping is configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Extension attributes are supported.&lt;/li&gt;
&lt;li&gt;Target tenant administrators can stop a synchronization at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;p&gt;![Description: A table listing the parts of cross-tenant synchronization and their configuration in source and target tenants]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Source[&amp;quot;Source tenant&amp;quot;] ---|Automatic redemption| AR[&amp;quot;Selected&amp;quot;];
    Source ---|Sync settings configuration| SSC[&amp;quot;Selected&amp;quot;];
    Source ---|Users in scope| US[&amp;quot;Selected&amp;quot;];
    Target[&amp;quot;Target tenant&amp;quot;] ---|Cross-tenant access settings| CTAS[&amp;quot;Selected&amp;quot;];
    Target ---|Automatic redemption| AR;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Cross-tenant synchronization setting&lt;/h1&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a check box with the name Allow users sync into this tenant that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt; Inbound access settings - Contoso ===&lt;/p&gt;
&lt;p&gt;X ✅ B2B collaboration B2B direct connect Trust settings Cross-tenant sync&lt;/p&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization. ✅ V Allow users sync into this tenant&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantIdentitySyncPolicyPartner API. For more information, see Configure cross- tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Automatic redemption setting&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a check box with the following name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
[Figure depicting the automatic redemption setting. A checkbox is used to enable or disable the automatic redemption of invitations. The checkbox is labeled &quot;Automatically redeem invitations with the tenant fc19f6b2-c752-43d3-a1aa-c75e9a85a7dc.&quot;]
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CheckBox[&amp;quot;Automatically redeem invitations with the tenant fc19f6b2_c752_43d3_a1aa_c75e9a85a7dc&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Compare setting for different scenarios&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;p&gt;+ ❌&lt;/p&gt;
&lt;p&gt;· When users are created in a target tenant using cross-tenant synchronization.
· When users are added to a resource tenant using B2B collaboration.
· When users access resources in a resource tenant using B2B direct connect.&lt;/p&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see Consent experience for applications in Microsoft Entra ID. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h1&gt;When is consent prompt suppressed?&lt;/h1&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;p&gt;Figure description: 
Source tenant → Target tenant
Outbound access settings
:checked: &amp;gt; Automatically redeem invitations
Inbound access settings
:checked: &amp;gt; Automatically redeem invitations&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source tenant&amp;quot;] --&amp;gt; TargetTenant[&amp;quot;Target tenant&amp;quot;]
    SourceTenant --&amp;gt; OutboundAccessSettings[&amp;quot;Outbound access settings&amp;quot;]
    OutboundAccessSettings --&amp;gt; AutoRedeemOutbound[&amp;quot;Automatically redeem invitations&amp;quot;]
    TargetTenant --&amp;gt; InboundAccessSettings[&amp;quot;Inbound access settings&amp;quot;]
    InboundAccessSettings --&amp;gt; AutoRedeemInbound[&amp;quot;Automatically redeem invitations&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;p&gt;Home/source tenant&lt;/p&gt;
&lt;p&gt;Resource/target tenant&lt;/p&gt;
&lt;p&gt;Consent prompt behavior for source tenant users&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outbound&lt;/th&gt;
&lt;th&gt;Inbound&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;✅ V&lt;/td&gt;
&lt;td&gt;✅ &amp;gt;&lt;/td&gt;
&lt;td&gt;Suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ V&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ V&lt;/td&gt;
&lt;td&gt;✅ &amp;gt;&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ V&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantAccessPolicyConfigurationPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;How do users know what tenants they belong to?&lt;/h1&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their My Account page and select Organizations. In the Microsoft Entra admin center, users can open their Portal settings, view their Directories + subscriptions, and switch directories.&lt;/p&gt;
&lt;p&gt;For more information, including privacy information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h1&gt;Get started&lt;/h1&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;Step 1: Define how to structure the tenants in your organization&lt;/h1&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;A diagram illustrating possible tenant structures.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A1[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; A2[&amp;quot;Satellite Tenant 1&amp;quot;];
    A1 --&amp;gt; A3[&amp;quot;Satellite Tenant 2&amp;quot;];
    A4[&amp;quot;Mesh Tenant 1&amp;quot;] --&amp;gt; A5[&amp;quot;Mesh Tenant 2&amp;quot;];
    A4 --&amp;gt; A6[&amp;quot;Mesh Tenant 3&amp;quot;];
    A5 --&amp;gt; A6;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/h1&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Diagram showing the &amp;quot;Target tenant&amp;quot; with settings for &amp;quot;Inbound access&amp;quot; that have &amp;quot;Allow users sync into this tenant&amp;quot; and &amp;quot;Automatically redeem invitations&amp;quot; checked.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TargetTenant[&amp;quot;Target Tenant&amp;quot;] --&amp;gt; InboundAccessSettings[&amp;quot;Inbound Access Settings&amp;quot;];
    InboundAccessSettings --&amp;gt; AllowUsersSync[&amp;quot;Allow users sync into this tenant&amp;quot;];
    InboundAccessSettings --&amp;gt; AutomaticallyRedeem[&amp;quot;Automatically redeem invitations&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/h1&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which users you want to synchronize&lt;/li&gt;
&lt;li&gt;What attributes you want to include&lt;/li&gt;
&lt;li&gt;Any transformations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured,&lt;/p&gt;
&lt;p&gt;you can start testing with a few users and make sure they&amp;#39;re created with all the attributes that you need. When testing is complete, you can quickly add additional users to synchronize and roll out across your organization. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization illustration showing the source tenant and target tenant with selected settings for allowing user sync and auto-redeeming invitations.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source_tenant[&amp;quot;Source tenant&amp;quot;] --&amp;gt; cross_tenant_sync[&amp;quot;Cross-tenant synchronization&amp;quot;]
    cross_tenant_sync --&amp;gt; target_tenant[&amp;quot;Target tenant&amp;quot;]
    outbound_access[&amp;quot;Outbound access settings&amp;quot;] --&amp;gt; cross_tenant_sync
    inbound_access[&amp;quot;Inbound access settings&amp;quot;] --&amp;gt; target_tenant
    outbound_access[&amp;quot;Outbound access settings&amp;quot;] --&amp;gt; auto_redeem_out[&amp;quot;Automatically redeem invitations&amp;quot;]
    inbound_access[&amp;quot;Inbound access settings&amp;quot;] --&amp;gt; user_sync[&amp;quot;Allow users sync into this tenant&amp;quot;]
    inbound_access[&amp;quot;Inbound access settings&amp;quot;] --&amp;gt; auto_redeem_in[&amp;quot;Automatically redeem invitations&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;License requirements&lt;/h1&gt;
&lt;p&gt;In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing model. To understand the external identities licensing model, see MAU billing model for Microsoft Entra External ID. You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/p&gt;
&lt;h1&gt;Frequently asked questions&lt;/h1&gt;
&lt;h1&gt;Clouds&lt;/h1&gt;
&lt;p&gt;Which clouds can cross-tenant synchronization be used in?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/li&gt;
&lt;li&gt;Synchronization is only supported between two tenants in the same cloud.&lt;/li&gt;
&lt;li&gt;Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Existing B2B users&lt;/h1&gt;
&lt;p&gt;Will cross-tenant synchronization manage existing B2B users?&lt;/p&gt;
&lt;p&gt;. Yes. Cross-tenant synchronization uses an internal attribute called the alternativeSecurityIdentifier to uniquely match an internal user in the source tenant with an external / B2B user in the target tenant. Cross-tenant synchronization can update existing B2B users, ensuring that each user has only one account.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization cannot match an internal user in the source tenant with an internal user in the target tenant (both type member and type guest).&lt;/p&gt;
&lt;h1&gt;Synchronization frequency&lt;/h1&gt;
&lt;p&gt;How often does cross-tenant synchronization run?&lt;/p&gt;
&lt;p&gt;· The sync interval is currently fixed to start at 40-minute intervals. Sync duration varies based on the number of in-scope users. The initial sync cycle is likely to take significantly longer than the following incremental sync cycles.&lt;/p&gt;
&lt;h1&gt;Scope&lt;/h1&gt;
&lt;p&gt;How do I control what is synchronized into the target tenant?&lt;/p&gt;
&lt;p&gt;· In the source tenant, you can control which users are provisioned with the configuration or attribute-based filters. You can also control what attributes on the user object are synchronized. For more information, see Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;p&gt;If a user is removed from the scope of sync in a source tenant, will cross-tenant synchronization soft delete them in the target?&lt;/p&gt;
&lt;p&gt;· Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant synchronization will soft delete them in the target tenant.&lt;/p&gt;
&lt;h1&gt;Object types&lt;/h1&gt;
&lt;p&gt;What object types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Microsoft Entra users can be synchronized between tenants. (Groups, devices, and contacts aren&amp;#39;t currently supported.)&lt;/p&gt;
&lt;p&gt;What user types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t be synchronized from source tenants.&lt;/p&gt;
&lt;p&gt;· Users can be synchronized to target tenants as external members (default) or external guests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt;
Diagram showing the synchronization process between tenants.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[Source Tenant]
    TargetTenant[Target Tenant]
    InternalUser1[Internal User 1]
    InternalUser2[Internal User 2]
    ExternalB2BUser1[External B2B User 1]
    InternalGuest1[Internal Guest 1]

    SourceTenant --&amp;gt; |Synchronizes| ExternalB2BUser1
    SourceTenant --&amp;gt; |Cannot Synchronize| InternalUser2
    SourceTenant --&amp;gt; |Synchronizes| InternalUser1
    SourceTenant --&amp;gt; |Cannot Synchronize| InternalGuest1
    ExternalB2BUser1 --&amp;gt; TargetTenant
    InternalUser1 --&amp;gt; TargetTenant

    TargetTenant --&amp;gt; |Updates| ExternalB2BUser1
    TargetTenant --&amp;gt; |Soft Deletes if Out of Scope| InternalUser1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;. For more information about the UserType definitions, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;p&gt;I have existing B2B collaboration users. What will happen to them?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/p&gt;
&lt;h1&gt;Attributes&lt;/h1&gt;
&lt;p&gt;What user attributes can be synchronized?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including (but not limited to) displayName, userPrincipalName, and directory extension attributes.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024, with the default schema / attribute mappings:&lt;/p&gt;
&lt;p&gt;o The manager attribute will automatically be added to the mappings.&lt;/p&gt;
&lt;p&gt;o This does not trigger an initial sync cycle.&lt;/p&gt;
&lt;p&gt;o Manager updates will apply on the incremental cycle for users that are undergoing changes (e.g. manager change). The sync engine doesn&amp;#39;t automatically update all existing users that were provisioned previously.&lt;/p&gt;
&lt;p&gt;o To update the manager for existing users that are in scope for provisioning, you can use on-demand provisioning for specific users or do a restart to provision the manager for all users.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024, with a custom schema / attribute mappings (e.g. you added an attribute to the mappings or changed the default mappings):&lt;/p&gt;
&lt;p&gt;o You need to manually add the manager attribute to your attribute mappings. This will trigger a restart and update all users that are in scope for provisioning. This should be a direct mapping of the manager attribute in the source tenant to the manager in the target tenant.&lt;/p&gt;
&lt;p&gt;o If the manager of a user is removed in the source tenant and no new manager is assigned in the source tenant, the manager attribute will not be updated in the target tenant.&lt;/p&gt;
&lt;p&gt;What attributes can&amp;#39;t be synchronized?&lt;/p&gt;
&lt;p&gt;· Attributes including (but not limited to) photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Can I control where user attributes are sourced/managed?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority. The user and its attributes are deemed authoritative at the source tenant. There are parallel sources of authority workstreams that will evolve source of authority controls for users down to the attribute level and a user object at the source may ultimately reflect multiple underlying sources. For the tenant-to-tenant process, this is still treated as the source tenant&amp;#39;s values being authoritative for the sync process (even if pieces actually originate elsewhere) into the target tenant. Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization only supports source of authority at the object level. That means all attributes of a user must come from the same source, including credentials. It isn&amp;#39;t possible to reverse the source of authority or federation direction of a synchronized object.&lt;/p&gt;
&lt;p&gt;What happens if attributes for a synced user are changed in the target tenant?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no changes are made to the synced user in the source tenant, then user attribute changes made in the target tenant will persist. However, if changes are made to the user in the source tenant, then during the next synchronization cycle, the user in the target tenant will be updated to match the user in the source tenant.&lt;/p&gt;
&lt;p&gt;Can the target tenant manually block sign-in for a specific home/source tenant user that is synced?&lt;/p&gt;
&lt;p&gt;· If no changes are made to the synced user in the source tenant, then the block sign-in setting in the target tenant will persist. If a change is detected for the user in the source tenant, cross-tenant synchronization will re-enable that user blocked from sign-in in the target tenant.&lt;/p&gt;
&lt;h1&gt;Structure&lt;/h1&gt;
&lt;p&gt;Can I sync a mesh between multiple tenants?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is configured as a single-direction peer-to-peer sync, meaning sync is configured between one source and one target tenant. Multiple instances of cross-tenant synchronization can be configured to sync from a single&lt;/p&gt;
&lt;p&gt;source to multiple targets and from multiple sources into a single target. But only one sync instance can exist between a source and a target.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization only synchronizes users that are internal to the home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is written back to the same tenant.&lt;/li&gt;
&lt;li&gt;Multiple topologies are supported. For more information, see Topologies for cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For privacy reasons, cross-tenant synchronization is intended for use within an organization. We recommend using entitlement management for inviting B2B collaboration users across organizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. In addition, tenant migrations would require migrating user data such as SharePoint and OneDrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;B2B collaboration&lt;/h1&gt;
&lt;p&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Since cross-tenant synchronization is built on existing B2B collaboration technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Image reference had an empty URL in source and breaks the build: &quot;Table illustration describing limitations for specific apps or services.&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;B2B direct connect&lt;/h1&gt;
&lt;p&gt;How does cross-tenant synchronization relate to B2B direct connect?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;B2B direct connect is the underlying identity technology required for Teams Connect shared channels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Microsoft 365&lt;/h1&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Yes, but you must set the value for the &lt;code&gt;showInAddressList&lt;/code&gt; attribute of synchronized users to True, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology. For more information, see Step 9: Review attribute mappings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Teams&lt;/h1&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
Step9[Step 9: Review attribute mappings]
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- PageHeader=&quot;Integration&quot; --&gt;

&lt;p&gt;What federation options are supported for users in the target tenant back to the source tenant?&lt;/p&gt;
&lt;p&gt;· For each internal user in the source tenant, cross-tenant synchronization creates a federated external user (commonly used in B2B) in the target. It supports syncing internal users. This includes internal users federated to other identity systems using domain federation (such as Active Directory Federation Services). It doesn&amp;#39;t support syncing external users.&lt;/p&gt;
&lt;p&gt;Does cross-tenant synchronization use System for Cross-Domain Identity Management (SCIM)?&lt;/p&gt;
&lt;p&gt;· No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For more information, see SCIM synchronization with Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Deprovisioning&lt;/h1&gt;
&lt;p&gt;Does cross-tenant synchronization support deprovisioning users?&lt;/p&gt;
&lt;p&gt;· Yes, when the below actions occur in the source tenant, the user will be soft deleted in the target tenant.&lt;/p&gt;
&lt;p&gt;o Delete the user in the source tenant
o Unassign the user from the cross-tenant synchronization configuration
o Remove the user from a group that is assigned to the cross-tenant synchronization configuration
o An attribute on the user changes such that they do not meet the scoping filter conditions defined on the cross-tenant synchronization configuration anymore&lt;/p&gt;
&lt;p&gt;· If the user is blocked from sign-in in the source tenant (accountEnabled = false) they will be blocked from sign-in in the target. This is not a deletion, but an updated to the accountEnabled property.&lt;/p&gt;
&lt;p&gt;· Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a user to a group and assign it to the cross-tenant synchronization configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Update the account enabled status to false on the user in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle. The account enabled status is changed to false in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;sequenceDiagram
    participant SourceTenant as Source Tenant
    participant TargetTenant as Target Tenant

    SourceTenant-&amp;gt;&amp;gt;TargetTenant: Add user to group assigned to cross-tenant sync
    TargetTenant--&amp;gt;&amp;gt;SourceTenant: Provision user on-demand or through incremental cycle
    SourceTenant-&amp;gt;&amp;gt;TargetTenant: Update account enabled status to false on user
    TargetTenant--&amp;gt;&amp;gt;SourceTenant: Provision user on-demand or through incremental cycle to update status
    SourceTenant-&amp;gt;&amp;gt;TargetTenant: Remove user from group
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Does cross-tenant synchronization support restoring users?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the user in the source tenant is restored, reassigned to the app, meets the scoping condition again within 30 days of soft deletion, it will be restored in the target tenant.&lt;/li&gt;
&lt;li&gt;IT admins can also manually restore the user directly in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unassign all users and / or groups from the cross-tenant synchronization configuration. This will trigger all the users that were unassigned, either directly or through group membership, to be deprovisioned in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to Sync all users and groups, you will also need to change it to Sync only assigned users and groups. The users will be automatically soft deleted by cross-tenant synchronization. The users will be automatically hard deleted after 30 days or you can choose to hard delete the users directly from the target tenant. You can choose to hard delete the users directly in the target tenant or wait 30 days for the users to be automatically hard deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the sync relationship is severed, are external users previously managed by cross-tenant synchronization deleted in the target tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No. No changes are made to the external users previously managed by cross-tenant synchronization if the relationship is severed (for example, if the cross-tenant synchronization policy is deleted).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Multitenant organization identity provisioning for Microsoft 365&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h1&gt;Microsoft 365 people search&lt;/h1&gt;
&lt;p&gt;Teams external access and Teams shared channels excluded, Microsoft 365 people search is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h1&gt;New Microsoft Teams&lt;/h1&gt;
&lt;p&gt;The new Microsoft Teams experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations.&lt;/p&gt;
&lt;h1&gt;Collaborating user set&lt;/h1&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;&amp;quot;Diagram depicting tenants A, B, and C each containing internal and B2B identities: Tenant A has an internal user, Annie; Tenant B has internal users Bob and Barbara; Tenant C has an internal user, Charles.&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantA[&amp;quot;Tenant A&amp;quot;] --&amp;gt; Annie_Internal[&amp;quot;Internal: Annie&amp;quot;]
    TenantB[&amp;quot;Tenant B&amp;quot;] --&amp;gt; Bob_Internal[&amp;quot;Internal: Bob&amp;quot;]
    TenantB --&amp;gt; Barbara_Internal[&amp;quot;Internal: Barbara&amp;quot;]
    TenantC[&amp;quot;Tenant C&amp;quot;] --&amp;gt; Charles_Internal[&amp;quot;Internal: Charles&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;For people search to succeed, while scoped to local tenant boundaries, the entire collaborating user set must be represented within the scope of each multitenant organization tenant A, B, and C, in the form of either internal or B2B identities.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;&amp;quot;Diagram showing tenants A, B, and C with both internal and external users. Tenant A now has an internal user Annie and external users Bob, Barbara, and Charles. Tenant B has internal users Bob and Barbara and external users Annie and Charles. Tenant C has an internal user Charles and external users Annie, Bob, and Barbara.&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    subgraph TenantA[&amp;quot;Tenant A&amp;quot;]
        Annie_Internal_A[&amp;quot;Internal: Annie&amp;quot;]
        Bob_External_A[&amp;quot;External: Bob&amp;quot;]
        Barbara_External_A[&amp;quot;External: Barbara&amp;quot;]
        Charles_External_A[&amp;quot;External: Charles&amp;quot;]
    end

    subgraph TenantB[&amp;quot;Tenant B&amp;quot;]
        Bob_Internal_B[&amp;quot;Internal: Bob&amp;quot;]
        Barbara_Internal_B[&amp;quot;Internal: Barbara&amp;quot;]
        Annie_External_B[&amp;quot;External: Annie&amp;quot;]
        Charles_External_B[&amp;quot;External: Charles&amp;quot;]
    end

    subgraph TenantC[&amp;quot;Tenant C&amp;quot;]
        Charles_Internal_C[&amp;quot;Internal: Charles&amp;quot;]
        Annie_External_C[&amp;quot;External: Annie&amp;quot;]
        Bob_External_C[&amp;quot;External: Bob&amp;quot;]
        Barbara_External_C[&amp;quot;External: Barbara&amp;quot;]
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Depending on your organization&amp;#39;s needs, the collaborating user set may contain a subset of collaborating employees, or eventually all employees.&lt;/p&gt;
&lt;h1&gt;Sharing your users&lt;/h1&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator A contributes or shares Annie&lt;/li&gt;
&lt;li&gt;Administrator B contributes or shares Bob and Barbara&lt;/li&gt;
&lt;li&gt;Administrator C contributes or shares Charles&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;

&lt;p&gt;Diagram depicting the relationship and user synchronization across three tenants in a multitenant organization. The tenants are Tenant A, Tenant B, and Tenant C, with users classified as Internal or External.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantB[&amp;quot;Tenant B&amp;quot;]
    TenantA[&amp;quot;Tenant A&amp;quot;]
    TenantC[&amp;quot;Tenant C&amp;quot;]
    
    InternalBob[&amp;quot;Internal Bob&amp;quot;] --&amp;gt; TenantB
    InternalBarbara[&amp;quot;Internal Barbara&amp;quot;] --&amp;gt; TenantB
    ExternalAnnie_B[&amp;quot;External Annie&amp;quot;] --&amp;gt; TenantB
    ExternalCharles_B[&amp;quot;External Charles&amp;quot;] --&amp;gt; TenantB
    
    InternalAnnie_A[&amp;quot;Internal Annie&amp;quot;] --&amp;gt; TenantA
    ExternalBob_A[&amp;quot;External Bob&amp;quot;] --&amp;gt; TenantA
    ExternalBarbara_A[&amp;quot;External Barbara&amp;quot;] --&amp;gt; TenantA
    ExternalCharles_A[&amp;quot;External Charles&amp;quot;] --&amp;gt; TenantA
    
    InternalCharles_C[&amp;quot;Internal Charles&amp;quot;] --&amp;gt; TenantC
    ExternalAnnie_C[&amp;quot;External Annie&amp;quot;] --&amp;gt; TenantC
    ExternalBob_C[&amp;quot;External Bob&amp;quot;] --&amp;gt; TenantC
    ExternalBarbara_C[&amp;quot;External Barbara&amp;quot;] --&amp;gt; TenantC
    
    TenantB --&amp;gt; TenantA
    TenantA --&amp;gt; TenantB
    
    TenantB --&amp;gt; TenantC
    TenantC --&amp;gt; TenantB
    
    TenantA --&amp;gt; TenantC
    TenantC --&amp;gt; TenantA
    
    style InternalBob fill:#00f
    style InternalBarbara fill:#00f
    style ExternalAnnie_B fill:#f0f
    style ExternalCharles_B fill:#f0f
    style InternalAnnie_A fill:#00f
    style ExternalBob_A fill:#f0f
    style ExternalBarbara_A fill:#f0f
    style ExternalCharles_A fill:#f0f
    style InternalCharles_C fill:#00f
    style ExternalAnnie_C fill:#f0f
    style ExternalBob_C fill:#f0f
    style ExternalBarbara_C fill:#f0f
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set across multitenant organization tenants. For more information, see Synchronize users in multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;p&gt;Alternatively, pair-wise configuration of inbound and outbound cross-tenant synchronization can be used to orchestrate such collating user set across multitenant organization tenants. For more information, see What is a cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;B2B member users&lt;/h1&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User synchronization method&lt;/th&gt;
&lt;th&gt;Default userType property&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see Compare member and guest default permissions.&lt;/p&gt;
&lt;p&gt;To change the userType from Guest to Member (or vice versa), a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;h1&gt;Unsharing your users&lt;/h1&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Multitenant organization optional policy templates&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h1&gt;Autogeneration of cross-tenant access settings&lt;/h1&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional cross-tenant access settings, for both, partner configuration and identity synchronization. These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross-tenant access settings pass through the default settings.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy behavior, it allows your organization to easily customize the cross-tenant access settings for partner tenants in the multitenant organization on a per-tenant basis.&lt;/p&gt;
&lt;h1&gt;Policy templates at multitenant organization formation&lt;/h1&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding cross-tenant access settings, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/li&gt;
&lt;li&gt;Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/li&gt;
&lt;li&gt;Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TenantA[&amp;quot;Tenant A&amp;quot;] --&amp;gt; TenantB[&amp;quot;Tenant B&amp;quot;]
    TenantA[&amp;quot;Tenant A&amp;quot;] --&amp;gt; TenantC[&amp;quot;Tenant C&amp;quot;]
    TenantB[&amp;quot;Tenant B&amp;quot;] --&amp;gt; TenantC[&amp;quot;Tenant C&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If this generation is different from the information in the figures or illustrations in the original document being transcribed, ensure the mermaid code is re-evaluated and conforms accurately to the textual description.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator C joins the multitenant organization. Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/li&gt;
&lt;li&gt;Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see Configure multitenant organization templates.&lt;/p&gt;
&lt;h1&gt;Policy template scoping and additional properties&lt;/h1&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross-tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, new partners refer to tenants for which you haven&amp;#39;t yet configured cross-tenant access settings, while existing partners refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access partner configuration template and the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access identity synchronization template.&lt;/p&gt;
&lt;p&gt;Finally, in terms of interpretation of template property values, any template property value of null has no effect on the corresponding property value in the targeted cross-tenant access settings, while a defined template property value causes the corresponding property value in the targeted cross-tenant access settings to be amended in accordance with the template. The following table illustrates how template property values are being applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table&lt;/strong&gt;: Illustrates how template property values are applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;any value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Policy templates used by Microsoft 365 admin center&lt;/h1&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;p&gt;· Identity synchronization is set to allow users to synchronize into this tenant&lt;/p&gt;
&lt;p&gt;· Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/p&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to true:&lt;/p&gt;
&lt;p&gt;· automaticUserConsentSettings.inboundAllowed&lt;/p&gt;
&lt;p&gt;· automaticUserConsentSettings.outboundAllowed&lt;/p&gt;
&lt;p&gt;· userSyncInbound&lt;/p&gt;
&lt;p&gt;For more information, see Join or leave a multitenant organization in Microsoft 365.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    IdentitySynchronization[&amp;quot;Identity synchronization is set to allow users to synchronize into this tenant&amp;quot;] --&amp;gt; automaticUserConsentSettings_inboundAllowed[&amp;quot;automaticUserConsentSettings.inboundAllowed&amp;quot;]
    CrossTenantAccess[&amp;quot;Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&amp;quot;] --&amp;gt; automaticUserConsentSettings_outboundAllowed[&amp;quot;automaticUserConsentSettings.outboundAllowed&amp;quot;]
    CrossTenantAccess --&amp;gt; userSyncInbound[&amp;quot;userSyncInbound&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Cross-tenant access settings at time of multitenant organization disassembly&lt;/h1&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/graph/api/resources/organization&quot;&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Limitations in multitenant organizations&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see Microsoft Entra UserVoice. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h1&gt;Scope&lt;/h1&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Expand table button](Description: An expandable button labeled &quot;Expand table&quot; which allows the user to expand or collapse the table view.) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;- Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;- Microsoft 365 admin center limitations related to multitenant organizations - Microsoft 365 multitenant organization people search experiences - Cross-tenant synchronization limitations related to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;- Cross-tenant synchronization unrelated to Microsoft 365 - End user experiences in new Teams - End user experiences in Power BI - Tenant migration or consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported scenarios&lt;/td&gt;
&lt;td&gt;- Seamless collaboration experience across multitenant organizations in classic Teams - Self-service for multitenant organizations larger than 100 tenants - Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet - Cross-cloud multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;ul&gt;
&lt;li&gt;In the identity platform, both methods are represented as Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Synchronization jobs created with Microsoft Entra ID will not appear in the Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;· If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/p&gt;
&lt;p&gt;o You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/p&gt;
&lt;p&gt;· By default, new B2B users are provisioned as B2B members, while existing B2B guests remain B2B guests.&lt;/p&gt;
&lt;p&gt;o You can opt to convert B2B guests into B2B members by setting Apply this mapping to Always.&lt;/p&gt;
&lt;p&gt;· If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an Outbound sync status of Not configured. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;· If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants to or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name MTO_Sync_&lt;TenantID&gt;. Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;· Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross- tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with userSyncInbound set to true, as facilitated by Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;· There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/p&gt;
&lt;h1&gt;Join requests&lt;/h1&gt;
&lt;p&gt;· There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you followed the correct sequence to create a multitenant organization and add a tenant to the multitenant organization, and the added tenant&amp;#39;s join request keeps failing, submit a support request in the Microsoft Entra or Microsoft 365 admin center.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Microsoft apps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In SharePoint OneDrive, the promotion of B2B guests to B2B members might not happen automatically. If faced with a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try Set-SPUser [-SyncFromAD].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In SharePoint OneDrive user interfaces, when sharing a file with People in Fabrikam, the current user interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards People in Fabrikam.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Forms, B2B member users might not be able to access forms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Power BI, B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Power Apps, Microsoft Dynamics 365, and related workloads, B2B member users may have restricted functionality. For more information, see Invite users with Microsoft Entra B2B collaboration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the default permissions for B2B members.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To promote B2B guests to B2B members, a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As your organization rolls out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others users as B2B members. To achieve this, you might want to establish two Microsoft Entra cross-tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with Apply this mapping set to&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Description of Illustration:&lt;/strong&gt; This section appears to display various toggle switches, each with either a &amp;#39;selected&amp;#39; or &amp;#39;unselected&amp;#39; state, suggesting different configuration options for synchronization settings.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    toggle1[&amp;quot;Toggle 1: Selected&amp;quot;] --&amp;gt; toggle2[&amp;quot;Toggle 2: Unselected&amp;quot;]
    toggle2 --&amp;gt; toggle3[&amp;quot;Toggle 3: Unselected&amp;quot;]
    toggle3 --&amp;gt; toggle4[&amp;quot;Toggle 4: Selected&amp;quot;]
    toggle4 --&amp;gt; toggle5[&amp;quot;Toggle 5: Unselected&amp;quot;]
    toggle5 --&amp;gt; toggle6[&amp;quot;Toggle 6: Unselected&amp;quot;]
    toggle6 --&amp;gt; toggle7[&amp;quot;Toggle 7: Unselected&amp;quot;]
    toggle7 --&amp;gt; toggle8[&amp;quot;Toggle 8: Unselected&amp;quot;]
    toggle8 --&amp;gt; toggle9[&amp;quot;Toggle 9: Selected&amp;quot;]
    toggle9 --&amp;gt; toggle10[&amp;quot;Toggle 10: Unselected&amp;quot;]
    toggle10 --&amp;gt; toggle11[&amp;quot;Toggle 11: Unselected&amp;quot;]
    toggle11 --&amp;gt; toggle12[&amp;quot;Toggle 12: Selected&amp;quot;]
    toggle12 --&amp;gt; toggle13[&amp;quot;Toggle 13: Unselected&amp;quot;]
    toggle13 --&amp;gt; toggle14[&amp;quot;Toggle 14: Unselected&amp;quot;]
    toggle14 --&amp;gt; toggle15[&amp;quot;Toggle 15: Unselected&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Always. By moving a user from one configuration&amp;#39;s scope to the other, you can easily control who will be a B2B guest or a B2B member in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As part of a multitenant organization, reset redemption for an already redeemed B2B user is currently disabled.&lt;/li&gt;
&lt;li&gt;The at-scale provisioning of B2B users might collide with contact objects. The handling or conversion of contact objects is currently not supported.&lt;/li&gt;
&lt;li&gt;Using Microsoft Entra cross-tenant synchronization to target hybrid identities that have been converted to B2B users has not been tested in source of authority conflicts and is not supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Cross-tenant synchronization deprovisioning&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Currently, SkipOutOfScopeDeletions works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set Target Object Actions for Delete to disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Known issues for provisioning in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Topologies for cross-tenant collaboration&lt;/h1&gt;
&lt;p&gt;Article · 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;p&gt;✔ Hub and spoke&lt;/p&gt;
&lt;p&gt;✔ Mesh&lt;/p&gt;
&lt;p&gt;✔ Just-in-time&lt;/p&gt;
&lt;h1&gt;Hub and spoke&lt;/h1&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Option 1 (application hub): In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Option 2 (user hub): Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h1&gt;Mergers and acquisitions (application hub)&lt;/h1&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time limited access to additional applications such as Salesforce and Amazon Web Services.&lt;/p&gt;
&lt;p&gt;that contain business critical data. The following diagram shows recently acquired tenants on the left and their users being provisioned into the parent company&amp;#39;s tenant, which grants users access to the necessary resources.&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram showing the flow of user provisioning from recently acquired tenants into a parent company&apos;s tenant. The parent company&apos;s tenant manages HR, SaaS apps, Microsoft apps, SQL, On-premises apps, and Active Directory.](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    RecentlyAcquiredTenants --&amp;gt; ParentCompanyTenant
    ParentCompanyTenant --&amp;gt; HR
    ParentCompanyTenant --&amp;gt; SaaSApps[&amp;quot;SaaS apps&amp;quot;]
    ParentCompanyTenant --&amp;gt; MicrosoftApps[&amp;quot;Microsoft apps&amp;quot;]
    ParentCompanyTenant --&amp;gt; SQL
    ParentCompanyTenant --&amp;gt; OnPremisesApps[&amp;quot;On-premises apps&amp;quot;]
    ParentCompanyTenant --&amp;gt; ActiveDirectory[&amp;quot;Active Directory&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Separate collaboration and resource tenants (user hub)&lt;/h1&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;A diagram illustrating a mesh integration within various systems. At the center, there is a primary geometric-shaped logo connected to several smaller instances of a similar logo, indicating multiple tenants. The central tenant integrates with HR systems, Salesforce, and Active Directory.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; Tenant1[&amp;quot;Tenant A&amp;quot;]
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; Tenant2[&amp;quot;Tenant A&amp;quot;]
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; Tenant3[&amp;quot;Tenant A&amp;quot;]
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; HR[&amp;quot;HR&amp;quot;]
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; Salesforce[&amp;quot;Salesforce&amp;quot;]
    CentralTenant[&amp;quot;Central Tenant&amp;quot;] --&amp;gt; ActiveDirectory[&amp;quot;Active Directory&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Mesh&lt;/h1&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h1&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h1&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a separate configuration.&lt;/p&gt;
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Tenant1[&amp;quot;Tenant with mixed logos (1)&amp;quot;] --&amp;gt; Tenant2[&amp;quot;Tenant with AWS and Salesforce logos&amp;quot;]
    Tenant2[&amp;quot;Tenant with AWS and Salesforce logos&amp;quot;] --&amp;gt; Tenant1[&amp;quot;Tenant with mixed logos (1)&amp;quot;]
    Tenant1[&amp;quot;Tenant with mixed logos (1)&amp;quot;] --&amp;gt; Tenant3[&amp;quot;Tenant with Salesforce logo and mixed logos&amp;quot;]
    Tenant2[&amp;quot;Tenant with AWS and Salesforce logos&amp;quot;] --&amp;gt; Tenant3[&amp;quot;Tenant with Salesforce logo and mixed logos&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Collaborate across business units (full-mesh)&lt;/h1&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;figure&gt;
    Diagram showing three interconnected organizations, each represented by a stylized pyramid icon. The top left organization is associated with a purple-and-blue hexagonal icon, a blue flag icon, and a small cluster of squares icon. The top right organization is associated with the same purple-and-blue hexagonal icon, an &quot;AWS&quot; logo, and a &quot;Salesforce&quot; logo. The bottom center organization is associated with the same purple-and-blue hexagonal icon and the &quot;Salesforce&quot; logo. Solid arrows connect each organization to the others, indicating a bidirectional resource and access flow between them.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    org1[&amp;quot;Organization 1&amp;quot;] -- &amp;quot;Bidirectional Access&amp;quot; --&amp;gt; org2[&amp;quot;Organization 2&amp;quot;]
    org2[&amp;quot;Organization 2&amp;quot;] -- &amp;quot;Bidirectional Access&amp;quot; --&amp;gt; org3[&amp;quot;Organization 3&amp;quot;]
    org3[&amp;quot;Organization 3&amp;quot;] -- &amp;quot;Bidirectional Access&amp;quot; --&amp;gt; org1[&amp;quot;Organization 1&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Just-in-time&lt;/h1&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h1&gt;Joint ventures&lt;/h1&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;p&gt;The following diagram shows how two organizations can just-in-time collaborate by using connected organizations and entitlement management.&lt;/p&gt;
&lt;p&gt;| | ||&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;th&gt;Litware&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;user 1&lt;/td&gt;
&lt;td&gt;user 2&lt;/td&gt;
&lt;td&gt;user 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure&gt;
&quot;Contoso: The image depicts Contoso&apos;s organizational resources divided into two main catalogs: Marketing catalog and Sales catalog. The Marketing catalog includes a Marketing group and a Sales team group, which in turn includes a Sales team group, a Sales app, and a Sales site. Accessibility packages like Salesperson access package and Sales support access package are shown. Various roles and permissions such as group member, app contributor, and site member are denoted with tags like &apos;✅&apos; and &apos;❌&apos;. It also includes policies for access request, approval, review, lifecycle, and separation of duties (SOD). Users 1, 2, and 3 are shown to have different levels of access based on their roles. Outside sales reps can request access through predefined packages. Connected organization Litware shows Litware user 1, Litware user 2, and Litware user 3.&quot;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Contoso[&amp;quot;Contoso&amp;quot;] --&amp;gt; MarketingCatalog[&amp;quot;Marketing catalog&amp;quot;];
    Contoso[&amp;quot;Contoso&amp;quot;] --&amp;gt; SalesCatalog[&amp;quot;Sales catalog&amp;quot;];
    MarketingCatalog --&amp;gt; MarketingGroup[&amp;quot;Marketing group&amp;quot;];
    SalesCatalog --&amp;gt; SalesTeamGroup[&amp;quot;Sales team group&amp;quot;];
    SalesCatalog --&amp;gt; SalesApp[&amp;quot;Sales app&amp;quot;];
    SalesCatalog --&amp;gt; SalesSite[&amp;quot;Sales site&amp;quot;];
    SalesTeamGroup --&amp;gt; SalespersonAccessPackage[&amp;quot;Salesperson access package&amp;quot;];
    SalesTeamGroup --&amp;gt; SalesSupportAccessPackage[&amp;quot;Sales support access package&amp;quot;];
    SalesTeamGroup --&amp;gt; SalesTeamGroupMember[&amp;quot;Sales team group: member&amp;quot;];
    SalesTeamGroup --&amp;gt; SalesAppContributor[&amp;quot;Sales app: contributor&amp;quot;];
    SalesTeamGroup --&amp;gt; SalesSiteMember[&amp;quot;Sales site: member&amp;quot;];
    SalesSupportAccessPackage -.- Policies[&amp;quot;Policies for access request, approval, review, lifecycle, separation of duties (SOD)&amp;quot;];
    Policies --&amp;gt; EmployeesRequest[&amp;quot;Employees can request&amp;quot;];
    Policies --&amp;gt; OutsideSalesRepsRequest[&amp;quot;Outside sales reps can request&amp;quot;];
    SalesTeamGroupMember --&amp;gt; User1[&amp;quot;User 1&amp;quot;];
    SalesTeamGroupMember --&amp;gt; User2[&amp;quot;User 2&amp;quot;];
    SalesTeamGroupMember --&amp;gt; User3[&amp;quot;User 3&amp;quot;];
    Litware[&amp;quot;Litware&amp;quot;] --&amp;gt; LitwareUser1[&amp;quot;Litware user 1&amp;quot;];
    Litware[&amp;quot;Litware&amp;quot;] --&amp;gt; LitwareUser2[&amp;quot;Litware user 2&amp;quot;];
    Litware[&amp;quot;Litware&amp;quot;] --&amp;gt; LitwareUser3[&amp;quot;Litware user 3&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· What is cross-tenant synchronization? &lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;p&gt;Provide product feedback | Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;h1&gt;Governance and cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/21/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross-tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how Microsoft Entra ID Governance customers can use cross-tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h1&gt;Deployment example&lt;/h1&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;p&gt;· Manage employee identity lifecycles across multiple tenants
· Use workflows to automate lifecycle processes for employees that originate in other tenants
· Assign resource access automatically to employees that originate in other tenants
· Allow employees to request access to resources in multiple tenants
· Review the access of synchronized users&lt;/p&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant. The following diagram illustrates the topology.&lt;/p&gt;
&lt;p&gt;Figure: Diagram illustrating the topology of cross-tenant synchronization between Contoso Europe (EMEA), Contoso United States (US), and Contoso (target tenant). Contoso EMEA and Contoso US are source tenants. Contoso is a target tenant, indicating synchronization from the source tenants to the target tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Contoso_EMEA[&amp;quot;Contoso Europe (EMEA)&amp;quot;] --&amp;gt; Contoso[&amp;quot;Contoso&amp;quot;]
    Contoso_US[&amp;quot;Contoso United States (US)&amp;quot;] --&amp;gt; Contoso[&amp;quot;Contoso&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![The diagram shows cross-tenant synchronization architecture. The diagram includes various elements such as cross-tenant sync logos, two Contoso Hybrid Identity Administrators marked Contoso EMEA and Contoso US, and various access policies like Access Packages, Automatic assignment policy, Access Reviews, and Lifecycle Workflows. Arrows indicate synchronization and interaction across the tenants.](figures/0) --&gt; --&gt;

&lt;!-- No valid additional description possible with mermaidjs syntax for this figure content. --&gt;

&lt;/figure&gt;

&lt;p&gt;This supported topology for cross-tenant synchronization is one of many in Microsoft Entra ID. Tenants can be a source tenant, a target tenant, or both. In the following sections, learn how cross-tenant synchronization and Microsoft Entra ID Governance features address several scenarios.&lt;/p&gt;
&lt;h1&gt;Manage employee lifecycles across tenants&lt;/h1&gt;
&lt;p&gt;Cross-tenant synchronization in Microsoft Entra ID automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various properties of a Microsoft Entra B2B collaboration user. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in multitenant organizations.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Cross-tenant Synchronization](figures/0) --&gt; --&gt;

&lt;p&gt;The illustration shows a flowchart with the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cross-tenant Synchronization (syncs user attribute data) &lt;/li&gt;
&lt;li&gt;Application provisioning &lt;/li&gt;
&lt;li&gt;Automatic assignment policies for access packages&lt;/li&gt;
&lt;/ol&gt;
&lt;/figure&gt;

&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h1&gt;Automate lifecycle processes with workflows&lt;/h1&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the createdDateTime event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as userType and userPrincipalName to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h1&gt;Govern synchronized user access with access packages&lt;/h1&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;p&gt;Automatically assign access in target tenants to employees from source tenants&lt;/p&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create automatic assignment policies for access packages in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access&lt;/li&gt;
&lt;li&gt;In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;h1&gt;Enable source-tenant employees to request access to target-tenant shared resources&lt;/h1&gt;
&lt;p&gt;With identity governance access package policies, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;h1&gt;Review synchronized-user access&lt;/h1&gt;
&lt;p&gt;Access reviews in Microsoft Entra ID enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn&amp;#39;t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;h2&gt;Review source-tenant user access&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can include internal users in access reviews. This action enables access recertification in source tenants that synchronizes users. Use this approach for regular review of security groups assigned to cross-tenant synchronization. Therefore, ongoing B2B collaboration access to other tenants has approval in the user home tenant.&lt;/p&gt;
&lt;p&gt;Use access reviews of users in source tenants to avoid potential conflicts between cross-tenant synchronization and access reviews that remove denied users upon completion.&lt;/p&gt;
&lt;h1&gt;Review target-tenant user access&lt;/h1&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users provisioned by cross-tenant synchronization in target tenants. This option enables access recertification of resources in target tenants. Although organizations can target all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn&amp;#39;t recommend removing denied guest users automatically from access reviews. Cross-tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organizations and Microsoft 365&lt;/li&gt;
&lt;li&gt;Multitenant organization templates&lt;/li&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h1&gt;
&lt;p&gt;Article · 05/02/2024&lt;/p&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/li&gt;
&lt;li&gt;Example topologies for how you can implement your lifecycle and access controls.&lt;/li&gt;
&lt;li&gt;Deployment considerations (roles, monitoring, APIs).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Manage the lifecycle and access of a SOC user&lt;/h1&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h1&gt;Lifecycle control&lt;/h1&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don&amp;#39;t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the&lt;/p&gt;
&lt;p&gt;target tenant. When they don&amp;#39;t have any remaining entitlements in the target tenant, their B2B account will automatically be removed. Learn more&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Comparing entitlement management and cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Entitlement management&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Access control&lt;/h1&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;h2&gt;Entitlement management&lt;/h2&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access policies&lt;/h1&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;h1&gt;Deployment topologies&lt;/h1&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h1&gt;Topology 1&lt;/h1&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant. &lt;/p&gt;
&lt;p&gt;Steps to configure topology 1:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source tenant (SoC users&amp;#39; governance): Users are added to the SoC security groups through access packages.&lt;/li&gt;
&lt;li&gt;Target tenant (Guest accounts provisioning): Users are provisioned automatically through cross-tenant sync.&lt;/li&gt;
&lt;li&gt;Target tenant (Access packages assignment): SoC users will be auto-assigned Security Reader access. &lt;ul&gt;
&lt;li&gt;SoC users will have eligible access for Security Operator and Security Admin roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source tenant&amp;quot;]
    TargetTenant[&amp;quot;Target tenant&amp;quot;]
    Start[&amp;quot;SoC users&amp;#39; governance&amp;quot;] --&amp;gt; Provision[&amp;quot;Guest accounts provisioning&amp;quot;]
    Provision --&amp;gt; AccessPackages[&amp;quot;Access packages assignment&amp;quot;]
    SourceTenant -.-&amp;gt; TargetTenant
    Approvals[&amp;quot;APPROVALS ADD Inject attributes to map to SoC access Packages&amp;quot;]
    AccessPackage1[&amp;quot;Access Package 1&amp;quot;]
    AccessPackage2[&amp;quot;Access Package 2&amp;quot;]
    AccessPackage3[&amp;quot;Access Package 3&amp;quot;]
    SecReader[&amp;quot;Security Reader&amp;quot;]
    SecOperator[&amp;quot;Security Operator&amp;quot;]
    SecAdmin[&amp;quot;Security Admin&amp;quot;]

    subgraph SourceTenant
        Start
        Approvals
        AccessPackage1
        AccessPackage2
        AccessPackage3
    end

    subgraph TargetTenant
        Provision
        AccessPackages
        SecReader
        SecOperator
        SecAdmin
    end

    Start --&amp;gt; Approvals
    Approvals --&amp;gt; Provision
    Provision --&amp;gt; AccessPackages
    AccessPackages --&amp;gt; AccessPackage1 --&amp;gt; SecReader
    AccessPackages --&amp;gt; AccessPackage2 --&amp;gt; SecOperator
    AccessPackages --&amp;gt; AccessPackage3 --&amp;gt; SecAdmin
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, configure cross-tenant synchronization to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll automatically be provisioned into the target tenant. As they&amp;#39;re removed from the configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute mappings, you can add a new mapping of type constant to provision a directory extension attribute on the user to indicate that they&amp;#39;re a SOC administrator. Alternatively, if you have an attribute such as department that you can rely on for this step, you can skip creating the extension. This attribute will be used in the target tenant to provide them with access to the necessary roles.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the source tenant, create an access package that includes the cross-tenant synchronization service principal as a resource.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant synchronization service principal. Ensure that you set up periodic access reviews of the access package or time-limit the assignments to ensure that only the users that need access to the target tenant continue to have access.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;In the target tenant, create access packages to provide the necessary roles for investigating an incident.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We recommend one autoassigned access package to provide the Security Reader role and one request based package for the Security Operator and Security Administrator roles.&lt;/p&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary access packages in the source tenant. Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the security reader role. They can then request additional access in any tenants where they need the Security Operator or Security Administrator roles. Once their access period is over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the target tenants they don&amp;#39;t need access to anymore.&lt;/p&gt;
&lt;h1&gt;Topology 2&lt;/h1&gt;
&lt;p&gt;In topology 2 the target tenant administrator defines the access packages and resources that the source users can request access to. If the source tenant administrator would like to restrict which of their users can access the target tenant, you can use a cross-tenant access policy coupled with an access package to block all access to the target tenant, except for users that are part of a group that is included in an access package in the home tenant.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Text description of the figure: &lt;/p&gt;
&lt;p&gt;In the provided image, there is an illustration describing the topology setup between a source tenant and a target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The left side, labeled &amp;quot;Source tenant,&amp;quot; shows &amp;quot;SoC users&amp;#39; governance&amp;quot; with a blue background labeled &amp;quot;1.&amp;quot;&lt;/li&gt;
&lt;li&gt;The right side, labeled &amp;quot;Target tenant,&amp;quot; is divided into two parts:&lt;ul&gt;
&lt;li&gt;&amp;quot;Guest accounts provisioning&amp;quot;: Labeled &amp;quot;2&amp;quot;, showing the setup to establish a connected organization.&lt;/li&gt;
&lt;li&gt;&amp;quot;Access packages assignment&amp;quot;: Labeled &amp;quot;3&amp;quot;, detailing that the users from the source tenant can request access packages, and they will be auto-assigned to specific roles (Security Reader, Security Operator, Security Admin).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MermaidJS diagram for the figure:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source tenant&amp;quot;] --&amp;gt; Governance[&amp;quot;SoC users&amp;#39; governance&amp;quot;]
    TargetTenant[&amp;quot;Target tenant&amp;quot;] --&amp;gt; Provisioning[&amp;quot;Guest accounts provisioning&amp;quot;]
    TargetTenant --&amp;gt; Assignment[&amp;quot;Access packages assignment&amp;quot;]

    Governance --&amp;gt;|1| ConnectedOrg[&amp;quot;Connected organization&amp;quot;]
    Provisioning --&amp;gt;|2| AccessPackages[&amp;quot;Define access packages for necessary roles&amp;quot;]
    Assignment --&amp;gt;|3| RolesAssignment[&amp;quot;Upon requesting access package, users auto-assigned roles&amp;quot;]

    RolesAssignment --&amp;gt; SecurityReader[&amp;quot;Security Reader&amp;quot;]
    RolesAssignment --&amp;gt; SecurityOperator[&amp;quot;Security Operator&amp;quot;]
    RolesAssignment --&amp;gt; SecurityAdmin[&amp;quot;Security Admin&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;Steps to configure topology 2&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, add the source tenant as a connected organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users from the source tenant can now request access packages in the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h1&gt;Topologies compared&lt;/h1&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;p&gt;provisioned into their tenant and perform the necessary approvals in their tenant, topology 2 will best meet their needs.&lt;/p&gt;
&lt;h1&gt;Deployment considerations&lt;/h1&gt;
&lt;p&gt;Monitoring&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Defender are also audited.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Scaling deployment with PowerShell / APIs&lt;/p&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell commandlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Role-based access control&lt;/p&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuring cross-tenant access settings - Security Administrator&lt;/li&gt;
&lt;li&gt;Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/li&gt;
&lt;li&gt;Configuring entitlement management - Identity Governance Administrator&lt;/li&gt;
&lt;li&gt;Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;· What is entitlement management?&lt;/p&gt;
&lt;p&gt;· Multitenant management in Defender XDR&lt;/p&gt;
&lt;h1&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 02/14/2024&lt;/p&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see Microsoft Entra application provision UserVoice. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h1&gt;Note&lt;/h1&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;h1&gt;Authorization&lt;/h1&gt;
&lt;h2&gt;Unable to change provisioning mode back to manual&lt;/h2&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h1&gt;Attribute mappings&lt;/h1&gt;
&lt;h2&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/h2&gt;
&lt;p&gt;The attributes SamAccountName and userType aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see Missing source attribute.&lt;/p&gt;
&lt;h2&gt;Source attribute dropdown missing for schema extension&lt;/h2&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and&lt;/p&gt;
&lt;!-- PageHeader=&quot;manually add the attributes. To learn more, see Customize attribute mappings.&quot; --&gt;

&lt;h1&gt;Null attribute can&amp;#39;t be provisioned&lt;/h1&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h1&gt;Maximum characters for attribute-mapping expressions&lt;/h1&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h2&gt;Unsupported scoping filters&lt;/h2&gt;
&lt;p&gt;The appRoleAssignments, userType, and accountExpires attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h1&gt;Multivalue directory extensions&lt;/h1&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h1&gt;Service issues&lt;/h1&gt;
&lt;p&gt;Unsupported scenarios&lt;/p&gt;
&lt;p&gt;· Provisioning passwords isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;· Provisioning nested groups isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;· Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/p&gt;
&lt;p&gt;· Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/p&gt;
&lt;h1&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h1&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h1&gt;Manager isn&amp;#39;t provisioned&lt;/h1&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h1&gt;The provisioning interval is fixed&lt;/h1&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h1&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h1&gt;Switching from Sync All to Sync Assigned not working&lt;/h1&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h2&gt;Provisioning cycle continues until completion&lt;/h2&gt;
&lt;p&gt;When you set provisioning to enabled = off or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h1&gt;Member of group not provisioned&lt;/h1&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h1&gt;Global Reader&lt;/h1&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the microsoft.directory/applications/synchronization/standard/read&lt;/p&gt;
&lt;h1&gt;Microsoft Azure Government Cloud&lt;/h1&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h1&gt;On-premises application provisioning&lt;/h1&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h1&gt;Application and directories&lt;/h1&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;h2&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When a user is managed by Microsoft Entra Connect, the source of authority is on-premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/li&gt;
&lt;li&gt;Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on this website to track the status of the preview. Alternatively, you can use Microsoft Identity Manager for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. You can&amp;#39;t bring a user into the directory from a third-party application. Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.&lt;/p&gt;
&lt;h1&gt;Attributes and objects&lt;/h1&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;p&gt;· Multivalued attributes.&lt;/p&gt;
&lt;p&gt;· Reference attributes (for example, manager).&lt;/p&gt;
&lt;p&gt;· Groups.&lt;/p&gt;
&lt;p&gt;· Complex anchors (for example, ObjectTypeName+UserName).&lt;/p&gt;
&lt;p&gt;· Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;&lt;/p&gt;
&lt;p&gt;· Binary attributes.&lt;/p&gt;
&lt;p&gt;· On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/p&gt;
&lt;h1&gt;SSL certificates&lt;/h1&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h1&gt;Anchor attributes&lt;/h1&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h1&gt;Attribute discovery and mapping&lt;/h1&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;h1&gt;Provisioning agent&lt;/h1&gt;
&lt;p&gt;· The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/p&gt;
&lt;p&gt;· The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR-driven provisioning.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;How provisioning works&lt;/p&gt;
&lt;h1&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named Cairo and two member tenants named Berlin and Athens.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see Set up a multitenant org in Microsoft 365 and Join or leave a multitenant organization in Microsoft 365. To learn how to configure Microsoft Teams for your multitenant organization, see The new Microsoft Teams desktop client.&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram showing the relationship and cross-tenant access settings between the owner tenant (Cairo) and the member tenants (Athens and Berlin).](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (Cairo)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (Athens)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (Cairo)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (Berlin)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (Athens)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (Berlin)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Microsoft 365 Prerequisites](figures/1) --&gt; --&gt;

&lt;h2&gt;Owner tenant&lt;/h2&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;figure&gt;
Description: An icon and text labeled &quot;Member tenant&quot;.

&lt;ul&gt;
&lt;li&gt;For license information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/figure&gt;

&lt;h1&gt;Step 1: Sign in to the owner tenant&lt;/h1&gt;
&lt;figure&gt;
Description: An icon and text labeled &quot;Owner tenant&quot;.

&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the owner and member tenants and initialize variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$OwnerTenantId = &amp;quot;&lt;OwnerTenantId&gt;&amp;quot; $MemberTenantIdB = &amp;quot;&lt;MemberTenantIdB&gt;&amp;quot; $MemberTenantIdA = &amp;quot;&lt;MemberTenantIdA&gt;&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the owner tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect -MgGraph -TenantId $OwnerTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenant[&amp;quot;Owner tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;eadWrite. CrossTenantAccess&amp;quot;, &amp;quot;Application. ReadWrite. All&amp;quot;, &amp;quot;Directory. ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 2: Create a multitenant organization&lt;/h1&gt;
&lt;p&gt;[Blue box with icon]&lt;/p&gt;
&lt;p&gt;In the owner tenant, use the Update-MgBetaTenantRelationshipMultiTenantOrganization command to create your multitenant organization. This operation can take a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganization command to check that the operation has completed before proceeding.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;CreatedDateTime : 1/8/2024 7:47:45 PM&lt;br&gt;Description :&lt;br&gt;DisplayName : Cairo&lt;br&gt;Id : &amp;lt; MtoIdC&amp;gt;&lt;br&gt;JoinRequest :&lt;br&gt;Microsoft. Graph. Beta. PowerShell.Models.MicrosoftGraphMultiTenantOrganizationJoinRequestRecord&lt;br&gt;State : active&lt;br&gt;Tenants :&lt;br&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/$entity%5D%7D&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/$entity]}&lt;/a&gt; &lt;/p&gt;
&lt;h1&gt;Step 3: Add tenants&lt;/h1&gt;
&lt;p&gt;Description: Azure icon and header for the section.&lt;/p&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the New-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to add tenants to your multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdB -DisplayName &amp;quot;Berlin&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdA -DisplayName &amp;quot;Athens&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId    : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime      : 1/8/2024 7:47:45 PM
DeletedDateTime    :
DisplayName        : Cairo
Id                 : &amp;lt;MtoIdC&amp;gt;
JoinedDateTime     :
Role               : owner
State              : active
TenantId           : &amp;lt;OwnerTenantId&amp;gt;
TransitionDetails  :
Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenant --&amp;gt; MemberTenantBerlin[&amp;quot;Tenant ID: $MemberTenantIdB\nDisplayName: Berlin&amp;quot;]
    OwnerTenant --&amp;gt; MemberTenantAthens[&amp;quot;Tenant ID: $MemberTenantIdA\nDisplayName: Athens&amp;quot;]
    OwnerTenant --&amp;gt; MemberTenantCairo[&amp;quot;Tenant ID: &amp;lt;MtoIdC&amp;gt;\nDisplayName: Cairo\nRole: owner\nState: active\nTransitionDetails: [multiTenantOrgLabelType, none]&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;: 1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;: Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;: pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationMemberTransitionDetails AdditionalProperties : {[multiTenantOrgLabelType, none] }&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:08:47 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Athens&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: pending&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell.Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h1&gt;Step 4: (Optional) Change the role of a tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;p&gt;Text Description: This section provides a PowerShell command to change a tenant&amp;#39;s role within the multitenant organization. It demonstrates how to use the Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant command in PowerShell.&lt;/p&gt;
&lt;p&gt;MermaidJS Diagram: &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;]
    OwnerTenantC[&amp;quot;Owner tenant (C)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
    MemberTenantA[&amp;quot;Member tenant (A)&amp;quot;] --&amp;gt; MemberTenantB[&amp;quot;Member tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the Update- MgBeta TenantRelationshipMultiTenantOrganization Tenant command to change a member tenant to an owner tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; | Format-List&lt;/p&gt;
&lt;h1&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/h1&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId $MemberTenantIdB | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;AddedByTenantId : &lt;OwnerTenantId&gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime : 1/8/2024 8:05:25 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime :&lt;/p&gt;
&lt;p&gt;DisplayName : Berlin&lt;/p&gt;
&lt;p&gt;Id : &lt;MtoIdB&gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime :&lt;/p&gt;
&lt;p&gt;Role : owner&lt;/p&gt;
&lt;p&gt;State : pending&lt;/p&gt;
&lt;p&gt;TenantId : &lt;MemberTenantIdB&gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity%5D&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity]&lt;/a&gt;, [multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h1&gt;Step 5: (Optional) Remove a member tenant&lt;/h1&gt;
&lt;p&gt;Description of Figure:
The figure likely represents a PowerShell command or script related to removing a member tenant from the multi-tenant organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    OwnerTenant --&amp;gt; MemberTenantA
    MemberTenantA --&amp;gt; MemberTenantB
    OwnerTenant --&amp;gt; MemberTenantC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove any member tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get: Unable to read the company information from the directory.&lt;/p&gt;
&lt;p&gt;Status: 404 (NotFound) ErrorCode: Directory_ObjectNotFound Date: 2024-01-08T20:35:11&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;h1&gt;Step 6: Sign in to a member tenant&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Description of figure: The figure is an icon representing a tenant.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CairoTenant[&amp;quot;Cairo tenant&amp;quot;] --&amp;gt; BerlinTenant[&amp;quot;Berlin tenant&amp;quot;]
    CairoTenant[&amp;quot;Cairo tenant&amp;quot;] --&amp;gt; AthensTenant[&amp;quot;Athens tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Connect-MgGraph -TenantId $MemberTenantIdB -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;,&amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;,&amp;quot;Application.ReadWrite.All&amp;quot;,&amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 7: Join the multitenant organization&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram showing member tenant joining multitenant organization](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    MemberTenant[&amp;quot;Member tenant&amp;quot;]
    MultiTenantOrganization[&amp;quot;Multitenant organization&amp;quot;]
    MemberTenant --&amp;gt; MultiTenantOrganization;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the member tenant, use the Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to join the multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest -AddedByTenantId $OwnerTenantId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to verify the join.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest | Format-List&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemberState&lt;/td&gt;
&lt;td&gt;: active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationJoinRequestTransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties : {[@odata.context,&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt; iTenantOrganization/joinRequest/$entity]}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    subgraph Output
        A[AddedByTenantId: &amp;lt;OwnerTenantId&amp;gt;]
        B[Id: &amp;lt;MtoJoinRequestIdB&amp;gt;]
        C[MemberState: active]
        D[Role: member]
        E[TransitionDetails]
        F[Microsoft Graph Beta PowerShell Models MicrosoftGraphMultiTenantOrganizationJoinRequestTransitionDetails]
        G[AdditionalProperties: {{@odata.context, https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/joinRequest/$entity}}]
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;command to check the multitenant organization itself. It should reflect the&lt;/p&gt;
&lt;p&gt;join operation.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-&lt;/p&gt;
&lt;p&gt;List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:05:25 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Berlin&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 9:53:55 PM&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Cairo&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; Id&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    subgraph Output1[Output for Berlin]
        A1[AddedByTenantId: &amp;lt;OwnerTenantId&amp;gt;]
        B1[AddedDateTime: 1/8/2024 8:05:25 PM]
        C1[DeletedDateTime]
        D1[DisplayName: Berlin]
        E1[Id: &amp;lt;MtoJoinRequestIdB&amp;gt;]
        F1[JoinedDateTime: 1/8/2024 9:53:55 PM]
        G1[Role: member]
        H1[State: active]
        I1[TenantId: &amp;lt;MemberTenantIdB&amp;gt;]
        J1[TransitionDetails: Microsoft Graph Beta PowerShell Models MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails]
        K1[AdditionalProperties: {multiTenantOrgLabelType, none}]
    end

    subgraph Output2[Output for Cairo]
        A2[AddedByTenantId: &amp;lt;OwnerTenantId&amp;gt;]
        B2[AddedDateTime: 1/8/2024 7:47:45 PM]
        C2[DeletedDateTime]
        D2[DisplayName: Cairo]
        E2[Id: &amp;lt;Id&amp;gt;]
        F2[JoinedDateTime]
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: owner&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &lt;OwnerTenantId&gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours before joining a multitenant organization is completed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 8: (Optional) Leave the multitenant organization&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Member tenant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.&lt;/p&gt;
&lt;p&gt;If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see Step 4: (Optional) Change the role of a tenant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &lt;MemberTenantId&gt;&lt;/p&gt;
&lt;h1&gt;Step 9: (Optional) Delete the multitenant organization&lt;/h1&gt;
&lt;figure&gt;
Description: A logo of an organization is shown at the top of the document.
&lt;/figure&gt;

&lt;h1&gt;Owner tenant&lt;/h1&gt;
&lt;p&gt;You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the final owner tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $OwnerTenantId&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;The new Microsoft Teams desktop client&lt;/li&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h1&gt;Cross-tenant access policy partner template&lt;/h1&gt;
&lt;p&gt;The cross-tenant access partner configuration handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h3&gt;Figure Description&lt;/h3&gt;
&lt;p&gt;The figure illustrates the flow of trust settings and automatic user consent settings between partner tenants within a multitenant organization, managed by the cross-tenant access partner configuration.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    PartnerTenantA[&amp;quot;Partner Tenant (A)&amp;quot;] --&amp;gt; MultitenantOrganization[&amp;quot;Multitenant Organization&amp;quot;]
    PartnerTenantB[&amp;quot;Partner Tenant (B)&amp;quot;] --&amp;gt; MultitenantOrganization[&amp;quot;Multitenant Organization&amp;quot;]
    MultitenantOrganization[&amp;quot;Multitenant Organization&amp;quot;] --&amp;gt; PartnerTenantA[&amp;quot;Partner Tenant (A)&amp;quot;]
    MultitenantOrganization[&amp;quot;Multitenant Organization&amp;quot;] --&amp;gt; PartnerTenantB[&amp;quot;Partner Tenant (B)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Configure inbound and outbound automatic redemption&lt;/h1&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the Update multiTenantOrganizationPartnerConfigurationTemplate API. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;{
&amp;quot;inboundTrust&amp;quot;: {
&amp;quot;isMfaAccepted&amp;quot;: true,
&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
},
&amp;quot;automaticUserConsentSettings&amp;quot;: {
&amp;quot;inboundAllowed&amp;quot;: true,
&amp;quot;outboundAllowed&amp;quot;: true
},
&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners,existingPartners&amp;quot;
}&lt;/p&gt;
&lt;h1&gt;Disable the template for existing partners&lt;/h1&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![HTTP PATCH Request](figures/0) --&gt; --&gt;
&lt;p&gt;&lt;em&gt;The HTTP PATCH request to disable the template for existing partners&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Request[&amp;quot;HTTP PATCH Request&amp;quot;] --&amp;gt; URL[&amp;quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&amp;quot;]
    URL --&amp;gt; inboundTrust[&amp;quot;inboundTrust: { isMfaAccepted: true, isCompliantDeviceAccepted: true, isHybridAzureADJoinedDeviceAccepted: true }&amp;quot;]
    URL --&amp;gt; automaticUserConsentSettings[&amp;quot;automaticUserConsentSettings: { inboundAllowed: true, outboundAllowed: true }&amp;quot;]
    URL --&amp;gt; templateApplicationLevel[&amp;quot;templateApplicationLevel: newPartners&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Disable the template completely&lt;/h1&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;quot;inboundTrust&amp;quot;: {&lt;/p&gt;
&lt;p&gt;&amp;quot;isMfaAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true },&lt;/p&gt;
&lt;p&gt;&amp;quot;automaticUserConsentSettings&amp;quot;: { &amp;quot;inboundAllowed&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;outboundAllowed&amp;quot;: true },&lt;/p&gt;
&lt;p&gt;&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot; }&lt;/p&gt;
&lt;h1&gt;Reset the template&lt;/h1&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the multiTenantOrganizationPartnerConfigurationTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;POST&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Cross-tenant synchronization template&lt;/h1&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h1&gt;Configure inbound user synchronization&lt;/h1&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the Update multiTenantOrganizationIdentitySyncPolicyTemplate API. If you create or join a&lt;/p&gt;
&lt;p&gt;multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Figure: HTTP PATCH request to enable identity synchronization for both new and existing partners&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/ multiTenantOrganizationIdentitySynchronization
{
    &amp;quot;userSyncInbound&amp;quot;: {
        &amp;quot;isSyncAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners,existingPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;


&lt;h1&gt;Disable the template for existing partners&lt;/h1&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Figure: HTTP PATCH request to enable identity synchronization for new partners only&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/ multiTenantOrganizationIdentitySynchronization
{
    &amp;quot;userSyncInbound&amp;quot;: {
        &amp;quot;isSyncAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;


&lt;h1&gt;Disable the template completely&lt;/h1&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationIdentitySynchronization&lt;/p&gt;
&lt;p&gt;{ &amp;quot;userSyncInbound&amp;quot;: { &amp;quot;isSyncAllowed&amp;quot;: true }, &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot; }&lt;/p&gt;
&lt;h1&gt;Reset the template&lt;/h1&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;h1&gt;Request&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;[Figure: A table with HTTP request information]&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    HTTP --&amp;gt; POST[&amp;quot;POST&amp;quot;]
    POST --&amp;gt; URL[&amp;quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Configure cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/11/2024&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;[Diagram illustrating the cross-tenant synchronization process between the Source tenant and Target tenant. The Source tenant has internal users UserS1, UserS2, and UserS3 and is configured to automatically redeem invitations for outbound access settings. The Target tenant has internal users UserT1, UserT2, UserT3, and GroupT1, and external users UserS1 and UserS3 with inbound access settings allowing users to sync into this tenant and automatically redeem invitations. Scoping filters and attribute mappings between these entities are also shown.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source_tenant_A[&amp;quot;Source tenant&amp;quot;];
    target_tenant_B[&amp;quot;Target tenant&amp;quot;];
    source_config[&amp;quot;Configuration&amp;quot;];
    
    source_internal_A[&amp;quot;Internal UserS1\nUserS2\nUserS3&amp;quot;];
    source_outbound_access[&amp;quot;Outbound access settings:\n Automatically redeem invitations&amp;quot;];
    source_tenant_A --&amp;gt; source_internal_A;
    source_tenant_A --&amp;gt; source_outbound_access;
    
    cross_tenant_sync[&amp;quot;Cross-tenant synchronization&amp;quot;];
    source_tenant_A --&amp;gt; cross_tenant_sync;
    cross_tenant_sync --&amp;gt; target_tenant_B;

    target_internal_B[&amp;quot;Internal UserT1\nUserT2\nUserT3\nGroupT1&amp;quot;];
    target_external_B[&amp;quot;External UserS1\nUserS3&amp;quot;];
    target_inbound_access[&amp;quot;Inbound access settings:\n Allow users sync into this tenant\n Automatically redeem invitations&amp;quot;];
    target_tenant_B --&amp;gt; target_internal_B;
    target_tenant_B --&amp;gt; target_external_B;
    target_tenant_B --&amp;gt; target_inbound_access;
    
    scoping_filters[&amp;quot;Scope UserS1\nUserS3\nScoping filters department EQUALS Marketing&amp;quot;];
    attribute_mappings[&amp;quot;Attribute mappings accountEnabled=accountEnabled\nemployeeld=employeeld\nuserPrincipalName=userPrincipalName\n+ extensionName=companyName&amp;quot;];
    source_config --&amp;gt; scoping_filters;
    source_config --&amp;gt; attribute_mappings;
    cross_tenant_sync --&amp;gt; source_config;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Learning objectives&lt;/h1&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Remove B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Keep user attributes synchronized between your source and target tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prerequisites&lt;/p&gt;
&lt;p&gt;[Visual representation of the source tenant]&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There is an illustration of a communication path between two cloud structures, labeled as source tenant and target tenant, indicating how identity roles facilitate cross-tenant synchronization.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source_tenant[&amp;quot;Source Tenant&amp;quot;] --&amp;gt; target_tenant[&amp;quot;Target Tenant&amp;quot;]
    target_tenant --&amp;gt; security_admin[&amp;quot;Security Administrator&amp;quot;]
    target_tenant --&amp;gt; hybrid_identity_admin[&amp;quot;Hybrid Identity Administrator&amp;quot;]
    target_tenant --&amp;gt; cloud_app_admin[&amp;quot;Cloud Application Administrator&amp;quot;]
    target_tenant --&amp;gt; app_admin[&amp;quot;Application Administrator&amp;quot;]
    cloud_app_admin --&amp;gt; users[&amp;quot;Users&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;h1&gt;Step 1: Plan your provisioning deployment&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Define how you would like to structure the tenants in your organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn about how the provisioning service works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine who will be in scope for provisioning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Determine what data to map between tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the source tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Inbound access settings - Contoso &amp;gt; External Identities&lt;/p&gt;
&lt;p&gt;[Figure 1: Screenshot of the External Identities | Cross-tenant access settings page in Microsoft Entra ID for workforce. The page provides options to add an organization, configure cross-tenant settings, and search for tenant IDs or domain names.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    AddOrganization[&amp;quot;Add organization&amp;quot;] --&amp;gt; CrossTenantSettings[&amp;quot;Cross tenant settings&amp;quot;]
    CrossTenantSettings --&amp;gt; ExternalMicrosoftEntraTenant[&amp;quot;External Microsoft Entra tenant&amp;quot;]
    CrossTenantSettings --&amp;gt; Search[&amp;quot;Search by domain name or tenant ID&amp;quot;]
    CrossTenantSettings --&amp;gt; UserFlows[&amp;quot;User flows&amp;quot;]    
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Under Inbound access of the added organization, select Inherited from default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Cross-tenant sync tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Allow users sync into this tenant check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[Figure 2: Screenshot showing the Inbound access settings page for Fabrikam. The Cross-tenant sync tab is selected, and the option to Allow users sync into this tenant is enabled.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    InboundAccessSettings[&amp;quot;Inbound access settings - Fabrikam&amp;quot;] --&amp;gt; CrossTenantSync[&amp;quot;Cross-tenant sync&amp;quot;]
    CrossTenantSync --&amp;gt; EnableSync[&amp;quot;Allow users sync into this tenant&amp;quot;]
    EnableSync --&amp;gt; Save[&amp;quot;Save&amp;quot;]
    EnableSync --&amp;gt; Discard[&amp;quot;Discard&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see an Enable cross-tenant sync and auto-redemption dialog box asking if you want to enable auto-redemption, select Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selecting Yes will automatically redeem invitations in the target tenant.&lt;/p&gt;
&lt;p&gt;✅
X&lt;/p&gt;
&lt;h1&gt;Inbound access settings - Fabrikam ..&lt;/h1&gt;
&lt;figure&gt;
Screenshot of the Inbound access settings page in Fabrikam tenant&apos;s External Identities. The &quot;Cross-tenant sync&quot; tab is selected, showing an &quot;Enable cross-tenant sync and auto-redemption?&quot; dialog box. The dialog box mentions that setting up cross-tenant synchronization also requires auto-redemption to be enabled. The options &quot;Yes&quot; and &quot;No&quot; are available at the bottom.

&lt;!-- Image reference points to missing asset: figures/0 --&gt;
&lt;/figure&gt;


&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;figure&gt;
Icon representing a target tenant with an inbound arrow.

&lt;!-- Image reference points to missing asset: figures/1 --&gt;
&lt;/figure&gt;


&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;p&gt;In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt. This setting must be checked in both the source tenant (outbound) and target tenant (inbound). For more information, see Automatic redemption setting.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, on the same Inbound access settings page, select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This box might already be checked if you previously selected Yes in the Enable cross-tenant sync and auto-redemption dialog box.&lt;/p&gt;
&lt;figure&gt;
Screenshot of the &quot;Automatic redemption&quot; section in the Inbound access settings. There&apos;s a checkbox for &quot;Automatically redeem invitations with the tenant Fabrikam.&quot; The option to save or discard is shown at the bottom.

&lt;!-- Image reference points to missing asset: figures/2 --&gt;
&lt;/figure&gt;

&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 4: Automatically redeem invitations in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Screenshot of the Microsoft Entra admin center showing the Cross-tenant access settings page. A user is instructed to add an organization by typing one of its domain names or tenant ID.](figures/1) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CrossTenantAccessSettings[&amp;quot;Cross-tenant access settings page&amp;quot;] --&amp;gt; AddOrganization[&amp;quot;Add organization&amp;quot;]
    AddOrganization --&amp;gt; TenantIDDomainName[&amp;quot;Tenant ID or domain name&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Under Outbound access for the target organization, select Inherited from default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Home &amp;gt; Fabrikam &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;h1&gt;Outbound access settings - Contoso&lt;/h1&gt;
&lt;p&gt;✅
X&lt;/p&gt;
&lt;p&gt;B2B collaboration ❌ B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more
✅ ✅
V Automatically redeem invitations with the tenant Contoso.&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;p&gt;8. Select Save.&lt;/p&gt;
&lt;h2&gt;Step 5: Create a configuration in the source tenant&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;Description: A screenshot of the &amp;quot;Outbound access settings - Contoso&amp;quot; page showing &amp;quot;Automatic redemption&amp;quot; checkbox selected. Below, there are two buttons, &amp;quot;Save&amp;quot; and &amp;quot;Discard&amp;quot;.&lt;/h2&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. Select Configurations.&lt;/p&gt;
&lt;p&gt;3. At the top of the page, select New configuration.&lt;/p&gt;
&lt;p&gt;4. Provide a name for the configuration and select Create.&lt;/p&gt;
&lt;p&gt;It can take up to 15 seconds for the configuration that you just created to appear in the list.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Description: An icon indicative of a source tenant configuration screen capturing the process to create a new configuration.&lt;/h2&gt;
&lt;h2&gt;Step 6: Test the connection to the target tenant&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;Description: A screenshot of the configuration page in the source tenant.&lt;/h2&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;1. In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.&lt;/p&gt;
&lt;p&gt;+
❌&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Outbound access settings - Contoso &amp;gt; Cross-tenant synchronization | Configurations &amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Description: A screenshot displaying the outbound access settings in a Microsoft Entra admin center, showing the navigation path and a dropdown menu with various settings categories.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Outbound_Access_Settings[&amp;quot;Outbound access settings - Contoso&amp;quot;] --&amp;gt; Cross_Tenant_Sync[&amp;quot;Cross-tenant synchronization&amp;quot;]
    Cross_Tenant_Sync --&amp;gt; Configurations
    Configurations --&amp;gt; Fabrikam_to_Contoso[&amp;quot;Fabrikam to Contoso&amp;quot;]
    Fabrikam_to_Contoso --&amp;gt; Overview
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fabrikam to Contoso Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Overview
 ✅
X&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Got feedback?&lt;/p&gt;
&lt;p&gt;Overview&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Activity&lt;/p&gt;
&lt;p&gt;Audit logs&lt;/p&gt;
&lt;p&gt;Provisioning logs&lt;/p&gt;
&lt;p&gt;Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support&lt;/p&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;p&gt;Description: A pane from the Microsoft Entra admin center showing options for managing identity lifecycle, including user provisioning and audit logs. An illustration promotes automating identity lifecycle management.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Manage[&amp;quot;Manage&amp;quot;] --&amp;gt; Users_and_Groups[&amp;quot;Users and groups&amp;quot;]
    Manage --&amp;gt; Provisioning
    Manage --&amp;gt; Expression_Builder[&amp;quot;Expression builder&amp;quot;]
    Activity[&amp;quot;Activity&amp;quot;] --&amp;gt; Audit_Logs[&amp;quot;Audit logs&amp;quot;]
    Activity --&amp;gt; Provisioning_Logs[&amp;quot;Provisioning logs&amp;quot;]
    Activity --&amp;gt; Insights
    Troubleshooting_Support[&amp;quot;Troubleshooting + Support&amp;quot;] --&amp;gt; New_Support_Request[&amp;quot;New support request&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Automate identity lifecycle management with Microsoft Entra&lt;/p&gt;
&lt;p&gt;Automatically create, update, and delete accounts when users join, leave, and move within your organization. Learn more.&lt;/p&gt;
&lt;p&gt;Get started&lt;/p&gt;
&lt;p&gt;What is provisioning? Plan an application deployment. +&lt;/p&gt;
&lt;p&gt;Configure automatic provisioning.&lt;/p&gt;
&lt;p&gt;Description: A screenshot showing provisioning instructions with a focus on setting the provisioning mode to automatic and configuring admin credentials for cross-tenant synchronization policy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Provisioning_Mode[&amp;quot;Provisioning Mode&amp;quot;] --&amp;gt; Automatic
    Admin_Credentials[&amp;quot;Admin Credentials&amp;quot;] --&amp;gt; Cross_Tenant_Sync_Policy[&amp;quot;Cross Tenant Synchronization Policy&amp;quot;]
    Cross_Tenant_Sync_Policy --&amp;gt; Tenant_ID[&amp;quot;Tenant Id&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Get started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the Provisioning Mode to Automatic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the Admin Credentials section, change the Authentication Method to Cross Tenant Synchronization Policy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Description: A screenshot of the provisioning configuration page in the Microsoft Entra admin center. The Provisioning Mode is set to Automatic, and the Authentication Method is set to Cross Tenant Synchronization Policy. There is a Tenant Id field and an option to Test Connection.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Provisioning_Config[&amp;quot;Provisioning Configuration&amp;quot;] --&amp;gt; Provisioning_Mode[&amp;quot;Provisioning Mode: Automatic&amp;quot;]
    Provisioning_Config --&amp;gt; Admin_Credentials[&amp;quot;Admin Credentials&amp;quot;]
    Admin_Credentials --&amp;gt; Auth_Method[&amp;quot;Authentication Method: Cross Tenant Synchronization Policy&amp;quot;]
    Auth_Method --&amp;gt; Tenant_ID[&amp;quot;Tenant Id&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;In the Tenant Id box, enter the tenant ID of the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Test Connection to test the connection.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see Troubleshooting tips later in this article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1: Notification screen showing a successful test connection. The message states &amp;quot;The supplied credentials are authorized to enable provisioning&amp;quot; and displays a timestamp of a few seconds ago.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;Notifications Panel&amp;quot;]
    A --&amp;gt;|More events in the activity log| B[&amp;quot;Dismiss all&amp;quot;]
    A --&amp;gt;|Testing connection to Fabrikam to Contoso| C[&amp;quot;Success Message: The supplied credentials are authorized to enable provisioning&amp;quot;]
    C --&amp;gt;|Timestamp: a few seconds ago| D[&amp;quot;Timestamp&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mappings and Settings sections appear.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Close the Provisioning page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Step 7: Define who is in scope for provisioning&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: Microsoft Entra icon illustrating source tenant scope definition.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on assignment to the configuration&lt;/li&gt;
&lt;li&gt;Based on attributes of the user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning and expand the Settings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;

&lt;p&gt;Outbound access settings - Contoso &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso Fabrikam to Contoso | Provisioning Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Discard&lt;/li&gt;
&lt;li&gt;Overview&lt;/li&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;li&gt;Admin Credentials&lt;/li&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;li&gt;Settings:&lt;ul&gt;
&lt;li&gt;Send an email notification when a failure occurs: [Unselected]&lt;/li&gt;
&lt;li&gt;Prevent accidental deletion: [Selected]&lt;ul&gt;
&lt;li&gt;Accidental deletion threshold: 500&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scope: Sync only assigned users and groups&lt;ul&gt;
&lt;li&gt;Sync all users and groups [Unselected]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Activity:&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Troubleshooting + Support:&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Provisioning Status: Off&lt;/li&gt;
&lt;/ul&gt;
&lt;/figure&gt;

&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the Scope list, select whether to synchronize all users in the source tenant or only users assigned to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;#39;s recommended that you select Sync only assigned users and groups instead of Sync all users and groups. Reducing the number of users in scope improves performance.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;p&gt;If you made any changes, select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the configuration page, select Users and groups.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Add user/group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Add Assignment page, under Users and groups, select None Selected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Users and groups pane, search for and select one or more internal users or groups you want to assign to the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you select a group to assign to the configuration, only users that are direct members in the group will be in scope for provisioning. You can select a static group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Select Select.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PageHeader=&quot;9\. Select Assign.&quot; --&gt;

&lt;figure&gt;
Description: The figure depicts the &quot;Fabrikam to Contoso | Users and groups&quot; screen in Microsoft Entra ID, displaying a list of users and groups with various provisioning options.

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; Users_and_groups;
    Overview --&amp;gt; Provisioning;
    Overview --&amp;gt; Expression_builder;
    Activity --&amp;gt; Audit_logs;
    Activity --&amp;gt; Provisioning_logs;
    Activity --&amp;gt; Insights;
    Troubleshooting_and_Support --&amp;gt; &amp;quot;New_support_request&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Display Name&lt;/th&gt;
&lt;th&gt;Object Type&lt;/th&gt;
&lt;th&gt;Role assigned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;❌ ✅  US User3&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ ✅  US User1&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ GR Group1&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For more information, see Assign users and groups to an application.&lt;/p&gt;
&lt;h1&gt;Step 8: (Optional) Define who is in scope for provisioning with scoping filters&lt;/h1&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Regardless of the value you selected for Scope in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning and expand the Mappings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;h1&gt;Fabrikam to Contoso | Provisioning&lt;/h1&gt;
&lt;p&gt; ✅
X&lt;/p&gt;
&lt;p&gt;Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Save ✅ Discard&lt;/p&gt;
&lt;p&gt;1 Overview&lt;/p&gt;
&lt;p&gt;V Admin Credentials&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;1 Mappings&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Mappings Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Activity - Audit logs&lt;/p&gt;
&lt;p&gt;Provisioning logs ❌ Restore default mappings&lt;/p&gt;
&lt;p&gt;Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support v Settings&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;p&gt;Provisioning Status
 ✅
+&lt;/p&gt;
&lt;p&gt;On&lt;/p&gt;
&lt;p&gt;Off&lt;/p&gt;
&lt;h2&gt;2. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/h2&gt;
&lt;figure&gt;
Home &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping .. &gt; ✅ Save ✅ Discard Name Provision Microsoft Entra ID Users Enabled Yes No Source Object User Source Object Scope All records Source Object User Target Object Actions ✅ Create ✅ Update + ✅ Delete
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Home[&amp;quot;Home&amp;quot;]
    CrossTenant[&amp;quot;Cross-tenant synchronization&amp;quot;]
    Configurations[&amp;quot;Configurations&amp;quot;]
    FabrikamToContoso[&amp;quot;Fabrikam to Contoso&amp;quot;]
    Provisioning[&amp;quot;Provisioning&amp;quot;]
    AttributeMapping[&amp;quot;Attribute Mapping&amp;quot;]

    Home --&amp;gt; CrossTenant
    CrossTenant --&amp;gt; Configurations
    Configurations --&amp;gt; FabrikamToContoso
    FabrikamToContoso --&amp;gt; Provisioning
    Provisioning --&amp;gt; AttributeMapping
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. Under Source Object Scope, select All records.&lt;/h2&gt;
&lt;figure&gt;
Home &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping .. &gt; ✅ Save ✅ Discard Name Provision Microsoft Entra ID Users Enabled Yes No Source Object User Source Object Scope All records Source Object User Target Object Actions ✅ Create ✅ Update + ✅ Delete
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Home[&amp;quot;Home&amp;quot;]
    CrossTenant[&amp;quot;Cross-tenant synchronization&amp;quot;]
    Configurations[&amp;quot;Configurations&amp;quot;]
    FabrikamToContoso[&amp;quot;Fabrikam to Contoso&amp;quot;]
    Provisioning[&amp;quot;Provisioning&amp;quot;]
    AttributeMappingScope[&amp;quot;Source Object Scope&amp;quot;]
    AllRecords[&amp;quot;All records&amp;quot;]

    Home --&amp;gt; CrossTenant
    CrossTenant --&amp;gt; Configurations
    Configurations --&amp;gt; FabrikamToContoso
    FabrikamToContoso --&amp;gt; Provisioning
    Provisioning --&amp;gt; AttributeMappingScope
    AttributeMappingScope --&amp;gt; AllRecords
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4. On the Source Object Scope page, select Add scoping filter.&lt;/p&gt;
&lt;p&gt;5. Add any scoping filters to define which users are in scope for provisioning.&lt;br&gt;✅ ❌ ❌&lt;/p&gt;
&lt;p&gt;To configure scoping filters, refer to the instructions provided in Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Add/Remove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;No scoping filters found&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department ✅&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;Add New Scoping Clause&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;6. Select Ok and Save to save any changes.&lt;/p&gt;
&lt;p&gt;If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.&lt;/p&gt;
&lt;p&gt;7. Select Yes and close the Attribute Mapping page.&lt;/p&gt;
&lt;h1&gt;Step 9: Review attribute mappings&lt;/h1&gt;
&lt;figure&gt;

&lt;p&gt;&lt;em&gt;An image showing an interface for adding a scoping filter. There are fields for Target Attribute, Operator, Value, and Add/Remove. The &amp;quot;Marketing department filter&amp;quot; and &amp;quot;EQUALS&amp;quot; operator are selected.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
  NoScopingFilter[&amp;quot;No scoping filters found&amp;quot;]
  Department[&amp;quot;department: EQUALS&amp;quot;]
  Marketing[&amp;quot;Marketing&amp;quot;]
  ScopingFilterTitle[&amp;quot;Scoping Filter Title *&amp;quot;]
  FilterLogic[&amp;quot;If multiple scoping clauses are present, they are evaluated using &amp;#39;AND&amp;#39; logic.&amp;quot;]
  NoScopingFilter --&amp;gt; Department
  Department --&amp;gt; Marketing
  Marketing --&amp;gt; ScopingFilterTitle
  ScopingFilterTitle --&amp;gt; FilterLogic
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;2. Select Provision Microsoft Entra ID Users.&lt;/p&gt;
&lt;p&gt;3. On the Attribute Mapping page, scroll down to review the user attributes that are synchronized between tenants in the Attribute Mappings section.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;&lt;em&gt;An image showing the Cross-tenant Synchronization configurations from Fabrikam to Contoso under the Provisioning section. There&amp;#39;s a section for adding scoping filters with the title &amp;quot;Marketing department filter&amp;quot;.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
  CrossTenantSync[&amp;quot;Cross-tenant synchronization | Configurations | Fabrikam to Contoso&amp;quot;]
  Provisioning[&amp;quot;Provisioning | Add Scoping Filter&amp;quot;]
  DefineScope[&amp;quot;Define which users are in scope for provisioning&amp;quot;]
  ScopingFilterTitle[&amp;quot;Scoping Filter Title * Marketing department filter&amp;quot;]
  LogicInfo[&amp;quot;If multiple scoping clauses are present, they are evaluated using &amp;#39;AND&amp;#39; logic&amp;quot;]
  CrossTenantSync --&amp;gt; Provisioning
  Provisioning --&amp;gt; DefineScope
  DefineScope --&amp;gt; ScopingFilterTitle
  ScopingFilterTitle --&amp;gt; LogicInfo
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;The first attribute, alternativeSecurityIdentifier, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a schemaInvalid error.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Attribute Mapping&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attribute mappings&lt;/strong&gt; define how attributes are synchronized between Azure Active Directory and Azure Active Directory (target tenant)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Active Directory Attribute&lt;/th&gt;
&lt;th&gt;Azure Active Directory (target tenant) Attribute&lt;/th&gt;
&lt;th&gt;Matching precedence&lt;/th&gt;
&lt;th&gt;Remove&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AltSecldFromNetid([netid])&lt;/td&gt;
&lt;td&gt;alternativeSecuritylds&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| AltSecldFromNetid[&amp;quot;AltSecldFromNetid([netid])&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| IsSoftDeleted[&amp;quot;IsSoftDeleted&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| accountEnabled[&amp;quot;accountEnabled&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| streetAddress[&amp;quot;streetAddress&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| city[&amp;quot;city&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| state[&amp;quot;state&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| postalCode[&amp;quot;postalCode&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| country[&amp;quot;country&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| department[&amp;quot;department&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| employeeld[&amp;quot;employeeld&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| displayName[&amp;quot;displayName&amp;quot;]
    AzureAD[&amp;quot;Azure Active Directory Attribute&amp;quot;] --&amp;gt;|Matches with| givenName[&amp;quot;givenName&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;p&gt;Select the Member (userType) attribute to open the Edit Attribute page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review the Constant Value setting for the userType attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constant Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;Users will be created as external guests (B2B collaboration users) in the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    userType[Member(&amp;quot;Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&amp;quot;)]
    userType2(&amp;quot;Guest&amp;quot;)[&amp;quot;Users will be created as external guests (B2B collaboration users) in the target tenant.&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Note&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the B2B user already exists in the target tenant then Member (userType) will not changed to Member, unless the Apply this mapping setting is set to Always.&lt;/p&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Table Description: The table outlines various applications or services and their limitations when working with different user types.)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;... &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h1&gt;Edit Attribute&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;(Figure illustrating the interface for editing attribute mappings.)&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**MermaidJS Description: Diagram to represent the attribute mapping process.**

graph TD;
    A[&amp;quot;Mapping Attributes&amp;quot;] --&amp;gt; B[&amp;quot;Source Tenant Attributes&amp;quot;];
    B --&amp;gt; C[&amp;quot;Target Tenant Attributes&amp;quot;];
    C --&amp;gt; D[&amp;quot;Transform Attributes&amp;quot;];
    D --&amp;gt; E[&amp;quot;Apply Mapping&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Dropdown to select mapping type)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;| Constant | V |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Input fields and selection checkboxes for configuring the mapping)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;| Constant Value * | ❌ |
| Member | V |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(More options for selecting attribute settings)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Target attribute * ❌ userType&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;Match objects using this attribute No&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;Matching precedence
❌ 0&lt;/p&gt;
&lt;p&gt;Apply this mapping 
Only during object creation&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;If you want to define any transformations, on the Attribute Mapping page, select the attribute you want to transform, such as displayName.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ok
❌&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;Set the Mapping type to Expression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Expression box, enter the transformation expression. For example with the display name, you can do the following:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;· Flip the first name and last name and add a comma in between.&lt;/p&gt;
&lt;p&gt;· Add the domain name in parentheses at the end of the display name.&lt;/p&gt;
&lt;p&gt;For examples, see Reference for writing expressions for attribute mappings in Microsoft Entra ID.&lt;/p&gt;
&lt;figure&gt;
Text Description: &quot;Edit Attribute&quot; window in Microsoft Entra. It depicts configurations for cross-tenant synchronization from Fabrikam to Contoso. The Mapping type is set to Expression. The user enters a transformation expression in the Expression box. The &quot;displayName&quot; is used as a target attribute.
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    EditAttributeWindow[&amp;quot;Edit Attribute Window&amp;quot;] --&amp;gt; MappingType[&amp;quot;Mapping Type: Expression&amp;quot;]
    MappingType --&amp;gt; ExpressionBox[&amp;quot;Expression: [displayName]&amp;quot;]
    ExpressionBox --&amp;gt; TargetAttribute[&amp;quot;Target attribute: displayName&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see Map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Step 10: Specify additional provisioning settings&lt;/p&gt;
&lt;figure&gt;
Text Description: Source tenant icon.
&lt;/figure&gt;

&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning and expand the Settings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Outbound access settings - Contoso &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Provisioning Fabrikam - Microsoft Entra ID ✅ « ❌ Save ✅ Discard Overview v Admin Credentials Provision on demand Manage V Mappings Users and groups Provisioning Settings Expression builder Activity ❌ Send an email notification when a failure occurs Audit logs ✅ Prevent accidental deletion 0 Accidental deletion threshold \* Provisioning logs 500 Insights Scope ❌ Sync only assigned users and groups V Troubleshooting + Support New support request Provisioning Status O On Off +&quot; ](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;Outbound access settings - Contoso&amp;quot;] --&amp;gt; B[&amp;quot;Cross-tenant synchronization&amp;quot;]
    B --&amp;gt; C[&amp;quot;Configurations &amp;gt; Fabrikam to Contoso&amp;quot;]
    C --&amp;gt; D[&amp;quot;Fabrikam to Contoso | Provisioning&amp;quot;]
    D --&amp;gt; E[&amp;quot;Overview&amp;quot;]
    D --&amp;gt; F[&amp;quot;Admin Credentials&amp;quot;]
    D --&amp;gt; G[&amp;quot;Provision on demand&amp;quot;]
    D --&amp;gt; H[&amp;quot;Mappings&amp;quot;]
    D --&amp;gt; I[&amp;quot;Users and groups&amp;quot;]
    D --&amp;gt; J[&amp;quot;Provisioning&amp;quot;]
    D --&amp;gt; K[&amp;quot;Expression builder&amp;quot;]
    D --&amp;gt; L[&amp;quot;Activity&amp;quot;]
    L --&amp;gt; M[&amp;quot;Send an email notification when a failure occurs&amp;quot;]
    L --&amp;gt; N[&amp;quot;Audit logs&amp;quot;]
    L --&amp;gt; O[&amp;quot;Prevent accidental deletion&amp;quot;]
    L --&amp;gt; P[&amp;quot;Accidental deletion threshold * Provisioning logs 500 Insights Scope&amp;quot;]
    P --&amp;gt; Q[&amp;quot;Sync only assigned users and groups&amp;quot;]
    P --&amp;gt; R[&amp;quot;Troubleshooting + Support&amp;quot;]
    R --&amp;gt; S[&amp;quot;New support request&amp;quot;]
    P --&amp;gt; T[&amp;quot;Provisioning Status On Off&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Check the Send an email notification when a failure occurs check box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Notification Email box, enter the email address of a person or group who should receive provisioning error notifications.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Email notifications are sent within 24 hours of the job entering quarantine state. For custom alerts, see Understand how provisioning integrates with Azure Monitor logs.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;To prevent accidental deletion, select Prevent accidental deletion and specify a threshold value. By default, the threshold is set to 500.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information, see Enable accidental deletions prevention in the Microsoft Entra provisioning service.&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Select Save to save any changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step 11: Test provision on demand&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Logo](figures/1) --&gt; --&gt; 

&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision on demand.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Select a user or group box, search for and select one of your test users.&lt;/p&gt;
 &lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Screenshot of Provision on demand page with instruction to select a user or group](figures/0) --&gt; --&gt; 

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Browse[&amp;quot;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&amp;quot;] --&amp;gt; Configurations[&amp;quot;Select Configurations&amp;quot;]
    Configurations --&amp;gt; Provision_on_demand[&amp;quot;Select Provision on demand&amp;quot;]
    Provision_on_demand --&amp;gt; SearchUser[&amp;quot;Search for and select one of your test users&amp;quot;]
    SearchUser --&amp;gt; ProvisionButton[&amp;quot;Select Provision&amp;quot;]
    ProvisionButton --&amp;gt; PerformAction[&amp;quot;Perform action page appears with information about the provisioning of the test user in the target tenant&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After a few moments, the Perform action page appears with information about the provisioning of the test user in the target tenant.&lt;/p&gt;
&lt;!-- PageNumber=&quot;X&quot; --&gt;

&lt;h1&gt;Perform action&lt;/h1&gt;
&lt;p&gt;Modified attributes (successful) Data flow&lt;/p&gt;
&lt;p&gt;User &amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Ma&lt;/p&gt;
&lt;p&gt;Act&lt;/p&gt;
&lt;p&gt;-&lt;/p&gt;
&lt;p&gt;Tro&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target attribute name&lt;/th&gt;
&lt;th&gt;Source attribute value&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Original target attribute v ...&lt;/th&gt;
&lt;th&gt;Modified target attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;[IsSoftDeleted]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;[accountEnabled]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;[displayName]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mailNickname&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;[mailNickname]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alternativeSecuritylds&lt;/td&gt;
&lt;td&gt;AltSecldFromNetid(&amp;quot;1003 ...&lt;/td&gt;
&lt;td&gt;AltSecldFromNetid([netid])&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;[preferredLanguage]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;h1&gt;If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why test user was skipped.&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Image description: A screenshot of a user interface explaining that the user &amp;#39;&lt;a href=&quot;mailto:alice@fabrikam.com&quot;&gt;alice@fabrikam.com&lt;/a&gt;&amp;#39; will be skipped due to specific reasons such as the object not being assigned to the application and not having the required entitlement for provisioning.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    scopeX[Determine if user is in scope] --&amp;gt; reason1[&amp;quot;1) This object is not assigned to the application.&amp;quot;]
    scopeX --&amp;gt; reason2[&amp;quot;2) This object does not have required entitlement for provisioning.&amp;quot;]
    reason1 --&amp;gt; action1[&amp;quot;If you did not expect the object to be skipped, assign the object to the application or change the scoping filter.&amp;quot;]
    reason2 --&amp;gt; action2[&amp;quot;Update provisioning scope to &amp;#39;Sync all users and groups&amp;#39; or assign the object to the application with entitlement of provisioning category.&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute name&lt;/th&gt;
&lt;th&gt;Attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;SkipReason&lt;/td&gt;
&lt;td&gt;NotEffectivelyEntitled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsActive&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assigned to the application&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsInProvisioningScope&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;On the Provision on demand page, you can view details about the provision and have the option to retry.&lt;/p&gt;
&lt;h1&gt;✅
... &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;figure&gt;

&lt;p&gt;Figure 1: Fabrikam to Contoso | Provision on demand Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;/figure&gt;


&lt;p&gt;X&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Figure 2: Learn More Technical details Got feedback? 1 Overview Ps Provision on demand User Manage US User1 &lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt; Users and groups Provisioning Expression builder 1. Import user This step shows the user retrieved from the source system and the properties of the user in the source system. Activity ✅ Success | View details Audit logs Provisioning logs 2. Determine if user is in scope Insights This step shows the scoping conditions that were evaluated and which ones the user passed or failed. Troubleshooting + Support ✅ Success | View details New support request 3. Match user between source and target system This step shows whether the user was found in the target system as well as the properties of the user in the target system. ✅ Success | View details 4. Perform action This step shows the action that was performed in the target application, such as creating a user or updating a user. Success | View details ✅ + Retry Provision another object&lt;/p&gt;
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ImportUser[&amp;quot;Import user&amp;quot;] --&amp;gt; DetermineScope[&amp;quot;Determine if user is in scope&amp;quot;]
    DetermineScope --&amp;gt; MatchUser[&amp;quot;Match user between source and target system&amp;quot;]
    MatchUser --&amp;gt; PerformAction[&amp;quot;Perform action&amp;quot;]
    
    ImportUser --&amp;gt; ImportUserResult[&amp;quot;Success | View details&amp;quot;]
    DetermineScope --&amp;gt; DetermineScopeResult[&amp;quot;Success | View details&amp;quot;]
    MatchUser --&amp;gt; MatchUserResult[&amp;quot;Success | View details&amp;quot;]
    PerformAction --&amp;gt; PerformActionResult[&amp;quot;Success | View details&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. In the target tenant, verify that the test user was provisioned.&lt;/h2&gt;
&lt;figure&gt;

&lt;p&gt;Figure 3: Home &amp;gt; Contoso &amp;gt; Users ... × Contoso - Microsoft Entra ID Search « + New user V Download users Bulk operations V Refresh V Manage view Delete Per-user MFA .... All users O Azure Active Directory is now Microsoft Entra ID. 2 Audit logs user1 ✅ ✅ Add filter Sign-in logs 1 user found * Diagnose and solve problems ❌ Display name 1l User principal name 1l User type On-premises ... Identities Company name Creation type Manage ❌ US User1 user1_fabrikam.com#EXT#@ ... ✅ Member No ExternalAzureAD Invitation Deleted users Password reset User settings + % Bulk operation results Troubleshooting + Support&lt;/p&gt;
&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TargetTenant[&amp;quot;Target Tenant&amp;quot;] --&amp;gt; TestUserProvisioned[&amp;quot;Test user provisioned&amp;quot;]
    TestUserProvisioned --&amp;gt; UsersList[&amp;quot;Users List&amp;quot;]
    
    UsersList --&amp;gt; DisplayNameMatched[&amp;quot;Display name matched&amp;quot;]
    UsersList --&amp;gt; UserPrincipalNameMatched[&amp;quot;User principal name matched&amp;quot;]
    UsersList --&amp;gt; UserTypeMatched[&amp;quot;User type matched&amp;quot;]
    UsersList --&amp;gt; IdentitiesMatched[&amp;quot;Identities matched&amp;quot;]
    
    DisplayNameMatched --&amp;gt; ResultSuccess[&amp;quot;Success&amp;quot;]
    UserPrincipalNameMatched --&amp;gt; ResultSuccess
    UserTypeMatched --&amp;gt; ResultSuccess
    IdentitiesMatched --&amp;gt; ResultSuccess
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;7. If all is working as expected, assign additional users to the configuration.&lt;/p&gt;
&lt;p&gt;For more information, see On-demand provisioning in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Step 12: Start the provisioning job
✅&lt;/p&gt;
&lt;h1&gt;Source tenant&lt;/h1&gt;
&lt;p&gt;The provisioning job starts the initial synchronization cycle of all users defined in Scope of the Settings section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Overview page, review the provisioning details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; i Fabrikam to Contoso Fabrikam - Microsoft Entra ID Overview .. X ✅ « ✅ Start provisioning ❌ Stop provisioning Restart provisioning ... Overview % Provision on demand Current cycle status Manage Initial cycle not run. Users and groups 0% complete Provisioning Expression builder View provisioning logs Activity Statistics to date Audit logs ✅ v View provisioning details Provisioning logs ✅ V View technical information + Insights](figures/1) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview[&amp;quot;Overview&amp;quot;] --&amp;gt; StartProvisioning[&amp;quot;Start provisioning&amp;quot;]
    Overview --&amp;gt; StopProvisioning[&amp;quot;Stop provisioning&amp;quot;]
    Overview --&amp;gt; RestartProvisioning[&amp;quot;Restart provisioning&amp;quot;]
    Overview --&amp;gt; &amp;#39;ProvisionOnDemand[&amp;quot;Provision on demand&amp;quot;]
    Overview --&amp;gt; &amp;#39;CurrentCycleStatus[&amp;quot;Current cycle status: Initial cycle not run. 0% complete&amp;quot;]
    Manage[&amp;quot;Manage&amp;quot;] --&amp;gt; UsersAndGroups[&amp;quot;Users and groups&amp;quot;]
    Manage --&amp;gt; ProvisioningExprBuilder[&amp;quot;Provisioning Expression builder&amp;quot;]
    Activity[&amp;quot;Activity&amp;quot;] --&amp;gt; AuditLogs[&amp;quot;Audit logs&amp;quot;]
    Activity --&amp;gt; ProvisioningLogs[&amp;quot;Provisioning logs&amp;quot;]
    Activity --&amp;gt; TechInfo[&amp;quot;View technical information&amp;quot;]
    Activity --&amp;gt; Insights[&amp;quot;Insights&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Select Start provisioning to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;p&gt;Source and target tenants&lt;/p&gt;
&lt;p&gt;Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, on the Overview page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see Check the status of user provisioning.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Source and target tenants overview](figures/2) --&gt; --&gt;

&lt;p&gt;If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Screenshot of provisioning page showing the Fabrikam to Contoso Overview with an option to start provisioning. The current cycle status is shown as 100% complete for users and groups.](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Overview --&amp;gt; Manage;
    Manage --&amp;gt; Users_and_groups;
    Manage --&amp;gt; Provisioning;
    Manage --&amp;gt; &amp;quot;Expression builder&amp;quot;;
    Activity --&amp;gt; &amp;quot;Audit logs&amp;quot;;
    Activity --&amp;gt; &amp;quot;Provisioning logs&amp;quot;;
    Activity --&amp;gt; Insights;
    &amp;quot;Troubleshooting + Support&amp;quot; --&amp;gt; &amp;quot;View provisioning details&amp;quot;;
    &amp;quot;Troubleshooting + Support&amp;quot; --&amp;gt; &amp;quot;View technical information&amp;quot;;
    Statistics --&amp;gt; &amp;quot;Provisioning details&amp;quot;;
    Statistics --&amp;gt; &amp;quot;Technical information&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Select Provisioning logs to determine which users have been provisioned successfully or unsuccessfully. By default, the logs are filtered by the service principal ID of the configuration. For more information, see Provisioning logs in Microsoft Entra ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Screenshot of the provisioning logs page filtered by a specific application&apos;s service principal ID, showing the date, identity, action, source system, target system, and status of provisioning entries.](figures/1) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Configuration --&amp;gt; &amp;quot;Service principal ID&amp;quot;;
    Logs --&amp;gt; Download;
    Logs --&amp;gt; Learn_more;
    Logs --&amp;gt; Refresh;
    Logs --&amp;gt; Columns;
    Logs --&amp;gt; Filters[&amp;quot;Add filters&amp;quot;];
    Identity --&amp;gt; &amp;quot;Display Name User3&amp;quot;;
    Action --&amp;gt; Update;
    &amp;quot;Source System&amp;quot; --&amp;gt; &amp;quot;Azure Active Directory&amp;quot;;
    &amp;quot;Target System&amp;quot; --&amp;gt; &amp;quot;Azure Active Directory (target tenant)&amp;quot;;
    Status --&amp;gt; Success;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Users and groups Provisioning&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Source System&lt;/th&gt;
&lt;th&gt;Target System&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression builder Activity&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning logs 0 Insights Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID ❌&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success +&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New support request&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID ❌ ❌&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Audit logs to view all logged events in Microsoft Entra ID. For more information, see Audit logs in Microsoft Entra ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
    The first figure shows a detailed UI of audit logs within a provisioning management system. The header indicates this view is set for attributes mapping, cross-tenant synchronization from Fabrikam to Contoso. A table lists activities by date, service, category, and specific operations with their status. There are various columns like Users, Date, Service, Category, Activity, Status, and Target for fine-grained tracking of provisioning actions.

&lt;pre&gt;&lt;code&gt;```mermaid
graph TD;
    AuditLogs[&amp;quot;Audit Logs&amp;quot;] --&amp;gt;|View Items| AttributesMapping[&amp;quot;Attribute Mapping&amp;quot;]
    AuditLogs --&amp;gt;|Edit Attribute| CrossTenantSync[&amp;quot;Cross-tenant synchronization&amp;quot;]
    CrossTenantSync --&amp;gt; Configurations[&amp;quot;Configurations &amp;gt; Fabrikam to Contoso&amp;quot;]
    Configurations --&amp;gt; Provisioning[&amp;quot;Provisioning&amp;quot;]
    Provisioning --&amp;gt; FabricamContoso[&amp;quot;Configuration &amp;gt; Fabrikam to Contoso&amp;quot;]
    Provisioning --&amp;gt; AuditLogs
```
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;p&gt;| Manage | Date : Last 1 month || Show dates as : Local  Service : All ❌ ❌ | Category : All ❌ | Activity : All || ty Add filters | | Initiated by (acto ... |&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Users and groups&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Stat ...&lt;/th&gt;
&lt;th&gt;Status reason&lt;/th&gt;
&lt;th&gt;Target(s)&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;User &amp;#39;user3@fabrika ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expression builder&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;User &amp;#39;user3@fabrika ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;User &amp;#39;user3@fabrika ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;The state of the entr ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user1 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;The state of the entr ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user1 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 Insights&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;No User with &amp;#39;alterna ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Retrieved &amp;#39;user1@fab ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New support request&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A target entry in Azu ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;Received User &amp;#39;user3 ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;This app role assign ...&lt;/td&gt;
&lt;td&gt;Fabrikam to Contoso&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You can also view audit logs in the target tenant.&lt;/p&gt;
&lt;p&gt;4. In the target tenant, select Users &amp;gt; Audit logs to view logged events for user management.&lt;/p&gt;
&lt;figure&gt;
    The second figure details the audit logs page in the target tenant. The page shows user-related logs with several columns for dates, services, categories, activities, statuses, status reasons, targets, and who initiated the activities.

&lt;pre&gt;&lt;code&gt;```mermaid
graph TD;
    Home[&amp;quot;Home &amp;gt; Contoso &amp;gt; Users&amp;quot;] --&amp;gt; UsersAuditLogs[&amp;quot;Users &amp;gt; Audit Logs&amp;quot;]
    UsersAuditLogs --&amp;gt; AllUsers[&amp;quot;All Users&amp;quot;]
    UsersAuditLogs --&amp;gt; SignInLogs[&amp;quot;Sign-in Logs&amp;quot;]
    UsersAuditLogs --&amp;gt; DiagnoseAndSolve[&amp;quot;Diagnose and solve problems&amp;quot;]
```
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;P Search «&lt;/th&gt;
&lt;th&gt;✅ Download Refresh&lt;/th&gt;
&lt;th&gt;EE Columns&lt;/th&gt;
&lt;th&gt;Or Got feedback?&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;All users&lt;/td&gt;
&lt;td&gt;This view will be soon replaced with a view that includes infinite scrolling and column reordering. Try out our new audits preview. - &amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-in logs&lt;/td&gt;
&lt;td&gt;Date : Last 1 month&lt;/td&gt;
&lt;td&gt;Show dates as : Local&lt;/td&gt;
&lt;td&gt;Service : All&lt;/td&gt;
&lt;td&gt;Category : UserManagement&lt;/td&gt;
&lt;td&gt;Activity : All ty Add filters&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagnose and solve problems&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Status reason&lt;/td&gt;
&lt;td&gt;Target(s)&lt;/td&gt;
&lt;td&gt;Initiated by (actor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manage&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:24:19 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ...&lt;/td&gt;
&lt;td&gt;Microsoft Substrate Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleted users&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ...&lt;/td&gt;
&lt;td&gt;Microsoft.Azure.SyncFabric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password reset&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Redeem external user invite&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;UPN: user3_fabrika ...&lt;/td&gt;
&lt;td&gt;unknown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User settings&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Redeem external user invite&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk operation results&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ...&lt;/td&gt;
&lt;td&gt;Microsoft B2B Admin Worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:44 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Invite external user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:44 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Add user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ...&lt;/td&gt;
&lt;td&gt;Microsoft B2B Admin Worker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Step 14: Configure leave settings&lt;/h1&gt;
&lt;figure&gt;
    The third figure describes the configuration process for leave settings in a target tenant&apos;s identity management system. The provided steps outline the navigation to the external collaboration settings in the tenant&apos;s identity section to adjust the leave permissions for external users.

&lt;pre&gt;&lt;code&gt;```mermaid
graph TD;
    TargetTenant[&amp;quot;Target tenant&amp;quot;] --&amp;gt; IdentitySection[&amp;quot;Identity &amp;gt; External Identities&amp;quot;]
    IdentitySection --&amp;gt; ExternalCollabSettings[&amp;quot;External collaboration settings&amp;quot;]
```
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h2&gt;Target tenant&lt;/h2&gt;
&lt;p&gt;Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, browse to Identity &amp;gt; External Identities &amp;gt; External collaboration settings.&lt;/li&gt;
&lt;li&gt;Under External user leave settings, choose whether to allow external users to leave your organization themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting also applies to B2B collaboration and B2B direct connect, so if you set External user leave settings to No, B2B collaboration users and B2B direct connect users can&amp;#39;t leave your organization themselves. For more information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;h2&gt;Delete a configuration&lt;/h2&gt;
&lt;p&gt;Follows these steps to delete a configuration on the Configurations page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Configurations page, add a check mark next to the configuration you want to delete.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Delete and then OK to delete the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[Figure: The Configurations page, showing options to create, refresh, and delete configurations. A list of configurations with names and tenant names is displayed, with one configuration selected.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Home --&amp;gt; Default2;
    Default2 --&amp;gt; CrossTenantSync1[&amp;quot;Cross-tenant synchronization&amp;quot;];
    CrossTenantSync1 --&amp;gt; CrossTenantSync2[&amp;quot;Cross-tenant synchronization&amp;quot;];
    CrossTenantSync2 --&amp;gt; Overview;
    CrossTenantSync2 --&amp;gt; Configurations;
    Configurations --&amp;gt; Action1[&amp;quot;+ New configuration&amp;quot;];
    Configurations --&amp;gt; Action2[Refresh];
    Configurations --&amp;gt; Action3[Delete];
    Configurations --&amp;gt; Action4[&amp;quot;Got feedback?&amp;quot;];
    CrossTenantSync2 --&amp;gt; List1[(&amp;quot;Sync identities between Azure AD tenants. Learn more&amp;quot;)];
    Configurations --&amp;gt; Table;
    Table --&amp;gt; Row1[(&amp;quot;Name | Tenant Name&amp;quot;)];
    Table --&amp;gt; Row2[(&amp;quot;Fabrikam3 | Default Directory&amp;quot;)];
    Table --&amp;gt; Row3[(&amp;quot;Fabrikam4 | Default Directory&amp;quot;)];
    Table --&amp;gt; Row4[(&amp;quot;Fabrikam5 | Default Directory&amp;quot;)];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure&lt;/p&gt;
&lt;p&gt;When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:&lt;/p&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;!-- PageHeader=&quot;Error code: AzureDirectoryB2BManagementPolicyCheckFailure Details: Policy permitting auto-redemption of invitations not configured.&quot; --&gt;

&lt;h1&gt;Notifications&lt;/h1&gt;
&lt;p&gt;X
 ✅
More events in the activity log -&amp;gt;&lt;/p&gt;
&lt;p&gt;Dismiss all&lt;/p&gt;
&lt;p&gt;O Testing connection to Fabrikam X
 ✅
You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;p&gt;Error code: AzureDirectoryB2BManagementPolicyCheckFailure Details: Policy permitting auto-redemption of invitations not configured. Request-id:&lt;/p&gt;
&lt;p&gt;This figure displays a sample error message shown in the notification panel indicating a failure in testing the connection to Fabrikam due to invalid credentials and a specific error code related to AzureDirectoryB2BManagementPolicyCheckFailure.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Error message displayed in the notification panel. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Notifications

Testing connection to Fabrikam

Error code: AzureDirectoryB2BManagementPolicyCheckFailure
Details: Policy permitting auto-redemption of invitations not configured.
Request-id:
16 minutes ago
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;

&lt;h1&gt;Cause&lt;/h1&gt;
&lt;p&gt;This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Follow the steps in Step 3: Automatically redeem invitations in the target tenant and Step 4: Automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;p&gt;Symptom - Automatic redemption check box is disabled&lt;/p&gt;
&lt;p&gt;When configuring cross-tenant synchronization, the Automatic redemption check box is disabled.
 ✅ ✅&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt; Outbound access settings - Contoso&lt;/p&gt;
&lt;p&gt;You need Azure AD Premium to configure trust settings and target select users, groups and applications in cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;B2B collaboration&lt;/p&gt;
&lt;p&gt;B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more ❌ Automatically redeem invitations with the tenant aa5eaf5a-ecc3-49f6-aac8-e50a26e228de.&lt;/p&gt;
&lt;p&gt;Save Discard&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;You must have Microsoft Entra ID P1 or P2 to configure trust settings.&lt;/p&gt;
&lt;p&gt;Symptom - Recently deleted user in the target tenant is not restored&lt;/p&gt;
&lt;p&gt;After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Manually restore the soft-deleted user in the target tenant. For more information, see Restore or remove a recently deleted user using Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Symptom - Users are skipped because SMS sign-in is enabled on the user&lt;/p&gt;
&lt;p&gt;Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecuritylds EQUALS &amp;#39;None&amp;#39;&amp;quot;&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h5&gt;Disable SMS Sign-in options for the users&lt;/h5&gt;
&lt;h4&gt;Import module&lt;/h4&gt;
&lt;p&gt;Install-Module Microsoft.Graph.Users.Actions
Install-Module Microsoft.Graph.Identity.SignIns
Import-Module Microsoft.Graph.Users.Actions&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -Scopes &amp;quot;User.Read.All&amp;quot;, &amp;quot;Group.ReadWrite.All&amp;quot;, &amp;quot;UserAuthenticationMethod.Read.All&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h5&gt;The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-87b9720928f7&lt;/h5&gt;
&lt;p&gt;$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;&lt;/p&gt;
&lt;h4&gt;Get the User Details&lt;/h4&gt;
&lt;p&gt;$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;&lt;/p&gt;
&lt;h4&gt;validate the value for SmsSignInState&lt;/h4&gt;
&lt;p&gt;$smssignin = Get-MgUserAuthenticationPhoneMethod -UserId $userId
{
    if($smssignin.SmsSignInState -eq &amp;quot;ready&amp;quot;){
        #### Disable Sms Sign-In for the user is set to ready
        Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId - PhoneAuthenticationMethodId $phoneAuthenticationMethodId
        Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green
    }
    else{
        Write-Host &amp;quot;SMS sign-in status not set or found for the user &amp;quot; -ForegroundColor Yellow
    }
}&lt;/p&gt;
&lt;h5&gt;End the script&lt;/h5&gt;
&lt;h1&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h1&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;p&gt;[Text box with error message]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Cause&lt;/h1&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Solution&lt;/h1&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see Configure external collaboration settings.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial: Reporting on automatic user account provisioning&lt;/li&gt;
&lt;li&gt;Managing user account provisioning for enterprise apps in the Azure portal&lt;/li&gt;
&lt;li&gt;What is single sign-on in Microsoft Entra ID?&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram illustrating the cross-tenant synchronization process.](figures/0) --&gt; --&gt;
&lt;p&gt;The diagram shows the following elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source tenant&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal Users: UserS1, UserS2, UserS3&lt;/li&gt;
&lt;li&gt;Outbound access settings: Automatically redeem invitations&lt;/li&gt;
&lt;li&gt;Configuration: &lt;ul&gt;
&lt;li&gt;Scope: UserS1, UserS3&lt;/li&gt;
&lt;li&gt;Scoping filters: department EQUALS Marketing&lt;/li&gt;
&lt;li&gt;Attribute mappings:&lt;ul&gt;
&lt;li&gt;accountEnabled&lt;/li&gt;
&lt;li&gt;employeeld&lt;/li&gt;
&lt;li&gt;userPrincipalName&lt;/li&gt;
&lt;li&gt;extensionName&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-tenant synchronization&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Target tenant&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal Users: UserT1, UserT2, UserT3, GroupT1&lt;/li&gt;
&lt;li&gt;External Users: UserS1, UserS3&lt;/li&gt;
&lt;li&gt;Inbound access settings:&lt;ul&gt;
&lt;li&gt;Allow users sync into this tenant&lt;/li&gt;
&lt;li&gt;Automatically redeem invitations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[Source tenant] --&amp;gt;|Cross-tenant synchronization| TargetTenant[Target tenant];
    SourceTenant --&amp;gt; InternalUsersS[Internal: UserS1, UserS2, UserS3];
    InternalUsersS --&amp;gt; OutboundAccessS[Outbound access settings: Automatically redeem invitations];
    SourceTenant --&amp;gt; Configuration[Configuration];
    Configuration --&amp;gt; Scope[Scope: UserS1, UserS3];
    Configuration --&amp;gt; ScopingFilters[Scoping filters: department EQUALS Marketing];
    Configuration --&amp;gt; AttributeMappings[Attribute mappings: accountEnabled, employeeld, userPrincipalName, extensionName];
    TargetTenant --&amp;gt; InternalUsersT[Internal: UserT1, UserT2, UserT3, GroupT1];
    TargetTenant --&amp;gt; ExternalUsersT[External: UserS1, UserS3];
    TargetTenant --&amp;gt; InboundAccessT[Inbound access settings: Allow users sync into this tenant, Automatically redeem invitations];
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Icon representing prerequisites for the source tenant.](figures/1) --&gt; --&gt;

&lt;p&gt;Source tenant&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: Image showing target tenant permissions and administrator roles.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    CloudAppAdmin[&amp;quot;Cloud Application Administrator role&amp;quot;] --&amp;gt; AssignUsers[&amp;quot;assign users to a configuration&amp;quot;];
    AppAdmin[&amp;quot;Application Administrator role&amp;quot;] --&amp;gt; AssignUsers;
    GlobalAdmin[&amp;quot;Global Administrator role&amp;quot;] --&amp;gt; RequiredPermissions[&amp;quot;consent to required permissions&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h1&gt;Step 1: Sign in to the target tenant&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Figure 2: Illustration showing PowerShell steps to sign in to the target tenant.&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Step1[&amp;quot;Step 1: Sign in to the target tenant&amp;quot;] --&amp;gt; StartPS[&amp;quot;Start PowerShell&amp;quot;];
    Step1 --&amp;gt; InstallSDK[&amp;quot;Install the Microsoft Graph PowerShell SDK, if necessary&amp;quot;];
    Step1 --&amp;gt; GetTenantID[&amp;quot;Get tenant ID of source and target tenants and initialize variables&amp;quot;];
    GetTenantID --&amp;gt; InitializeVars[&amp;quot;$SourceTenantId = &amp;#39;&amp;lt;SourceTenantId&amp;gt;&amp;#39; \n $TargetTenantId = &amp;#39;&amp;lt;TargetTenantId&amp;gt;&amp;#39;&amp;quot;];
    Step1 --&amp;gt; ConnectMgGraph[&amp;quot;Use the Connect-MgGraph command to sign in to target tenant and consent to required permissions&amp;quot;];
    ConnectMgGraph --&amp;gt; ConsentPermissions[&amp;quot;Policy.Read.All, Policy.ReadWrite.CrossTenantAccess&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the target tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 2: Enable user synchronization in the target tenant&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![An illustration of a cloud with a synchronization arrow pointing towards it, representing user synchronization in the target tenant.](figures/0) --&gt; --&gt;

&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ 
TenantId = $SourceTenantId 
} 
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings: 
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration&lt;/p&gt;
&lt;p&gt;B2BCollaborationInbound: 
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BCollaborationOutbound:
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BDirectConnectInbound:
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting &lt;/p&gt;
&lt;p&gt;B2BDirectConnectOutbound:
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting &lt;/p&gt;
&lt;p&gt;IdentitySynchronization:
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity&lt;/p&gt;
&lt;p&gt;SyncPolicyPartner
InboundTrust :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
IsServiceProvider :
TenantId : &lt;SourceTenantId&gt;
TenantRestrictions :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity%5D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity]&lt;/a&gt;,
[crossCloudMeetingConfiguration,
System.Collections.Generic.Dictionary&lt;code&gt;2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary&lt;/code&gt;2[System.String,System.Object]]}&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Invoke-MgGraphRequest command to enable user synchronization in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get an Request_MultipleObjectsWithSameKeyValue error, you might already have an existing policy. For more information, see Symptom - Request_MultipleObjectsWithSameKeyValue error.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to verify IsSyncAllowed is set to True.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;!-- PageHeader=&quot;IsSyncAllowed&quot; --&gt;

&lt;h2&gt;IsSyncAllowed&lt;/h2&gt;
&lt;p&gt;True&lt;/p&gt;
&lt;h1&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram of the target tenant setup process](figures/0) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    TargetTenant[&amp;quot;Target Tenant&amp;quot;] --&amp;gt; SetupProcess[&amp;quot;Setup Process&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the target tenant, use the Update-MgPolicyCrossTenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for inbound access.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$AutomaticUserConsentSettings = @{ &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;&lt;/p&gt;
&lt;p&gt;} Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings&lt;/p&gt;
&lt;h2&gt;Step 4: Sign in to the source tenant&lt;/h2&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Diagram of signing in to the source tenant](figures/1) --&gt; --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source Tenant&amp;quot;] --&amp;gt; SignInProcess[&amp;quot;Sign-in Process&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Start an instance of PowerShell.&lt;/p&gt;
&lt;p&gt;2. Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;p&gt;$SourceTenantId = &amp;quot;&lt;SourceTenantId&gt;&amp;quot; 
$TargetTenantId = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Connect-MgGraph command to sign in to the source tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;li&gt;AuditLog.Read.All&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;,&amp;quot;Application.ReadWrite.All&amp;quot;,&amp;quot;Directory.ReadWrite.All&amp;quot;,&amp;quot;AuditLog.Read.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A purple icon is next to the title &amp;quot;Source tenant&amp;quot;.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;$Params = @{
    TenantId = $TargetTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPoli cyConfiguration&lt;/p&gt;
&lt;p&gt;B2BCollaborationInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BCollaborationOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BDirectConnectInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BDirectConnectOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;IdentitySynchronization :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity SyncPolicyPartner&lt;/p&gt;
&lt;p&gt;InboundTrust :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyInboundTrust&lt;/p&gt;
&lt;p&gt;IsServiceProvider :
TenantId : &lt;TargetTenantId&gt;&lt;/p&gt;
&lt;p&gt;TenantRestrictions :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPo licyTenantRestrictions&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&lt;/a&gt; ssPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary&lt;code&gt;2[System.String, System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary&lt;/code&gt;2[System.String, System.Object]]}&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Update-MgPolicyCrossTenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for outbound access.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;$AutomaticUserConsentSettings = @{ &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot; } 
Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings&lt;/p&gt;
&lt;h1&gt;Step 6: Create a configuration application in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, use the Invoke-MgInstantiateApplicationTemplate command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgServicePrincipal command to get the service principal ID and app role ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;-&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;-&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;AccountEnabled&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;: True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;AddIns&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;: {}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;AlternativeNames&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;: {}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;AppDescription&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;AppDisplayName&lt;/td&gt;
&lt;td align=&quot;left&quot;&gt;: Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AppId&lt;/p&gt;
&lt;p&gt;: &lt;AppId&gt;&lt;/p&gt;
&lt;p&gt;AppManagementPolicies&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AppOwnerOrganizationId&lt;/p&gt;
&lt;p&gt;: &lt;AppOwnerOrganizationId&gt;&lt;/p&gt;
&lt;p&gt;AppRoleAssignedTo&lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;AppRoleAssignmentRequired&lt;/p&gt;
&lt;p&gt;: True&lt;/p&gt;
&lt;p&gt;AppRoleAssignments&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AppRoles&lt;/p&gt;
&lt;p&gt;: {&lt;AppRoleId&gt; }&lt;/p&gt;
&lt;p&gt;ApplicationTemplateId&lt;/p&gt;
&lt;p&gt;: 518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&lt;/p&gt;
&lt;p&gt;ClaimsMappingPolicies&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;CreatedObjects&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;CustomSecurityAttributes&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttributeValue&lt;/p&gt;
&lt;p&gt;DelegatedPermissionClassifications&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisabledByMicrosoftStatus&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Fabrikam&lt;/p&gt;
&lt;p&gt;Endpoints&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;ErrorUrl&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;FederatedIdentityCredentials&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;HomeRealmDiscoveryPolicies&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Homepage&lt;/p&gt;
&lt;p&gt;: &lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync&lt;/a&gt; | ISV9.1|primary|z&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &lt;ServicePrincipalId&gt;&lt;/p&gt;
&lt;p&gt;Info&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl&lt;/p&gt;
&lt;p&gt;KeyCredentials&lt;/p&gt;
&lt;p&gt;: {}&lt;/p&gt;
&lt;p&gt;LicenseDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Initialize a variable for the service principal ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Be sure to use the service principal ID instead of the application ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$ServicePrincipalId = &amp;quot;&amp;lt;ServicePrincipalId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Initialize a variable for the app role ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$AppRoleId= &amp;quot;&amp;lt;AppRoleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 7: Test the connection to the target tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphRequest command to test the connection to the target tenant and validate the credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Screenshot of a PowerShell script validating credentials using the Invoke-MgGraphRequest command. Below is the depicted script:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$Params = @{
    &amp;quot;useSavedCredentials&amp;quot;= $false
    &amp;quot;templateId&amp;quot; = &amp;quot;Azure2Azure&amp;quot;
    &amp;quot;credentials&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        }
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
    )
}
Invoke-MgGraphRequest -Method POST -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Step 8: Create a provisioning job in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;In the source tenant, to enable provisioning, create a provisioning job.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine the synchronization template to use, such as Azure2Azure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Screenshot of a PowerShell script instruction guiding the user to determine the synchronization template, such as Azure2Azure. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[&amp;quot;Source Tenant&amp;quot;] --&amp;gt; Step7[&amp;quot;Test the connection to the target tenant using Invoke-MgGraphRequest&amp;quot;]
    Step7 --&amp;gt; $Params[&amp;quot;Parameters for Invoke-MgGraphRequest&amp;quot;]
    $Params --&amp;gt; useSavedCredentials[&amp;quot;useSavedCredentials = $false&amp;quot;]
    $Params --&amp;gt; templateId[&amp;quot;templateId = Azure2Azure&amp;quot;]
    $Params --&amp;gt; credentials[&amp;quot;credentials&amp;quot;]
    credentials --&amp;gt; key1[&amp;quot;key = CompanyId&amp;quot;]
    key1 --&amp;gt; value1[&amp;quot;value = $TargetTenantId&amp;quot;]
    credentials --&amp;gt; key2[&amp;quot;key = AuthenticationType&amp;quot;]
    key2 --&amp;gt; value2[&amp;quot;value = SyncPolicy&amp;quot;]
    
    SourceTenant --&amp;gt; Step8[&amp;quot;Create a provisioning job in the source tenant&amp;quot;]
    Step8 --&amp;gt; syncTemplate[&amp;quot;Determine the synchronization template to use, such as Azure2Azure&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A template has pre-configured synchronization settings.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the source tenant, use the New-MgServicePrincipalSynchronizationJob command to create a provisioning job based on a template.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;Id : &amp;lt; JobId&amp;gt; Schedule :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationSche dule&lt;/p&gt;
&lt;p&gt;Schema&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSche ma&lt;/p&gt;
&lt;p&gt;Status .. Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationStat us SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv icePrincipalId&gt;&amp;#39;)/synchro&lt;/p&gt;
&lt;p&gt;nization/jobs/$entity]}&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Initialize a variable for the job ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$JobId = &amp;quot;&lt;JobId&gt;&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 9: Save your credentials&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![Graphical illustration showing a labeled figure](figures/0) --&gt; --&gt;

&lt;p&gt;The figure shows a graphical illustration depicted under the Step 9 header with the title &amp;quot;Save your credentials&amp;quot;. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;Step 9: Save your credentials&amp;quot;] --&amp;gt; B[&amp;quot;Graphical illustration showing a labeled figure&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the Invoke-MgGraphRequest command to save your credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Description: A PowerShell snippet illustrating how to invoke the MgGraphRequest command with parameters to save credentials in the source tenant.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{&lt;br&gt;&amp;quot;value&amp;quot; = @(&lt;br&gt;@{&lt;br&gt;&amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;&lt;br&gt;&amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;&lt;br&gt;}&lt;br&gt;@{&lt;br&gt;&amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;&lt;br&gt;&amp;quot;value&amp;quot; = $TargetTenantId&lt;br&gt;}&lt;br&gt;)&lt;br&gt;}&lt;br&gt;Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets&quot;&gt;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets&lt;/a&gt;&amp;quot; -Body $Params&lt;/p&gt;
&lt;h1&gt;Step 10: Assign a user to the configuration&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Description: An illustrative diagram or image representing the assignment of a user to the configuration.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgServicePrincipalAppRoleAssignedTo command to assign an internal user to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{&lt;br&gt;PrincipalId = &amp;quot;&lt;PrincipalId&gt;&amp;quot;&lt;br&gt;ResourceId = $ServicePrincipalId&lt;br&gt;AppRoleId = $AppRoleId&lt;br&gt;}&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    SourceTenant[Source Tenant] --&amp;gt; AssignUser[Assign User to Configuration]
    AssignUser --&amp;gt; InternalUser[Internal User]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;AppRoleId&lt;/p&gt;
&lt;p&gt;: &amp;lt; AppRoleId&amp;gt;&lt;/p&gt;
&lt;p&gt;CreatedDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 10:27:12 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; Id&amp;gt;&lt;/p&gt;
&lt;p&gt;PrincipalDisplayName : User1&lt;/p&gt;
&lt;p&gt;PrincipalId&lt;/p&gt;
&lt;p&gt;: &amp;lt; PrincipalId&amp;gt;&lt;/p&gt;
&lt;p&gt;PrincipalType&lt;/p&gt;
&lt;p&gt;: User&lt;/p&gt;
&lt;p&gt;ResourceDisplayName&lt;/p&gt;
&lt;p&gt;: Fabrikam&lt;/p&gt;
&lt;p&gt;ResourceId&lt;/p&gt;
&lt;p&gt;: &amp;lt; ServicePrincipalId&amp;gt;&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ty]}&lt;/p&gt;
&lt;h1&gt;Step 11: Test provision on demand&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the Get- MgServicePrincipalSynchronizationJobSchema command to get the schema rule ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$SynchronizationSchema = Get- MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId $SynchronizationSchema. SynchronizationRules | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;ContainerFilter&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models.MicrosoftGraphContainerFilter&lt;/p&gt;
&lt;p&gt;Editable&lt;/p&gt;
&lt;p&gt;: True&lt;/p&gt;
&lt;p&gt;GroupFilter&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroupFilter&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; RuleId&amp;gt;&lt;/p&gt;
&lt;p&gt;Metadata&lt;/p&gt;
&lt;p&gt;: {defaultSourceObjectMappings,&lt;/p&gt;
&lt;p&gt;supportsProvisionOnDemand }&lt;/p&gt;
&lt;p&gt;Name&lt;/p&gt;
&lt;p&gt;: USER_INBOUND_USER&lt;/p&gt;
&lt;p&gt;ObjectMappings&lt;/p&gt;
&lt;p&gt;: {Provision Azure Active Directory Users, , ,&lt;/p&gt;
&lt;p&gt;.. }&lt;/p&gt;
&lt;p&gt;Priority&lt;/p&gt;
&lt;p&gt;: 1&lt;/p&gt;
&lt;p&gt;SourceDirectoryName&lt;/p&gt;
&lt;p&gt;: Azure Active Directory&lt;/p&gt;
&lt;p&gt;TargetDirectoryName&lt;/p&gt;
&lt;p&gt;: Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;2. Initialize a variable for the rule ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$RuleId = &amp;quot;&lt;RuleId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;3. Use the New-MgServicePrincipalSynchronizationJobOnDemand command to provision a test user on demand.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ Parameters = @( @{ Subjects = @( @{ ObjectId = &amp;quot;&lt;UserObjectId&gt;&amp;quot; ObjectTypeName = &amp;quot;User&amp;quot; }&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;RuleId = $RuleId&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;-&lt;/p&gt;
&lt;p&gt;} New-MgServicePrincipalSynchronizationJobOnDemand - ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;Key : Microsoft. Identity. Health . CPP. Common. DataContracts. SyncFabric. Statu sInfo&lt;/p&gt;
&lt;p&gt;Value : [{&amp;quot;provisioningSteps&amp;quot;: [{ &amp;quot;name&amp;quot; : &amp;quot;EntryImport&amp;quot;, &amp;quot;type&amp;quot; : &amp;quot;Import&amp;quot;, &amp;quot;status&amp;quot; : &amp;quot;Success&amp;quot;, &amp;quot;descript ion&amp;quot;: &amp;quot;Retrieved User&lt;/p&gt;
&lt;p&gt;&amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; from Azure Active Directory&amp;quot;, &amp;quot;timestamp&amp;quot; : &amp;quot;2023-07-31T22 : 31:15.9116590Z&amp;quot;, &amp;quot;details&amp;quot; : {&amp;quot;objectId&amp;quot;: = &lt;UserObjectId&gt;&amp;quot;, &amp;quot;accountEnabled&amp;quot;: &amp;quot;True&amp;quot;, &amp;quot;displayName&amp;quot; : &amp;quot;User1&amp;quot;, &amp;quot;mail Nickname&amp;quot; : &amp;quot;user1&amp;quot;, &amp;quot;userPrincipalName&amp;quot; : &amp;quot;use AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&lt;/a&gt; yStringValuePair]}&lt;/p&gt;
&lt;h1&gt;Step 12: Start the provisioning job&lt;/h1&gt;
&lt;p&gt;This figure shows a command prompt executing a PowerShell command to start the synchronization job.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    PowerShell_Command[&amp;quot;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is configured, in the source tenant, use the Start-MgServicePrincipalSynchronizationJob command to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId&lt;/p&gt;
&lt;h1&gt;Step 13: Monitor provisioning&lt;/h1&gt;
&lt;p&gt;This figure shows a command prompt executing a PowerShell command to monitor the progress of the synchronization job.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    PowerShell_Command_2[&amp;quot;Get-MgServicePrincipalSynchronizationJob&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is running, in the source tenant, use the Get-MgServicePrincipalSynchronizationJob command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PowerShell --&gt;

&lt;p&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List&lt;/p&gt;
&lt;h1&gt;Output&lt;/h1&gt;
&lt;p&gt;Id : &amp;lt; JobId&amp;gt; 
Schedule : Microsoft. Graph. PowerShell. Models.MicrosoftGraphSynchronizationSchedule 
Schema : Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationSchema 
Status : Microsoft. Graph. PowerShell.Models.MicrosoftGraphSynchronizationStatus 
SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} 
TemplateId : Azure2Azure 
AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;ServicePrincipalId&gt;&amp;#39;)/synchronization/jobs/$entity]}&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In addition to monitoring the status of the provisioning job, use the Get-MgAuditLogProvisioning command to retrieve the provisioning logs and get all the provisioning events that occur. For example, query for a particular user and determine if they were successfully provisioned.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgAuditLogDirectoryAudit | Select -First 10| Format-List&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ActivityDateTime&lt;/td&gt;
&lt;td&gt;: 7/31/2023 12:08:17 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ActivityDisplayName&lt;/td&gt;
&lt;td&gt;: Export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalDetails&lt;/td&gt;
&lt;td&gt;: {Details, ErrorCode, EventName, ipaddr. . . }&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;: ProvisioningManagement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CorrelationId&lt;/td&gt;
&lt;td&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8f9dc271c5ec_L5BFV_161778479&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InitiatedBy&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft. Graph. PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoggedByService&lt;/td&gt;
&lt;td&gt;: Account Provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OperationType&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result&lt;/td&gt;
&lt;td&gt;: success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ResultReason : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources : {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;ActivityDateTime : 7/31/2023 12:08:17 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName : Export&lt;/p&gt;
&lt;p&gt;AdditionalDetails : {Details, ErrorCode, EventName, ipaddr ... }&lt;/p&gt;
&lt;p&gt;Category : ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778264&lt;/p&gt;
&lt;p&gt;InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/p&gt;
&lt;p&gt;LoggedByService : Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType :&lt;/p&gt;
&lt;p&gt;Result : success&lt;/p&gt;
&lt;p&gt;ResultReason : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources : {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;ActivityDateTime : 7/31/2023 12:08:14 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName : Synchronization rule action&lt;/p&gt;
&lt;p&gt;AdditionalDetails : {Details, ErrorCode, EventName, ipaddr ... }&lt;/p&gt;
&lt;p&gt;Category : ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778395&lt;/p&gt;
&lt;p&gt;InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/p&gt;
&lt;p&gt;LoggedByService : Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType :&lt;/p&gt;
&lt;p&gt;Result : success&lt;/p&gt;
&lt;p&gt;ResultReason : User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant))&lt;/p&gt;
&lt;p&gt;TargetResources : {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h1&gt;Symptom - Insufficient privileges error&lt;/h1&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/p&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartner command to list the existing object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing object, you might need to make an update using Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Symptom - Request_MultipleObjectsWithSameKeyValue Error&lt;/h1&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Figure: Error message received when enabling user synchronization]

Invoke-MgGraphRequest: PUT
https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&amp;lt;SourceTenantId&amp;gt;/identitySynchronization HTTP/1.1 409 Conflict
...
{&amp;quot;error&amp;quot;: { &amp;quot;code&amp;quot;: &amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;, &amp;quot;details&amp;quot;:
[{&amp;quot;code&amp;quot;: &amp;quot;ConflictingObjects&amp;quot;, &amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to list the IsSyncAllowed setting.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Figure: PowerShell command to list IsSyncAllowed setting]

PowerShell

(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    PowerShell[&amp;quot;PowerShell Command: Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId&amp;quot;] --&amp;gt; IsSyncAllowed[&amp;quot;IsSyncAllowed Setting&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing policy, you might need to make an update using Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to enable user synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra synchronization API overview&lt;/li&gt;
&lt;li&gt;Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h1&gt;
&lt;p&gt;Article · 01/18/2024&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h1&gt;Scoping filter use cases&lt;/h1&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Outbound provisioning from Microsoft Entra ID to SaaS applications.&lt;/strong&gt; When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;  The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory.&lt;/strong&gt; When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, Microsoft Entra provisioning connectors don&amp;#39;t have any attribute-based scoping filters configured.&lt;/p&gt;
&lt;h1&gt;Scoping filter construction&lt;/h1&gt;
&lt;p&gt;A scoping filter consists of one or more clauses. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;p&gt;As an example, consider the following scoping filter:&lt;/p&gt;
&lt;p&gt;Source Object Query: Define which users are in scope for provisioning. Only objects that meet the criteria below will be synchronized.
Add scoping filter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SCOPING FILTER GROUP: New York Engineering (Delete)&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET ATTRIBUTE&lt;/th&gt;
&lt;th&gt;OPERATOR&lt;/th&gt;
&lt;th&gt;VALUE&lt;/th&gt;
&lt;th&gt;ACTION&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;New York&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;Engineering&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeID (extension ...)&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9][0-9][0 ...&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jobTitle&lt;/td&gt;
&lt;td&gt;IS NOT NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If multiple scoping filters are present, they are evaluated using &amp;quot;OR&amp;quot; logic.
Add new scoping clause:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scoping Filter Title: New York Engineering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If multiple scoping clauses are present, they are evaluated using &amp;quot;AND&amp;quot; logic.&lt;/p&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They must be in New York.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source_object_query[&amp;quot;Source Object Query&amp;quot;] --&amp;gt; scoping_filter[&amp;quot;Add Scoping Filter&amp;quot;]
    scoping_filter --&amp;gt; city_equals[&amp;quot;TARGET ATTRIBUTE: city EQUALS New York&amp;quot;]
    scoping_filter --&amp;gt; department_equals[&amp;quot;TARGET ATTRIBUTE: department EQUALS Engineering&amp;quot;]
    scoping_filter --&amp;gt; employeeID_regex[&amp;quot;TARGET ATTRIBUTE: employeeID REGEX MATCH (1[0-9][0-9][0-9][0 ...&amp;quot;]
    scoping_filter --&amp;gt; jobTitle_not_null[&amp;quot;TARGET ATTRIBUTE: jobTitle IS NOT NULL&amp;quot;]
    multiple_filters[&amp;quot;If multiple scoping filters are present, they are evaluated using &amp;#39;OR&amp;#39; logic.&amp;quot;] --&amp;gt; scoping_filter
    multiple_clauses[&amp;quot;If multiple scoping clauses are present, they are evaluated using &amp;#39;AND&amp;#39; logic.&amp;quot;] --&amp;gt; scoping_filter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;· They must work in the Engineering department.
· Their company employee ID must be between 1,000,000 and 2,000,000.
· Their job title must not be null or empty.&lt;/p&gt;
&lt;h1&gt;Create scoping filters&lt;/h1&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for one of the supported applications and are adding a scoping filter to it.&lt;/p&gt;
&lt;h2&gt;Create a scoping filter&lt;/h2&gt;
&lt;p&gt;![Tip icon] Tip
Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; All applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Provisioning tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Mappings section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Source object scope menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Add scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define a clause by selecting a source Attribute Name, an Operator, and an Attribute Value to match against. The following operators are supported:&lt;/p&gt;
&lt;p&gt; a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/p&gt;
&lt;p&gt; b. !&amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;c. ENDS_WITH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;p&gt;d. EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;p&gt;e. Greater_Than. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;f. Greater_Than_OR_EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;g. Includes. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described here.&lt;/p&gt;
&lt;p&gt;h. IS FALSE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;p&gt;i. IS NOT NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;p&gt;j. IS NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;p&gt;k. IS TRUE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;p&gt;l. NOT EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;p&gt;m. NOT REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;p&gt;n. REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: ([1-9][0-9]) matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure Description:&lt;/strong&gt; An information box highlights several important notes: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IsMemberOf filter is not supported currently.&lt;/li&gt;
&lt;li&gt;The members attribute on a group is not supported currently.&lt;/li&gt;
&lt;li&gt;Filtering is not supported for multi-valued attributes.&lt;/li&gt;
&lt;li&gt;Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;rect InfoBox
    NoteA[&amp;quot;The IsMemberOf filter is not supported currently.&amp;quot;]
    NoteB[&amp;quot;The members attribute on a group is not supported currently.&amp;quot;]
    NoteC[&amp;quot;Filtering is not supported for multi-valued attributes.&amp;quot;]
    NoteD[&amp;quot;Scoping filters will return &amp;#39;false&amp;#39; if the value is null / empty.&amp;quot;]
end
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;&lt;p&gt;Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Scoping Filter Title, add a name for your scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select OK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select OK again on the Scoping Filters screen. Optionally, repeat steps 6-11 to add another scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save on the Attribute Mapping screen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Important&lt;/h1&gt;
&lt;p&gt;Saving a new scoping filter triggers a new full sync for the application, where all users in the source system are evaluated again against the new scoping filter. If a user in the application was previously in scope for provisioning, but falls out of scope, their account is disabled or deprovisioned in the application. To override this default behavior, refer to Skip deletion for user accounts that go out of scope.&lt;/p&gt;
&lt;h1&gt;Common scoping filters&lt;/h1&gt;
&lt;p&gt;( Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that have the domain @domain.com are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that has the domain @domain.com are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9][0-9][0-9][0-9])&lt;/td&gt;
&lt;td&gt;All employees with workerID between 1000000 and 2000000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Related articles&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Automate user provisioning and deprovisioning to SaaS applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Customize attribute mappings for user provisioning&lt;/p&gt;
&lt;p&gt;· Write expressions for attribute mappings&lt;/p&gt;
&lt;p&gt;· Account provisioning notifications&lt;/p&gt;
&lt;p&gt;· Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/p&gt;
&lt;p&gt;· List of tutorials on how to integrate SaaS apps&lt;/p&gt;
&lt;h1&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h1&gt;Configure accidental deletion prevention&lt;/h1&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning and then on the provisioning page select Edit provisioning.&lt;/li&gt;
&lt;li&gt;Under Settings, select the Prevent accidental deletions check box and specify a deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the Notification Email address is completed. If the deletion threshold is met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select Save to save the changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. &lt;/p&gt;
&lt;p&gt;To learn more about quarantine behavior, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;h1&gt;Recovering from an accidental deletion&lt;/h1&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says Provisioning has been quarantined. See quarantine details for more information.&lt;/p&gt;
&lt;p&gt;You can click either Allow deletes or View provisioning logs.&lt;/p&gt;
&lt;h1&gt;Allowing deletions&lt;/h1&gt;
&lt;p&gt;The Allow deletes action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;p&gt;1. Select Allow deletes.&lt;/p&gt;
&lt;p&gt;2. Click Yes on the confirmation to allow the deletions.&lt;/p&gt;
&lt;p&gt;3. View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/p&gt;
&lt;h1&gt;Rejecting deletions&lt;/h1&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/li&gt;
&lt;li&gt;Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/li&gt;
&lt;li&gt;Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test deletion prevention&lt;/h2&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h1&gt;Common deprovisioning scenarios to test&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Delete a user / put them into the recycle bin.&lt;/li&gt;
&lt;li&gt;Block sign in for a user.&lt;/li&gt;
&lt;li&gt;Unassign a user or group from the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· Remove a user from a group that&amp;#39;s provides them access to the application (or configuration).&lt;/p&gt;
&lt;p&gt;To learn more about deprovisioning scenarios, see How Application Provisioning Works.&lt;/p&gt;
&lt;h1&gt;Frequently Asked Questions&lt;/h1&gt;
&lt;h2&gt;What scenarios count toward the deletion threshold?&lt;/h2&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h2&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the &amp;quot;circuit breaker&amp;quot; isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h1&gt;How are these deletion events logged?&lt;/h1&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven’t due to the deletion threshold. Navigation to Provisioning logs and then filter Action with StagedAction or StagedDelete.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· How application provisioning works&lt;/p&gt;
&lt;p&gt;· Plan an application provisioning deployment&lt;/p&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;3 Yes&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;p&gt;Provide product feedback   |  Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;h1&gt;On-demand provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshoot configuration issues quickly.&lt;/li&gt;
&lt;li&gt;Validate expressions that you&amp;#39;ve defined.&lt;/li&gt;
&lt;li&gt;Test scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;How to use on-demand provisioning&lt;/h1&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Tip: Steps in this article may vary slightly based on the portal you start from.](tip-illustration) --&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning.&lt;/li&gt;
&lt;li&gt;Configure provisioning by providing your admin credentials.&lt;/li&gt;
&lt;li&gt;Select Provision on demand.&lt;/li&gt;
&lt;li&gt;Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Note: For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &quot;WorkerID&quot; or &quot;WID&quot; of the user in Workday. For SuccessFactors scenario, please provide &quot;personIdExternal&quot; of the user in SuccessFactors.](note-illustration) --&gt;

&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select Provision at the bottom of the page.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;

&lt;p&gt;Description: The image shows a screenshot of the Microsoft Azure portal, specifically the &amp;quot;Provision on demand&amp;quot; section. It shows options for provisioning users or groups on-demand. Two users, Alex Wilber and Nestor Wilke, are selected for provisioning. There are also options to search resources, services, and documentation.&lt;/p&gt;
&lt;/figure&gt;

&lt;h1&gt;Understand the provisioning steps&lt;/h1&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h2&gt;Step 1: Test connection&lt;/h2&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service is authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the tutorial list.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the matching attributes defined in the Attribute mappings pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/li&gt;
&lt;li&gt;For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to authorization requests in the way that the Microsoft Entra provisioning service expects. Have a look at an example request.&lt;/p&gt;
&lt;h1&gt;Step 2: Import user&lt;/h1&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;p&gt;· Evaluate whether the user is in scope for provisioning.&lt;/p&gt;
&lt;p&gt;· Check the target system for an existing user.&lt;/p&gt;
&lt;p&gt;· Determine what user attributes to export to the target system.&lt;/p&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;p&gt;· Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;/p&gt;
&lt;p&gt;  o Update the user object with a value for the matching attribute.&lt;/p&gt;
&lt;p&gt;  o Change the matching attribute in your provisioning configuration.&lt;/p&gt;
&lt;p&gt;· If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/p&gt;
&lt;p&gt;· Make sure that the Attribute mapping page of your provisioning configuration contains the attribute that you expect.&lt;/p&gt;
&lt;h2&gt;Step 3: Determine if user is in scope&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;p&gt;· Whether the user is assigned to the application.&lt;/p&gt;
&lt;p&gt;· Whether scope is set to Sync assigned or Sync all.&lt;/p&gt;
&lt;p&gt;· The scoping filters defined in your provisioning configuration.&lt;/p&gt;
&lt;!-- Description of potential diagram: A decision flow illustrating the steps of determining user scope for provisioning, including assignment checks, scope settings, and scoping filters. --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    UserAssignedToApp[&amp;quot;User assigned to the application?&amp;quot;] --&amp;gt; ScopeSetting[&amp;quot;Scope set to &amp;#39;Sync assigned&amp;#39; or &amp;#39;Sync all&amp;#39;?&amp;quot;]
    ScopeSetting --&amp;gt; ScopingFilters[&amp;quot;Scoping filters defined in provisioning configuration&amp;quot;]
    ScopingFilters --&amp;gt; UserInScope[&amp;quot;Determine if user is in scope for provisioning&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;p&gt;The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Active in source system indicates that the user has the property IsActive set to true in Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assigned to application indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scope sync all indicates that the scope setting allows all users and groups in the tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User has required role indicates that the user has the necessary roles to be provisioned into the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scoping filters are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figure description: A list of possible scoping conditions for users in Microsoft Entra ID, indicating their statuses like activeness, application assignment, scope setting, role requirement, and scoping filters.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figure description: Tips for troubleshooting issues related to scoping roles and required user roles.&lt;/p&gt;
&lt;h1&gt;Step 4: Match user between source and target&lt;/h1&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If no users are matched in the target system, no properties are shown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If one user matches in the target system, the properties of that user are shown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If multiple users match, the properties of both users are shown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Figure description: An explanation of how the View details page displays user properties depending on the number of matches in the target system.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    NoMatch[&amp;quot;If no users are matched in the target system, no properties are shown.&amp;quot;]
    OneMatch[&amp;quot;If one user matches in the target system, the properties of that user are shown.&amp;quot;]
    MultipleMatch[&amp;quot;If multiple users match, the properties of both users are shown.&amp;quot;]
    MultipleAttributes[&amp;quot;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&amp;quot;]
    ViewDetails[&amp;quot;View details page&amp;quot;]
    ViewDetails --&amp;gt; NoMatch
    ViewDetails --&amp;gt; OneMatch
    ViewDetails --&amp;gt; MultipleMatch
    ViewDetails --&amp;gt; MultipleAttributes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;· The provisioning service might not be able to match a user in the source system uniquely with a user in the target. Resolve this problem by ensuring that the matching attribute is unique.&lt;/p&gt;
&lt;p&gt;· Make sure that the target system supports filtering on the attribute that&amp;#39;s defined as the matching attribute.&lt;/p&gt;
&lt;h1&gt;Step 5: Perform action&lt;/h1&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:&lt;/p&gt;
&lt;p&gt;The illustration shows a Microsoft Azure portal screen displaying the &amp;quot;Perform action&amp;quot; page. The page shows group details and user operations with updated membership statuses for two users, Alex Wilber and Nestor Wilke, who have been successfully added as members.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Perform action] --&amp;gt; B[&amp;quot;Group Members&amp;quot;]
    B --&amp;gt; C[Alex Wilber]
    C --&amp;gt; D[&amp;quot;Add member: Success&amp;quot;]
    B --&amp;gt; E[Nestor Wilke]
    E --&amp;gt; F[&amp;quot;Add member: Success&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;View details&lt;/h1&gt;
&lt;p&gt;The View details section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;p&gt;· Failures for exporting changes can vary greatly. Check the documentation for provisioning logs for common failures.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few&lt;/p&gt;
&lt;p&gt;minutes between when an object is assigned to an application and when that assignment is honored in on-demand provisioning. You may need to wait a few minutes and try again.&lt;/p&gt;
&lt;h1&gt;Frequently asked questions&lt;/h1&gt;
&lt;p&gt;. Do you need to turn provisioning off to use on-demand provisioning? For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on-demand provisioning for all applications without having to stop provisioning jobs.&lt;/p&gt;
&lt;p&gt;. How long does on-demand provisioning take? On-demand provisioning typically takes less than 30 seconds.&lt;/p&gt;
&lt;h1&gt;Known limitations&lt;/h1&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your suggestions and feedback 2 so we can better determine what improvements to make next.&lt;/p&gt;
&lt;h1&gt;Note&lt;/h1&gt;
&lt;p&gt;The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/p&gt;
&lt;p&gt;· Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning of roles isn&amp;#39;t supported.
❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ❌ ❌ ✅&lt;/p&gt;
&lt;p&gt;· On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/p&gt;
&lt;p&gt;· The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· Troubleshooting provisioning&lt;/p&gt;
&lt;h1&gt;Feedback&lt;/h1&gt;
&lt;p&gt;Was this page helpful? Yes 5 No&lt;/p&gt;
&lt;p&gt;Provide product feedback 4 | Get help at Microsoft Q&amp;amp;A
❌ ❌ ✅ ❌ ❌&lt;/p&gt;
&lt;h1&gt;What are the Microsoft Entra user provisioning logs?&lt;/h1&gt;
&lt;p&gt;Article · 01/25/2024&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign-ins - Information about sign-ins and how your resources are used by your users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Audit - Information about changes applied to your tenant such as users and group management or updates applied to your tenant&amp;#39;s resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h1&gt;License and role requirements&lt;/h1&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the Zero Trust guidance.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with &lt;code&gt;AuditLogsRead&lt;/code&gt; or &lt;code&gt;CustomSecAuditLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with &lt;code&gt;SignInLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Application Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cloud App Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ProvisioningLogsRead permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage and insights&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Reports Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection*&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with IdentityRiskEventReadWrite permission&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph activity logs&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ListKeys permission&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the license requirements for Identity Protection.&lt;/p&gt;
&lt;h1&gt;What can you do with the provisioning logs?&lt;/h1&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;p&gt;· What groups were successfully created in ServiceNow?&lt;/p&gt;
&lt;p&gt;· What users were successfully removed from Adobe?&lt;/p&gt;
&lt;p&gt;· What users from Workday were successfully created in Active Directory?&lt;/p&gt;
&lt;p&gt;![Icon Note]&lt;/p&gt;
&lt;p&gt;Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;h1&gt;What do the logs show?&lt;/h1&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;p&gt;· Steps: This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/p&gt;
&lt;p&gt;o Import the object.
 ❌
o Match the object between source and target.
 ❌
o Determine if the object is in scope.
 ❌
o Evaluate the object before synchronization.
 ❌
o Provision the object (create, update, delete, or disable).
 ❌&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1&lt;/strong&gt;: Steps for importing, matching, determining the scope, evaluating, and provisioning an object. This figure includes the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Import User from Azure Active Directory &lt;/li&gt;
&lt;li&gt;Determine if User is in scope &lt;/li&gt;
&lt;li&gt;Match User between Azure Active Directory and Box&lt;/li&gt;
&lt;li&gt;Provision User in Box&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Step1[&amp;quot;Import User from Azure Active Directory&amp;quot;] --&amp;gt; Step2[&amp;quot;Determine if User is in scope&amp;quot;]
    Step2 --&amp;gt; Step3[&amp;quot;Match User between Azure Active Directory and Box&amp;quot;]
    Step3 --&amp;gt; Step4[&amp;quot;Provision User in Box&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EntryExportAdd Result: Success Description: User &amp;quot;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;quot; was created in Box ReportableIdentifier: &amp;quot;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Troubleshooting &amp;amp; Recommendations: If there was an error, this tab provides the error code and reason.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modified Properties: If there were changes, this tab shows the old value and the new value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Summary: Provides an overview of what happened and identifiers for the object in the source and target systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Map directory extensions in cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. Custom security attributes are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h1&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;h1&gt;Create directory extensions&lt;/h1&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see Syncing extension attributes for Microsoft Entra Application Provisioning.&lt;/p&gt;
&lt;h1&gt;Map directory extensions&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;An illustration depicting the steps involved in mapping directory extensions in the source tenant.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Microsoft_Entra_Admin_Center[&amp;quot;Microsoft Entra admin center&amp;quot;] --&amp;gt; Identity
    Identity --&amp;gt; External_Identities[&amp;quot;External Identities&amp;quot;]
    External_Identities --&amp;gt; Cross_tenant_Synchronization[&amp;quot;Cross-tenant synchronization&amp;quot;]
    Cross_tenant_Synchronization --&amp;gt; Configurations
    Configurations --&amp;gt; Provisioning
    Provisioning --&amp;gt; Mappings
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;h1&gt;Fabrikam to Contoso | Provisioning&lt;/h1&gt;
&lt;p&gt;X
 ✅
Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Save ✅ Discard&lt;/p&gt;
&lt;p&gt;1 Overview&lt;/p&gt;
&lt;p&gt;V Admin Credentials&lt;/p&gt;
&lt;p&gt;Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;1 Mappings&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Mappings&lt;/p&gt;
&lt;p&gt;Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restore default mappings&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Provisioning logs&lt;/p&gt;
&lt;p&gt;Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support&lt;/p&gt;
&lt;p&gt;v Settings&lt;/p&gt;
&lt;p&gt;Activity - Audit logs&lt;/p&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;p&gt;Provisioning Status
 ✅
+&lt;/p&gt;
&lt;p&gt;On Off&lt;/p&gt;
&lt;h2&gt;5. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/h2&gt;
&lt;p&gt;6. Scroll to the bottom of the page and select Add new mapping.&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Description: Screenshot of the Attribute Mapping configuration page, showing various mappings between attributes of Microsoft Entra ID and Azure Active Directory. There is a highlighted &amp;quot;Add New Mapping&amp;quot; button at the bottom left.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    preferredLanguage[&amp;quot;preferredLanguage&amp;quot;] --&amp;gt; preferredLanguage[&amp;quot;preferredLanguage&amp;quot;]
    surname[&amp;quot;surname&amp;quot;] --&amp;gt; surname[&amp;quot;surname&amp;quot;]
    telephoneNumber[&amp;quot;telephoneNumber&amp;quot;] --&amp;gt; telephoneNumber[&amp;quot;telephoneNumber&amp;quot;]
    userPrincipalName[&amp;quot;userPrincipalName&amp;quot;] --&amp;gt; userPrincipalName[&amp;quot;userPrincipalName&amp;quot;]
    true[&amp;quot;true&amp;quot;] --&amp;gt; showInAddressList[&amp;quot;showInAddressList&amp;quot;]
    mail[&amp;quot;mail&amp;quot;] --&amp;gt; mail[&amp;quot;mail&amp;quot;]
    Member[&amp;quot;Member&amp;quot;] --&amp;gt; userType[&amp;quot;userType&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/figure&gt;


&lt;p&gt;7. In the Source attribute drop-down list, select a source attribute.&lt;/p&gt;
&lt;p&gt;If you created a directory extension in the source tenant, select the directory extension.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ ❌ ❌&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- PageHeader=&quot;Home &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt;&quot; --&gt;

&lt;h1&gt;Edit Attribute ..&lt;/h1&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type 0&lt;/p&gt;
&lt;p&gt;Direct&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Source attribute *&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeHireDate&lt;/p&gt;
&lt;p&gt;employeeld&lt;/p&gt;
&lt;p&gt;employeeLeaveDateTime&lt;/p&gt;
&lt;p&gt;employeeOrgData.costCenter&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeOrgData.division&lt;/p&gt;
&lt;p&gt;employeeType&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;testExtension (extension_c44d2adc1ddd43f29f29248e8de53937_testExtension)&lt;/p&gt;
&lt;p&gt;extensionAttribute1&lt;/p&gt;
&lt;p&gt;extensionAttribute10&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/p&gt;
&lt;p&gt;8. In the Target attribute drop-down list, select a target attribute.&lt;/p&gt;
&lt;p&gt;If you created a directory extension in the target tenant, select the directory extension.&lt;/p&gt;
&lt;p&gt;9. Select Ok to save the mapping.&lt;/p&gt;
&lt;h1&gt;Manually add directory extensions to the attribute list&lt;/h1&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![A screenshot of the &quot;Edit Attribute&quot; interface in Microsoft Entra admin center. The screenshot shows a user selecting a source attribute from a dropdown list. Various attributes such as employeeHireDate, employeeld, employeeLeaveDateTime, and others are visible in the list. At the bottom of the dropdown list, there is an Ok button to save the mapping.](figures/0) --&gt; --&gt;

&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;If your directory extension wasn&amp;#39;t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/p&gt;
&lt;!-- PageHeader=&quot;https://entra.microsoft.com/?&quot; --&gt;

&lt;p&gt;Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;3. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;4. Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;5. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;p&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h1&gt;Attribute Mapping&lt;/h1&gt;
&lt;p&gt;..
 ✅
X&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping
 ✅&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Screenshot of the Attribute Mapping page in Microsoft&amp;#39;s admin center interface. It shows user attributes and their corresponding actions.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ShowAdvancedOptions[&amp;quot;Show advanced options&amp;quot;] --&amp;gt; |Checkbox| AdvancedSettingsShown[&amp;quot;Advanced settings shown&amp;quot;]
    AttributeMapping[&amp;quot;Attribute Mapping&amp;quot;] --&amp;gt; userPrincipalName[&amp;quot;userPrincipalName&amp;quot;]
    AttributeMapping --&amp;gt; showInAddressList[&amp;quot;showInAddressList&amp;quot;]
    AttributeMapping --&amp;gt; mail[&amp;quot;mail&amp;quot;]
    AttributeMapping --&amp;gt; userType[&amp;quot;userType&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Screenshot showing buttons for editing the attribute list for Microsoft Entra ID and Azure Active Directory (target tenant)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    EditAttributeListMicrosoftEntraID[&amp;quot;Edit attribute list for Microsoft Entra ID&amp;quot;] --&amp;gt; |Link| MicrosoftEntraIDAttributes[&amp;quot;Microsoft Entra ID Attributes&amp;quot;]
    EditAttributeListAzureAD[&amp;quot;Edit attribute list for Azure Active Directory (target tenant)&amp;quot;] --&amp;gt; |Link| AzureADAttributes[&amp;quot;Azure AD Attributes&amp;quot;]
    UseExpressionBuilder[&amp;quot;Use the expression builder&amp;quot;] --&amp;gt; |Link| ExpressionBuilder[&amp;quot;Expression Builder&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON of your schema. Review your schema here.&lt;/p&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;If you don&amp;#39;t see the Edit attribute list links, be sure that you are signed in to the Microsoft Entra admin center using the link in Step 1.&lt;/p&gt;
&lt;p&gt;7. If you created a directory extension in the source tenant, select the Edit attribute list for Microsoft Entra ID link.&lt;/p&gt;
&lt;p&gt;8. If you created an extension in the target tenant, select the Edit attribute list for Azure Active Directory (target tenant) link.&lt;/p&gt;
&lt;p&gt;9. Add the directory extension and select the appropriate options.&lt;/p&gt;
&lt;p&gt;Save ✅ Discard
❌ ❌&lt;/p&gt;
&lt;figure&gt;

&lt;p&gt;Description: Screenshot showing the &amp;quot;Edit Attribute List&amp;quot; page in the Fabrikam to Contoso | Provisioning | Attribute Mapping interface. Various attributes like &amp;quot;alternativeSecurityIds&amp;quot;, &amp;quot;showInAddressList&amp;quot;, &amp;quot;mail&amp;quot;, &amp;quot;userState&amp;quot;, &amp;quot;userType&amp;quot;, and &amp;quot;extension_c44d2adc1ddd4...&amp;quot; are listed with corresponding data types (String, Boolean) and options to select or unselect these attributes. Tips for editing the attribute list are provided at the bottom.&lt;/p&gt;
&lt;figcaption&gt;Fabrikam to Contoso | Provisioning | Attribute Mapping | Edit Attribute List&lt;/figcaption&gt;

&lt;/figure&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[&amp;quot;alternativeSecurityIds (String)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | B;
    C[&amp;quot;showInAddressList (Boolean)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | D;
    E[&amp;quot;mail (String)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | F;
    G[&amp;quot;userState (String)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | H;
    I[&amp;quot;userType (String)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | J;
    K[&amp;quot;extension_c44d2adc1ddd4... (String)&amp;quot;] --&amp;gt; | &amp;quot;Selected&amp;quot; | L;
    M[&amp;quot;Another (String)&amp;quot;] --&amp;gt; | &amp;quot;Unselected&amp;quot; | N;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;alternativeSecuritylds&lt;/th&gt;
&lt;th&gt;String&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;❌&lt;/th&gt;
&lt;th&gt;❌&lt;/th&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userState&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extension_c44d2adc1ddd4 ...&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Manually add directory extensions by editing the schema&lt;/h1&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema by using the schema editor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/h1&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Attribute Mapping&lt;/p&gt;
&lt;p&gt;Save Discard&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping&lt;/p&gt;
&lt;p&gt;Show advanced options&lt;/p&gt;
&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.&lt;/p&gt;
&lt;h1&gt;7. Select the Review your schema here link to open the Schema editor page.&lt;/h1&gt;
&lt;p&gt;Fabrikam to Contoso | Provisioning Attribute Mapping &amp;gt;&lt;/p&gt;
&lt;p&gt;Schema editor&lt;/p&gt;
&lt;p&gt;The schema below is a JSON representation of your provisioning configuration. You can use it to define what objects you want to provision, map objects between your source and target system, and specify who should be provisioned. We recommend making these changes directly through our configuration experience. The schema below is only used for saving your configuration and making changes in it.&lt;/p&gt;
&lt;p&gt;We recommend downloading and saving the current configuration prior to making changes. A backup copy can be used to roll back to a known good state.&lt;/p&gt;
&lt;p&gt;| - |&lt;/p&gt;
&lt;p&gt;| 1 | | | |
| - | - | - | - | - | - |
| 2 | &amp;quot;@odata.context&amp;quot;: &amp;quot;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#servicePril&quot;&gt;https://graph.microsoft.com/beta/$metadata#servicePril&lt;/a&gt; || | | |
| 3 | &amp;quot;id&amp;quot;: &amp;quot;Azure2Azure. 1f58d1c91f90427abd849f967e96fb42.6a0b230b-3a8d-455d-9: || | | |
| 4 | &amp;quot;version&amp;quot;: &amp;quot;v1.2&amp;quot;, || | | |
| 5 | &amp;quot;synchronizationRules&amp;quot;: [ || | | |
| 6 | { || | | |
| 7 | &amp;quot;containerFilter&amp;quot;: null, || | |
| 8 | &amp;quot;editable&amp;quot;: true, || | | |
| 9 | &amp;quot;groupFilter&amp;quot;: null, || | |
| 10 | &amp;quot;id&amp;quot;: &amp;quot;df8df8d1-9e6e-40d3-b8df-09bbb402db7e&amp;quot;, || | | |
| 11 | &amp;quot;name&amp;quot;: &amp;quot;USER_INBOUND_USER&amp;quot;, || +
| 12 | &amp;quot;priority&amp;quot;: 1, || | |
| 13 | &amp;quot;sourceDirectoryName&amp;quot;: &amp;quot;Microsoft Entra ID&amp;quot;, || 1&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;p&gt;Download an original copy of the schema as a backup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the schema following your required configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Save Discard&lt;/p&gt;
&lt;p&gt;Download Got feedback?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Step1[&amp;quot;Scroll to the bottom and select the Show advanced settings check box.&amp;quot;]
    Step2[&amp;quot;Select the Review your schema here link to open the Schema editor page.&amp;quot;]
    Step3[&amp;quot;Download an original copy of the schema as a backup.&amp;quot;]
    Step4[&amp;quot;Modify the schema following your required configuration.&amp;quot;]
    Step5[&amp;quot;Select Save.&amp;quot;]

    Step1 --&amp;gt; Step2
    Step2 --&amp;gt; Step3
    Step3 --&amp;gt; Step4
    Step4 --&amp;gt; Step5
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 01/26/2024&lt;/p&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h1&gt;Syntax overview&lt;/h1&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: FunctionName( &amp;lt;&amp;lt; argument 1&amp;gt;&amp;gt;, &amp;lt;&amp;lt; argument N&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;You can nest functions within each other. For example: FunctionOne(FunctionTwo( &amp;lt;&amp;lt; argument1&amp;gt;&amp;gt;))&lt;/li&gt;
&lt;li&gt;You can pass three different types of arguments into functions:&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example: [attributeName]&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example: &amp;quot;United States&amp;quot;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: FunctionOne( &amp;lt;&amp;lt; argument1&amp;gt;&amp;gt; , FunctionTwo( &amp;lt;&amp;lt; argument2&amp;gt;&amp;gt;))&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;For string constants, if you need a backslash (\) or quotation mark (&amp;quot;) in the string, it must be escaped with the backslash (\) symbol. For example: &amp;quot;Company name: \&amp;quot;Contoso\&amp;quot;&amp;quot;&lt;/li&gt;
&lt;li&gt;The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of Functions&lt;/p&gt;
&lt;p&gt;Append AppRoleAssignmentsComplex BitAnd CBool CDate Coalesce ConvertToBase64 ConvertToUTF8Hex Count CStr DateAdd DateDiff DateFromNum FormatDateTime Guid IgnoreFlowlfNullOrEmpty&lt;/p&gt;
&lt;p&gt;IIF InStr IsNull IsNullOrEmpty IsPresent IsString Item Join Left Mid NormalizeDiacritics Not Now NumFromDate PCase RandomString Redact RemoveDuplicates Replace SelectUniqueValue&lt;/p&gt;
&lt;p&gt;SingleAppRoleAssignment Split StripSpaces Switch ToLower ToUpper Word&lt;/p&gt;
&lt;h1&gt;Append&lt;/h1&gt;
&lt;p&gt;Function: Append(source, suffix)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Append constant suffix to user name&lt;/p&gt;
&lt;p&gt;Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;Expression: Append([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;INPUT: (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AppRoleAssignmentsComplex&lt;/p&gt;
&lt;p&gt;Function: AppRoleAssignmentsComplex([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Used to configure multiple roles for a user. For detailed usage, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;![A table that lists parameters for configuring multiple roles for a user. The columns include Name, Required/Repeating, Type, and Notes.]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;BitAnd&lt;/h1&gt;
&lt;p&gt;Function: BitAnd(value1, value2)&lt;/p&gt;
&lt;p&gt;Description: This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;p&gt;· 0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/p&gt;
&lt;p&gt;· 1 - if both of the corresponding bits are 1.&lt;/p&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;![A table listing parameters for the BitAnd function. The columns include Name, Required/Repeating, Type, and Notes.]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: BitAnd(&amp;amp;HF, &amp;amp;HF7)&lt;/p&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;p&gt;CBool&lt;/p&gt;
&lt;p&gt;Function: CBool(Expression)&lt;/p&gt;
&lt;p&gt;Description: CBool returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then CBool returns True, else it returns False.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description of the figure&lt;/strong&gt;: This figure is a table listing the parameters for the CBool function.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;MermaidJS Diagram Not Applicable for Table Representation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Example: CBool([attribute1] = [attribute2])&lt;/p&gt;
&lt;p&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;h1&gt;CDate&lt;/h1&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;CDate(expression)&lt;/p&gt;
&lt;p&gt;Description: The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as FormatDateTime and DateAdd.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description of the figure&lt;/strong&gt;: This figure is a table listing the parameters for the CDate function.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;MermaidJS Diagram Not Applicable for Table Representation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remarks: The returned string is always in UTC and follows the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example 1: CDate([StatusHireDate])
Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· OUTPUT: &amp;quot;3/16/2020 7:00:00 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 2: CDate(&amp;quot;2021-06-30+08:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2021-06-30+08:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 3:&lt;/p&gt;
&lt;p&gt;CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;h1&gt;Coalesce&lt;/h1&gt;
&lt;p&gt;Function: Coalesce(source1, source2, ... , defaultValue)&lt;/p&gt;
&lt;p&gt;Description: Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when all source values are NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;p&gt;Example: You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Coalesce([mail], [userPrincipalName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): NULL&lt;/li&gt;
&lt;li&gt;INPUT (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;ConvertToBase64&lt;/h1&gt;
&lt;p&gt;Function: ConvertToBase64(source)&lt;/p&gt;
&lt;p&gt;Description: The ConvertToBase64 function converts a string to a Unicode base64 string. &lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABIAGwAbABvACAAdwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h1&gt;ConvertToUTF8Hex&lt;/h1&gt;
&lt;p&gt;Function: ConvertToUTF8Hex(source)&lt;/p&gt;
&lt;p&gt;Description: The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h1&gt;Count&lt;/h1&gt;
&lt;p&gt;Function: Count(attribute)&lt;/p&gt;
&lt;p&gt;Description: The Count function returns the number of elements in a multi-valued attribute&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that will have elements counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;CStr&lt;/h1&gt;
&lt;p&gt;Function: CStr(value)&lt;/p&gt;
&lt;p&gt;Description: The CStr function converts a value to a string data type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;CStr([dn])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;h1&gt;DateAdd&lt;/h1&gt;
&lt;!-- PageHeader=&quot;Function: DateAdd(interval, value, dateTime)&quot; --&gt;

&lt;p&gt;Function: &lt;code&gt;DateAdd(interval, value, dateTime)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table Describing Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below this table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTime&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Table Schema Visualization:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    parameter_table[&amp;quot;Table Describing Parameters&amp;quot;] 
    interval[&amp;quot;Name: interval\nRequired/Repeating: Required\nType: String\nNotes: Interval of time you want to add. See accepted values below this table.&amp;quot;] 
    value[&amp;quot;Name: value\nRequired/Repeating: Required\nType: Number\nNotes: The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&amp;quot;] 
    dateTime[&amp;quot;Name: dateTime\nRequired/Repeating: Required\nType: DateTime\nNotes: DateTime representing date to which the interval is added.&amp;quot;] 
    
    parameter_table --&amp;gt; interval
    parameter_table --&amp;gt; value
    parameter_table --&amp;gt; dateTime
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 1: Generate a date value based on incoming StatusHireDate from Workday&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- PageFooter=&quot;Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;dateTime (value of variable StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Add 7 days to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a date ten days&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prior to hire date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two weeks to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;ww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add ten months to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two years to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;DateDiff&lt;/h1&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DateDiff(interval, date1, date2)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;This function uses the interval parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a positive number if date2 &amp;gt; date1,&lt;/li&gt;
&lt;li&gt;a negative number if date2 &amp;lt; date1,&lt;/li&gt;
&lt;li&gt;0 if date2 == date1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;p&gt;· yyyy Year&lt;/p&gt;
&lt;p&gt;· m Month&lt;/p&gt;
&lt;p&gt;· d Day&lt;/p&gt;
&lt;p&gt;· ww Week&lt;/p&gt;
&lt;p&gt;· h Hour&lt;/p&gt;
&lt;p&gt;· n Minute&lt;/p&gt;
&lt;p&gt;· s Second&lt;/p&gt;
&lt;p&gt;Example 1: Compare current date with hire date from Workday with different intervals
DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Positive difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in weeks between two dates&lt;/td&gt;
&lt;td&gt;ww&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in months between two dates&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in years between two dates&lt;/td&gt;
&lt;td&gt;yyyy&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference when both dates are same&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in hours between two dates&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in minutes between two dates&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in seconds between two dates&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 2: Combine DateDiff with IIF function to set attribute value
If an account is Active in Workday, set the accountEnabled attribute of the user to True only if hire date is within the next five days.&lt;/p&gt;
&lt;p&gt;Switch ([Active], , &amp;quot;1&amp;quot;, IIF(DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate])) &amp;gt; 5, &amp;quot;False&amp;quot;, &amp;quot;True&amp;quot;), &amp;quot;0&amp;quot;, &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;h1&gt;DateFromNum&lt;/h1&gt;
&lt;p&gt;Function: DateFromNum(value)&lt;/p&gt;
&lt;p&gt;Description: The DateFromNum function converts a value in AD&amp;#39;s date format to a DateTime type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Table 1: Parameters](figure1) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;AD Date to be converted to DateTime type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Name --&amp;gt; value;
    Required_Repeating --&amp;gt; &amp;quot;Required&amp;quot;;
    Type --&amp;gt; Date;
    Notes --&amp;gt; &amp;quot;AD Date to be converted to DateTime type&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example: DateFromNum([lastLogonTimestamp])&lt;/p&gt;
&lt;p&gt;DateFromNum(129699324000000000)&lt;/p&gt;
&lt;p&gt;Returns a DateTime representing January 1, 2012 at 11:00PM.&lt;/p&gt;
&lt;h1&gt;FormatDateTime&lt;/h1&gt;
&lt;p&gt;Function: FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)&lt;/p&gt;
&lt;p&gt;Description: Takes a date string from one format and converts it into a different format.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Table 2: Parameters](figure2) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTimeStyles&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Name --&amp;gt; source;
    Required_Repeating --&amp;gt; &amp;quot;Required&amp;quot;;
    Type --&amp;gt; String;
    Notes_1 --&amp;gt; &amp;quot;Usually name of the attribute from the source object&amp;quot;;
    dateTimeStyles --&amp;gt; dateTimeStyles;
    Optional --&amp;gt; &amp;quot;Optional&amp;quot;;
    Type_2 --&amp;gt; &amp;quot;String&amp;quot;;
    Notes_2 --&amp;gt; &amp;quot;Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;DateTimeStyles.RoundtripKind, DateTimeStyles.AllowLeadingWhite, DateTimeStyles.AllowTrailingWhite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Expected format of the source value. For supported formats, see .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Format of the output date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Output date as a string in a certain format&lt;/h1&gt;
&lt;p&gt;Example: You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FormatDateTime([extensionAttribute1], , &amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;2015-01-23&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Guid&lt;/h1&gt;
&lt;p&gt;Function: Guid()&lt;/p&gt;
&lt;p&gt;Description: The function Guid generates a new random GUID&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Guid()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;h1&gt;IgnoreFlowIfNullOrEmpty&lt;/h1&gt;
&lt;p&gt;Function: IgnoreFlowIfNullOrEmpty(expression)&lt;/p&gt;
&lt;p&gt;Description: The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Don&amp;#39;t flow an attribute if it is null
IgnoreFlowIfNullOrEmpty([department])&lt;/p&gt;
&lt;p&gt;The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;p&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say the SuccessFactors attribute prefix is mapped to the on-premises Active Directory attribute personalTitle using the following expression mapping:
IgnoreFlowIfNullOrEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr.&amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))&lt;/p&gt;
&lt;p&gt;The above expression first evaluates the Switch function. If the prefix attribute doesn&amp;#39;t have any of the values listed within the Switch function, then Switch will return an empty string and the attribute personalTitle will not be included in the provisioning flow to on-premises Active Directory.&lt;/p&gt;
&lt;p&gt;IIF&lt;/p&gt;
&lt;p&gt;Function: IIF(condition,valuelfTrue,valuelfFalse)&lt;/p&gt;
&lt;p&gt;Description: The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valuelfTrue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;valuelfFalse&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to false, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following comparison operators can be used in the condition:&lt;/p&gt;
&lt;p&gt;· Equal to (=) and not equal to (&amp;lt;&amp;gt;)&lt;/p&gt;
&lt;p&gt;· Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)&lt;/p&gt;
&lt;p&gt;· Less than (&amp;lt;) and less than equal to (&amp;lt;=)&lt;/p&gt;
&lt;p&gt;Example: Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute. IIF([country]=&amp;quot;USA&amp;quot;, [country] , [department])&lt;/p&gt;
&lt;h1&gt;Known limitations&lt;/h1&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For information about troubleshooting user creation issues, see Creation fails due to null / empty values.&lt;/p&gt;
&lt;p&gt;. The IIF function currently doesn&amp;#39;t support AND and OR logical operators.&lt;/p&gt;
&lt;p&gt;. To implement AND logic, use nested IIF statement chained along the trueValue path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;), &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;p&gt;· To implement OR logic, use nested IIF statement chained along the falseValue path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, &amp;quot;True&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;))&lt;/p&gt;
&lt;p&gt;. If the source attribute used within the IIF function is empty or null, the condition check fails.&lt;/p&gt;
&lt;p&gt;o Unsupported IIF expression examples:
  o IIF([country]=&amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;, [country])
  o IIF(IsNullOrEmpty([country]), &amp;quot;Other&amp;quot;, [country])
  o IIF (IsPresent([country]), [country], &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;p&gt;o Recommended workaround: Use the Switch function to check for empty/null values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present, pass the country attribute value to target attribute.&lt;/p&gt;
&lt;p&gt;  o Switch([country], [country], &amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    valuelfFalse --&amp;gt; String[&amp;quot;Variable or String&amp;quot;]
    condition --&amp;gt; comparison_operators[&amp;quot;==, !=, &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;=&amp;quot;]
    examples --&amp;gt; IIF_example[&amp;quot;IIF([country]=USA, [country], [department])&amp;quot;]
    limitations --&amp;gt; IIF_limitations
    IIF_limitations --&amp;gt; logic_operators[&amp;quot;AND, OR not supported&amp;quot;]
    logic_operators --&amp;gt; nested_IIF_TRUE[&amp;quot;If country=USA and state=CA, IIF([country]=USA, IIF([state]=CA, True, False), False)&amp;quot;]
    logic_operators --&amp;gt; nested_IIF_FALSE[&amp;quot;If country=USA or state=CA, IIF([country]=USA, True, IIF([state]=CA, True, False))&amp;quot;]
    IIF_limitations --&amp;gt; empty_null_check_failed
    empty_null_check_failed --&amp;gt; unsupported_examples[&amp;quot;IIF([country]=, Other, [country]) IIF(IsNullOrEmpty([country]), Other, [country]) IIF(IsPresent([country]), [country], Other)&amp;quot;]
    empty_null_check_failed --&amp;gt; switch_function[&amp;quot;Switch([country], [country], , Other)&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Function: InStr(value1, value2, start, compareType)&lt;/p&gt;
&lt;p&gt;Description: The InStr function finds the first occurrence of a substring in a string&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image not found: Figure-Expand-table.png --&gt;
&lt;!-- ![Figure: Expand table](Figure-Expand-table.png) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compareType&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: InStr(&amp;quot;The quick brown fox&amp;quot;,&amp;quot;quick&amp;quot;)&lt;/p&gt;
&lt;p&gt;Evaluates to 5&lt;/p&gt;
&lt;p&gt;InStr(&amp;quot;repEated&amp;quot;,&amp;quot;e&amp;quot;,3,vbBinaryCompare)&lt;/p&gt;
&lt;p&gt;Evaluates to 7&lt;/p&gt;
&lt;p&gt;IsNull&lt;/p&gt;
&lt;p&gt;Function: IsNull(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image not found: Figure-Expand-table.png --&gt;
&lt;!-- ![Figure: Expand table](Figure-Expand-table.png) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNull([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;!-- PageHeader=&quot;Function: IsNullOrEmpty(Expression)&quot; --&gt;

&lt;p&gt;Description: If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Table: IsNullOrEmpty Parameters](#) --&gt;
&lt;p&gt;&lt;em&gt;Figure description: A table with four columns: &amp;quot;Name,&amp;quot; &amp;quot;Required/Repeating,&amp;quot; &amp;quot;Type,&amp;quot; and &amp;quot;Notes.&amp;quot; The only row contains:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Name: &amp;quot;Expression&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Required/Repeating: &amp;quot;Required&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Type: &amp;quot;Expression&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Notes: &amp;quot;Expression to be evaluated&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Expression[&amp;quot;Expression&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example: IsNullOrEmpty([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h1&gt;IsPresent&lt;/h1&gt;
&lt;p&gt;Function: IsPresent(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Table: IsPresent Parameters](#) --&gt;
&lt;p&gt;&lt;em&gt;Figure description: A table with four columns: &amp;quot;Name,&amp;quot; &amp;quot;Required/Repeating,&amp;quot; &amp;quot;Type,&amp;quot; and &amp;quot;Notes.&amp;quot; The only row contains:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Name: &amp;quot;Expression&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Required/Repeating: &amp;quot;Required&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Type: &amp;quot;Expression&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Notes: &amp;quot;Expression to be evaluated&amp;quot;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Expression[&amp;quot;Expression&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example: Switch (IsPresent([directManager]), [directManager], IsPresent([skiplevelManager]), [skiplevelManager], IsPresent([director]), [director])&lt;/p&gt;
&lt;h2&gt;IsString&lt;/h2&gt;
&lt;p&gt;Function: IsString(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression can be evaluated to a string type, then the IsString function evaluates to True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Item&lt;/h1&gt;
&lt;p&gt;Function: Item(attribute, index)&lt;/p&gt;
&lt;p&gt;Description: The Item function returns one item from a multi-valued string/attribute. &lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;Item([proxyAddresses], 1)&lt;/code&gt; returns the first item in the multi-valued attribute. Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h1&gt;Join&lt;/h1&gt;
&lt;p&gt;Function: Join(separator, source1, source2, ...)&lt;/p&gt;
&lt;p&gt;Description: Join() is similar to Append(), except that it can combine multiple source string values into a single string, and each value will be separated by a separator string.&lt;/p&gt;
&lt;p&gt;If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &amp;quot;&amp;quot; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required, variable- number of times&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String values to be joined together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Left&lt;/h1&gt;
&lt;p&gt;Function: Left(String, NumChars)&lt;/p&gt;
&lt;p&gt;Description: The Left function returns a specified number of characters from the left of a string. If numChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in numChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 1: Parameters table for the Left function&lt;/strong&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![The parameters table for the Left function listing the parameter names, if they are required, the type, and notes.](#) --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    String[&amp;quot;String&amp;quot;] --&amp;gt; NumChars[&amp;quot;NumChars&amp;quot;];
    NumChars[&amp;quot;NumChars&amp;quot;] --&amp;gt; Notes1[&amp;quot;A number identifying the number of characters to return from the beginning (left) of string&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;The string to return characters from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumChars&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;A number identifying the number of characters to return from the beginning (left) of string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Mid&lt;/h1&gt;
&lt;p&gt;Function: Mid(source, start, length)&lt;/p&gt;
&lt;p&gt;Description: Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Figure 2: Parameters table for the Mid function&lt;/strong&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![The parameters table for the Mid function listing the parameter names, if they are required, the type, and notes.](#) --&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Source[&amp;quot;source&amp;quot;] --&amp;gt; Start[&amp;quot;start&amp;quot;];
    Start[&amp;quot;start&amp;quot;] --&amp;gt; Length[&amp;quot;length&amp;quot;];
    Length[&amp;quot;length&amp;quot;] --&amp;gt; Notes2[&amp;quot;Number of characters to include in the substring&amp;quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;NormalizeDiacritics&lt;/h1&gt;
&lt;p&gt;Function: NormalizeDiacritics(source)&lt;/p&gt;
&lt;p&gt;Description: Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters (accent marks) into legal values that can be used in various user identifiers such as user principal names, SAM account names, and email addresses.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ä, à, â, ã, å, á, ą, ă, ā, á, à, â, ã, ã, ä, å, a, å&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Ä, À, Â, Ã, Å, Á, Ą, Ă, Ā, Á, À, Â, Ã, Ã, Ä, Ã, A, Å&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, æ&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Ā&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, č, ć, č, c&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, č, Ć, Č, C&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ď, d, d&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Ď, D, D&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ë, è, é, ê, ę, ě, ė, ē, é, è, ê, ẽ, ē, e̱, ē, é&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;Ë, È, É, Ê, Ę, Ě, Ė, Ē, É, È, Ê, Ẽ, È, E&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source[&amp;quot;source (String)&amp;quot;] --&amp;gt; |Usually name of the attribute| Start
    start[&amp;quot;start (Integer)&amp;quot;] --&amp;gt; |Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on| Length
    length[&amp;quot;length (Integer)&amp;quot;] --&amp;gt; |Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string| End
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    source[&amp;quot;source (String)&amp;quot;] --&amp;gt; |Usually name of the attribute| Attribute
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    a[&amp;quot;ä, à, â, ã, å, á, ą, ă, ā, á, à, â, ã, ã, ä, å, a, å&amp;quot;] --&amp;gt; A[&amp;quot;a&amp;quot;]
    A2[&amp;quot;Ä, À, Â, Ã, Å, Á, Ą, Ă, Ā, Á, À, Â, Ã, Ã, Ä, Ã, A, Å&amp;quot;] --&amp;gt; A[&amp;quot;A&amp;quot;]

    ae[&amp;quot;æ, æ&amp;quot;] --&amp;gt; AE[&amp;quot;ae&amp;quot;]
    AE2[&amp;quot;Æ, Ā&amp;quot;] --&amp;gt; AE[&amp;quot;AE&amp;quot;]

    c[&amp;quot;ç, č, ć, č, c&amp;quot;] --&amp;gt; C[&amp;quot;c&amp;quot;]
    C2[&amp;quot;Ç, č, Ć, Č, C&amp;quot;] --&amp;gt; C[&amp;quot;C&amp;quot;]

    d[&amp;quot;ď, d, d&amp;quot;] --&amp;gt; D[&amp;quot;d&amp;quot;]
    D2[&amp;quot;Ď, D, D&amp;quot;] --&amp;gt; D[&amp;quot;D&amp;quot;]

    e[&amp;quot;ë, è, é, ê, ę, ě, ė, ē, é, è, ê, ẽ, ē, e̱, ē, é&amp;quot;] --&amp;gt; E[&amp;quot;e&amp;quot;]
    E2[&amp;quot;Ë, È, É, Ê, Ę, Ě, Ė, Ē, É, È, Ê, Ẽ, È, E&amp;quot;] --&amp;gt; E[&amp;quot;E&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ğ, ğ, g&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ğ, Ġ, G&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ï, î, ì, í, ı, ī, Í, ì, î, ĩ, į&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Ī, Į, I&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[&amp;#39;, ł, I, [, ]&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Ł, Ľ, L, Ļ&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ñ, ń, ň, n̄, ṋ&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ñ, Ń, Ň, N̄, Ņ&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ö, ò, ő, õ, ô, ó, ō, ố, ồ, ô, õ, ô, ö, ọ, õ, ỏ, o&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;Ö, Ò, Ő, Õ, Ô, Ó, ô, Ô, Ò, ô, Ổ, Ō, Ọ, Õ, Ỏ, Ò&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ø,ø, œ&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Ø, Ø, Œ&lt;/td&gt;
&lt;td&gt;OE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ř, r, r, r&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ř, Ř, R, Ř&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;SS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;š, Ś, ș, ș, š, S&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Š, Ś, Ș, Ș, Š, S&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ť, ț, t, t&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ť, Ț, Ī, Ţ&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ü, ù, û, ú, ů, ű, ū, ú, ù, û, ũ, ū, ū, ũ, u̱, u̱&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Ü, Ù, Û, Ú, Ů, Ű, Ū, Ú, Ù, Û, Õ, U&lt;/td&gt;
&lt;td&gt;Ú, Ü, Ü, Ų, U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ÿ, ý, ÿ, ý, ỳ, ỹ, y&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Ÿ, Ý, Y, Ý, Ỳ, Ý, Y&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ź, ž, ż, ž, z&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;Ź, Ž, Ż, Ż, Z&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Remove diacritics from a string&lt;/h1&gt;
&lt;p&gt;Example: Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/p&gt;
&lt;p&gt;Expression: NormalizeDiacritics([givenName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;Zoë&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Zoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not&lt;/p&gt;
&lt;p&gt;Function: Not(source)&lt;/p&gt;
&lt;p&gt;Description: Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Boolean String&lt;/td&gt;
&lt;td&gt;Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Now&lt;/p&gt;
&lt;p&gt;Function: Now()&lt;/p&gt;
&lt;p&gt;Description: The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example: Now() Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;p&gt;NumFromDate&lt;/p&gt;
&lt;p&gt;Function: NumFromDate(value)&lt;/p&gt;
&lt;p&gt;Description: The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 format. If the date variable is in a different format, use FormatDateTime function to convert the date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Workday example Assuming you want to map the attribute ContractEndDate from Workday, which is in the format 2020-12-31-08:00 to accountExpires field in AD, here&amp;#39;s how you can use this function and change the timezone offset to match your locale. &lt;code&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], ,&amp;quot;yyyy-MM-ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SuccessFactors example Assuming you want to map the attribute endDate from SuccessFactors, which is in the format M/d/yyyy hh:mm:ss tt to accountExpires field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale. &lt;code&gt;NumFromDate (Join(&amp;quot;&amp;quot;, FormatDateTime([endDate], ,&amp;quot;M/d/yyyy hh:mm:ss tt&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;PCase&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; PCase(source, wordSeparators)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The PCase function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify a set of characters that is used as word separators (example: &amp;quot; ,-&amp;#39;&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Remarks:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If the wordSeparators parameter isn&amp;#39;t specified, then PCase internally invokes the .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; to convert the source string to proper case. The .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; supports a comprehensive set of the Unicode character categories as word separators.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Space character&lt;/li&gt;
&lt;li&gt;New line character&lt;/li&gt;
&lt;li&gt;Control characters like CRLF&lt;/li&gt;
&lt;li&gt;Format control characters&lt;/li&gt;
&lt;li&gt;ConnectorPunctuation characters like underscore&lt;/li&gt;
&lt;li&gt;DashPunctuation characters like dash and hyphen (including characters such as En Dash, Em Dash, double hyphen, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;o OpenPunctuation and ClosePunctuation characters that occur in pairs like parenthesis, curly bracket, angle bracket, etc.&lt;/p&gt;
&lt;p&gt;o InitialQuotePunctuation and FinalQuotePunctuation characters like single quotes, double quotes and angular quotes.&lt;/p&gt;
&lt;p&gt;o OtherPunctuation characters like exclamation mark, number sign, percent sign, ampersand, asterisk, comma, full stop, colon, semi-colon, etc.&lt;/p&gt;
&lt;p&gt;o MathSymbol characters like plus sign, less-than and greater-than sign, vertical line, tilde, equals sign, etc.&lt;/p&gt;
&lt;p&gt;o CurrencySymbol characters like dollar sign, cent sign, pound sign, euro sign, etc.&lt;/p&gt;
&lt;p&gt;o ModifierSymbol characters like macron, accents, arrow heads, etc.&lt;/p&gt;
&lt;p&gt;o OtherSymbol characters like copyright sign, degree sign, registered sign, etc.&lt;/p&gt;
&lt;p&gt;If the wordSeparators parameter is specified, then PCase only uses the characters specified as word separators.&lt;/p&gt;
&lt;h1&gt;Example:&lt;/h1&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes firstName and lastName from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;p&gt;![Expand table]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PCase([firstName])&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;PABLO GONSALVES (SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo Gonsalves (Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase([lastName],&amp;quot; &amp;#39;-&amp;quot;)&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;PINTO-DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;The PCase function uses characters in the wordSeparators parameter to identify words and transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase(Join(&amp;quot; &amp;quot;, [firstName],[lastName]))&lt;/td&gt;
&lt;td&gt;firstName = GREGORY, lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory James&amp;quot;&lt;/td&gt;
&lt;td&gt;You can nest the Join function within PCase. As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;RandomString&lt;/h1&gt;
&lt;p&gt;Function: RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)&lt;/p&gt;
&lt;p&gt;Description: The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified here.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- Image not found: figure1.png --&gt;
&lt;!-- ![Description of Figures: Illustrated icon represents an expandable table element.](figure1.png) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: - Generate a random string without special character restrictions: RandomString(6,3,0,0,3) Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/p&gt;
&lt;p&gt;Example 2: - Generate a random string with special character restrictions: RandomString(10,2,2,2,1,&amp;quot;?,&amp;quot;) Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/p&gt;
&lt;p&gt;Redact&lt;/p&gt;
&lt;p&gt;Function: Redact()&lt;/p&gt;
&lt;p&gt;Description: The Redact function replaces the attribute value with the string literal &amp;quot; [Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    ExpandTable[&amp;quot;Expandable table element representation&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- PageHeader=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute/value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Redact an attribute: Redact([userPrincipalName]) Removes the userPrincipalName from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 2: Redact a string: Redact(&amp;quot;StringToBeRedacted&amp;quot;) Removes a constant string from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 3: Redact a random string: Redact(RandomString(6,3,0,0,3)) Removes the random string from the provisioning logs.&lt;/p&gt;
&lt;h1&gt;RemoveDuplicates&lt;/h1&gt;
&lt;p&gt;Function: RemoveDuplicates(attribute)&lt;/p&gt;
&lt;p&gt;Description: The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- PageHeader=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: RemoveDuplicates([proxyAddresses]) Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/p&gt;
&lt;h2&gt;Replace&lt;/h2&gt;
&lt;p&gt;Function: Replace(source, oldValue, regexPattern, regexGroupName, replacementValue, replacementAttributeName, template)&lt;/p&gt;
&lt;p&gt;Description: Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided:&lt;/p&gt;
&lt;p&gt;· When oldValue and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;  o Replaces all occurrences of oldValue in the source with replacementValue&lt;/p&gt;
&lt;p&gt;· When oldValue and template are provided:&lt;/p&gt;
&lt;p&gt;  o Replaces all occurrences of the oldValue in the template with the source value&lt;/p&gt;
&lt;p&gt;· When regexPattern and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;  o The function applies the regexPattern to the source string and you can use the regex group names to construct the string for replacementValue&lt;/p&gt;
&lt;p&gt;![Graphic of Note: To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Note[&amp;quot;Note: To learn more about regex grouping constructs and named sub-expressions...\nSee Grouping Constructs in Regular Expressions.&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementValue are provided:&lt;/p&gt;
&lt;p&gt;  o The function applies the regexPattern to the source string and replaces all values matching regexGroupName with replacementValue&lt;/p&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementAttributeName are provided:&lt;/p&gt;
&lt;p&gt;  o If source has a value, source is returned
  o If source has no value, the function applies the regexPattern to the replacementAttributeName and returns the value matching regexGroupName&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in source or template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in source. When replacementAttributeName is used, the regexPattern is applied to extract a value from replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside regexPattern. When named replacementAttributeName is used, we&amp;#39;ll extract the value of the named regex group from the replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;replacementAttributeName and return it as the replacement value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;New value to replace old one with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the attribute to be used for replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;When template value is provided, we&amp;#39;ll look for oldValue inside the template and replace it with source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Replace characters using a regular expression&lt;/h1&gt;
&lt;p&gt;Example 1: Using oldValue and replacementValue to replace the entire source string with another string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your HR system has an attribute BusinessTitle. As part of recent job title changes, your company wants to update anyone with the business title &amp;quot;Product Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([BusinessTitle],&amp;quot;Product Developer&amp;quot;, , , &amp;quot;Software Engineer&amp;quot;, , )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [BusinessTitle]&lt;/li&gt;
&lt;li&gt;oldValue: &amp;quot;Product Developer&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;Software Engineer&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: Software Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example 2: Using oldValue and template to insert the source string into another templatized string.&lt;/p&gt;
&lt;p&gt;The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets replaced.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you want to always generate login ID in the format &lt;username&gt;@contoso.com. There is a source attribute called UserID and you want that value to be used for the &lt;username&gt; portion of the login ID. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([UserID],&amp;quot;&amp;lt;username&amp;gt;&amp;quot;, , , , , &amp;quot;&amp;lt;username&amp;gt;@contoso.com&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [UserID] = &amp;quot;jsmith&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· oldValue: &amp;quot;&lt;username&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· template: &amp;quot;&lt;username&gt;@contoso.com&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Example 3: Using regexPattern and replacementValue to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you have a source attribute &lt;code&gt;telephoneNumber&lt;/code&gt; that has components &lt;code&gt;country code&lt;/code&gt; and &lt;code&gt;phone number&lt;/code&gt; separated by a space character. For example, +91 9998887777 Then in this case, you can use the following expression in your attribute mapping to extract the 10 digit phone number.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;\+(?&lt;isdCode&gt;\d*) (?&lt;phoneNumber&gt;\d{10})&amp;quot;, , &amp;quot;${phoneNumber}&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;\+(?&lt;isdCode&gt;\d*) (?&lt;phoneNumber&gt;\d{10})&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;${phoneNumber}&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 9998887777&lt;/p&gt;
&lt;p&gt;You can also use this pattern to remove characters and collapse a string. For example, the expression below removes parenthesis, dashes and space characters in the mobile number string and returns only digits.&lt;/p&gt;
&lt;p&gt;Replace([mobile], , &amp;quot;[()-\s]+&amp;quot;, , &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;[()-\s]+&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· Expression output: 19998887777&lt;/p&gt;
&lt;p&gt;Example 4: Using regexPattern, regexGroupName and replacementValue to extract a portion of the source string and replace it with another literal value or empty string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute AddressLineData with two components street number and street name. As part of a recent move, let&amp;#39;s say the street number of the address changed, and you want to update only the street number portion of the address line. Then in this case, you can use the following expression in your attribute mapping to extract the street number.&lt;/p&gt;
&lt;p&gt;Replace([AddressLineData], , &amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;, &amp;quot;streetNumber&amp;quot;, &amp;quot;888&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [AddressLineData] = &amp;quot;545 Tremont Street&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;( ?&amp;lt; streetNumber&amp;gt;^\\d*) &amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;streetNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;888&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 888 Tremont Street&lt;/p&gt;
&lt;p&gt;[Figure: Text description of how to replace a street number via regex pattern]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    A[regexPattern] --&amp;gt; B[streetNumber];
    B --&amp;gt; C[replacementValue = 888];
    C --&amp;gt; D{Expression output};
    D --&amp;gt; E[888 Tremont Street];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is another example where the domain suffix from a UPN is replaced with an empty string to generate login ID without domain suffix.&lt;/p&gt;
&lt;p&gt;Replace([userPrincipalName], , &amp;quot;( ?&amp;lt; Suffix&amp;gt;@(.)*)&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [userPrincipalName] =&amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot; (?‹Suffix&amp;gt;@(.)*) &amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;Suffix&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· Expression output: jsmith&lt;/p&gt;
&lt;p&gt;[Figure: Text description of how to replace domain suffix from UPN via regex pattern]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    F[source] --&amp;gt; G[jsmith@contoso.com];
    H[regexPattern] --&amp;gt; I[Suffix];
    I --&amp;gt; J[replacementValue = &amp;quot;&amp;quot;];
    J --&amp;gt; K{Expression output};
    K --&amp;gt; L[jsmith];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example 5: Using regexPattern, regexGroupName and replacementAttributeName to handle scenarios when the source attribute is empty or doesn&amp;#39;t have a value.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute telephoneNumber. If telephoneNumber is empty, you want to extract the 10 digits of the mobile number attribute. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&amp;quot;, &amp;quot;phoneNumber&amp;quot; , , [mobile], )&lt;/p&gt;
&lt;p&gt;· source: [telephoneNumber] = &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;phoneNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementAttributeName: [mobile] = &amp;quot;+91 8887779999&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 8887779999&lt;/p&gt;
&lt;p&gt;[Figure: Text description of how to replace telephone number via regex pattern]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TB;
    M[source] --&amp;gt; N[empty string];
    O[regexPattern] --&amp;gt; P[phoneNumber];
    P --&amp;gt; Q[replacementAttributeName = &amp;quot;+91 8887779999&amp;quot;];
    Q --&amp;gt; R{Expression output};
    R --&amp;gt; S[8887779999];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example 6: You need to find characters that match a regular expression value and remove them.&lt;/p&gt;
&lt;p&gt;Replace([mailNickname], , &amp;quot;[a-zA-Z_]*&amp;quot; و , , )&lt;/p&gt;
&lt;p&gt;· source [mailNickname]&lt;/p&gt;
&lt;p&gt;· oldValue: &amp;quot;john_doe72&amp;quot;&lt;/p&gt;
&lt;p&gt;· replaceValue: &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 72&lt;/p&gt;
&lt;p&gt;[Figure: Text description of how to remove characters matching regular expression]&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TB;
    T[source] --&amp;gt; U[oldValue john_doe72];
    V[replaceValue] --&amp;gt; W[&amp;quot;&amp;quot;];
    W --&amp;gt; X{Expression output};
    X --&amp;gt; Y[72];
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;SelectUniqueValue&lt;/h1&gt;
&lt;p&gt;Function: SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ... )&lt;/p&gt;
&lt;p&gt;Description: Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This function must be at the top-level and cannot be nested.&lt;/li&gt;
&lt;li&gt;This function cannot be applied to attributes that have a matching precedence.&lt;/li&gt;
&lt;li&gt;This function is only meant to be used for entry creations. When using it with an attribute, set the Apply Mapping property to Only during object creation.&lt;/li&gt;
&lt;li&gt;This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/li&gt;
&lt;li&gt;The LDAP search that SelectUniqueValue function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the NormalizeDiacritics function as shown in the example below to normalize special characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1 ...&lt;/td&gt;
&lt;td&gt;At least 2 are required, no upper bound&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/p&gt;
&lt;p&gt;Example: Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;p&gt;ad-attr-mapping-expr&lt;/p&gt;
&lt;p&gt;SelectUniqueValue(&lt;/p&gt;
&lt;p&gt;Join (&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,&lt;/p&gt;
&lt;p&gt;[PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),&lt;/p&gt;
&lt;p&gt;Join (&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;), Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;) )&lt;/p&gt;
&lt;h1&gt;Sample input/output:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (PreferredFirstName):&lt;/strong&gt; &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT (PreferredLastName):&lt;/strong&gt; &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; doesn&amp;#39;t already exist in the directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; already exists in the directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in the directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SingleAppRoleAssignment&lt;/h1&gt;
&lt;p&gt;Function: SingleAppRoleAssignment([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Split&lt;/h1&gt;
&lt;p&gt;Function: Split(source, delimiter)&lt;/p&gt;
&lt;p&gt;Description: Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;![Figure: Expand table icon]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiter&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    expand_table_icon[&amp;quot;Expand table icon&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Split a string into a multi-valued array&lt;/h1&gt;
&lt;p&gt;Example: You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Expression: Split([extensionAttribute5], &amp;quot;,&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;StripSpaces&lt;/h1&gt;
&lt;p&gt;Function: StripSpaces(source)&lt;/p&gt;
&lt;p&gt;Description: Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;![Figure: Expand table icon]&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR;
    expand_table_icon[&amp;quot;Expand table icon&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Switch&lt;/h1&gt;
&lt;p&gt;Function: Switch(source, defaultValue, key1, value1, key2, value2, ... )&lt;/p&gt;
&lt;p&gt;Description: When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;) . In this example, the source attribute statusFlag may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;h3&gt;Caution&lt;/h3&gt;
&lt;p&gt;For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. Example: Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;) . In this example, if the source attribute statusFlag is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;h1&gt;Parameters:&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when source doesn&amp;#39;t match any keys. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Replace a value based on predefined set of options&lt;/h1&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;Expression: Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (state): &amp;quot;QLD&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Australia/Brisbane&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;ToLower&lt;/h1&gt;
&lt;p&gt;Function: ToLower(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to lower case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/p&gt;
&lt;p&gt;Example: You would like to generate the UPN value by concatenating the PreferredFirstName and PreferredLastName source fields and converting all characters to lower case.&lt;/p&gt;
&lt;p&gt;ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;ToUpper&lt;/h1&gt;
&lt;p&gt;Function: ToUpper(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Word&lt;/p&gt;
&lt;p&gt;Function: Word(String,WordNumber,Delimiters)&lt;/p&gt;
&lt;p&gt;Description: The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Word(&amp;quot;The quick brown fox&amp;quot;, 3,&amp;quot; &amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;Word(&amp;quot;This, string!has&amp;amp;many separators&amp;quot;, 3, &amp;quot;, ! &amp;amp;#&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h1&gt;Examples&lt;/h1&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h1&gt;Strip known domain name&lt;/h1&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;p&gt;Expression: Replace([mail], &amp;quot;@contoso.com&amp;quot;, , ,&amp;quot;&amp;quot;, ,)&lt;/p&gt;
&lt;p&gt;Sample input / output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;john.doe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Generate user alias by concatenating parts of first and last name&lt;/h1&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;JohDoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Add a comma between last name and first name&lt;/h1&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Doe, John&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Generate an ID for a user based on their Microsoft Entra ID object ID. Remove any letters from the ID and add 1000 at the beginning&lt;/h1&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectId]), &amp;quot;[a-zA-Z_]*&amp;quot;, &amp;quot;&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;· OUTPUT: &amp;quot;100064303565343762312333930392343435612626135652636136306362633065346234&amp;quot;&lt;/p&gt;
&lt;h1&gt;Related Articles&lt;/h1&gt;
&lt;p&gt;· Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/p&gt;
&lt;p&gt;· Customizing Attribute Mappings for User Provisioning&lt;/p&gt;
&lt;p&gt;· Scoping Filters for User Provisioning&lt;/p&gt;
&lt;p&gt;· Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/p&gt;
&lt;p&gt;· Account Provisioning Notifications&lt;/p&gt;
&lt;p&gt;· List of Tutorials on How to Integrate SaaS Apps&lt;/p&gt;
</content:encoded></item><item><title>mtoFromDocIntelOnly</title><link>https://www.elumenotion.com/journal/mtofromdocintelonly/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtofromdocintelonly/</guid><pubDate>Fri, 17 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;!-- PageHeader=&quot;Tell us about your PDF experience.&quot; --&gt;

&lt;h1&gt;Multitenant organizations documentation&lt;/h1&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h2&gt;About multitenant organizations&lt;/h2&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;Multitenant organization capabilities&lt;/p&gt;
&lt;p&gt;Compare multitenant capabilities&lt;/p&gt;
&lt;h2&gt;Configure a multitenant organization&lt;/h2&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;What is a multitenant organization?&lt;/p&gt;
&lt;p&gt;HOW-TO GUIDE&lt;/p&gt;
&lt;p&gt;Microsoft 365 admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;Configure cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;OVERVIEW&lt;/p&gt;
&lt;p&gt;What is cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;HOW-TO GUIDE&lt;/p&gt;
&lt;p&gt;Microsoft Entra admin center&lt;/p&gt;
&lt;p&gt;PowerShell or Microsoft Graph API
:selected: :selected:
Collaborate in Microsoft 365&lt;/p&gt;
&lt;p&gt;CONCEPT&lt;/p&gt;
&lt;p&gt;Identity provisioning for Microsoft 365 Microsoft 365 multitenant people search Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;h1&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;What is a tenant?&lt;/h2&gt;
&lt;p&gt;A tenant is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h2&gt;What is a multitenant organization?&lt;/h2&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;p&gt;· Conglomerates: Organizations with multiple subsidiaries or business units that operate independently.&lt;/p&gt;
&lt;p&gt;· Mergers and acquisitions: Organizations that merge or acquire companies.&lt;/p&gt;
&lt;p&gt;· Divestiture activity: In a divestiture, one organization splits off part of its business to form a new organization or sell it to an existing organization.&lt;/p&gt;
&lt;p&gt;. Multiple clouds: Organizations that have compliance or regulatory needs to exist in multiple cloud environments.&lt;/p&gt;
&lt;p&gt;· Multiple geographical boundaries: Organizations that operate in multiple geographic locations with various residency regulations.&lt;/p&gt;
&lt;p&gt;. Test or staging tenants: Organizations that need multiple tenants for testing or staging purposes before deploying more broadly to primary tenants.&lt;/p&gt;
&lt;p&gt;. Department or employee-created tenants: Organizations where departments or employees have created tenants for development, testing, or separate control.&lt;/p&gt;
&lt;h2&gt;Multitenant challenges&lt;/h2&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/0 --&gt;

&lt;!-- FigureContent=&quot;X X Tenant Primary tenant Tenant&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;h3&gt;B2B direct connect&lt;/h3&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use Microsoft Entra B2B direct connect. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;h1&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:&lt;/h1&gt;
&lt;p&gt;. Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/1 --&gt;

&lt;!-- FigureContent=&quot;B2B direct connect users B2B direct connect users Tenant Primary tenant T Tenant Teams Connect shared channels +&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;For more information, see B2B direct connect overview.&lt;/p&gt;
&lt;h2&gt;B2B collaboration&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use Microsoft Entra B2B collaboration. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using B2B collaboration across multiple tenants:&lt;/p&gt;
&lt;p&gt;· Administrators must invite users using the B2B invitation process or build an onboarding experience using the B2B collaboration invitation manager.&lt;/p&gt;
&lt;p&gt;· Administrators might have to synchronize users using custom scripts.&lt;/p&gt;
&lt;p&gt;· Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/p&gt;
&lt;p&gt;. By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/2 --&gt;

&lt;!-- FigureContent=&quot;B2B collab users B2B collab users :selected: :selected: Tenant Primary tenant A 0 S Microsoft apps Non-Microsoft apps&quot; --&gt;

&lt;/figure&gt;


&lt;!-- PageHeader=&quot;For more information, see B2B collaboration overview.&quot; --&gt;

&lt;h1&gt;Cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use cross-tenant synchronization. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits with using cross-tenant synchronization:&lt;/p&gt;
&lt;p&gt;· Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/p&gt;
&lt;p&gt;· Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/p&gt;
&lt;p&gt;. Automatically update users and remove them when they leave the organization.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using cross-tenant synchronization across multiple tenants:&lt;/p&gt;
&lt;p&gt;. Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;p&gt;· Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/3 --&gt;

&lt;!-- FigureContent=&quot;B2B collab users (External members) B2B collab users (External members) Source tenant Cross-tenant sync Target tenant Cross-tenant sync Source tenant A 0 S + Microsoft apps Non-Microsoft apps&quot; --&gt;

&lt;/figure&gt;


&lt;!-- PageFooter=&quot;For more information, see What is cross-tenant synchronization ?.&quot; --&gt;
&lt;p&gt;:selected: :unselected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected:&lt;/p&gt;
&lt;h2&gt;Multitenant organization&lt;/h2&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;p&gt;· Differentiate in-organization and out-of-organization external users&lt;/p&gt;
&lt;p&gt;. Improved collaborative experience in new Microsoft Teams&lt;/p&gt;
&lt;p&gt;· Improved people search experience across tenants&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/4 --&gt;

&lt;!-- FigureContent=&quot;Owner tenant (C) Cross-tenant access settings + Member tenant (A) Member tenant (B)&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;For more information, see What is a multitenant organization in Microsoft Entra ID ?.&lt;/p&gt;
&lt;h2&gt;Compare multitenant capabilities&lt;/h2&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature. For more information about different external identity scenarios, see Comparing External Identities feature sets.&lt;/p&gt;
&lt;!-- PageFooter=&quot;Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Users can access Teams Connect shared channels hosted in external tenants.&lt;/td&gt;
&lt;td&gt;Users can access apps/resources hosted in external tenants, usually with limited guest privileges. Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant&lt;/td&gt;
&lt;td&gt;Users can seamlessly access apps/resources across the same organization, even if they&amp;#39;re hosted in different tenants.&lt;/td&gt;
&lt;td&gt;Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Enables external collaboration within Teams Connect shared channels only. More convenient for administrators because they don&amp;#39;t have to manage B2B users.&lt;/td&gt;
&lt;td&gt;Enables external collaboration. More control and monitoring for administrators by managing the B2B collaboration users. Administrators can limit the access that these external users have to their apps/resources.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators don&amp;#39;t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators continue to have full configuration ability via cross- tenant access settings. Optional cross-tenant access templates allow pre- configuration of cross-tenant access settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary administrator workflow&lt;/td&gt;
&lt;td&gt;Configure cross-tenant access to provide external users inbound access to tenant the credentials for their home tenant.&lt;/td&gt;
&lt;td&gt;Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration&lt;/td&gt;
&lt;td&gt;Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Create a multitenant organization, add (invite) tenants, join a multitenant organization. Leverage existing B2B collaboration users or use cross- tenant synchronization to&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;invitation manager.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;provision B2B collaboration users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust level&lt;/td&gt;
&lt;td&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/td&gt;
&lt;td&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect on users&lt;/td&gt;
&lt;td&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/td&gt;
&lt;td&gt;External users are added to a tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User type&lt;/td&gt;
&lt;td&gt;B2B direct connect user - N/A&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;td&gt;B2B collaboration user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External member&lt;/td&gt;
&lt;td&gt;- External member (default) :unselected:&lt;/td&gt;
&lt;td&gt;- External member (default) :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External guest (default)&lt;/td&gt;
&lt;td&gt;- External guest :unselected:&lt;/td&gt;
&lt;td&gt;- External guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following diagram shows how B2B direct connect, B2B collaboration, and cross- tenant synchronization capabilities could be used together.&lt;/p&gt;
&lt;!-- PageHeader=&quot;Org-to-org external&quot; --&gt;

&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/5 --&gt;

&lt;!-- FigureContent=&quot;Org internal B2B collaboration Adatum Corporation (External collaborator) B2B collab users (External members) B2B collab users (External guests) Fabrikam (Acquired) Cross-tenant sync Contoso (Primary tenant) B2B direct connect B2B direct connect users Trey Research + (External collaborator)&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Terminology&lt;/h2&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, you can refer back to the following list of terms.&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but that hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don&amp;#39;t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· What is a multitenant organization in Microsoft Entra ID?&lt;/p&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;h1&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Why use multitenant organization?&lt;/h2&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;p&gt;· Define a group of tenants belonging to your organization&lt;/p&gt;
&lt;p&gt;· Collaborate across your tenants in new Microsoft Teams&lt;/p&gt;
&lt;p&gt;. Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/p&gt;
&lt;h2&gt;Who should use it?&lt;/h2&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra- organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for external identities.&lt;/p&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;p&gt;· Differentiate in-organization and out-of-organization external users&lt;/p&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.
:unselected:&lt;/p&gt;
&lt;h3&gt;· Improved collaborative experience in Microsoft Teams&lt;/h3&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations &amp;amp; and Microsoft Teams: Advantages of the new architecture &amp;amp;Z.&lt;/p&gt;
&lt;p&gt;· Improved people search experience across tenants&lt;/p&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards. For more information, see Microsoft 365 multitenant organization people search.&lt;/p&gt;
&lt;h2&gt;How does a multitenant organization work?&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;p&gt;· Define a multitenant organization&lt;/p&gt;
&lt;p&gt;One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;p&gt;· Join a multitenant organization&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Leave a multitenant organization&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.
:unselected: :unselected: :unselected: :unselected:
A multitenant organization is established as a collaboration of equals. Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to- tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;p&gt;· Cross-tenant access partner configurations&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;p&gt;· Cross-tenant access identity synchronization&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and cross TenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;h2&gt;Multitenant organization example&lt;/h2&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/6 --&gt;

&lt;!-- FigureContent=&quot;Owner tenant (C) Cross-tenant access settings + Member tenant (A) Member tenant (B)&quot; --&gt;

&lt;/figure&gt;


&lt;!-- PageFooter=&quot;[] Expand table&quot; --&gt;
&lt;p&gt;:selected: :unselected: :unselected: :selected: :unselected: :unselected:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Templates for cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Tenant role and state&lt;/h2&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;p&gt;03 Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tenant role&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- PageFooter=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tenant state&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator&amp;#39;s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user&amp;#39;s view of a multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Constraints&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:&lt;/p&gt;
&lt;p&gt;· Any given tenant can only create or join a single multitenant organization.&lt;/p&gt;
&lt;p&gt;. Any multitenant organization must have at least one active owner tenant.&lt;/p&gt;
&lt;p&gt;· Each active tenant must have cross-tenant access settings for all active tenants.&lt;/p&gt;
&lt;p&gt;· Any active tenant may leave a multitenant organization by removing themselves from it.&lt;/p&gt;
&lt;p&gt;· A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/p&gt;
&lt;h2&gt;Limits&lt;/h2&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Limit Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;External user segmentation&lt;/h2&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;p&gt;· External members originating from within a multitenant organization&lt;/p&gt;
&lt;p&gt;· External guests originating from within a multitenant organization&lt;/p&gt;
&lt;p&gt;· External members originating from outside of your organization&lt;/p&gt;
&lt;p&gt;· External guests originating from outside of your organization&lt;/p&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h2&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;. If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/p&gt;
&lt;p&gt;· If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/p&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h2&gt;Step 1: Plan your deployment&lt;/h2&gt;
&lt;p&gt;For more information, see Plan for multitenant organizations in Microsoft 365.
:unselected: :unselected:&lt;/p&gt;
&lt;h2&gt;Step 2: Create your multitenant organization&lt;/h2&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;p&gt;· First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/p&gt;
&lt;p&gt;· Owner tenant adds one or more joiner tenants.&lt;/p&gt;
&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;p&gt;. Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/p&gt;
&lt;p&gt;. To allow for asynchronous processing, wait up to 2 hours.&lt;/p&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;h2&gt;Step 4: Synchronize users&lt;/h2&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;p&gt;· Synchronize users in multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;. Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/p&gt;
&lt;p&gt;· Your alternative bulk provisioning engine&lt;/p&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID &amp;amp;Z.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;. Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;h1&gt;· What is cross-tenant synchronization?
:selected:
What is cross-tenant synchronization?&lt;/h1&gt;
&lt;p&gt;Article · 01/03/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting Microsoft Entra B2B collaboration users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;p&gt;· Seamless collaboration for a multitenant organization&lt;/p&gt;
&lt;p&gt;· Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/p&gt;
&lt;p&gt;. Automatically remove B2B accounts when a user leaves the organization&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBcz&quot;&gt;https://www.youtube-nocookie.com/embed/7B-PQwNfGBcz&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Why use cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as ServiceNow, Adobe, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as Microsoft Entra Conditional Access and cross- tenant access settings, and can be governed through features such as Microsoft Entra entitlement management.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/7 --&gt;

&lt;!-- FigureContent=&quot;Internal Cross-tenant sync User1 User2 External A Fabrikam Mexico Internal S User4 Microsoft apps External Internal Contoso User1 User3 User3 External Cross-tenant sync Non-Microsoft apps + Fabrikam US&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Who should use?&lt;/h2&gt;
&lt;p&gt;. Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/p&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;p&gt;. Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/p&gt;
&lt;p&gt;. Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/p&gt;
&lt;p&gt;. Automatically update users and remove them when they leave the organization.&lt;/p&gt;
&lt;h2&gt;Teams and Microsoft 365&lt;/h2&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the member userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.
:unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected: :selected:&lt;/p&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;p&gt;· Based on the Microsoft Entra provisioning engine.&lt;/p&gt;
&lt;p&gt;. Is a push process from the source tenant, not a pull process from the target tenant.&lt;/p&gt;
&lt;p&gt;. Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/p&gt;
&lt;p&gt;· Users in scope for synchronization are configured in the source tenant.&lt;/p&gt;
&lt;p&gt;. Attribute mapping is configured in the source tenant.&lt;/p&gt;
&lt;p&gt;· Extension attributes are supported.&lt;/p&gt;
&lt;p&gt;. Target tenant administrators can stop a synchronization at any time.&lt;/p&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;p&gt;03 Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;✔️ :selected:&lt;/td&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Cross-tenant synchronization setting&lt;/h2&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a check box with the name Allow users sync into this tenant that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.
:unselected: :unselected:
Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;h1&gt;Inbound access settings - Contoso&lt;/h1&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;B2B collaboration B2B direct connect Trust settings Cross-tenant sync&lt;/p&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.
 :selected:
Allow users sync into this tenant&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update&lt;/p&gt;
&lt;p&gt;crossTenantIdentitySyncPolicyPartner API. For more information, see Configure cross- tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Automatic redemption setting&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a check box with the following name:&lt;/p&gt;
&lt;p&gt;. Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/8 --&gt;

&lt;!-- FigureContent=&quot;Automatic redemption Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&apos;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well. Learn more :selected: Automatically redeem invitations with the tenant fc19f6b2-c752-43d3-a1aa-c75e9a85a7dc. + Save Discard&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Compare setting for different scenarios&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;p&gt;+
:selected: :unselected:
· When users are created in a target tenant using cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· When users are added to a resource tenant using B2B collaboration.&lt;/p&gt;
&lt;p&gt;· When users access resources in a resource tenant using B2B direct connect.&lt;/p&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;p&gt;() Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see Consent experience for applications in Microsoft Entra ID. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h2&gt;When is consent prompt suppressed?&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/9 --&gt;

&lt;!-- FigureContent=&quot;Source tenant Target tenant Outbound access settings :selected: V Automatically redeem invitations Inbound access settings :selected: Automatically redeem invitations&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;!-- PageHeader=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home/source tenant&lt;/th&gt;
&lt;th&gt;Resource/target tenant&lt;/th&gt;
&lt;th&gt;Consent prompt behavior for source tenant users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;Suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;:selected: &amp;gt;&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:selected: V&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update cross TenantAccessPolicyConfigurationPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;How do users know what tenants they belong to?&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their My Account &amp;amp; page and select Organizations. In the Microsoft Entra admin center, users can open their Portal settings, view their Directories + subscriptions, and switch directories.&lt;/p&gt;
&lt;p&gt;For more information, including privacy information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Step 1: Define how to structure the tenants in your organization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/10 --&gt;

&lt;/figure&gt;



&lt;h3&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/h3&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/11 --&gt;

&lt;!-- FigureContent=&quot;Target tenant Inbound access settings :selected: Allow users sync into this tenant :selected: Automatically redeem invitations&quot; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/h3&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;p&gt;· Which users you want to synchronize&lt;/p&gt;
&lt;p&gt;· What attributes you want to include&lt;/p&gt;
&lt;p&gt;· Any transformations&lt;/p&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured,&lt;/p&gt;
&lt;p&gt;you can start testing with a few users and make sure they&amp;#39;re created with all the attributes that you need. When testing is complete, you can quickly add additional users to synchronize and roll out across your organization. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/12 --&gt;

&lt;!-- FigureContent=&quot;Source tenant Cross-tenant synchronization Target tenant Outbound access settings :selected: Automatically redeem invitations Inbound access settings :selected: Allow users sync into this tenant :selected: Automatically redeem invitations&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID Z .&lt;/p&gt;
&lt;p&gt;In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing model. To understand the external identities licensing model, see MAU billing model for Microsoft Entra External ID. You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/p&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;h2&gt;Clouds&lt;/h2&gt;
&lt;p&gt;Which clouds can cross-tenant synchronization be used in?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/p&gt;
&lt;p&gt;· Synchronization is only supported between two tenants in the same cloud.&lt;/p&gt;
&lt;p&gt;· Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/p&gt;
&lt;p&gt;Existing B2B users&lt;/p&gt;
&lt;!-- PageFooter=&quot;Will cross-tenant synchronization manage existing B2B users?&quot; --&gt;

&lt;p&gt;. Yes. Cross-tenant synchronization uses an internal attribute called the alternativeSecurityIdentifier to uniquely match an internal user in the source tenant with an external / B2B user in the target tenant. Cross-tenant synchronization can update existing B2B users, ensuring that each user has only one account.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization cannot match an internal user in the source tenant with an internal user in the target tenant (both type member and type guest).&lt;/p&gt;
&lt;h2&gt;Synchronization frequency&lt;/h2&gt;
&lt;p&gt;How often does cross-tenant synchronization run?&lt;/p&gt;
&lt;p&gt;. The sync interval is currently fixed to start at 40-minute intervals. Sync duration varies based on the number of in-scope users. The initial sync cycle is likely to take significantly longer than the following incremental sync cycles.&lt;/p&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;p&gt;How do I control what is synchronized into the target tenant?&lt;/p&gt;
&lt;p&gt;. In the source tenant, you can control which users are provisioned with the configuration or attribute-based filters. You can also control what attributes on the user object are synchronized. For more information, see Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;p&gt;If a user is removed from the scope of sync in a source tenant, will cross-tenant synchronization soft delete them in the target?&lt;/p&gt;
&lt;p&gt;. Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant synchronization will soft delete them in the target tenant.&lt;/p&gt;
&lt;h2&gt;Object types&lt;/h2&gt;
&lt;p&gt;What object types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Microsoft Entra users can be synchronized between tenants. (Groups, devices, and contacts aren&amp;#39;t currently supported.)&lt;/p&gt;
&lt;p&gt;What user types can be synchronized?&lt;/p&gt;
&lt;p&gt;· Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t be synchronized from source tenants.&lt;/p&gt;
&lt;p&gt;· Users can be synchronized to target tenants as external members (default) or external guests.
:unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :selected: :unselected:
. For more information about the UserType definitions, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;p&gt;I have existing B2B collaboration users. What will happen to them?&lt;/p&gt;
&lt;p&gt;. Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/p&gt;
&lt;h2&gt;Attributes&lt;/h2&gt;
&lt;p&gt;What user attributes can be synchronized?&lt;/p&gt;
&lt;p&gt;. Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including (but not limited to) displayName, userPrincipalName, and directory extension attributes.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024 with the default schema / attribute mappings:&lt;/p&gt;
&lt;p&gt;o The manager attribute will automatically be added to the mappings.
 :unselected:
o This does not trigger an initial sync cycle.&lt;/p&gt;
&lt;p&gt;o Manager updates will apply on the incremental cycle for users that are undergoing changes (e.g. manager change). The sync engine doesn&amp;#39;t automatically update all existing users that were provisioned previously.
 :unselected:
o To update the manager for existing users that are in scope for provisioning, you can use on-demand provisioning for specific users or do a restart to provision the manager for all users.&lt;/p&gt;
&lt;p&gt;o For cross-tenant synchronization configurations created before January 2024 :unselected: with a custom schema / attribute mappings (e.g. you added an attribute to the mappings or changed the default mappings):&lt;/p&gt;
&lt;p&gt;o You need to manually add the manager attribute to your attribute mappings.
 :unselected:
This will trigger a restart and update all users that are in scope for provisioning. This should be a direct mapping of the manager attribute in the source tenant to the manager in the target tenant.&lt;/p&gt;
&lt;p&gt;o If the manager of a user is removed in the source tenant and no new manager is :unselected: assigned in the source tenant, the manager attribute will not be updated in the target tenant.&lt;/p&gt;
&lt;!-- PageFooter=&quot;What attributes can&apos;t be synchronized?&quot; --&gt;
&lt;p&gt;:unselected: :selected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected:
· Attributes including (but not limited to) photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Can I control where user attributes are sourced/managed?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority. The user and its attributes are deemed authoritative at the source tenant. There are parallel sources of authority workstreams that will evolve source of authority controls for users down to the attribute level and a user object at the source may ultimately reflect multiple underlying sources. For the tenant-to-tenant process, this is still treated as the source tenant&amp;#39;s values being authoritative for the sync process (even if pieces actually originate elsewhere) into the target tenant. Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization only supports source of authority at the object level. That means all attributes of a user must come from the same source, including credentials. It isn&amp;#39;t possible to reverse the source of authority or federation direction of a synchronized object.&lt;/p&gt;
&lt;p&gt;What happens if attributes for a synced user are changed in the target tenant?&lt;/p&gt;
&lt;p&gt;. Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no changes are made to the synced user in the source tenant, then user attribute changes made in the target tenant will persist. However, if changes are made to the user in the source tenant, then during the next synchronization cycle, the user in the target tenant will be updated to match the user in the source tenant.&lt;/p&gt;
&lt;p&gt;Can the target tenant manually block sign-in for a specific home/source tenant user that is synced?&lt;/p&gt;
&lt;p&gt;. If no changes are made to the synced user in the source tenant, then the block sign-in setting in the target tenant will persist. If a change is detected for the user in the source tenant, cross-tenant synchronization will re-enable that user blocked from sign-in in the target tenant.&lt;/p&gt;
&lt;h2&gt;Structure&lt;/h2&gt;
&lt;p&gt;Can I sync a mesh between multiple tenants?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization is configured as a single-direction peer-to-peer sync, meaning sync is configured between one source and one target tenant. Multiple instances of cross-tenant synchronization can be configured to sync from a single
:unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected:
source to multiple targets and from multiple sources into a single target. But only one sync instance can exist between a source and a target.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization only synchronizes users that are internal to the home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is written back to the same tenant.&lt;/p&gt;
&lt;p&gt;· Multiple topologies are supported. For more information, see Topologies for cross- tenant synchronization.&lt;/p&gt;
&lt;p&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/p&gt;
&lt;p&gt;· For privacy reasons, cross-tenant synchronization is intended for use within an organization. We recommend using entitlement management for inviting B2B collaboration users across organizations.&lt;/p&gt;
&lt;p&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/p&gt;
&lt;p&gt;. No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. In addition, tenant migrations would require migrating user data such as SharePoint and OneDrive.&lt;/p&gt;
&lt;h3&gt;B2B collaboration&lt;/h3&gt;
&lt;p&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/p&gt;
&lt;p&gt;. Since cross-tenant synchronization is built on existing B2B collaboration technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App or service&lt;/td&gt;
&lt;td&gt;Limitations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B. :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;B2B direct connect&lt;/h3&gt;
&lt;p&gt;How does cross-tenant synchronization relate to B2B direct connect?
:unselected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected:
. B2B direct connect is the underlying identity technology required for Teams Connect shared channels.&lt;/p&gt;
&lt;p&gt;. We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/p&gt;
&lt;p&gt;· B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/p&gt;
&lt;p&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/p&gt;
&lt;p&gt;. There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/p&gt;
&lt;h2&gt;Microsoft 365&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/p&gt;
&lt;p&gt;· Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/p&gt;
&lt;p&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/p&gt;
&lt;p&gt;. Yes, but you must set the value for the showInAddressList attribute of synchronized users to True, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology. For more information, see Step 9: Review attribute mappings.&lt;/p&gt;
&lt;p&gt;· Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/p&gt;
&lt;h2&gt;Teams&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/p&gt;
&lt;p&gt;· Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.
:unselected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :selected: :unselected: :unselected: :unselected: :selected: :unselected:&lt;/p&gt;
&lt;h2&gt;Integration&lt;/h2&gt;
&lt;p&gt;What federation options are supported for users in the target tenant back to the source tenant?&lt;/p&gt;
&lt;p&gt;· For each internal user in the source tenant, cross-tenant synchronization creates a federated external user (commonly used in B2B) in the target. It supports syncing internal users. This includes internal users federated to other identity systems using domain federation (such as Active Directory Federation Services). It doesn&amp;#39;t support syncing external users.&lt;/p&gt;
&lt;p&gt;Does cross-tenant synchronization use System for Cross-Domain Identity Management (SCIM)?&lt;/p&gt;
&lt;p&gt;. No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For more information, see SCIM synchronization with Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Deprovisioning&lt;/h3&gt;
&lt;p&gt;Does cross-tenant synchronization support deprovisioning users?&lt;/p&gt;
&lt;p&gt;. Yes, when the below actions occur in the source tenant, the user will be soft deleted in the target tenant.&lt;/p&gt;
&lt;p&gt;o Delete the user in the source tenant
 :unselected:
o Unassign the user from the cross-tenant synchronization configuration
 :unselected:
o Remove the user from a group that is assigned to the cross-tenant :unselected: synchronization configuration&lt;/p&gt;
&lt;p&gt;o An attribute on the user changes such that they do not meet the scoping filter conditions defined on the cross-tenant synchronization configuration anymore&lt;/p&gt;
&lt;p&gt;. If the user is blocked from sign-in in the source tenant (accountEnabled = false) they will be blocked from sign-in in the target. This is not a deletion, but an updated to the accountEnabled property.&lt;/p&gt;
&lt;p&gt;· Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;p&gt;1. Add a user to a group and assign it to the cross-tenant synchronization configuration in the source tenant.&lt;/p&gt;
&lt;p&gt;2. Provision the user on-demand or through the incremental cycle.&lt;/p&gt;
&lt;p&gt;3. Update the account enabled status to false on the user in the source tenant.&lt;/p&gt;
&lt;p&gt;4. Provision the user on-demand or through the incremental cycle. The account enabled status is changed to false in the target tenant.&lt;/p&gt;
&lt;p&gt;5. Remove the user from the group in the source tenant.
:unselected: :unselected: :unselected: :selected: :unselected: :unselected: :selected: :selected:
Does cross-tenant synchronization support restoring users?&lt;/p&gt;
&lt;p&gt;. If the user in the source tenant is restored, reassigned to the app, meets the scoping condition again within 30 days of soft deletion, it will be restored in the target tenant.&lt;/p&gt;
&lt;p&gt;. IT admins can also manually restore the user directly in the target tenant.&lt;/p&gt;
&lt;p&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;· Unassign all users and / or groups from the cross-tenant synchronization configuration. This will trigger all the users that were unassigned, either directly or through group membership, to be deprovisioned in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to Sync all users and groups, you will also need to change it to Sync only assigned users and groups. The users will be automatically soft deleted by cross-tenant synchronization. The users will be automatically hard deleted after 30 days or you can choose to hard delete the users directly from the target tenant. You can choose to hard delete the users directly in the target tenant or wait 30 days for the users to be automatically hard deleted.&lt;/p&gt;
&lt;p&gt;If the sync relationship is severed, are external users previously managed by cross- tenant synchronization deleted in the target tenant?&lt;/p&gt;
&lt;p&gt;· No. No changes are made to the external users previously managed by cross- tenant synchronization if the relationship is severed (for example, if the cross- tenant synchronization policy is deleted).&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Topologies for cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;· Configure cross-tenant synchronization
:selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected: :unselected:
Multitenant organization identity provisioning for Microsoft 365&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h2&gt;Microsoft 365 people search&lt;/h2&gt;
&lt;p&gt;Teams external access and Teams shared channels excluded, Microsoft 365 people search is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h2&gt;New Microsoft Teams&lt;/h2&gt;
&lt;p&gt;The new Microsoft Teams experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations &amp;amp;2 .&lt;/p&gt;
&lt;h2&gt;Collaborating user set&lt;/h2&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/13 --&gt;

&lt;!-- FigureContent=&quot;Tenant A Tenant B Tenant C Internal Internal Internal :selected: + Annie Bob Barbara Charles&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;For people search to succeed, while scoped to local tenant boundaries, the entire collaborating user set must be represented within the scope of each multitenant organization tenant A, B, and C, in the form of either internal or B2B identities.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/14 --&gt;

&lt;!-- FigureContent=&quot;Tenant A Tenant B Tenant C Internal Internal Internal Annie Bob Barbara Charles External External External + Bob Barbara Charles Annie Charles Annie Bob Barbara&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Depending on your organization&amp;#39;s needs, the collaborating user set may contain a subset of collaborating employees, or eventually all employees.&lt;/p&gt;
&lt;h2&gt;Sharing your us&lt;/h2&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization them outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;p&gt;· Administrator A contributes or shares Annie&lt;/p&gt;
&lt;p&gt;· Administrator B contributes or shares Bob and Barbara&lt;/p&gt;
&lt;p&gt;· Administrator C contributes or shares Charles
:selected: :selected: :selected: :selected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: figures/15 --&gt;

&lt;!-- FigureContent=&quot;Tenant B Internal Bob Barbara External :selected: Annie Charles Tenant A Tenant C Internal Internal :selected: :selected: Annie Charles External External + Bob Barbara Charles Annie Bob Barbara&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set across multitenant organization tenants. For more information, see Synchronize users in multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;p&gt;Alternatively, pair-wise configuration of inbound and outbound cross-tenant synchronization can be used to orchestrate such collating user set across multitenant organization tenants. For more information, see What is a cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;B2B member users&lt;/h3&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User synchronization method&lt;/th&gt;
&lt;th&gt;Default userType property&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see Compare member and guest default permissions.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To change the userType from Guest to Member (or vice versa), a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;h2&gt;Unsharing your users&lt;/h2&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Plan for multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;. Set up a multitenant org in Microsoft 365&lt;/p&gt;
&lt;h1&gt;Multitenant organization optional policy templates&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to- tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross- tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Autogeneration of cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional cross- tenant access settings, for both, partner configuration and identity synchronization. These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross- tenant access settings pass through the default settings.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy behavior, it allows your organization to easily customize the cross-tenant access settings for partner tenants in the multitenant organization on a per-tenant basis.&lt;/p&gt;
&lt;h2&gt;Policy templates at multitenant organization formation&lt;/h2&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding cross- tenant access settings, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;p&gt;. The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/p&gt;
&lt;p&gt;· Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.
:unselected: :unselected: :unselected: :selected:
· Administrator C joins the multitenant organization. Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/p&gt;
&lt;p&gt;. Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/p&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see Configure multitenant organization templates.&lt;/p&gt;
&lt;h2&gt;Policy template scoping and additional properties&lt;/h2&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross- tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, new partners refer to tenants for which you haven&amp;#39;t yet configured cross- tenant access settings, while existing partners refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the templateApplicationLevel property on the cross-tenant access partner configuration template and the templateApplicationLevel property on the cross-tenant access identity synchronization template.
:unselected: :unselected: :unselected: :unselected:
Finally, in terms of interpretation of template property values, any template property value of null has no effect on the corresponding property value in the targeted cross- tenant access settings, while a defined template property value causes the corresponding property value in the targeted cross-tenant access settings to be amended in accordance with the template. The following table illustrates how template property values are being applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;p&gt;() Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;any value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Policy templates used by Microsoft 365 admin center&lt;/h2&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;p&gt;· Identity synchronization is set to allow users to synchronize into this tenant&lt;/p&gt;
&lt;p&gt;· Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/p&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to true :&lt;/p&gt;
&lt;p&gt;. automaticUserConsentSettings. inboundAllowed&lt;/p&gt;
&lt;p&gt;. automaticUserConsentSettings . outboundAllowed&lt;/p&gt;
&lt;p&gt;· userSyncInbound&lt;/p&gt;
&lt;p&gt;For more information, see Join or leave a multitenant organization in Microsoft 365.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access settings at time of multitenant organization disassembly&lt;/h2&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Configure multitenant organization templates using the Microsoft Graph API&lt;/p&gt;
&lt;h2&gt;Limitations in multitenant organizations&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see Microsoft Entra UserVoice Z. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;p&gt;03 Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;- Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;- Microsoft 365 admin center limitations related to multitenant organizations - Microsoft 365 multitenant organization people search experiences - Cross-tenant synchronization limitations related to Microsoft 365 :unselected: :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;- Cross-tenant synchronization unrelated to Microsoft 365 - End user experiences in new Teams - End user experiences in Power BI - Tenant migration or consolidation :unselected: :unselected: :unselected: :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported scenarios&lt;/td&gt;
&lt;td&gt;- Seamless collaboration experience across multitenant organizations in classic Teams - Self-service for multitenant organizations larger than 100 tenants - Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet - Cross-cloud multitenant organizations :unselected: :unselected: :unselected: :selected: :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;. Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;/p&gt;
&lt;p&gt;o In the identity platform, both methods are represented as Microsoft Entra cross- tenant synchronization jobs.&lt;/p&gt;
&lt;p&gt;o Synchronization jobs created with Microsoft Entra ID will not appear in the :unselected: Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;. If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/p&gt;
&lt;p&gt;· You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/p&gt;
&lt;p&gt;· By default, new B2B users are provisioned as B2B members, while existing B2B :unselected: guests remain B2B guests.&lt;/p&gt;
&lt;p&gt;. You can opt to convert B2B guests into B2B members by setting Apply this :unselected: mapping to Always.&lt;/p&gt;
&lt;p&gt;. If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an Outbound sync status of Not configured. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;. If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants to or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name MTO_Sync _&amp;lt; TenantID&amp;gt; . Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;· Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross- tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with userSyncInbound set to true, as facilitated by Microsoft 365 admin center.&lt;/p&gt;
&lt;p&gt;· There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/p&gt;
&lt;h2&gt;Join requests&lt;/h2&gt;
&lt;p&gt;. There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.
:unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected:
. If you followed the correct sequence to create a multitenant organization and add a tenant to the multitenant organization, and the added tenant&amp;#39;s join request keeps failing, submit a support request in the Microsoft Entra or Microsoft 365 admin center.&lt;/p&gt;
&lt;h2&gt;Microsoft apps&lt;/h2&gt;
&lt;p&gt;. In SharePoint OneDrive, the promotion of B2B guests to B2B members might not happen automatically. If faced with a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try Set-SPUser [-SyncFromAD].&lt;/p&gt;
&lt;p&gt;. In SharePoint OneDrive user interfaces, when sharing a file with People in Fabrikam, the current user interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards People in Fabrikam.&lt;/p&gt;
&lt;p&gt;. In Microsoft Forms, B2B member users might not be able to access forms.&lt;/p&gt;
&lt;p&gt;· In Microsoft Power BI, B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/p&gt;
&lt;p&gt;. In Microsoft Power Apps, Microsoft Dynamics 365, and related workloads, B2B member users may have restricted functionality. For more information, see Invite users with Microsoft Entra B2B collaboration.&lt;/p&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;p&gt;. The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the default permissions for B2B members.&lt;/p&gt;
&lt;p&gt;· To promote B2B guests to B2B members, a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurringly synchronized.&lt;/p&gt;
&lt;p&gt;. As your organization rolls out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others users as B2B members. To achieve this, you might want to establish two Microsoft Entra cross- tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with Apply this mapping set to
:selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected:
Always. By moving a user from one configuration&amp;#39;s scope to the other, you can easily control who will be a B2B guest or a B2B member in the target tenant.&lt;/p&gt;
&lt;p&gt;· As part of a multitenant organization, reset redemption for an already redeemed B2B user is currently disabled.&lt;/p&gt;
&lt;p&gt;. The at-scale provisioning of B2B users might collide with contact objects. The handling or conversion of contact objects is currently not supported.&lt;/p&gt;
&lt;p&gt;. Using Microsoft Entra cross-tenant synchronization to target hybrid identities that have been converted to B2B users has not been tested in source of authority conflicts and is not supported.&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization deprovisioning&lt;/h2&gt;
&lt;p&gt;· By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;p&gt;· Currently, SkipOutOfScopeDeletions works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set Target Object Actions for Delete to disabled.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;h1&gt;. Known issues for provisioning in Microsoft Entra ID
:unselected: :unselected: :selected: :unselected: :unselected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected:
Topologies for cross-tenant collaboration&lt;/h1&gt;
&lt;p&gt;Article · 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;p&gt;V Hub and spoke&lt;/p&gt;
&lt;p&gt;V Mesh&lt;/p&gt;
&lt;p&gt;V Just-in-time&lt;/p&gt;
&lt;h2&gt;Hub and spoke&lt;/h2&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;p&gt;. Option 1 (application hub): In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/p&gt;
&lt;p&gt;· Option 2 (user hub): Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h2&gt;Mergers and acquisitions (application hub)&lt;/h2&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time limited access to additional applications such as Salesforce and Amazon Web Services
:selected: :selected: :selected: :unselected: :unselected: :unselected:
that contain business critical data. The following diagram shows recently acquired tenants on the left and their users being provisioned into the parent company&amp;#39;s tenant, which grants users access to the necessary resources.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/16 --&gt;

&lt;!-- FigureContent=&quot;HR salesforce aws SaaS apps A Microsoft apps SQL On-premises apps Active Directory&quot; --&gt;

&lt;/figure&gt;


&lt;h1&gt;Separate collaboration and resource tenants (user hub)&lt;/h1&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/17 --&gt;

&lt;!-- FigureContent=&quot;HR A A salesforce A Active Directory&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Mesh&lt;/h2&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h2&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/18 --&gt;

&lt;!-- FigureContent=&quot;aws salesforce salesforce&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a separate configuration.&lt;/p&gt;
&lt;h2&gt;Collaborate across business units (full-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/19 --&gt;

&lt;!-- FigureContent=&quot;aws salesforce salesforce&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Just-in-time&lt;/h2&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h2&gt;Joint ventures&lt;/h2&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;p&gt;The following diagram shows how two organizations can just-in-time collaborate by using connected organizations and entitlement management.&lt;/p&gt;
&lt;p&gt;| | | |
||| Litware Litware Litware user 1  user 2  user 3 |&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/20 --&gt;

&lt;!-- FigureContent=&quot;Contoso Litware Connected organization Resources = Marketing catalog = Sales catalog Marketing Sales team Sales team group group group Sales app :unselected: Sales S Sales site :unselected: Marketing app app Salesperson access package Sales support access package S S Marketing site Sales team group: member Sales site Sales app: contributor 0℃ 2 Sales site: member Employees can request Policies for access request, approval, review, lifecycle, separation of duties (SOD) User 1 User 2 User 3 Outside sales reps can request&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful? 3 Yes&lt;/p&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;h1&gt;Provide product feedback &amp;amp; | Get help at Microsoft Q&amp;amp;A
:unselected: :selected: :selected: :selected: :unselected: :selected: :selected: :unselected: :unselected: :unselected: :unselected: :unselected:
Governance and cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/21/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross- tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how Microsoft Entra ID Governance customers can use cross- tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h2&gt;Deployment example&lt;/h2&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;p&gt;· Manage employee identity lifecycles across multiple tenants&lt;/p&gt;
&lt;p&gt;. Use workflows to automate lifecycle processes for employees that originate in other tenants&lt;/p&gt;
&lt;p&gt;. Assign resource access automatically to employees that originate in other tenants&lt;/p&gt;
&lt;p&gt;. Allow employees to request access to resources in multiple tenants&lt;/p&gt;
&lt;p&gt;· Review the access of synchronized users&lt;/p&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant. The following diagram illustrates the topology.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/21 --&gt;

&lt;!-- FigureContent=&quot;Marketing catalog Resources Marketing :unselected: Cross- tenant sync Planning :unselected: Salesforce Marketing campaign access package Automatic assignment Access Box resource role Salesforce resource role Planning resource role policy Reviews E IMtémal utért policy Access Packages Contoso EMEA Hybrid Identity Administrator Contoso Cross- tenant sync Contoso US Hybrid Identity Administrator Lifecycle Workflows&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;This supported topology for cross-tenant synchronization is one of many in Microsoft Entra ID. Tenants can be a source tenant, a target tenant, or both. In the following sections, learn how cross-tenant synchronization and Microsoft Entra ID Governance features address several scenarios.&lt;/p&gt;
&lt;h2&gt;Manage employee lifecycles across tenants&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization in Microsoft Entra ID automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various properties of a Microsoft Entra B2B collaboration user. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in multitenant organizations.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.
:unselected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: figures/22 --&gt;

&lt;!-- FigureContent=&quot;= :unselected: :unselected: Cross-tenant Synchronization (syncs user attribute data) Application provisioning Automatic assignment policies for access packages&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h2&gt;Automate lifecycle processes with workflows&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the createdDateTime event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as userType and userPrincipalName to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h2&gt;Govern synchronized user access with access packages&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;p&gt;Automatically assign access in target tenants to employees from source tenants&lt;/p&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create automatic assignment policies for access packages in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users:&lt;/p&gt;
&lt;p&gt;· In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access&lt;/p&gt;
&lt;p&gt;· In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users&lt;/p&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;h2&gt;Enable source-tenant employees to request access to target-tenant shared resources&lt;/h2&gt;
&lt;p&gt;With identity governance access package policies, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;h2&gt;Review synchronized-user access&lt;/h2&gt;
&lt;p&gt;Access reviews in Microsoft Entra ID enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn&amp;#39;t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;p&gt;Review source-tenant user access
:unselected:
Multitenant organizations can include internal users in access reviews. This action enables access recertification in source tenants that synchronizes users. Use this approach for regular review of security groups assigned to cross-tenant synchronization. Therefore, ongoing B2B collaboration access to other tenants has approval in the user home tenant.&lt;/p&gt;
&lt;p&gt;Use access reviews of users in source tenants to avoid potential conflicts between cross- tenant synchronization and access reviews that remove denied users upon completion.&lt;/p&gt;
&lt;h3&gt;Review target-tenant user access&lt;/h3&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users provisioned by cross-tenant synchronization in target tenants. This option enables access recertification of resources in target tenants. Although organizations can target all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn&amp;#39;t recommend removing denied guest users automatically from access reviews. Cross- tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Multitenant organizations and Microsoft 365&lt;/p&gt;
&lt;p&gt;· Multitenant organization templates&lt;/p&gt;
&lt;p&gt;· Topologies for cross-tenant synchronization&lt;/p&gt;
&lt;h2&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h2&gt;
&lt;p&gt;Article · 05/02/2024&lt;/p&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;p&gt;· The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/p&gt;
&lt;p&gt;. Example topologies for how you can implement your lifecycle and access controls.&lt;/p&gt;
&lt;p&gt;· Deployment considerations (roles, monitoring, APIs).&lt;/p&gt;
&lt;h2&gt;Manage the lifecycle and access of a SOC user&lt;/h2&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h2&gt;Lifecycle control&lt;/h2&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don&amp;#39;t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the&lt;/p&gt;
&lt;p&gt;target tenant. When they don&amp;#39;t have any remaining entitlements in the target tenant, their B2B account will automatically be removed. Learn more&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Comparing entitlement management and cross-tenant synchronization&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Entitlement management&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;:selected: ●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:selected: ●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td&gt;:selected: ●&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Access control&lt;/h2&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;h3&gt;Entitlement management&lt;/h3&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.
:unselected:&lt;/p&gt;
&lt;!-- PageHeader=&quot;Learn more&quot; --&gt;


&lt;h4&gt;Cross-tenant access policies&lt;/h4&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;h2&gt;Deployment topologies&lt;/h2&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h2&gt;Topology 1&lt;/h2&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: figures/23 --&gt;

&lt;!-- FigureContent=&quot;Source tenant Target tenant 1 SoC users&apos; governance 2 Guest accounts provisioning 3 Access packages assignment PERMISSIONS 2. Users are provisioned 3. SOC users will be auto-assigned Security Reader access. ORGANIZATION TRUST automatically through cross- tenant sync. SoC users will have eligible access for Security Operator and Security Admin roles. - CROSS-TENANT SYNC APPROVALS ADD Inject attributes to map to SoC access Packages SoC 1 Access Package 1 Security Reader SOC 2 Access Package 2 Security Operator REMOVE CHANGE ACCESS REVIEWS SoC 3 Access Package 3 Security Admin 1. Users are added to the SoC security SoC Team Security Groups groups through access packages.&quot; --&gt;

&lt;figcaption&gt;

&lt;p&gt;Steps to configure topology 1&lt;/p&gt;
&lt;/figcaption&gt;

&lt;/figure&gt;


&lt;p&gt;1. In the source tenant, configure cross-tenant synchronization to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/p&gt;
&lt;p&gt;As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll automatically be provisioned into the target tenant. As they&amp;#39;re removed from the configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute mappings, you can add a new mapping of type constant to provision a directory extension attribute on the user to indicate that they&amp;#39;re a SOC administrator. Alternatively, if you have an attribute such as department that you can rely on for this step, you can skip creating the extension. This attribute will be used in the target tenant to provide them with access to the necessary roles.&lt;/p&gt;
&lt;p&gt;2. In the source tenant, create an access package that includes the cross-tenant synchronization service principal as a resource.&lt;/p&gt;
&lt;p&gt;As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant synchronization service principal. Ensure that you set up periodic access reviews of the access package or time-limit the assignments to ensure that only the users that need access to the target tenant continue to have access.&lt;/p&gt;
&lt;p&gt;3. In the target tenant, create access packages to provide the necessary roles for investigating an incident.&lt;/p&gt;
&lt;p&gt;We recommend one autoassigned access package to provide the Security Reader role and one request based package for the Security Operator and Security Administrator roles.&lt;/p&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary access packages in the source tenant. Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the security reader role. They can then request additional access in any tenants where they need the Security Operator or Security Administrator roles. Once their access period is over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the target tenants they don&amp;#39;t need access to anymore.&lt;/p&gt;
&lt;h2&gt;Topology 2&lt;/h2&gt;
&lt;p&gt;In topology 2 the target tenant administrator defines the access packages and resources that the source users can request access to. If the source tenant administrator would like to restrict which of their users can access the target tenant, you can use a cross-tenant access policy coupled with an access package to block all access to the target tenant, except for users that are part of a group that is included in an access package in the home tenant.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/24) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Source tenant Target tenant 1 SoC users&apos; governance 2 Guest accounts provisioning 3 Access packages assignment 1. Establish a connected organization. PERMISSIONS Connected organization 2. Define access packages for the necessary roles. Ensure they are accessible by the connected org. 3. Upon requesting the access package, SoC users will be auto-assigned Security Reader access. SoC users will have eligible access for Security Operator and Security Admin roles. Access Package 1 Security Reader Access Package 2 Security Operator Access Package 3 Security Admin +&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Steps to configure topology 2&lt;/p&gt;
&lt;p&gt;1. In the target tenant, add the source tenant as a connected organization.&lt;/p&gt;
&lt;p&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/p&gt;
&lt;p&gt;2. In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/p&gt;
&lt;p&gt;3. Users from the source tenant can now request access packages in the target tenant.&lt;/p&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h3&gt;Topologies compared&lt;/h3&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;!-- PageHeader=&quot;provisioned into their tenant and perform the necessary approvals in their tenant, topology 2 will best meet their needs.&quot; --&gt;

&lt;h1&gt;Deployment considerations&lt;/h1&gt;
&lt;p&gt;Monitoring&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Defender are also audited.&lt;/p&gt;
&lt;p&gt;Learn more&lt;/p&gt;
&lt;h2&gt;Scaling deployment with PowerShell / APIs&lt;/h2&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell commandlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Role-based access control&lt;/h3&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;p&gt;. Configuring cross-tenant access settings - Security Administrator&lt;/p&gt;
&lt;p&gt;. Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/p&gt;
&lt;p&gt;. Configuring entitlement management - Identity Governance Administrator&lt;/p&gt;
&lt;p&gt;· Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· What is cross-tenant synchronization?&lt;/p&gt;
&lt;p&gt;· What is entitlement management?&lt;/p&gt;
&lt;p&gt;· Multitenant management in Defender XDR&lt;/p&gt;
&lt;h1&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 02/14/2024&lt;/p&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see Microsoft Entra application provision UserVoice Z. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h2&gt;1 Note&lt;/h2&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;h2&gt;Authorization&lt;/h2&gt;
&lt;h3&gt;Unable to change provisioning mode back to manual&lt;/h3&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h2&gt;Attribute mappings&lt;/h2&gt;
&lt;p&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/p&gt;
&lt;p&gt;The attributes SamAccountName and userType aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see Missing source attribute.&lt;/p&gt;
&lt;h2&gt;Source attribute dropdown missing for schema extension&lt;/h2&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and&lt;/p&gt;
&lt;p&gt;manually add the attributes. To learn more, see Customize attribute mappings.&lt;/p&gt;
&lt;h2&gt;Null attribute can&amp;#39;t be provisioned&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h2&gt;Maximum characters for attribute-mapping expressions&lt;/h2&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h3&gt;Unsupported scoping filters&lt;/h3&gt;
&lt;p&gt;The appRoleAssignments, userType, and accountExpires attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h3&gt;Multivalue directory extensions&lt;/h3&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h2&gt;Service issues&lt;/h2&gt;
&lt;p&gt;Unsupported scenarios&lt;/p&gt;
&lt;p&gt;· Provisioning passwords isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;· Provisioning nested groups isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;· Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/p&gt;
&lt;p&gt;· Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/p&gt;
&lt;h2&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h2&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h2&gt;Manager isn&amp;#39;t provisioned&lt;/h2&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h2&gt;The provisioning interval is fixed&lt;/h2&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h2&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Switching from Sync All to Sync Assigned not working&lt;/h2&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h3&gt;Provisioning cycle continues until completion&lt;/h3&gt;
&lt;p&gt;When you set provisioning to enabled = off or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h3&gt;Member of group not provisioned&lt;/h3&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h3&gt;Global Reader&lt;/h3&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the microsoft.directory/applications/synchronization/standard/read&lt;/p&gt;
&lt;!-- PageHeader=&quot;permission in order to read the provisioning configuration from the Microsoft Entra admin center.&quot; --&gt;


&lt;h2&gt;Microsoft Azure Government Cloud&lt;/h2&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h2&gt;On-premises application provisioning&lt;/h2&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h2&gt;Application and directories&lt;/h2&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;p&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/p&gt;
&lt;p&gt;· When a user is managed by Microsoft Entra Connect, the source of authority is on- premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/p&gt;
&lt;p&gt;. Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on this website &amp;amp;2 to track the status of the preview. Alternatively, you can use Microsoft Identity Manager for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/p&gt;
&lt;h2&gt;Microsoft Entra ID&lt;/h2&gt;
&lt;h1&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. You can&amp;#39;t bring a user into the directory from a third-party application. Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.
:unselected: :unselected:
Attributes and objects&lt;/h1&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;p&gt;· Multivalued attributes.&lt;/p&gt;
&lt;p&gt;· Reference attributes (for example, manager).&lt;/p&gt;
&lt;p&gt;· Groups.&lt;/p&gt;
&lt;p&gt;· Complex anchors (for example, ObjectTypeName+UserName).&lt;/p&gt;
&lt;p&gt;· Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;&lt;/p&gt;
&lt;p&gt;· Binary attributes.&lt;/p&gt;
&lt;p&gt;· On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/p&gt;
&lt;h2&gt;SSL certificates&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h2&gt;Anchor attributes&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h2&gt;Attribute discovery and mapping&lt;/h2&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;!-- PageFooter=&quot;Provisioning agent&quot; --&gt;

&lt;p&gt;. The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/p&gt;
&lt;p&gt;. The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR- driven provisioning.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;How provisioning works
:unselected: :unselected: :selected: :unselected:&lt;/p&gt;
&lt;h2&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named Cairo and two member tenants named Berlin and Athens.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see Set up a multitenant org in Microsoft 365 and Join or leave a multitenant organization in Microsoft 365. To learn how to configure Microsoft Teams for your multitenant organization, see The new Microsoft Teams desktop client.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/25) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Owner tenant (Cairo) Cross-tenant access settings Member tenant (Athens) Member tefant (Berlin)&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/26) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/27) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;. For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h2&gt;Step 1: Sign in to the owner tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/28) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Start PowerShell.&lt;/p&gt;
&lt;p&gt;2. If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;p&gt;3. Get the tenant ID of the owner and member tenants and initialize variables.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$OwnerTenantId = &amp;quot;&lt;OwnerTenantId&gt;&amp;quot; $MemberTenantIdB = &amp;quot;&lt;MemberTenantIdB&gt;&amp;quot; $MemberTenantIdA = &amp;quot;&lt;MemberTenantIdA&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;4. Use the Connect-MgGraph command to sign in to the owner tenant and consent to the following required permissions.&lt;/p&gt;
&lt;p&gt;. MultiTenantOrganization. ReadWrite.All&lt;/p&gt;
&lt;p&gt;· Policy. Read.All&lt;/p&gt;
&lt;p&gt;. Policy. ReadWrite. CrossTenantAccess&lt;/p&gt;
&lt;p&gt;· Application. ReadWrite.All&lt;/p&gt;
&lt;p&gt;· Directory. ReadWrite.All&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $OwnerTenantId -Scopes &amp;quot;MultiTenantOrganization. ReadWrite. All&amp;quot;, &amp;quot;Policy. Read. All&amp;quot;, &amp;quot;Policy. R&lt;/p&gt;
&lt;p&gt;eadWrite. CrossTenantAccess&amp;quot;, &amp;quot;Application. ReadWrite. All&amp;quot;, &amp;quot;Directory. ReadWrite.All&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 2: Create a multitenant organization&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/29) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the Update- MgBeta TenantRelationshipMultiTenantOrganization command to create your multitenant organization. This operation can take a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganization command to check that the operation has completed before proceeding.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;CreatedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;Cairo&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdC&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinRequest&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationJoinRequestRecord&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;Tenants&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;iTenantOrganization/$entity]}&lt;/p&gt;
&lt;h1&gt;Step 3: Add tenants&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/30) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the New- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to add tenants to your multitenant organization.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdB -DisplayName &amp;quot;Berlin&amp;quot; Format-List&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdA -DisplayName &amp;quot;Athens&amp;quot; | Format-List&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify that the operation has completed before proceeding.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format- List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;Cairo&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;MtoIdC&gt;

&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: owner&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;: 1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;: Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;: pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:08:47 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Athens&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: pending&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdA&amp;gt;&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationMemberTransitionDetails AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h1&gt;Step 4: (Optional) Change the role of a tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/31) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the Update- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to change a member tenant to an owner tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; | Format-List&lt;/p&gt;
&lt;h2&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/p&gt;
&lt;p&gt;MultiTenantOrganizationMemberId $MemberTenantIdB&lt;/p&gt;
&lt;p&gt;| Format-List&lt;/p&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:05:25 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Berlin&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: owner&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: pending&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;MemberTenantIdB&gt;

&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationMemberTransitionDetails AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt; iTenantOrganization/tenants/$entity], [multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;h2&gt;Step 5: (Optional) Remove a member tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/32) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the owner tenant, use the Remove- MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove any member tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId &lt;MemberTenantIdD&gt;&lt;/p&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get: Unable to read the company information from the directory.&lt;/p&gt;
&lt;p&gt;Status: 404 (NotFound) ErrorCode: Directory_ObjectNotFound Date: 2024-01-08T20:35:11&lt;/p&gt;
&lt;p&gt;. . .&lt;/p&gt;
&lt;h3&gt;Step 6: Sign in to a member tenant&lt;/h3&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/33) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;1. Start PowerShell.&lt;/p&gt;
&lt;p&gt;2. Use the Connect-MgGraph command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;p&gt;. MultiTenantOrganization. ReadWrite. All&lt;/p&gt;
&lt;p&gt;· Policy. Read.All&lt;/p&gt;
&lt;p&gt;. Policy. ReadWrite. CrossTenantAccess&lt;/p&gt;
&lt;p&gt;· Application. ReadWrite.All&lt;/p&gt;
&lt;p&gt;· Directory.ReadWrite.All&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $MemberTenantIdB -Scopes &amp;quot;MultiTenantOrganization. ReadWrite. All&amp;quot;, &amp;quot;Policy. Read. All&amp;quot;, &amp;quot;Policy. R eadWrite. CrossTenantAccess&amp;quot;, &amp;quot;Application. ReadWrite. All&amp;quot;, &amp;quot;Directory. ReadWrite. All&amp;quot;&lt;/p&gt;
&lt;h3&gt;Step 7: Join the multitenant organization&lt;/h3&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/34) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the member tenant, use the Update- MgBeta TenantRelationshipMultiTenantOrganizationJoinRequest command to join the multitenant organization.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest - AddedByTenantId $OwnerTenantId | Format-List&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to verify the join.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest | Format-List&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;: &lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemberState&lt;/td&gt;
&lt;td&gt;: active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;: member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg anizationJoinRequestTransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties : {[@odata.context,&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult&lt;/a&gt; iTenantOrganization/joinRequest/$entity]}&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;3. Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/p&gt;
&lt;p&gt;command to check the multitenant organization itself. It should reflect the&lt;/p&gt;
&lt;p&gt;join operation.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/p&gt;
&lt;p&gt;List&lt;/p&gt;
&lt;p&gt;Format -&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 8:05:25 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Berlin&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; MtoJoinRequestIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 9:53:55 PM&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: member&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; MemberTenantIdB&amp;gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;AddedByTenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;AddedDateTime&lt;/p&gt;
&lt;p&gt;: 1/8/2024 7:47:45 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;: Cairo&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; Id&amp;gt;&lt;/p&gt;
&lt;p&gt;JoinedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Role&lt;/p&gt;
&lt;p&gt;: owner&lt;/p&gt;
&lt;p&gt;State&lt;/p&gt;
&lt;p&gt;: active&lt;/p&gt;
&lt;p&gt;TenantId&lt;/p&gt;
&lt;p&gt;: &amp;lt; OwnerTenantId&amp;gt;&lt;/p&gt;
&lt;p&gt;TransitionDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. Beta. PowerShell. Models. MicrosoftGraphMultiTenantOrg&lt;/p&gt;
&lt;p&gt;anizationMemberTransitionDetails&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/p&gt;
&lt;p&gt;4. To allow for asynchronous processing, wait up to 2 hours before joining a multitenant organization is completed.&lt;/p&gt;
&lt;h3&gt;Step 8: (Optional) Leave the multitenant organization&lt;/h3&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/35) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Member tenant&lt;/p&gt;
&lt;p&gt;You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.&lt;/p&gt;
&lt;p&gt;If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see Step 4: (Optional) Change the role of a tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;. In the tenant, use the Remove- MgBeta TenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId &lt;MemberTenantId&gt;&lt;/p&gt;
&lt;p&gt;Step 9: (Optional) Delete the multitenant organization&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/36) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Owner tenant&lt;/p&gt;
&lt;p&gt;You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;. In the final owner tenant, use the Remove- MgBeta TenantRelationshipMultiTenantOrganization Tenant command to remove the tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant - MultiTenantOrganizationMemberId $OwnerTenantId&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;. Set up a multitenant org in Microsoft 365&lt;/p&gt;
&lt;p&gt;· Synchronize users in multitenant organizations in Microsoft 365&lt;/p&gt;
&lt;p&gt;· The new Microsoft Teams desktop client&lt;/p&gt;
&lt;p&gt;. Configure multitenant organization templates using the Microsoft Graph API&lt;/p&gt;
&lt;h1&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;· For license information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access policy partner template&lt;/h2&gt;
&lt;p&gt;The cross-tenant access partner configuration handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h3&gt;Configure inbound and outbound automatic redemption&lt;/h3&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the Update multiTenantOrganizationPartnerConfigurationTemplate API. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationPartnerConfiguration&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;quot;inboundTrust&amp;quot;: {&lt;/p&gt;
&lt;p&gt;&amp;quot;isMfaAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true&lt;/p&gt;
&lt;p&gt;}, &amp;quot;automaticUserConsentSettings&amp;quot;: {&lt;/p&gt;
&lt;p&gt;&amp;quot;inboundAllowed&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;outboundAllowed&amp;quot;: true },&lt;/p&gt;
&lt;p&gt;&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners, existingPartners&amp;quot; }&lt;/p&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;h2&gt;Request&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/37) --&gt; --&gt;

&lt;!-- FigureContent=&quot;HTTP PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/ multiTenantOrganizationPartnerConfiguration { &quot;inboundTrust&quot;: { &quot;isMfaAccepted&quot;: true, &quot;isCompliantDeviceAccepted&quot;: true, &quot;isHybridAzureADJoinedDeviceAccepted&quot;: true }, &quot;automaticUserConsentSettings&quot;: { &quot;inboundAllowed&quot;: true, &quot;outboundAllowed&quot;: true }, &quot;templateApplicationLevel&quot;: &quot;newPartners&quot; }&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationPartnerConfiguration&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;quot;inboundTrust&amp;quot;: {&lt;/p&gt;
&lt;p&gt;&amp;quot;isMfaAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isCompliantDeviceAccepted&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true }, &amp;quot;automaticUserConsentSettings&amp;quot;: { &amp;quot;inboundAllowed&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;&amp;quot;outboundAllowed&amp;quot;: true },&lt;/p&gt;
&lt;p&gt;&amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot; }&lt;/p&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the multiTenantOrganizationPartnerConfigurationTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;POST&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization template&lt;/h2&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h2&gt;Configure inbound user synchronization&lt;/h2&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the Update multiTenantOrganizationIdentitySyncPolicyTemplate API. If you create or join a&lt;/p&gt;
&lt;p&gt;multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;h2&gt;Request&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/38) --&gt; --&gt;

&lt;!-- FigureContent=&quot;HTTP PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/ multiTenantOrganizationIdentitySynchronization { &quot;userSyncInbound&quot;: { &quot;isSyncAllowed&quot;: true }, &quot;templateApplicationLevel&quot;: &quot;newPartners, existingPartners&quot; }&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/39) --&gt; --&gt;

&lt;!-- FigureContent=&quot;HTTP PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/ multiTenantOrganizationIdentitySynchronization { &quot;userSyncInbound&quot;: { &quot;isSyncAllowed&quot;: true }, &quot;templateApplicationLevel&quot;: &quot;newPartners&quot; }&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;p&gt;Request&lt;/p&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;PATCH&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationIdentitySynchronization&lt;/p&gt;
&lt;p&gt;{ &amp;quot;userSyncInbound&amp;quot;: { &amp;quot;isSyncAllowed&amp;quot;: true }, &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot; }&lt;/p&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;h2&gt;Request&lt;/h2&gt;
&lt;p&gt;HTTP&lt;/p&gt;
&lt;p&gt;POST&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/&lt;/a&gt; multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;Configure cross-tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 03/11/2024&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/40) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Source tenant Target tenant Internal Internal UserS1 UserS2 UserS3 UserT1 UserT2 UserT3 GroupT1 Outbound access settings :selected: Automatically redeem invitations Cross-tenant synchronization External UserS1 UserS3 Configuration Inbound access settings :selected: Allow users sync into this tenant Scope :selected: Automatically redeem invitations UserS1 UserS3 Scoping filters department EQUALS Marketing Attribute mappings accountEnabled accountEnabled employeeld employeeld userPrincipalName userPrincipalName + extensionName companyName&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Learning objectives&lt;/h2&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;p&gt;. Create B2B users in your target tenant&lt;/p&gt;
&lt;p&gt;· Remove B2B users in your target tenant&lt;/p&gt;
&lt;p&gt;· Keep user attributes synchronized between your source and target tenants&lt;/p&gt;
&lt;p&gt;Prerequisites&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/41) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;. Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/42) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;. Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Step 1: Plan your provisioning deployment&lt;/h2&gt;
&lt;p&gt;1. Define how you would like to structure the tenants in your organization.&lt;/p&gt;
&lt;p&gt;2. Learn about how the provisioning service works.&lt;/p&gt;
&lt;p&gt;3. Determine who will be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;4. Determine what data to map between tenants.&lt;/p&gt;
&lt;h3&gt;Step 2: Enable user synchronization in the target tenant&lt;/h3&gt;
&lt;p&gt;? Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;h2&gt;Target tenant&lt;/h2&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp;2 of the target tenant.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;3. On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;p&gt;4. Add the source tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Inbound access settings - Contoso &amp;gt; External Identities&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/43) --&gt; --&gt;

&lt;!-- FigureContent=&quot;External Identities | Cross-tenant access settings Contoso - Microsoft Entra ID for workforce
Add organization Cross tenant settings Add an external Microsoft Entra tenant by typing one of its domain names or tenant ID if from another Microsoft cloud. P Search « :selected: Got feedback? Overview Q Tenant ID or domain name Cross-tenant access settings Organizational settings Default settings Microsoft cloud settir All identity providers ‘õ3 External collaboration settings + Add organization Refresh Columns × Diagnose and solve problems Use cross-tenant access settings to manage collaboration with external Mici tenants, use collaboration settings. Edit or view collaboration restrictions Self-service sign up Organizational settings are cross-tenant access settings you&apos;ve configured f Entra tenants not listed here will use the default settings. Learn more &amp; Custom user attributes All API connectors Search by domain name or tenant ID Custom authentication extensions (Preview) User flows 0 organizations found + Subscriptions Linked subscriptions Name Inbound access Add Discard&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;5. Under Inbound access of the added organization, select Inherited from default.&lt;/h2&gt;
&lt;p&gt;6. Select the Cross-tenant sync tab.&lt;/p&gt;
&lt;p&gt;7. Check the Allow users sync into this tenant check box.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/44) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; External Identities | Cross-tenant access settings &gt; Inbound access settings - Fabrikam X B2B collaboration B2B direct connect Trust settings Cross-tenant sync Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant. Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization. :selected: Allow users sync into this tenant + Save Discard&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;8. Select Save.&lt;/p&gt;
&lt;p&gt;9. If you see an Enable cross-tenant sync and auto-redemption dialog box asking if you want to enable auto-redemption, select Yes.&lt;/p&gt;
&lt;p&gt;Selecting Yes will automatically redeem invitations in the target tenant.
:selected: :unselected: :selected: :unselected: :selected:
X&lt;/p&gt;
&lt;p&gt;... &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;h1&gt;Inbound access settings - Fabrikam ...&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/45) --&gt; --&gt;

&lt;!-- FigureContent=&quot;B2B collaboration B2B direct connect Trust settings Cross-tenant sync Enabling this will allow the admin of th Enable cross-tenant sync and auto-redemption? tenant. Disabling this will block admins of the objects. We recommend that this settir Setting up cross-tenant synchronization also requires auto-redemption to be enabled. Selecting yes will enable auto-redemption in addition to cross-tenant synchronization. ut will not remove currently synced e same organization. :selected: Allow users sync into this tenant Yes No + Save Discard&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/46) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt. This setting must be checked in both the source tenant (outbound) and target tenant (inbound). For more information, see Automatic redemption setting.&lt;/p&gt;
&lt;p&gt;1. In the target tenant, on the same Inbound access settings page, select the Trust settings tab.&lt;/p&gt;
&lt;p&gt;2. Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;p&gt;This box might already be checked if you previously selected Yes in the Enable cross-tenant sync and auto-redemption dialog box.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/47) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Automatic redemption Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&apos;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well. Learn more &amp; :selected: V Automatically redeem invitations with the tenant Fabrikam. + Save Discard&quot; --&gt;

&lt;/figure&gt;


&lt;!-- PageFooter=&quot;3\. Select Save.&quot; --&gt;
&lt;h1&gt;:selected: :unselected: :unselected: :unselected: :unselected:
Step 4: Automatically redeem invitations in the source tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/48) --&gt; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp; of the source tenant.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;3. On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;p&gt;4. Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/49) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Fabrikam &gt; External Identities External Identities | Cross-tenant access settings Fabrikam - Microsoft Entra ID for workforce Add organization Cross tenant settings ... Add an external Microsoft Entra tenant by typing one of its domain names or tenant ID if from another Microsoft cloud. P Search « &amp; Got feedback? :selected: Overview 1 Q Tenant ID or domain name Cross-tenant access settings Organizational settings Default settings Microsoft cloud setti All identity providers External collaboration settings + Add organization Refresh Columns × Diagnose and solve problems Use cross-tenant access settings to manage collaboration with external Micr tenants, use collaboration settings. Edit or view collaboration restrictions Self-service sign up Organizational settings are cross-tenant access settings you&apos;ve configured fc Entra tenants not listed here will use the default settings. Learn more Custom user attributes All API connectors a Search by domain name or tenant ID :selected: Custom authentication extensions (Preview) User flows 0 organizations found Subscriptions + Linked subscriptions Name Inbound access Add Discard&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;5. Under Outbound access for the target organization, select Inherited from default.&lt;/p&gt;
&lt;p&gt;6. Select the Trust settings tab.&lt;/p&gt;
&lt;p&gt;7. Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.
:selected: :unselected: :selected: :unselected:
Home &amp;gt; Fabrikam &amp;gt; External Identities | Cross-tenant access settings &amp;gt;&lt;/p&gt;
&lt;p&gt;Outbound access settings - Contoso&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;B2B collaboration&lt;/p&gt;
&lt;p&gt;B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more [
 :selected:
V Automatically redeem invitations with the tenant Contoso.&lt;/p&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;p&gt;Discard&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;8. Select Save.&lt;/p&gt;
&lt;h2&gt;Step 5: Create a configuration in the source tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/50) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. Select Configurations.&lt;/p&gt;
&lt;p&gt;3. At the top of the page, select New configuration.&lt;/p&gt;
&lt;p&gt;4. Provide a name for the configuration and select Create.&lt;/p&gt;
&lt;p&gt;It can take up to 15 seconds for the configuration that you just created to appear in the list.&lt;/p&gt;
&lt;h2&gt;Step 6: Test the connection to the target tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/51) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;1. In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.
:selected: :unselected:
... &amp;gt; Outbound access settings - Contoso &amp;gt; Cross-tenant synchronization | Configurations &amp;gt;&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/52) --&gt; --&gt;

&lt;!-- FigureContent=&quot;i&quot; --&gt;

&lt;/figure&gt;

&lt;p&gt; Fabrikam to Contoso | Overview ...&lt;/p&gt;
&lt;p&gt;Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;«&lt;/p&gt;
&lt;p&gt;Got feedback?&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Overview&lt;/p&gt;
&lt;p&gt;% Provision on demand&lt;/p&gt;
&lt;p&gt;Manage&lt;/p&gt;
&lt;p&gt;Users and groups&lt;/p&gt;
&lt;p&gt;Provisioning&lt;/p&gt;
&lt;p&gt;Expression builder&lt;/p&gt;
&lt;p&gt;Activity&lt;/p&gt;
&lt;p&gt;- Audit logs&lt;/p&gt;
&lt;p&gt;Provisioning logs&lt;/p&gt;
&lt;p&gt;0 Insights&lt;/p&gt;
&lt;p&gt;Troubleshooting + Support&lt;/p&gt;
&lt;p&gt;New support request&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/53) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Automate identity lifecycle management with Microsoft Entra&lt;/p&gt;
&lt;p&gt;Automatically create, update, and delete accounts when users join, leave, and move within your organization. Learn more.&lt;/p&gt;
&lt;p&gt;Get started&lt;/p&gt;
&lt;p&gt;What is provisioning? Plan an application deployment.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/54) --&gt; --&gt;

&lt;!-- FigureContent=&quot;\+&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Configure automatic provisioning.&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2. Select Get started.&lt;/p&gt;
&lt;p&gt;3. Set the Provisioning Mode to Automatic.&lt;/p&gt;
&lt;p&gt;4. Under the Admin Credentials section, change the Authentication Method to Cross Tenant Synchronization Policy.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/55) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Overview &gt; Provisioning ... X Save :selected: Discard Provisioning Mode Automatic V Use Microsoft Entra to manage the creation and synchronization of user accounts in Fabrikam to Contoso based on user and group assignment. ^ Admin Credentials Admin Credentials Microsoft Entra needs the following information to connect to Fabrikam to Contoso&apos;s API and synchronize user data. Authentication Method O Cross Tenant Synchronization Policy V Tenant Id \* Test Connection +&quot; --&gt;

&lt;/figure&gt;

&lt;p&gt; :selected: :selected: :unselected: :unselected:
5. In the Tenant Id box, enter the tenant ID of the target tenant.&lt;/p&gt;
&lt;p&gt;6. Select Test Connection to test the connection.&lt;/p&gt;
&lt;p&gt;You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see Troubleshooting tips later in this article.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/56) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Notifications X More events in the activity log -&gt; Dismiss all V :selected: Testing connection to Fabrikam to Contoso X The supplied credentials are authorized to enable provisioning + a few seconds ago&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;7. Select Save.&lt;/p&gt;
&lt;p&gt;Mappings and Settings sections appear.&lt;/p&gt;
&lt;p&gt;8. Close the Provisioning page.&lt;/p&gt;
&lt;h2&gt;Step 7: Define who is in scope for provisioning&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/57) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:&lt;/p&gt;
&lt;p&gt;. Based on assignment to the configuration&lt;/p&gt;
&lt;p&gt;. Based on attributes of the user&lt;/p&gt;
&lt;p&gt;Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Settings section.
:selected: :selected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/58) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Outbound access settings - Contoso &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Provisioning ... Fabrikam - Microsoft Entra ID « Save Discard Overview Provision on demand v Admin Credentials Manage V Mappings Users and groups Provisioning ^ Settings Expression builder Activity :unselected: Send an email notification when a failure occurs Audit logs :selected: Prevent accidental deletion Accidental deletion threshold \* Provisioning logs 500 Insights Scope 1 Sync only assigned users and groups V Troubleshooting + Support New support request Provisioning Status 1 On Off +&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;2. In the Scope list, select whether to synchronize all users in the source tenant or only users assigned to the configuration.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s recommended that you select Sync only assigned users and groups instead of Sync all users and groups. Reducing the number of users in scope improves performance.&lt;/p&gt;
&lt;p&gt;3. If you made any changes, select Save.&lt;/p&gt;
&lt;p&gt;4. On the configuration page, select Users and groups.&lt;/p&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;p&gt;5. Select Add user/group.&lt;/p&gt;
&lt;p&gt;6. On the Add Assignment page, under Users and groups, select None Selected.&lt;/p&gt;
&lt;p&gt;7. On the Users and groups pane, search for and select one or more internal users or groups you want to assign to the configuration.&lt;/p&gt;
&lt;p&gt;If you select a group to assign to the configuration, only users that are direct members in the group will be in scope for provisioning. You can select a static group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.&lt;/p&gt;
&lt;p&gt;8. Select Select.
:selected: :selected: :selected: :unselected:&lt;/p&gt;
&lt;!-- PageHeader=&quot;9\. Select Assign.&quot; --&gt;

&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/59) --&gt; --&gt;

&lt;!-- FigureContent=&quot;&gt; Outbound access settings - Contoso &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Users and groups X Fabrikam - Microsoft Entra ID « + Add user/group Edit assignment :selected: Remove .. Overview Provision on demand The application will not appear for assigned users within My Apps. Set &apos;visible to users?&apos; to yes in properties to enable this. 1 Manage Users and groups Assign users and groups to app-roles for your application here. To create new app-roles for this application, use the application registration. Provisioning Expression builder P First 200 shown, to search all users &amp; gro ... Activity - Audit logs Provisioning logs Insights Troubleshooting + Support New support request +&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Display Name&lt;/th&gt;
&lt;th&gt;Object Type&lt;/th&gt;
&lt;th&gt;Role assigned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;:unselected: US User3&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected: :selected:  US User1&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected: GR Group1&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Default Access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For more information, see Assign users and groups to an application.&lt;/p&gt;
&lt;h2&gt;Step 8: (Optional) Define who is in scope for provisioning with scoping filters&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Regardless of the value you selected for Scope in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Mappings section.
:selected:
X&lt;/p&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;p&gt;Fabrikam to Contoso | Provisioning ... Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/60) --&gt; --&gt;

&lt;!-- FigureContent=&quot;« Save Discard Overview v Admin Credentials 4 Provision on demand Manage ^ Mappings Users and groups Mappings Provisioning Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant). Expression builder Activity Audit logs Provisioning logs 0 Insights :unselected: Restore default mappings Troubleshooting + Support V Settings New support request Provisioning Status O + On Off&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;2. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/h2&gt;
&lt;p&gt;3. Under Source Object Scope, select All records.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/61) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping X Save :selected: Discard Name Provision Microsoft Entra ID Users Enabled Yes No Source Object User Source Object Scope All records Source Object User Target Object Actions :selected: Create :selected: Update + :selected: Delete &gt;&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;4. On the Source Object Scope page, select Add scoping filter.&lt;/h2&gt;
&lt;p&gt;5. Add any scoping filters to define which users are in scope for provisioning.
:selected: :selected: :selected: :unselected: :unselected:
To configure scoping filters, refer to the instructions provided in Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Add/Remove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;No scoping filters found&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department V :selected:&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;V :selected:&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;Add New Scoping Clause&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;6. Select Ok and Save to save any changes.&lt;/p&gt;
&lt;p&gt;If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.&lt;/p&gt;
&lt;p&gt;7. Select Yes and close the Attribute Mapping page.&lt;/p&gt;
&lt;h2&gt;Step 9: Review attribute mappings&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/62) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;2. Select Provision Microsoft Entra ID Users.&lt;/p&gt;
&lt;p&gt;3. On the Attribute Mapping page, scroll down to review the user attributes that are synchronized between tenants in the Attribute Mappings section.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/63) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Add Scoping Filter × Define which users are in scope for provisioning. Only objects that meet the criteria below will be synchronized. Scoping Filter Title \* Marketing department filter If multiple scoping clauses are present, they are evaluated using &quot;AND&quot; logic. + Ok&quot; --&gt;

&lt;/figure&gt;

&lt;p&gt; :selected:
The first attribute, alternativeSecurityIdentifier, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a schemaInvalid error.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/64) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping ... X Save :selected: Discard Attribute Mappings 4 Attribute mappings define how attributes are synchronized between Azure Active Directory and Azure Active Directory (target tenant)&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Active Directory Attribute&lt;/th&gt;
&lt;th&gt;Azure Active Directory (target tenant) Attribute&lt;/th&gt;
&lt;th&gt;Matching precedence&lt;/th&gt;
&lt;th&gt;Remove&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AltSecldFromNetld([netId])&lt;/td&gt;
&lt;td&gt;alternativeSecuritylds&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;4. Select the Member (userType) attribute to open the Edit Attribute page.&lt;/p&gt;
&lt;p&gt;5. Review the Constant Value setting for the userType attribute.&lt;/p&gt;
&lt;p&gt;This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;Users will be created as external guests (B2B collaboration users) in the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected: :unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Note&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If the B2B user already exists in the target tenant then Member (userType) will not changed to Member, unless the Apply this mapping setting is set to Always.&lt;/p&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;... &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h2&gt;Edit Attribute ...&lt;/h2&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type O&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Constant&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constant Value * :unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Target attribute * 0 userType&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;Match objects using this attribute No V&lt;/p&gt;
&lt;p&gt;Matching precedence 0&lt;/p&gt;
&lt;p&gt;Apply this mapping&lt;/p&gt;
&lt;p&gt;Only during object creation&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;6. If you want to define any transformations, on the Attribute Mapping page, select the attribute you want to transform, such as displayName.&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;Ok
:selected: :unselected:
7. Set the Mapping type to Expression.&lt;/p&gt;
&lt;p&gt;8. In the Expression box, enter the transformation expression. For example with the display name, you can do the following:&lt;/p&gt;
&lt;p&gt;. Flip the first name and last name and add a comma in between.&lt;/p&gt;
&lt;p&gt;. Add the domain name in parentheses at the end of the display name.&lt;/p&gt;
&lt;p&gt;For examples, see Reference for writing expressions for attribute mappings in Microsoft Entra ID.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/65) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Edit Attribute X A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application. Mapping type 0 Expression V Expression 1 [displayName] The expression was correctly parsed. Default value if null (optional) Use the expression builder Target attribute \* 0 displayName &gt; 1 + Ok&quot; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Q Tip&lt;/h3&gt;
&lt;p&gt;You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see Map directory extensions in cross- tenant synchronization.&lt;/p&gt;
&lt;p&gt;Step 10: Specify additional provisioning settings&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/66) --&gt; --&gt;

&lt;/figure&gt;


&lt;!-- PageFooter=&quot;Source tenant&quot; --&gt;
&lt;p&gt;:selected:
1. In the source tenant, select Provisioning and expand the Settings section.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/67) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Outbound access settings - Contoso &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Provisioning ... Fabrikam - Microsoft Entra ID « Save :selected: Discard Overview Provision on demand v Admin Credentials Manage V Mappings Users and groups Provisioning 1 Settings Expression builder Activity :unselected: Send an email notification when a failure occurs Audit logs :selected: Prevent accidental deletion Accidental deletion threshold \* Provisioning logs 500 0 Insights Scope O Sync only assigned users and groups V Troubleshooting + Support New support request Provisioning Status O On Off +&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;2. Check the Send an email notification when a failure occurs check box.&lt;/p&gt;
&lt;p&gt;3. In the Notification Email box, enter the email address of a person or group who should receive provisioning error notifications.&lt;/p&gt;
&lt;p&gt;Email notifications are sent within 24 hours of the job entering quarantine state. For custom alerts, see Understand how provisioning integrates with Azure Monitor logs.&lt;/p&gt;
&lt;p&gt;4. To prevent accidental deletion, select Prevent accidental deletion and specify a threshold value. By default, the threshold is set to 500.&lt;/p&gt;
&lt;p&gt;For more information, see Enable accidental deletions prevention in the Microsoft Entra provisioning service.&lt;/p&gt;
&lt;p&gt;5. Select Save to save any changes.&lt;/p&gt;
&lt;p&gt;Step 11: Test provision on demand&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/68) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant
:selected: :unselected:
Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;3. Select Provision on demand.&lt;/p&gt;
&lt;p&gt;4. In the Select a user or group box, search for and select one of your test users.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/69) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Provision on demand Fabrikam - Microsoft Entra ID X « Learn More Got feedback? Overview % Provision on demand Provision on-demand for a subset of users or groups before rolling it out broadly to your organization. When provisioning a group you can select 5 members at a time. Manage O No user or group will be provisioned on-demand that would not have been provisioned through the regular provisioning cycles. Users and groups Provisioning Selected user P User1 Expression builder Activity Audit logs Provisioning logs Insights Troubleshooting + Support + New support request Provision&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;5. Select Provision.&lt;/p&gt;
&lt;p&gt;After a few moments, the Perform action page appears with information about the provisioning of the test user in the target tenant.
:selected: :unselected: :unselected: :selected:&lt;/p&gt;
&lt;!-- PageNumber=&quot;×&quot; --&gt;

&lt;p&gt;.. Perform action&lt;/p&gt;
&lt;p&gt;8 Modified attributes (successful) Data flow&lt;/p&gt;
&lt;p&gt;User &amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;a&lt;/p&gt;
&lt;p&gt;Ma&lt;/p&gt;
&lt;p&gt;Ac&lt;/p&gt;
&lt;p&gt;Tra&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target attribute name&lt;/th&gt;
&lt;th&gt;Source attribute value&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Original target attribute v ...&lt;/th&gt;
&lt;th&gt;Modified target attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;[IsSoftDeleted]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;[accountEnabled]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;[displayName]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mailNickname&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;[mailNickname]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alternativeSecuritylds&lt;/td&gt;
&lt;td&gt;AltSecldFromNetid(&amp;quot;1003 ...&lt;/td&gt;
&lt;td&gt;AltSecidFromNetid([netid])&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;[preferredLanguage]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why test user was skipped.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/70) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Hom Determine if user is in scope X The User &apos;alice@fabrikam.com&apos; will be skipped due to the following reasons: 1) This object is not assigned to the application. If you did not expect the object to be skipped, assign the object to the application or change your scoping filter to allow all users and groups to be in scope for provisioning. 2) This object does not have required entitlement for provisioning. If you did not expect the object to be skipped, update provisioning scope to &apos;Sync all users and groups&apos; or assign the object to the application with entitlement of provisioning category O Us A 1. Im This prop&quot; --&gt;

&lt;/figure&gt;

&lt;p&gt; :selected:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute name&lt;/th&gt;
&lt;th&gt;Attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;SkipReason&lt;/td&gt;
&lt;td&gt;NotEffectivelyEntitled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsActive&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assigned to the application&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsInProvisioningScope&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;On the Provision on demand page, you can view details about the provision and have the option to retry.
:selected: :selected:
... &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/71) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Fabrikam to Contoso | Provision on demand ...
 Fabrikam - Microsoft Entra ID&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;X&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/72) --&gt; --&gt;

&lt;!-- FigureContent=&quot;« O Learn More = Technical details Got feedback? Overview Provision on demand User Manage US User1 user1@fabrikam.com Users and groups Provisioning Expression builder 1. Import user This step shows the user retrieved from the source system and the properties of the user in the source system. Activity :selected: Success | View details - Audit logs Provisioning logs 2. Determine if user is in scope Insights This step shows the scoping conditions that were evaluated and which ones the user passed or failed. :selected: Success | View details Troubleshooting + Support New support request 3. Match user between source and target system This step shows whether the user was found in the target system as well as the properties of the user in the target system. :selected: Success | View details 4. Perform action This step shows the action that was performed in the target application, such as creating a user or updating a user. Success | View details :selected: &gt; + Retry Provision another object&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;6. In the target tenant, verify that the test user was provisioned.&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/73) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Contoso &gt; Users ... X Contoso - Microsoft Entra ID P Search « + New user V Download users [ Bulk operations V Refresh Manage view V Delete :unselected: Per-user MFA ... All users 1 Azure Active Directory is now Microsoft Entra ID. [ Audit logs P user1 :selected: X 8 Add filter C Sign-in logs 1 user found &lt; Diagnose and solve problems :unselected: Display name 1l User principal name 1! User type On-premises ... Identities Company name Creation type Manage :unselected: US User1 user1\_fabrikam.com#EXT#@ ... Member :unselected: No ExternalAzureAD Invitation Deleted users Password reset &amp;&gt; User settings :selected: Bulk operation results Troubleshooting + Support&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;7. If all is working as expected, assign additional users to the configuration.&lt;/p&gt;
&lt;p&gt;For more information, see On-demand provisioning in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Step 12: Start the provisioning job&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/74) --&gt; --&gt;

&lt;/figure&gt;

&lt;h1&gt; :selected: :selected: :unselected: :unselected: :selected: :selected: :selected: :selected:
Source tenant&lt;/h1&gt;
&lt;p&gt;The provisioning job starts the initial synchronization cycle of all users defined in Scope of the Settings section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;3. On the Overview page, review the provisioning details.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/75) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; i Fabrikam to Contoso | Overview Fabrikam - Microsoft Entra ID X « Start provisioning :unselected: Stop provisioning Restart provisioning ... i Overview A Provision on demand Current cycle status Manage Initial cycle not run. Users and groups 0% complete Provisioning Expression builder View provisioning logs Activity Statistics to date Audit logs v View provisioning details Provisioning logs v View technical information + Insights 1&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;4. Select Start provisioning to start the provisioning job.&lt;/p&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/76) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source and target tenants&lt;/p&gt;
&lt;p&gt;Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, on the Overview page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see Check the status of user provisioning.
:selected: :selected: :selected:
If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/77) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; i Fabrikam to Contoso | Overview ... X Fabrikam - Microsoft Entra ID « Start provisioning :unselected: Stop provisioning Restart provisioning Edit provisioning ... O Overview % Provision on demand Current cycle status Manage Initial cycle completed. Users and groups 100% complete Provisioning Expression builder Users 2 Activity View provisioning logs Audit logs Provisioning logs Statistics to date Insights v View provisioning details + Troubleshooting + Support V View technical information &gt;&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;2. Select Provisioning logs to determine which users have been provisioned successfully or unsuccessfully. By default, the logs are filtered by the service principal ID of the configuration. For more information, see Provisioning logs in Microsoft Entra ID.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/78) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Edit Attribute &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Provisioning logs Fabrikam - Microsoft Entra ID × « Download v :unselected: Learn more :unselected: Refresh EE Columns :selected: &amp; Got feedback? O Overview % Provision on demand P Identity Name or ID Manage Date : Last 24 hours Show dates as: : Local Status : All Action : All&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;| Users and groups | Application contains 73574fa8-2ff5-4ada-bb13-32960b0434db X :selected: ||| to Add filters | | |&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provisioning&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;:unselected: Source System&lt;/th&gt;
&lt;th&gt;Target System&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression builder&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning logs&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0 Insights&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID :unselected:&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success +&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New support request&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1 Source ID Target ID :unselected: :unselected:&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;3. Select Audit logs to view all logged events in Microsoft Entra ID. For more information, see Audit logs in Microsoft Entra ID.
:selected: :selected: :selected: :unselected: :selected: :selected: :unselected: :unselected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/79) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Attribute Mapping &gt; Edit Attribute &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso Fabrikam to Contoso | Audit logs Fabrikam - Microsoft Entra ID × « Download ) Refresh :unselected: Columns :selected: &amp; Got feedback? :selected: Overview As Provision on demand This view will be soon replaced with a view that includes infinite scrolling and column reordering. Try out our new audits preview. &quot;&gt;&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Manage&lt;/th&gt;
&lt;th&gt;Date : Last 1 month&lt;/th&gt;
&lt;th&gt;Show dates as : Local :unselected:&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Service : All :unselected:&lt;/th&gt;
&lt;th&gt;Category : All :unselected:&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Activity : All&lt;/th&gt;
&lt;th&gt;:selected: Add filters&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;24 Users and groups&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Stat ...&lt;/td&gt;
&lt;td&gt;Status reason&lt;/td&gt;
&lt;td&gt;Target(s)&lt;/td&gt;
&lt;td&gt;Initiated by (acto ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User &amp;quot;user3@fabrika ...  Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expression builder&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User &amp;quot;user3@fabrika ...  Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User &amp;quot;user3@fabrika ..  Fabrikam to Contoso, user3 ... :unselected:&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;The state of the entr ...  Fabrikam to Contoso, user1 ... :unselected:&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Synchronization rule action&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;The state of the entr ...  Fabrikam to Contoso, user1 ... :unselected:&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;No User with &amp;#39;alterna ... Fabrikam to Contoso, [Type: ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Retrieved &amp;#39;user1@fab ... Fabrikam to Contoso, user1 ...  :unselected:&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New support request&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A target entry in Azu ... Fabrikam to Contoso, user1 ...  :unselected:&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync (+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Received User &amp;#39;user1 ... Fabrikam to Contoso, user1 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync :selected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM&lt;/td&gt;
&lt;td&gt;Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Import&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Received User &amp;#39;user3 ...  Fabrikam to Contoso, user3 ...&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:38 PM Account Provisioning&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;ProvisioningManagement&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;This app role assign ...  Fabrikam to Contoso&lt;/td&gt;
&lt;td&gt;Azure AD Cloud Sync&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You can also view audit logs in the target tenant.&lt;/p&gt;
&lt;p&gt;4. In the target tenant, select Users &amp;gt; Audit logs to view logged events for user management.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/80) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Contoso &gt; Users :selected: Users | Audit logs Contoso - Microsoft Entra ID ×&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;P Search ¥&lt;/th&gt;
&lt;th&gt;Download Refresh :unselected:&lt;/th&gt;
&lt;th&gt;EE Columns :unselected: :unselected:&lt;/th&gt;
&lt;th&gt;&amp;amp; Got feedback? :selected:&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;amp; All users :selected:&lt;/td&gt;
&lt;td&gt;This view will be soon replaced with a view that includes infinite scrolling and column reordering. Try out our new audits preview. - &amp;gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C Sign-in logs&lt;/td&gt;
&lt;td&gt;Date : Last 1 month&lt;/td&gt;
&lt;td&gt;Show dates as : Local&lt;/td&gt;
&lt;td&gt;Service : All :unselected:&lt;/td&gt;
&lt;td&gt;Category : UserManagement&lt;/td&gt;
&lt;td&gt;Activity : All 7 Add filters&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X Diagnose and solve problems&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;Activity&lt;/td&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Status reason&lt;/td&gt;
&lt;td&gt;Target(s) Initiated by (actor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manage&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:24:19 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ... Microsoft Substrate Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleted users&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ... Microsoft.Azure.SyncFabric :selected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password reset&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Redeem external user invite&lt;/td&gt;
&lt;td&gt;Success UPN: user3_fabrika .... unknown&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp; User settings&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Redeem external user invite&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk operation results&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Update user&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;user3_fabrikam.com ... Microsoft B2B Admin Worker&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting + Support&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:44 PM&lt;/td&gt;
&lt;td&gt;Invited Users&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;Invite external user&lt;/td&gt;
&lt;td&gt;Success user3 Microsoft.Azure.SyncFabric&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1/22/2024, 6:18:44 PM&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Core Directory&lt;/td&gt;
&lt;td&gt;UserManagement&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Microsoft B2B Admin Worker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 14: Configure leave settings&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/81) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;p&gt;Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.&lt;/p&gt;
&lt;p&gt;1. In the target tenant, browse to Identity &amp;gt; External Identities &amp;gt; External collaboration settings.&lt;/p&gt;
&lt;p&gt;2. Under External user leave settings, choose whether to allow external users to leave your organization themselves.
:selected: :unselected: :unselected: :unselected: :selected:
This setting also applies to B2B collaboration and B2B direct connect, so if you set External user leave settings to No, B2B collaboration users and B2B direct connect users can&amp;#39;t leave your organization themselves. For more information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h1&gt;Troubleshooting tips&lt;/h1&gt;
&lt;h2&gt;Delete a configuration&lt;/h2&gt;
&lt;p&gt;Follows these steps to delete a configuration on the Configurations page.&lt;/p&gt;
&lt;p&gt;1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;2. On the Configurations page, add a check mark next to the configuration you want to delete.&lt;/p&gt;
&lt;p&gt;3. Select Delete and then OK to delete the configuration.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/82) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Default 2 | Cross-tenant synchronization &gt; Cross-tenant synchronization Cross-tenant synchronization | Configurations ... X « + New configuration :unselected: Refresh Delete &amp; Got feedback? O Overview Configurations Sync identities between Azure AD tenants. Learn more &amp; +&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;:unselected:&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Tenant Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;Fabrikam3&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Fabrikam4&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;Fabrikam5&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure&lt;/p&gt;
&lt;p&gt;When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:&lt;/p&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.
:selected:&lt;/p&gt;
&lt;!-- PageHeader=&quot;Error code: AzureDirectoryB2BManagementPolicyCheckFailure Details: Policy permitting auto-redemption of invitations not configured.&quot; --&gt;

&lt;h1&gt;Notifications&lt;/h1&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;More events in the activity log -&amp;gt; Dismiss all&lt;/p&gt;
&lt;p&gt;V
 :selected:
Testing connection to Fabrikam X You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;p&gt;Error code: AzureDirectoryB2BManagementPolicyCheckFailure Details: Policy permitting auto-redemption of invitations not configured. Request-id:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/83) --&gt; --&gt;

&lt;!-- FigureContent=&quot;\+ 16 minutes ago&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Follow the steps in Step 3: Automatically redeem invitations in the target tenant and Step 4: Automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;p&gt;Symptom - Automatic redemption check box is disabled&lt;/p&gt;
&lt;p&gt;When configuring cross-tenant synchronization, the Automatic redemption check box is disabled.
:selected: :selected: :selected:
Home &amp;gt; Contoso | External Identities &amp;gt; External Identities | Cross-tenant access settings &amp;gt; Outbound access settings - Contoso ...&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;O You need Azure AD Premium to configure trust settings and target select users, groups and applications in cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;B2B collaboration B2B direct connect Trust settings&lt;/p&gt;
&lt;p&gt;Automatic redemption&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. Learn more :unselected: Automatically redeem invitations with the tenant aa5eaf5a-ecc3-49f6-aac8-e50a26e228de.&lt;/p&gt;
&lt;p&gt;Save Discard&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;You must have Microsoft Entra ID P1 or P2 to configure trust settings.&lt;/p&gt;
&lt;p&gt;Symptom - Recently deleted user in the target tenant is not restored&lt;/p&gt;
&lt;p&gt;After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Manually restore the soft-deleted user in the target tenant. For more information, see Restore or remove a recently deleted user using Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Symptom - Users are skipped because SMS sign-in is enabled on the user
:selected: :selected:
Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecurityIds EQUALS &amp;#39;None&amp;#39;&amp;quot;&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;##### Disable SMS Sign-in options for the users&lt;/p&gt;
&lt;p&gt;#### Import module Install-Module Microsoft. Graph. Users. Actions Install-Module Microsoft. Graph. Identity. SignIns Import-Module Microsoft. Graph. Users. Actions&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -Scopes &amp;quot;User . Read. All&amp;quot;, &amp;quot;Group. ReadWrite. All&amp;quot;, &amp;quot;UserAuthenticationMethod . Read . All&amp;quot; , &amp;quot;UserAuthenticationMethod. ReadWrite&amp;quot; , &amp;quot;Us erAuthenticationMethod. ReadWrite. All&amp;quot;&lt;/p&gt;
&lt;p&gt;##### The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c- 87b9720928f7&lt;/p&gt;
&lt;p&gt;$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;&lt;/p&gt;
&lt;p&gt;#### Get the User Details&lt;/p&gt;
&lt;p&gt;$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;&lt;/p&gt;
&lt;p&gt;#### validate the value for SmsSignInState&lt;/p&gt;
&lt;p&gt;$smssignin = Get-MgUserAuthenticationPhoneMethod -UserId $userId&lt;/p&gt;
&lt;p&gt;{ if($smssignin. SmsSignInState -eq &amp;quot;ready&amp;quot;){ #### Disable Sms Sign-In for the user is set to ready&lt;/p&gt;
&lt;p&gt;Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId - PhoneAuthenticationMethodId $phoneAuthenticationMethodId&lt;/p&gt;
&lt;p&gt;Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green } else{ Write-Host &amp;quot;SMS sign-in status not set or found for the user &amp;quot; - ForegroundColor Yellow&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;!-- PageNumber=&quot;}&quot; --&gt;

&lt;!-- PageHeader=&quot;\##### End the script&quot; --&gt;


&lt;h2&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h2&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;p&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.&lt;/p&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see Configure external collaboration settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;. Tutorial: Reporting on automatic user account provisioning&lt;/p&gt;
&lt;p&gt;· Managing user account provisioning for enterprise apps in the Azure portal&lt;/p&gt;
&lt;p&gt;· What is single sign-on in Microsoft Entra ID?&lt;/p&gt;
&lt;h1&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h1&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/84) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Source tenant Target tenant Internal Internal UserS1 UserS2 UserS3 UserT1 UserT2 UserT3 GroupT1 Outbound access settings :selected: Automatically redeem invitations Cross-tenant synchronization External UserS1 UserS3 Configuration Inbound access settings Scope :selected: Allow users sync into this tenant :selected: :selected: :selected: Automatically redeem invitations UserS1 UserS3 Scoping filters department EQUALS Marketing Attribute mappings accountEnabled accountEnabled employeeld employeeld userPrincipalName userPrincipalName + extensionName companyName&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/85) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;. Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/86) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;· Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/p&gt;
&lt;p&gt;· Security Administrator role to configure cross-tenant access settings.&lt;/p&gt;
&lt;p&gt;· Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;h2&gt;Step 1: Sign in to the target tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/87) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Start PowerShell.&lt;/p&gt;
&lt;p&gt;2. If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;p&gt;3. Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$SourceTenantId = &amp;quot;&lt;SourceTenantId&gt;&amp;quot; $TargetTenantId = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;4. Use the Connect-MgGraph command to sign in to the target tenant and consent to the following required permissions.&lt;/p&gt;
&lt;p&gt;· Policy. Read.All&lt;/p&gt;
&lt;p&gt;· Policy. ReadWrite. CrossTenantAccess&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy . Read . All&amp;quot;, &amp;quot;Policy . ReadWrite. CrossTenantAccess&amp;quot;&lt;/p&gt;
&lt;h1&gt;Step 2: Enable user synchronization in the target tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/88) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the target tenant, use the New-MgPolicyCross TenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.&lt;/p&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ TenantId = $SourceTenantId&lt;/p&gt;
&lt;p&gt;} New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphInboundOutboundPoli cyConfiguration&lt;/p&gt;
&lt;p&gt;B2BCollaborationInbound&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BCollaborationOutbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting B2BDirectConnectInbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting B2BDirectConnectOutbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting IdentitySynchronization :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantIdentity&lt;/p&gt;
&lt;p&gt;SyncPolicyPartner InboundTrust :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantAccessPo licyInboundTrust IsServiceProvider TenantId : &lt;SourceTenantId&gt; TenantRestrictions : :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyTenantRestrictions AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&lt;/a&gt; ssPolicy/partners/$entity],&lt;/p&gt;
&lt;p&gt;[ crossCloudMeetingConfiguration,&lt;/p&gt;
&lt;p&gt;System. Collections. Generic. Dictionary 2[System. String, System. Object ]], [protectedContentSharing,&lt;/p&gt;
&lt;p&gt;System. Collections. Generic.Dictionary 2[System.String, System. Object&lt;/p&gt;
&lt;h2&gt;2. Use the Invoke-MgGraphRequest command to enable user synchronization in the target tenant.&lt;/h2&gt;
&lt;p&gt;If you get an Request_MultipleObjectsWithSameKeyValue error, you might already have an existing policy. For more information, see Symptom - Request_MultipleObjectsWithSameKeyValue error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ userSyncInbound = @{ isSyncAllowed = $true }&lt;/p&gt;
&lt;p&gt;} Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/&lt;/a&gt; partners/$SourceTenantId/identitySynchronization&amp;quot; -Body $Params&lt;/p&gt;
&lt;p&gt;3. Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to verify IsSyncAllowed is set to True.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId) . UserSyncInbound&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;!-- PageHeader=&quot;IsSyncAllowed&quot; --&gt;

&lt;p&gt;True&lt;/p&gt;
&lt;h1&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/89) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Target tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the target tenant, use the Update-MgPolicyCross TenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for inbound access.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$AutomaticUserConsentSettings = @{ &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;&lt;/p&gt;
&lt;p&gt;} Update-MgPolicyCrossTenantAccessPolicyPartner - CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings&lt;/p&gt;
&lt;h2&gt;Step 4: Sign in to the source tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/90) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Start an instance of PowerShell.&lt;/p&gt;
&lt;p&gt;2. Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;$SourceTenantId = &amp;quot;&lt;SourceTenantId&gt;&amp;quot; $TargetTenantId = &amp;quot;&lt;TargetTenantId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;3. Use the Connect-MgGraph command to sign in to the source tenant and consent to the following required permissions.&lt;/p&gt;
&lt;p&gt;· Policy. Read.All&lt;/p&gt;
&lt;p&gt;. Policy. ReadWrite. CrossTenantAccess&lt;/p&gt;
&lt;p&gt;· Application. ReadWrite.All&lt;/p&gt;
&lt;p&gt;· Directory. ReadWrite.All&lt;/p&gt;
&lt;p&gt;· AuditLog. Read.All&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy . Read . All&amp;quot;, &amp;quot;Policy . ReadWrite. CrossTenantAccess&amp;quot;, &amp;quot;Application . ReadWrite. All&amp;quot;, &amp;quot;Directory . ReadWrite. All&amp;quot;, &amp;quot;AuditLog. Read. All&amp;quot;&lt;/p&gt;
&lt;h2&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/91) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the New-MgPolicyCross TenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/p&gt;
&lt;p&gt;If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ TenantId = $TargetTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;AutomaticUserConsentSettings :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphInboundOutboundPoli cyConfiguration&lt;/p&gt;
&lt;p&gt;B2BCollaborationInbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BCollaborationOutbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting B2BDirectConnectInbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;B2BDirectConnectOutbound :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyB2BSetting&lt;/p&gt;
&lt;p&gt;IdentitySynchronization :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphCrossTenantIdentity SyncPolicyPartner&lt;/p&gt;
&lt;p&gt;InboundTrust :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyInboundTrust&lt;/p&gt;
&lt;p&gt;IsServiceProvider&lt;/p&gt;
&lt;p&gt;TenantId : &lt;TargetTenantId&gt; :&lt;/p&gt;
&lt;p&gt;TenantRestrictions :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models . MicrosoftGraphCrossTenantAccessPo licyTenantRestrictions&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAcce&lt;/a&gt; ssPolicy/partners/$entity],&lt;/p&gt;
&lt;p&gt;[crossCloudMeetingConfiguration,&lt;/p&gt;
&lt;p&gt;System. Collections. Generic. Dictionary 2[System.String, System. Object ]], [protectedContentSharing,&lt;/p&gt;
&lt;p&gt;System. Collections. Generic. Dictionary 2[System. String, System. Object&lt;/p&gt;
&lt;p&gt;2. Use the Update-MgPolicyCross TenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for outbound access.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;$AutomaticUserConsentSettings = @{ &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot; } Update-MgPolicyCrossTenantAccessPolicyPartner -&lt;/p&gt;
&lt;p&gt;CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings&lt;/p&gt;
&lt;h1&gt;Step 6: Create a configuration application in the source tenant&lt;/h1&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the Invoke-MgInstantiateApplication Template command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgServicePrincipal command to get the service principal ID and app role ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39; &amp;quot; | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AccountEnabled&lt;/td&gt;
&lt;td&gt;: True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddIns&lt;/td&gt;
&lt;td&gt;: {} :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlternativeNames&lt;/td&gt;
&lt;td&gt;: {}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDescription&lt;/td&gt;
&lt;td&gt;:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDisplayName&lt;/td&gt;
&lt;td&gt;: Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;AppId&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;AppId&gt;

&lt;p&gt;AppManagementPolicies&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AppOwnerOrganizationId&lt;/p&gt;
&lt;p&gt;AppRoleAssignedTo&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AppRoleAssignmentRequired&lt;/p&gt;
&lt;p&gt;: True&lt;/p&gt;
&lt;p&gt;AppRoleAssignments&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;AppRoles&lt;/p&gt;
&lt;p&gt;ApplicationTemplateId&lt;/p&gt;
&lt;p&gt;9fdf28b0dfe7&lt;/p&gt;
&lt;p&gt;: {&lt;AppRoleId&gt;}&lt;/p&gt;
&lt;p&gt;: 518e5f48-1fc8-4c48-9387-&lt;/p&gt;
&lt;p&gt;CreatedObjects&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;CustomSecurityAttributes&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models.MicrosoftGraphCustomSecurityAttri&lt;/p&gt;
&lt;p&gt;buteValue&lt;/p&gt;
&lt;p&gt;DelegatedPermissionClassifications&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DeletedDateTime :&lt;/p&gt;
&lt;p&gt;Description&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisabledByMicrosoftStatus&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;DisplayName&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Fabrikam&lt;/p&gt;
&lt;p&gt;Endpoints&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;ErrorUrl&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;FederatedIdentityCredentials&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;HomeRealmDiscoveryPolicies :&lt;/p&gt;
&lt;p&gt;Homepage&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; ServicePrincipalId&amp;gt;&lt;/p&gt;
&lt;p&gt;Info&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphInformationalUrl&lt;/p&gt;
&lt;p&gt;KeyCredentials&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;LicenseDetails&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;.. .&lt;/p&gt;
&lt;p&gt;3. Initialize a variable for the service principal ID.&lt;/p&gt;
&lt;p&gt;Be sure to use the service principal ID instead of the application ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$ServicePrincipalId = &amp;quot;&lt;ServicePrincipalId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;4. Initialize a variable for the app role ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$AppRoleId= &amp;quot;&lt;AppRoleId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;: &amp;lt; AppOwnerOrganizationId&amp;gt;&lt;/p&gt;
&lt;p&gt;ClaimsMappingPolicies&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/d&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/d&lt;/a&gt; efault. aspx?metadata=aad2aadsync | ISV9. 1 | primary | z&lt;/p&gt;
&lt;h1&gt;Step 7: Test the connection to the target tenant&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/92) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the Invoke-MgGraphRequest command to test the connection to the target tenant and validate the credentials.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/93) --&gt; --&gt;

&lt;!-- FigureContent=&quot;PowerShell $Params = @{ &quot;useSavedCredentials&quot; = $false &quot;templateId&quot; = &quot;Azure2Azure&quot; &quot;credentials&quot; = @( &quot;key&quot; = &quot;CompanyId&quot; &quot;value&quot; = $TargetTenantId } @{ &quot;key&quot; = &quot;AuthenticationType&quot; &quot;value&quot; = &quot;SyncPolicy&quot; } ) } Invoke-MgGraphRequest -Method POST -Uri &quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincip alId/synchronization/jobs/validateCredentials&quot; -Body $Params&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Step 8: Create a provisioning job in the source tenant&lt;/p&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;In the source tenant, to enable provisioning, create a provisioning job.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;!-- PageFooter=&quot;1\. Determine the synchronization template to use, such as Azure2Azure.&quot; --&gt;

&lt;p&gt;A template has pre-configured synchronization settings.&lt;/p&gt;
&lt;p&gt;2. In the source tenant, use the New-MgServicePrincipalSynchronizationJob command to create a provisioning job based on a template.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List&lt;/p&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;Id : &amp;lt; JobId&amp;gt; Schedule :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSche dule&lt;/p&gt;
&lt;p&gt;Schema :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSche ma Status :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationStat us SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv icePrincipalId&gt;&amp;#39;)/synchro&lt;/p&gt;
&lt;p&gt;nization/jobs/$entity]}&lt;/p&gt;
&lt;p&gt;3. Initialize a variable for the job ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$JobId = &amp;quot;&lt;JobId&gt;&amp;quot;&lt;/p&gt;
&lt;h2&gt;Step 9: Save your credentials&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/94) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the Invoke-MgGraphRequest command to save your credentials.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/95) --&gt; --&gt;

&lt;!-- FigureContent=&quot;PowerShell $Params = @{ &quot;value&quot; = @( @{ &quot;key&quot; = &quot;AuthenticationType&quot; &quot;value&quot; = &quot;SyncPolicy&quot; } @{ &quot;key&quot; = &quot;CompanyId&quot; &quot;value&quot; = $TargetTenantId } ) } Invoke-MgGraphRequest -Method PUT -Uri &quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincip alId/synchronization/secrets&quot; -Body $Params&quot; --&gt;

&lt;/figure&gt;


&lt;h1&gt;Step 10: Assign a user to the configuration&lt;/h1&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/96) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the New-MgServicePrincipalAppRoleAssignedTo command to assign an internal user to the configuration.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ PrincipalId = &amp;quot;&lt;PrincipalId&gt;&amp;quot; ResourceId = $ServicePrincipalId AppRoleId = $AppRoleId&lt;/p&gt;
&lt;!-- PageNumber=&quot;}&quot; --&gt;

&lt;p&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params Format-List&lt;/p&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;AppRoleId&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;AppRoleId&gt;

&lt;p&gt;CreatedDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 10:27:12 PM&lt;/p&gt;
&lt;p&gt;DeletedDateTime&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;Id&gt;

&lt;p&gt;PrincipalDisplayName&lt;/p&gt;
&lt;p&gt;User1&lt;/p&gt;
&lt;p&gt;PrincipalId&lt;/p&gt;
&lt;p&gt;: &amp;lt; PrincipalId&amp;gt;&lt;/p&gt;
&lt;p&gt;PrincipalType&lt;/p&gt;
&lt;p&gt;: User&lt;/p&gt;
&lt;p&gt;ResourceDisplayName&lt;/p&gt;
&lt;p&gt;: Fabrikam&lt;/p&gt;
&lt;p&gt;ResourceId&lt;/p&gt;
&lt;p&gt;: &amp;lt; ServicePrincipalId&amp;gt;&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$enti&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ty] }&lt;/p&gt;
&lt;h2&gt;Step 11: Test provision on demand&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/97) --&gt; --&gt;

&lt;/figure&gt;


&lt;p&gt;Source tenant&lt;/p&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. In the source tenant, use the Get- MgServicePrincipalSynchronizationJobSchema command to get the schema rule ID.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$SynchronizationSchema = Get- MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId $SynchronizationSchema. SynchronizationRules | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;ContainerFilter&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphContainerFilter&lt;/p&gt;
&lt;p&gt;Editable&lt;/p&gt;
&lt;p&gt;: True&lt;/p&gt;
&lt;p&gt;GroupFilter&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphGroupFilter&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: &amp;lt; RuleId&amp;gt;&lt;/p&gt;
&lt;p&gt;Metadata&lt;/p&gt;
&lt;p&gt;: {defaultSourceObjectMappings,&lt;/p&gt;
&lt;p&gt;supportsProvisionOnDemand }&lt;/p&gt;
&lt;p&gt;Name&lt;/p&gt;
&lt;p&gt;: USER_INBOUND_USER&lt;/p&gt;
&lt;p&gt;ObjectMappings&lt;/p&gt;
&lt;p&gt;: {Provision Azure Active Directory Users, , ,&lt;/p&gt;
&lt;p&gt;... }&lt;/p&gt;
&lt;p&gt;Priority&lt;/p&gt;
&lt;p&gt;: 1&lt;/p&gt;
&lt;p&gt;SourceDirectoryName&lt;/p&gt;
&lt;p&gt;: Azure Active Directory&lt;/p&gt;
&lt;p&gt;TargetDirectoryName&lt;/p&gt;
&lt;p&gt;: Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;h2&gt;2. Initialize a variable for the rule ID.&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$RuleId = &amp;quot;&lt;RuleId&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;3. Use the New-MgServicePrincipalSynchronizationJobOnDemand command to provision a test user on demand.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;$Params = @{ Parameters = @( @{ Subjects = @(&lt;/p&gt;
&lt;p&gt;ObjectId = &amp;quot;&lt;UserObjectId&gt;&amp;quot; ObjectTypeName = &amp;quot;User&amp;quot; }&lt;/p&gt;
&lt;p&gt;) RuleId = $RuleId&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;} New-MgServicePrincipalSynchronizationJobOnDemand - ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;Key : Microsoft. Identity. Health. CPP. Common. DataContracts. SyncFabric. Statu SInfo&lt;/p&gt;
&lt;p&gt;Value : [{&amp;quot;provisioningSteps&amp;quot;: [{&amp;quot;name&amp;quot;: &amp;quot;EntryImport&amp;quot;, &amp;quot;type&amp;quot; : &amp;quot;Import&amp;quot;, &amp;quot;status&amp;quot; : &amp;quot;Success&amp;quot;, &amp;quot;descript ion&amp;quot;: &amp;quot;Retrieved User&lt;/p&gt;
&lt;p&gt;&amp;#39;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;#39; from Azure Active Directory&amp;quot;, &amp;quot;timestamp&amp;quot; : &amp;quot;2023-07-31T22 :31:15.9116590Z&amp;quot;, &amp;quot;details&amp;quot; : {&amp;quot;objectId&amp;quot;:&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;UserObjectId&gt;&amp;quot;, &amp;quot;accountEnabled&amp;quot;: &amp;quot;True&amp;quot;, &amp;quot;displayName&amp;quot; : &amp;quot;User1&amp;quot;, &amp;quot;mail Nickname&amp;quot; : &amp;quot;user1&amp;quot;, &amp;quot;userPrincipalName&amp;quot; : &amp;quot;use&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKe&lt;/a&gt; yStringValuePair]}&lt;/p&gt;
&lt;h2&gt;Step 12: Start the provisioning job&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/98) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Now that the provisioning job is configured, in the source tenant, use the Start-MgServicePrincipalSynchronizationJob command to start the provisioning job.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId&lt;/p&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/99) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;1. Now that the provisioning job is running, in the source tenant, use the Get- MgServicePrincipalSynchronizationJob command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId Format-List&lt;/p&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;Id : &amp;lt; JobId&amp;gt; Schedule : Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSche dule Schema : Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationSche ma Status :&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphSynchronizationStat us SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;Serv icePrincipalId&gt;&amp;#39;)/synchro&lt;/p&gt;
&lt;p&gt;nization/jobs/$entity]}&lt;/p&gt;
&lt;p&gt;2. In addition to monitoring the status of the provisioning job, use the Get- MgAuditLogProvisioning command to retrieve the provisioning logs and get all the provisioning events that occur. For example, query for a particular user and determine if they were successfully provisioned.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;Get-MgAuditLogDirectoryAudit | Select -First 10 |&lt;/p&gt;
&lt;p&gt;Format-List&lt;/p&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;p&gt;ActivityDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 12:08:17 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName&lt;/p&gt;
&lt;p&gt;: Export&lt;/p&gt;
&lt;p&gt;AdditionalDetails&lt;/p&gt;
&lt;p&gt;: {Details, ErrorCode, EventName, ipaddr. .. }&lt;/p&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;p&gt;: ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId&lt;/p&gt;
&lt;p&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/p&gt;
&lt;p&gt;8f9dc271c5ec_L5BFV_161778479&lt;/p&gt;
&lt;p&gt;InitiatedBy&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphAuditActivityInitia&lt;/p&gt;
&lt;p&gt;tor1&lt;/p&gt;
&lt;p&gt;LoggedByService&lt;/p&gt;
&lt;p&gt;: Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;: success&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;p&gt;ActivityDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 12:08:17 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName&lt;/p&gt;
&lt;p&gt;: Export&lt;/p&gt;
&lt;p&gt;AdditionalDetails&lt;/p&gt;
&lt;p&gt;: {Details, ErrorCode, EventName, ipaddr. .. }&lt;/p&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;p&gt;: ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId&lt;/p&gt;
&lt;p&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/p&gt;
&lt;p&gt;8f9dc271c5ec_L5BFV_161778264&lt;/p&gt;
&lt;p&gt;InitiatedBy&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models. MicrosoftGraphAuditActivityInitia&lt;/p&gt;
&lt;p&gt;tor1&lt;/p&gt;
&lt;p&gt;LoggedByService&lt;/p&gt;
&lt;p&gt;: Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;: success&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties&lt;/p&gt;
&lt;p&gt;{ }&lt;/p&gt;
&lt;p&gt;ActivityDateTime&lt;/p&gt;
&lt;p&gt;: 7/31/2023 12:08:14 AM&lt;/p&gt;
&lt;p&gt;ActivityDisplayName&lt;/p&gt;
&lt;p&gt;: Synchronization rule action&lt;/p&gt;
&lt;p&gt;AdditionalDetails&lt;/p&gt;
&lt;p&gt;: {Details, ErrorCode, EventName, ipaddr .. . }&lt;/p&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;p&gt;: ProvisioningManagement&lt;/p&gt;
&lt;p&gt;CorrelationId&lt;/p&gt;
&lt;p&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/p&gt;
&lt;p&gt;Id&lt;/p&gt;
&lt;p&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-&lt;/p&gt;
&lt;p&gt;8f9dc271c5ec_L5BFV_161778395&lt;/p&gt;
&lt;p&gt;InitiatedBy&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft. Graph. PowerShell. Models.MicrosoftGraphAuditActivityInitia&lt;/p&gt;
&lt;p&gt;tor1&lt;/p&gt;
&lt;p&gt;LoggedByService&lt;/p&gt;
&lt;p&gt;: Account Provisioning&lt;/p&gt;
&lt;p&gt;OperationType&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;Result&lt;/p&gt;
&lt;p&gt;: success&lt;/p&gt;
&lt;p&gt;ResultReason&lt;/p&gt;
&lt;p&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in&lt;/p&gt;
&lt;p&gt;Azure Active Directory (target tenant) (User is active and assigned&lt;/p&gt;
&lt;p&gt;in Azure Active Directory, but no matching&lt;/p&gt;
&lt;p&gt;User was found in Azure Active Directory (target tenant))&lt;/p&gt;
&lt;p&gt;TargetResources&lt;/p&gt;
&lt;p&gt;: {&lt;ServicePrincipalId&gt;, }&lt;/p&gt;
&lt;p&gt;AdditionalProperties : {}&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;h1&gt;Symptom - Insufficient privileges error&lt;/h1&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;code: Authorization_RequestDenied message: Insufficient privileges to complete the operation.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;1. Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/p&gt;
&lt;p&gt;2. When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/p&gt;
&lt;p&gt;Symptom - New- MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/p&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;p&gt;Solution&lt;/p&gt;
&lt;p&gt;1. Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgPolicyCross TenantAccessPolicyPartner command to list the existing object.&lt;/p&gt;
&lt;p&gt;3. If you have an existing object, you might need to make an update using Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/p&gt;
&lt;h1&gt;Symptom - Request_MultipleObjectsWithSameKeyValue error&lt;/h1&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;p&gt;Invoke-MgGraphRequest: PUT&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partne&quot;&gt;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partne&lt;/a&gt; rs/&lt;SourceTenantId&gt;/identitySynchronization HTTP/1.1 409 Conflict&lt;/p&gt;
&lt;p&gt;{&amp;quot;error&amp;quot; : {&amp;quot;code&amp;quot; : &amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;, &amp;quot;message&amp;quot; : &amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;, &amp;quot;details&amp;quot;:&lt;/p&gt;
&lt;p&gt;[{&amp;quot;code&amp;quot;: &amp;quot;ConflictingObjects&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,&lt;/p&gt;
&lt;p&gt;Cause&lt;/p&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;1. Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;p&gt;2. Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to list the IsSyncAllowed setting.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;p&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId) .UserSyncInbound&lt;/p&gt;
&lt;p&gt;3. If you have an existing policy, you might need to make an update using Set- MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to enable user synchronization.&lt;/p&gt;
&lt;!-- PageHeader=&quot;PowerShell&quot; --&gt;

&lt;p&gt;$Params = @{ userSyncInbound = @{ isSyncAllowed = $true }&lt;/p&gt;
&lt;p&gt;} Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization - CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params&lt;/p&gt;
&lt;h1&gt;Next steps&lt;/h1&gt;
&lt;p&gt;· Microsoft Entra synchronization API overview&lt;/p&gt;
&lt;p&gt;. Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/p&gt;
&lt;h1&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h1&gt;
&lt;p&gt;Article · 01/18/2024&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h2&gt;Scoping filter use cases&lt;/h2&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;p&gt;. Outbound provisioning from Microsoft Entra ID to SaaS applications. When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/p&gt;
&lt;h3&gt;Q Tip&lt;/h3&gt;
&lt;p&gt; :unselected:
The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;p&gt;. Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory. When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;By default, Microsoft Entra provisioning connectors don&amp;#39;t have any attribute-based scoping filters configured.&lt;/p&gt;
&lt;h1&gt;Scoping filter construction&lt;/h1&gt;
&lt;p&gt;A scoping filter consists of one or more clauses. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;p&gt;As an example, consider the following scoping filter:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/100) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Source Object Query Define which users are in scope for provisioning. Only objects that meet the criteria below will be synchronized. × Add Scoping Filter Define which users are in scope for provisioning. Only objects that meet the criteria below will be synchroni ... X + Add scoping filter TARGET ATTRIBUTE OPERATOR VALUE SCOPING FILTER GROUP New York Engineering Delete i If multiple scoping filters are present, they are evaluated using &quot;OR&quot; logic. Add New Scoping Clause \* Scoping Filter Title New York Engineering V If multiple scoping clauses are present, they are evaluated using &quot;AND&quot; logic.&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;city&lt;/th&gt;
&lt;th&gt;EQUALS&lt;/th&gt;
&lt;th&gt;New Yorjk&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;Engineering&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeID (extension ...&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9][0-9][0-9][0 ...&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jobTitle&lt;/td&gt;
&lt;td&gt;IS NOT NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;v&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;p&gt;. They must be in New York.
:selected: :selected:
. They must work in the Engineering department.&lt;/p&gt;
&lt;p&gt;· Their company employee ID must be between 1,000,000 and 2,000,000.&lt;/p&gt;
&lt;p&gt;. Their job title must not be null or empty.&lt;/p&gt;
&lt;h2&gt;Create scoping filters&lt;/h2&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for one of the supported applications and are adding a scoping filter to it.&lt;/p&gt;
&lt;h2&gt;Create a scoping filter&lt;/h2&gt;
&lt;p&gt;Q Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp; as at least a Application Administrator.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; All applications.&lt;/p&gt;
&lt;p&gt;3. Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/p&gt;
&lt;p&gt;4. Select the Provisioning tab.&lt;/p&gt;
&lt;p&gt;5. In the Mappings section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/p&gt;
&lt;p&gt;6. Select the Source object scope menu.&lt;/p&gt;
&lt;p&gt;7. Select Add scoping filter.&lt;/p&gt;
&lt;p&gt;8. Define a clause by selecting a source Attribute Name, an Operator, and an Attribute Value to match against. The following operators are supported:&lt;/p&gt;
&lt;p&gt;a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/p&gt;
&lt;p&gt;b. ! &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/p&gt;
&lt;p&gt;c. ENDS_WITH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;p&gt;d. EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;p&gt;e. Greater Than. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;f. Greater_Than_OR_EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2, ... ].&lt;/p&gt;
&lt;p&gt;g. Includes. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described here.&lt;/p&gt;
&lt;p&gt;h. IS FALSE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;p&gt;i. IS NOT NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;p&gt;j. IS NULL. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;p&gt;k. IS TRUE. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;p&gt;l. NOT EQUALS. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;p&gt;m. NOT REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;p&gt;n. REGEX MATCH. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: ([1-9][0-9]) matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/101) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Important · The IsMemberOf filter is not supported currently. · The members attribute on a group is not supported currently. · Filtering is not supported for multi-valued attributes. · Scoping filters will return &quot;false&quot; if the value is null / empty.&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;9. Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/p&gt;
&lt;p&gt;10. In Scoping Filter Title, add a name for your scoping filter.&lt;/p&gt;
&lt;p&gt;11. Select OK.&lt;/p&gt;
&lt;p&gt;12. Select OK again on the Scoping Filters screen. Optionally, repeat steps 6-11 to add another scoping filter.&lt;/p&gt;
&lt;p&gt;13. Select Save on the Attribute Mapping screen.&lt;/p&gt;
&lt;h2&gt;® Important&lt;/h2&gt;
&lt;p&gt;Saving a new scoping filter triggers a new full sync for the application, where all users in the source system are evaluated again against the new scoping filter. If a user in the application was previously in scope for provisioning, but falls out of scope, their account is disabled or deprovisioned in the application. To override this default behavior, refer to Skip deletion for user accounts that go out of scope.&lt;/p&gt;
&lt;h2&gt;Common scoping filters&lt;/h2&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;.* \@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that have the domain @domain. com are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;.* \@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that has the domain @domain. com are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9] [0-9][0-9][0-9])&lt;/td&gt;
&lt;td&gt;All employees with workerID between 1000000 and 2000000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Related articles&lt;/h2&gt;
&lt;p&gt;· Automate user provisioning and deprovisioning to SaaS applications&lt;/p&gt;
&lt;p&gt;· Customize attribute mappings for user provisioning&lt;/p&gt;
&lt;p&gt;· Write expressions for attribute mappings&lt;/p&gt;
&lt;p&gt;· Account provisioning notifications&lt;/p&gt;
&lt;p&gt;· Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/p&gt;
&lt;p&gt;. List of tutorials on how to integrate SaaS apps&lt;/p&gt;
&lt;h1&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h2&gt;Configure accidental deletion prevention&lt;/h2&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center 2 as at least a Application Administrator.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications.&lt;/p&gt;
&lt;p&gt;3. Select your application.&lt;/p&gt;
&lt;p&gt;4. Select Provisioning and then on the provisioning page select Edit provisioning.&lt;/p&gt;
&lt;p&gt;1. Under Settings, select the Prevent accidental deletions check box and specify a deletion threshold.&lt;/p&gt;
&lt;p&gt;2. Ensure the Notification Email address is completed. If the deletion threshold is met, an email is sent.&lt;/p&gt;
&lt;p&gt;3. Select Save to save the changes.&lt;/p&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. To learn more about quarantine behavior, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;h2&gt;Recovering from an accidental deletion&lt;/h2&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says Provisioning has been quarantined. See quarantine details for more information.&lt;/p&gt;
&lt;!-- PageHeader=&quot;You can click either Allow deletes or View provisioning logs.&quot; --&gt;


&lt;h2&gt;Allowing deletions&lt;/h2&gt;
&lt;p&gt;The Allow deletes action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;p&gt;1. Select Allow deletes.&lt;/p&gt;
&lt;p&gt;2. Click Yes on the confirmation to allow the deletions.&lt;/p&gt;
&lt;p&gt;3. View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/p&gt;
&lt;h2&gt;Rejecting deletions&lt;/h2&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;p&gt;. Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/p&gt;
&lt;p&gt;· Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/p&gt;
&lt;p&gt;. Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/p&gt;
&lt;h3&gt;Test deletion prevention&lt;/h3&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h3&gt;Common deprovisioning scenarios to test&lt;/h3&gt;
&lt;p&gt;· Delete a user / put them into the recycle bin.&lt;/p&gt;
&lt;p&gt;· Block sign in for a user.&lt;/p&gt;
&lt;p&gt;. Unassign a user or group from the application (or configuration).
:unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected:
· Remove a user from a group that&amp;#39;s provides them access to the application (or configuration).&lt;/p&gt;
&lt;p&gt;To learn more about deprovisioning scenarios, see How Application Provisioning Works.&lt;/p&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;What scenarios count toward the deletion threshold?&lt;/h3&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h3&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h3&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the &amp;quot;circuit breaker&amp;quot; isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h2&gt;How are these deletion events logged?&lt;/h2&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven&amp;#39;t due to the deletion threshold. Navigation to Provisioning logs and then filter Action with StagedAction or StagedDelete.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· How application provisioning works&lt;/p&gt;
&lt;p&gt;· Plan an application provisioning deployment&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful? 3 Yes&lt;/p&gt;
&lt;p&gt;P No&lt;/p&gt;
&lt;p&gt;Provide product feedback &amp;amp; | Get help at Microsoft Q&amp;amp;A&lt;/p&gt;
&lt;h1&gt;On-demand provisioning in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;p&gt;· Troubleshoot configuration issues quickly.&lt;/p&gt;
&lt;p&gt;· Validate expressions that you&amp;#39;ve defined.&lt;/p&gt;
&lt;p&gt;· Test scoping filters.&lt;/p&gt;
&lt;h2&gt;How to use on-demand provisioning&lt;/h2&gt;
&lt;p&gt;? Tip&lt;/p&gt;
&lt;p&gt;Steps in this article may vary slightly based on the portal you start from.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp; as at least a Application Administrator.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; select your application.&lt;/p&gt;
&lt;p&gt;3. Select Provisioning.&lt;/p&gt;
&lt;p&gt;4. Configure provisioning by providing your admin credentials.&lt;/p&gt;
&lt;p&gt;5. Select Provision on demand.&lt;/p&gt;
&lt;p&gt;6. Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/p&gt;
&lt;h3&gt;1 Note&lt;/h3&gt;
&lt;p&gt;For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &amp;quot;WorkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in Workday. For SuccessFactors scenario, please provide &amp;quot;personIdExternal&amp;quot; of the user in SuccessFactors.&lt;/p&gt;
&lt;!-- PageFooter=&quot;7\. Select Provision at the bottom of the page.&quot; --&gt;

&lt;p&gt;:unselected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/102) --&gt; --&gt;

&lt;!-- FigureContent=&quot;A Provision on demand - Microsof X + x € C https://portal.azure.com/?Microsoft\_AAD\_Connect\_Provisioning=tip&amp;feature.provisionondemandsupportmember=true#view/Microsoft\_AAD\_Connect\_Provisioning/UserPr ... A\* To U 0 ... Microsoft Azure
&lt;figcaption&gt;

P Search resources, services, and docs (G+/]

&lt;/figcaption&gt;
 Home &gt; scimreftest &gt; AHCustom &gt; Provision on demand × :selected: Learn More :selected: Got feedback? Provision on-demand for a subset of users or groups before rolling it out broadly to your organization. When provisioning a group you can select 5 members at a time. :selected: No user or group will be provisioned on-demand that would not have been provisioned through the regular provisioning cycles. Selected group P On-demand provisioning Selected members 2 selected :selected: Alex Wilber AletW@scimreftest.onmicrosoft.com MEMBER :selected: Nestor Wilke NestorW@scimreftest.onmicrosoft.com MEMBER + Provision&quot; --&gt;

&lt;/figure&gt;


&lt;h1&gt;Understand the provisioning steps&lt;/h1&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h2&gt;Step 1: Test connection&lt;/h2&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;p&gt;· Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the tutorial list.&lt;/p&gt;
&lt;p&gt;. Make sure that the target system supports filtering on the matching attributes defined in the Attribute mappings pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/p&gt;
&lt;p&gt;. For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds
:selected: :selected: :selected: :unselected: :selected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected: :selected: :unselected:
to authorization requests in the way that the Microsoft Entra provisioning service expects. Have a look at an example request.&lt;/p&gt;
&lt;h3&gt;Step 2: Import user&lt;/h3&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;p&gt;· Evaluate whether the user is in scope for provisioning.&lt;/p&gt;
&lt;p&gt;· Check the target system for an existing user.&lt;/p&gt;
&lt;p&gt;· Determine what user attributes to export to the target system.&lt;/p&gt;
&lt;h2&gt;View details&lt;/h2&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;p&gt;. Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;/p&gt;
&lt;p&gt;· Update the user object with a value for the matching attribute.
 :unselected:
Change the matching attribute in your provisioning configuration.
 :unselected:
. If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/p&gt;
&lt;p&gt;. Make sure that the Attribute mapping page of your provisioning configuration contains the attribute that you expect.&lt;/p&gt;
&lt;h3&gt;Step 3: Determine if user is in scope&lt;/h3&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;p&gt;. Whether the user is assigned to the application.&lt;/p&gt;
&lt;p&gt;. Whether scope is set to Sync assigned or Sync all.&lt;/p&gt;
&lt;p&gt;. The scoping filters defined in your provisioning configuration.&lt;/p&gt;
&lt;!-- PageFooter=&quot;View details&quot; --&gt;
&lt;p&gt;:selected: :selected: :selected:
The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/p&gt;
&lt;p&gt;. Active in source system indicates that the user has the property IsActive set to true in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;. Assigned to application indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;. Scope sync all indicates that the scope setting allows all users and groups in the tenant.&lt;/p&gt;
&lt;p&gt;. User has required role indicates that the user has the necessary roles to be provisioned into the application.&lt;/p&gt;
&lt;p&gt;. Scoping filters are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;p&gt;. Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater Than operator with a noninteger value.&lt;/p&gt;
&lt;p&gt;. If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/p&gt;
&lt;h2&gt;Step 4: Match user between source and target&lt;/h2&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;p&gt;· If no users are matched in the target system, no properties are shown.&lt;/p&gt;
&lt;p&gt;. If one user matches in the target system, the properties of that user are shown.&lt;/p&gt;
&lt;p&gt;. If multiple users match, the properties of both users are shown.&lt;/p&gt;
&lt;p&gt;. If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/p&gt;
&lt;!-- PageFooter=&quot;Troubleshooting tips&quot; --&gt;

&lt;p&gt;. The provisioning service might not be able to match a user in the source system uniquely with a user in the target. Resolve this problem by ensuring that the matching attribute is unique.&lt;/p&gt;
&lt;p&gt;. Make sure that the target system supports filtering on the attribute that&amp;#39;s defined as the matching attribute.&lt;/p&gt;
&lt;h2&gt;Step 5: Perform action&lt;/h2&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:
 :unselected:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/103) --&gt; --&gt;

&lt;!-- FigureContent=&quot;A Perform action - Microsoft Azure X + x :selected: https://portal.azure.com/?Microsoft\_AAD\_Connect\_Provisioning=tip&amp;feature.provisionondemandsupportmember=true#view/Microsoft\_AAD\_Connect\_Provisioning/ ... A\* Microsoft Azure P Search resources, services, and docs (G+/) G Home &gt; scimreftest &gt; AHCustom &gt; Perform action × Provision on demand Group details Group membership operations User operations Data flow :selected: O Learn More Technical details &amp; Got feedback? :selected: 2 members are evaluated for addition. View details for more information. Group Members User principal name Group membership operations Membership update status OP On-demand provisioning d35358d6-ad58-4dDe-b13a-b73664455677 Alex Wilber AlexW@scimreftest.onmicrosoft.com Add member :selected: Success | View details Nestor Wilke NestorW@scimreftest.onmicrosoft.com Add member :selected: Success | View details 1. Import group This step shows the group retrieved from the source system and the properties of the group in the source system. :selected: Success | View details 2. Determine if group is in scope This step shows the scoping conditions that were evaluated and which ones the group passed or failed. :selected: Success | View details 3. Match group between source and target system This step shows whether the group was found in the target system as well as the properties of the group in the target system. :selected: Success | View details 4. Perform action This step shows the action that was performed in the target application, such as creating a group or updating a group. :selected: Success | View details + Retry Provision another object&quot; --&gt;

&lt;/figure&gt;



&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;p&gt;. Failures for exporting changes can vary greatly. Check the documentation for provisioning logs for common failures.&lt;/p&gt;
&lt;p&gt;. On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few
:selected: :selected: :selected: :unselected: :unselected: :unselected: :selected: :selected: :unselected:
minutes between when an object is assigned to an application and when that assignment is honored in on-demand provisioning. You may need to wait a few minutes and try again.&lt;/p&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;. Do you need to turn provisioning off to use on-demand provisioning? For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on- demand provisioning for all applications without having to stop provisioning jobs.&lt;/p&gt;
&lt;p&gt;. How long does on-demand provisioning take? On-demand provisioning typically takes less than 30 seconds.&lt;/p&gt;
&lt;h2&gt;Known limitations&lt;/h2&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your suggestions and feedback &amp;amp; so we can better determine what improvements to make next.&lt;/p&gt;
&lt;h2&gt;1 Note&lt;/h2&gt;
&lt;p&gt;The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/p&gt;
&lt;p&gt;. On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/p&gt;
&lt;p&gt;. Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;p&gt;· On-demand provisioning of roles isn&amp;#39;t supported.
:unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :selected: :unselected: :selected: :unselected: :unselected: :selected:
. On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/p&gt;
&lt;p&gt;. On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/p&gt;
&lt;p&gt;. The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Troubleshooting provisioning&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful? Yes P No&lt;/p&gt;
&lt;h1&gt;Provide product feedback &amp;amp; | Get help at Microsoft Q&amp;amp;A
:unselected: :unselected: :selected: :unselected: :selected: :unselected:
What are the Microsoft Entra user provisioning logs?&lt;/h1&gt;
&lt;p&gt;Article · 01/25/2024&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;p&gt;. Sign-ins - Information about sign-ins and how your resources are used by your users.&lt;/p&gt;
&lt;p&gt;· Audit - Information about changes applied to your tenant such as users and group management or updates applied to your tenant&amp;#39;s resources.&lt;/p&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h2&gt;License and role requirements&lt;/h2&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the Zero Trust guidance.&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader&lt;/td&gt;
&lt;td&gt;All editions of&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus Security Operator Application Administrator Cloud App Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:selected: :unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log / Report&lt;/td&gt;
&lt;td&gt;Roles&lt;/td&gt;
&lt;td&gt;Licenses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ProvisioningLogsRead permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage and insights&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Reports Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection*&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with IdentityRiskEventReadWrite&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;permission&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph activity logs&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with ListKeys permission&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the license requirements for Identity Protection.&lt;/p&gt;
&lt;h2&gt;What can you do with the provisioning logs?&lt;/h2&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;p&gt;· What groups were successfully created in ServiceNow?&lt;/p&gt;
&lt;p&gt;· What users were successfully removed from Adobe?&lt;/p&gt;
&lt;p&gt;· What users from Workday were successfully created in Active Directory?&lt;/p&gt;
&lt;p&gt;1 Note&lt;/p&gt;
&lt;p&gt;Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;h2&gt;What do the logs show?&lt;/h2&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;p&gt;· Steps: This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/p&gt;
&lt;p&gt;o Import the object.
 :unselected:
o Match the object between source and target.
 :unselected:
o Determine if the object is in scope.
 :unselected:
o Evaluate the object before synchronization.
 :unselected:
o Provision the object (create, update, delete, or disable).
 :unselected:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/104) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Steps Troubleshooting &amp; Recommendations Modified Properties Summary ¥ 1. Import User from Azure Active Directory :selected: ¥ 2. Determine if User is in scope :selected: V 3. Match User between Azure Active Directory and Box :selected: ^ 4. Provision User in Box :selected: EntryExportAdd Result Success Description User &quot;cheryl@f128.info&apos; was created in Box Reportableldentifier cheryl@f128.info&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;. Troubleshooting &amp;amp; Recommendations: If there was an error, this tab provides the error code and reason.&lt;/p&gt;
&lt;p&gt;. Modified Properties: If there were changes, this tab shows the old value and the new value.&lt;/p&gt;
&lt;h1&gt;· Summary: Provides an overview of what happened and identifiers for the object in the source and target systems.
:selected: :selected: :selected:
Map directory extensions in cross- tenant synchronization&lt;/h1&gt;
&lt;p&gt;Article · 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. Custom security attributes are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;· Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;· Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;h2&gt;Create directory extensions&lt;/h2&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see Syncing extension attributes for Microsoft Entra Application Provisioning.&lt;/p&gt;
&lt;h2&gt;Map directory extensions&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/105) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp; of the source tenant.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;3. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;4. Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;h1&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h1&gt;
&lt;p&gt;Fabrikam to Contoso | Provisioning ... Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/106) --&gt; --&gt;

&lt;!-- FigureContent=&quot;« Save Discard Overview v Admin Credentials 4 Provision on demand Manage ^ Mappings Users and groups Mappings Provisioning Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant). Expression builder Activity Audit logs Provisioning logs :unselected: Restore default mappings 0 Insights Troubleshooting + Support V Settings New support request Provisioning Status O + On Off&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;5. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/h2&gt;
&lt;p&gt;6. Scroll to the bottom of the page and select Add new mapping.&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/107) --&gt; --&gt;

&lt;!-- FigureContent=&quot;Home &gt; Cross-tenant synchronization | Configurations &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping X Save :selected: Discard Add New Mapping :unselected: Show advanced options +&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;preferredLanguage&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;7. In the Source attribute drop-down list, select a source attribute.&lt;/p&gt;
&lt;p&gt;If you created a directory extension in the source tenant, select the directory extension.
:selected: :selected: :selected: :unselected: :unselected:
Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Edit Attribute ...&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;Mapping type 0&lt;/p&gt;
&lt;p&gt;Direct&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;Source attribute * 1&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeHireDate&lt;/p&gt;
&lt;p&gt;employeeld&lt;/p&gt;
&lt;p&gt;employeeLeaveDateTime&lt;/p&gt;
&lt;p&gt;employeeOrgData.costCenter&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;employeeOrgData.division&lt;/p&gt;
&lt;p&gt;employeeType&lt;/p&gt;
&lt;p&gt;V&lt;/p&gt;
&lt;p&gt;testExtension (extension_c44d2adc1ddd43f29f29248e8de53937_testExtension)&lt;/p&gt;
&lt;p&gt;extensionAttribute1&lt;/p&gt;
&lt;p&gt;extensionAttribute10&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/p&gt;
&lt;p&gt;8. In the Target attribute drop-down list, select a target attribute.&lt;/p&gt;
&lt;p&gt;If you created a directory extension in the target tenant, select the directory extension.&lt;/p&gt;
&lt;p&gt;9. Select Ok to save the mapping.&lt;/p&gt;
&lt;h2&gt;Manually add directory extensions to the attribute list&lt;/h2&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/108) --&gt; --&gt;

&lt;/figure&gt;



&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;If your directory extension wasn&amp;#39;t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/p&gt;
&lt;p&gt;Ok
:selected:&lt;/p&gt;
&lt;!-- PageHeader=&quot;https://entra.microsoft.com/?&quot; --&gt;

&lt;p&gt;Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;3. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;4. Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;5. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;p&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/p&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt;&lt;/p&gt;
&lt;h2&gt;Attribute Mapping&lt;/h2&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping
 :selected:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/109) --&gt; --&gt;

&lt;!-- FigureContent=&quot;&gt; Show advanced options&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/110) --&gt; --&gt;

&lt;!-- FigureContent=&quot;\+
In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.
 Y&quot; --&gt;

&lt;/figure&gt;



&lt;h2&gt;Q Tip&lt;/h2&gt;
&lt;p&gt;If you don&amp;#39;t see the Edit attribute list links, be sure that you are signed in to the Microsoft Entra admin center using the link in Step 1.&lt;/p&gt;
&lt;p&gt;7. If you created a directory extension in the source tenant, select the Edit attribute list for Microsoft Entra ID link.&lt;/p&gt;
&lt;p&gt;8. If you created an extension in the target tenant, select the Edit attribute list for Azure Active Directory (target tenant) link.&lt;/p&gt;
&lt;p&gt;9. Add the directory extension and select the appropriate options.&lt;/p&gt;
&lt;p&gt;Save :selected: Discard
:selected: :unselected: :unselected:&lt;figure&gt;&lt;/p&gt;
&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/111) --&gt; --&gt;

&lt;!-- FigureContent=&quot;... &gt; Fabrikam to Contoso | Provisioning &gt; Attribute Mapping &gt; Edit Attribute List ... X Save :selected: Discard 4 1 Tips . Editing the attribute list informs the provisioning service what attributes exist in your system(s). Editing this list does not modify the schema of these systems. . Leave &quot;Metadata&quot; blank for new attributes unless instructed by documentation. Requires a JSON-encoded object. . Leave &quot;Reference Object Attribute&quot; blank unless the &quot;Type &quot;is set to &quot;Reference&quot;. Enter referenced attribute in the form of objectName.attributeName or just objectName. . See the online documentation on attribute editing. + Y&quot; --&gt;

&lt;/figure&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;alternativeSecuritylds&lt;/th&gt;
&lt;th&gt;String&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;:unselected:&lt;/th&gt;
&lt;th&gt;:unselected:&lt;/th&gt;
&lt;th&gt;:selected:&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userState&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extension_c44d2adc1ddd4 ...&lt;/td&gt;
&lt;td&gt;String V&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:selected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;10. Select Save.&lt;/p&gt;
&lt;p&gt;11. Refresh the browser.&lt;/p&gt;
&lt;p&gt;12. Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;h2&gt;Manually add directory extensions by editing the schema&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema by using the schema editor.&lt;/p&gt;
&lt;p&gt;1. Sign in to the Microsoft Entra admin center &amp;amp; of the source tenant.&lt;/p&gt;
&lt;p&gt;2. Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;3. Select Configurations and then select your configuration.&lt;/p&gt;
&lt;p&gt;4. Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;p&gt;5. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.
:selected: :unselected:&lt;/p&gt;
&lt;h3&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/h3&gt;
&lt;p&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Attribute Mapping ...&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;Save :selected: Discard&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;Delete&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping
 :selected:&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/112) --&gt; --&gt;

&lt;!-- FigureContent=&quot;&gt; Show advanced options&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;Supported Attributes&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;p&gt;Edit attribute list for Microsoft Entra ID&lt;/p&gt;
&lt;p&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/p&gt;
&lt;p&gt;Use the expression builder&lt;/p&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.&lt;/p&gt;
&lt;h3&gt;7. Select the Review your schema here link to open the Schema editor page.&lt;/h3&gt;
&lt;p&gt;... &amp;gt; Fabrikam to Contoso | Provisioning &amp;gt; Attribute Mapping &amp;gt;&lt;/p&gt;
&lt;p&gt;Schema editor ...&lt;/p&gt;
&lt;p&gt;X&lt;/p&gt;
&lt;p&gt;The schema below is a JSON representation of your provisioning configuration. You can use it to define what objects you want to provision, map objects between your source and target system, and specify who should be provisioned. We recommend making these changes directly through our configuration experience. The schema below is only used for saving your configuration and making changes in it.&lt;/p&gt;
&lt;p&gt;We recommend downloading and saving the current configuration prior to making changes. A backup copy can be used to roll back to a known good state.&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;&amp;quot;@odata. context&amp;quot;: &amp;quot;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#servicePri&quot;&gt;https://graph.microsoft.com/beta/$metadata#servicePri&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Save X Discard
 :selected:
Download Got feedback?&lt;/p&gt;
&lt;p&gt;×&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;&amp;quot;id&amp;quot;: &amp;quot;Azure2Azure. 1f58d1c91f90427abd849f967e96fb42.6a0b230b-3a8d-455d-9:&lt;/p&gt;
&lt;p&gt;4 &amp;quot;version&amp;quot;: &amp;quot;v1.2&amp;quot;,&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;&amp;quot;synchronizationRules&amp;quot;: [&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;7 &amp;quot;containerFilter&amp;quot;: null,&lt;/p&gt;
&lt;p&gt;8 &amp;quot;editable&amp;quot;: true,&lt;/p&gt;
&lt;p&gt;9 &amp;quot;groupFilter&amp;quot;: null,&lt;/p&gt;
&lt;p&gt;10 &amp;quot;id&amp;quot;: &amp;quot;df8df8d1-9e6e-40d3-b8df-09bbb402db7e&amp;quot;,&lt;/p&gt;
&lt;p&gt;11 &amp;quot;name&amp;quot;: &amp;quot;USER_INBOUND_USER&amp;quot;,&lt;/p&gt;
&lt;p&gt;12 &amp;quot;priority&amp;quot;: 1,&lt;/p&gt;
&lt;p&gt;13 &amp;quot;sourceDirectoryName&amp;quot;: &amp;quot;Microsoft Entra ID&amp;quot;,&lt;/p&gt;
&lt;figure&gt;

&lt;!-- Image reference points to missing asset: &lt;!-- Image reference points to missing/unhandled asset: ![](figures/113) --&gt; --&gt;

&lt;!-- FigureContent=&quot;\+ 1&quot; --&gt;

&lt;/figure&gt;


&lt;p&gt;8. Download an original copy of the schema as a backup.&lt;/p&gt;
&lt;p&gt;9. Modify the schema following your required configuration.&lt;/p&gt;
&lt;p&gt;10. Select Save.
:selected: :selected: :selected: :unselected: :unselected: :selected: :unselected:
11. Refresh the browser.&lt;/p&gt;
&lt;p&gt;12. Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;· Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/p&gt;
&lt;p&gt;· Configure cross-tenant synchronization&lt;/p&gt;
&lt;h1&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h1&gt;
&lt;p&gt;Article · 01/26/2024&lt;/p&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h2&gt;Syntax overview&lt;/h2&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;p&gt;. The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: FunctionName( &amp;lt;&amp;lt; argument 1&amp;gt;&amp;gt;, &amp;lt;&amp;lt; argument N&amp;gt;&amp;gt; )&lt;/p&gt;
&lt;p&gt;. You can nest functions within each other. For example: FunctionOne(FunctionTwo( &amp;lt;&amp;lt; argument1&amp;gt;&amp;gt;))&lt;/p&gt;
&lt;p&gt;· You can pass three different types of arguments into functions:&lt;/p&gt;
&lt;p&gt;1. Attributes, which must be enclosed in square brackets. For example: [attributeName]&lt;/p&gt;
&lt;p&gt;2. String constants, which must be enclosed in double quotes. For example: &amp;quot;United States&amp;quot;&lt;/p&gt;
&lt;p&gt;3. Other Functions. For example: FunctionOne( &amp;lt;&amp;lt; argument1&amp;gt;&amp;gt;, FunctionTwo( &amp;lt;&amp;lt; argument2&amp;gt;&amp;gt; ))&lt;/p&gt;
&lt;p&gt;. For string constants, if you need a backslash (\ ) or quotation mark (&amp;quot; ) in the string, it must be escaped with the backslash (\ ) symbol. For example: &amp;quot;Company name: \&amp;quot;Contoso\&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;· The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/p&gt;
&lt;!-- PageFooter=&quot;List of Functions&quot; --&gt;
&lt;p&gt;:selected: :unselected: :unselected: :selected: :unselected: :unselected:
Append AppRoleAssignmentsComplex BitAnd CBool CDate Coalesce ConvertToBase64 ConvertToUTF8Hex&lt;/p&gt;
&lt;p&gt;Count CStr DateAdd DateDiff DateFromNum FormatDateTime Guid IgnoreFlowIfNullOrEmpty IIF InStr IsNull IsNullOrEmpty IsPresent IsString Item Join Left Mid NormalizeDiacritics Not Now NumFromDate PCase RandomString Redact RemoveDuplicates Replace SelectUniqueValue&lt;/p&gt;
&lt;p&gt;SingleAppRoleAssignment Split StripSpaces Switch ToLower ToUpper Word&lt;/p&gt;
&lt;h2&gt;Append&lt;/h2&gt;
&lt;p&gt;Function: Append(source, suffix)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Append constant suffix to user name&lt;/p&gt;
&lt;p&gt;Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;Expression: Append([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;. INPUT: (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;AppRoleAssignmentsComplex&lt;/p&gt;
&lt;p&gt;Function: AppRoleAssignmentsComplex([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Used to configure multiple roles for a user. For detailed usage, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;( Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;BitAnd&lt;/h2&gt;
&lt;p&gt;Function: BitAnd(value1, value2)&lt;/p&gt;
&lt;p&gt;Description: This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;p&gt;. 0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/p&gt;
&lt;p&gt;. 1 - if both of the corresponding bits are 1.&lt;/p&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;( Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: BitAnd(&amp;amp;HF, &amp;amp;HF7)&lt;/p&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;p&gt;CBool&lt;/p&gt;
&lt;p&gt;Function: CBool(Expression)&lt;/p&gt;
&lt;p&gt;Description: CBool returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then CBool returns True, else it returns False.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;03 Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: CBool([attribute1] = [attribute2])&lt;/p&gt;
&lt;p&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;h2&gt;CDate&lt;/h2&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;CDate(expression)&lt;/p&gt;
&lt;p&gt;Description: The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as FormatDateTime and DateAdd.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Expression Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Remarks: The returned string is always in UTC and follows the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example 1: CDate([StatusHireDate]) Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;3/16/2020 7:00:00 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 2: CDate(&amp;quot;2021-06-30+08:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2021-06-30+08:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;p&gt;Example 3: CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/p&gt;
&lt;h2&gt;Coalesce&lt;/h2&gt;
&lt;p&gt;Function: Coalesce(source1, source2, ... , defaultValue)&lt;/p&gt;
&lt;p&gt;Description: Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Default value to be used when all source values are  NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;p&gt;Example: You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;p&gt;Expression: Coalesce([mail], [userPrincipalName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;. INPUT (mail): NULL&lt;/p&gt;
&lt;p&gt;. INPUT (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;h2&gt;ConvertToBase64&lt;/h2&gt;
&lt;p&gt;Function: ConvertToBase64(source) Description: The ConvertToBase64 function converts a string to a Unicode base64 string. Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABlAGwAbABvACAAdwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h2&gt;ConvertToUTF8Hex&lt;/h2&gt;
&lt;p&gt;Function: ConvertToUTF8Hex(source)&lt;/p&gt;
&lt;p&gt;Description: The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;ol start=&quot;0&quot;&gt;
&lt;li&gt;Expand table&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- PageHeader=&quot;Example: ConvertToUTF8Hex(&quot;Hello world!&quot;)&quot; --&gt;

&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h2&gt;Count&lt;/h2&gt;
&lt;p&gt;Function: Count(attribute)&lt;/p&gt;
&lt;p&gt;Description: The Count function returns the number of elements in a multi-valued attribute&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;attribute Multi-valued attribute that will have elements  counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;CStr&lt;/p&gt;
&lt;p&gt;Function: CStr(value) Description: The CStr function converts a value to a string data type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;() Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: CStr([dn])&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;p&gt;DateAdd&lt;/p&gt;
&lt;p&gt;Function: DateAdd(interval, value, dateTime)&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below this table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;dateTime Required&lt;/td&gt;
&lt;td&gt;Date Time&lt;/td&gt;
&lt;td&gt;Date Time representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use CDate function to wrap the datetime string. To get system time in UTC, use the Now function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;p&gt;. yyyy Year&lt;/p&gt;
&lt;p&gt;. m Month&lt;/p&gt;
&lt;p&gt;· d Day&lt;/p&gt;
&lt;p&gt;· ww Week&lt;/p&gt;
&lt;p&gt;. h Hour&lt;/p&gt;
&lt;p&gt;· n Minute&lt;/p&gt;
&lt;p&gt;· s Second&lt;/p&gt;
&lt;p&gt;Example 1: Generate a date value based on incoming StatusHireDate from Workday DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;interval value dateTime (value of variable   StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Add 7 days to hire date &amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a date ten days&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prior to hire date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two weeks to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;ww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Add ten months to hire &amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two years to hire&lt;/td&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;DateDiff&lt;/h2&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;p&gt;DateDiff(interval, date1, date2)&lt;/p&gt;
&lt;p&gt;Description:&lt;/p&gt;
&lt;p&gt;This function uses the interval parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;p&gt;· a positive number if date2 &amp;gt; date1,&lt;/p&gt;
&lt;p&gt;· a negative number if date2 &amp;lt; date1,&lt;/p&gt;
&lt;p&gt;· 0 if date2 == date1&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use CDate function to wrap the datetime string. To get system time in UTC, use the Now function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;p&gt;. yyyy Year&lt;/p&gt;
&lt;p&gt;· m Month&lt;/p&gt;
&lt;p&gt;· d Day&lt;/p&gt;
&lt;p&gt;· ww Week&lt;/p&gt;
&lt;p&gt;. h Hour&lt;/p&gt;
&lt;p&gt;. n Minute&lt;/p&gt;
&lt;p&gt;· s Second&lt;/p&gt;
&lt;p&gt;Example 1: Compare current date with hire date from Workday with different intervals DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;interval date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Positive difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08- 31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative difference in days between two dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in weeks between two dates&lt;/td&gt;
&lt;td&gt;WW&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in months between two dates&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in years between two dates&lt;/td&gt;
&lt;td&gt;УУУУ&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16- 07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Difference when both dates are same d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08- 31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in hours between two dates&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in minutes between two dates&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in seconds between two dates&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 2: Combine DateDiff with IIF function to set attribute value If an account is Active in Workday, set the accountEnabled attribute of the user to True only if hire date is within the next five days.
:unselected:
Switch ([Active], , &amp;quot;1&amp;quot;, IIF(DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate])) &amp;gt; 5, &amp;quot;False&amp;quot;, &amp;quot;True&amp;quot;), &amp;quot;0&amp;quot;, &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;h2&gt;DateFromNum&lt;/h2&gt;
&lt;p&gt;Function: DateFromNum(value) Description: The DateFromNum function converts a value in AD&amp;#39;s date format to a DateTime type.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;AD Date to be converted to DateTime type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: DateFromNum([lastLogonTimestamp])&lt;/p&gt;
&lt;p&gt;DateFromNum(129699324000000000)&lt;/p&gt;
&lt;p&gt;Returns a DateTime representing January 1, 2012 at 11:00PM.&lt;/p&gt;
&lt;h2&gt;FormatDateTime&lt;/h2&gt;
&lt;p&gt;Function: FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)&lt;/p&gt;
&lt;p&gt;Description: Takes a date string from one format and converts it into a different format. Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date TimeStyles&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Use this parameter to specify the formatting options that  customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Required/ Repeating&lt;/td&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;DateTimeStyles.RoundtripKind, DateTimeStyles.AllowLeadingWhite, DateTimeStyles.AllowTrailingWhite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Expected format of the source value. For supported  formats, see .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Format of the output date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Output date as a string in a certain format&lt;/h2&gt;
&lt;p&gt;Example: You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;p&gt;FormatDateTime([extensionAttribute1], , &amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;2015-01-23&amp;quot;&lt;/p&gt;
&lt;h2&gt;Guid&lt;/h2&gt;
&lt;p&gt;Function: Guid()&lt;/p&gt;
&lt;p&gt;Description: The function Guid generates a new random GUID&lt;/p&gt;
&lt;p&gt;Example: Guid() Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;h2&gt;IgnoreFlowIfNullOrEmpty&lt;/h2&gt;
&lt;p&gt;Function: IgnoreFlowIfNullOrEmpty(expression)&lt;/p&gt;
&lt;p&gt;Description: The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;ol start=&quot;0&quot;&gt;
&lt;li&gt;Expand table&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Don&amp;#39;t flow an attribute if it is null&lt;/p&gt;
&lt;p&gt;IgnoreFlowIfNullOrEmpty([department])&lt;/p&gt;
&lt;p&gt;The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;p&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say the SuccessFactors attribute prefix is mapped to the on-premises Active Directory attribute personalTitle using the following expression mapping:&lt;/p&gt;
&lt;p&gt;IgnoreFlowIfNullOrEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr.&amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))&lt;/p&gt;
&lt;p&gt;The above expression first evaluates the Switch function. If the prefix attribute doesn&amp;#39;t have any of the values listed within the Switch function, then Switch will return an empty string and the attribute personalTitle will not be included in the provisioning flow to on- premises Active Directory.&lt;/p&gt;
&lt;p&gt;IIF&lt;/p&gt;
&lt;p&gt;Function: IIF(condition,valueIfTrue,valueIfFalse)&lt;/p&gt;
&lt;p&gt;Description: The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;valueIfTrue Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;valueIfFalse&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to false, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following comparison operators can be used in the condition:&lt;/p&gt;
&lt;p&gt;· Equal to (=) and not equal to (&amp;lt;&amp;gt;)&lt;/p&gt;
&lt;p&gt;· Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)&lt;/p&gt;
&lt;p&gt;· Less than (&amp;lt;) and less than equal to ( &amp;lt;= )&lt;/p&gt;
&lt;p&gt;Example: Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute. IIF ([country]=&amp;quot;USA&amp;quot;, [country], [department])&lt;/p&gt;
&lt;h3&gt;Known limitations&lt;/h3&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For information about troubleshooting user creation issues, see Creation fails due to null / empty values.&lt;/p&gt;
&lt;p&gt;. The IIF function currently doesn&amp;#39;t support AND and OR logical operators.&lt;/p&gt;
&lt;p&gt;. To implement AND logic, use nested IIF statement chained along the trueValue path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;), &amp;quot;False&amp;quot;)&lt;/p&gt;
&lt;p&gt;. To implement OR logic, use nested IIF statement chained along the falseValue path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. IIF([country]=&amp;quot;USA&amp;quot;, &amp;quot;True&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;))&lt;/p&gt;
&lt;p&gt;. If the source attribute used within the IIF function is empty or null, the condition check fails.&lt;/p&gt;
&lt;p&gt;o Unsupported IIF expression examples:
 :unselected:
O IIF([country]=&amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;, [country])&lt;/p&gt;
&lt;p&gt;O :unselected: IIF (IsNullOrEmpty([country]), &amp;quot;Other&amp;quot;, [country])&lt;/p&gt;
&lt;p&gt;O :unselected: IIF (IsPresent([country]), [country], &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;p&gt;o Recommended workaround: Use the Switch function to check for empty/null values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present, pass the country attribute value to target attribute. o :unselected: Switch([country], [country], &amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;)&lt;/p&gt;
&lt;!-- PageNumber=&quot;InStr&quot; --&gt;
&lt;p&gt;:selected: :unselected: :unselected: :selected: :selected: :unselected: :unselected:
Function: InStr(value1, value2, start, compare Type)&lt;/p&gt;
&lt;p&gt;Description: The InStr function finds the first occurrence of a substring in a string Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compare Type&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: InStr(&amp;quot;The quick brown fox&amp;quot;, &amp;quot;quick&amp;quot;)&lt;/p&gt;
&lt;p&gt;Evaluates to 5&lt;/p&gt;
&lt;p&gt;InStr(&amp;quot;repEated&amp;quot;, &amp;quot;e&amp;quot;, 3, vbBinaryCompare)&lt;/p&gt;
&lt;p&gt;Evaluates to 7&lt;/p&gt;
&lt;h2&gt;IsNull&lt;/h2&gt;
&lt;p&gt;Function: IsNull(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNull([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;!-- PageFooter=&quot;IsNullorEmpty&quot; --&gt;

&lt;!-- PageHeader=&quot;Function: IsNullOrEmpty(Expression)&quot; --&gt;

&lt;p&gt;Description: If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNullOrEmpty([displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h2&gt;IsPresent&lt;/h2&gt;
&lt;p&gt;Function: IsPresent(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Switch(IsPresent ([directManager]), [directManager],&lt;/p&gt;
&lt;p&gt;IsPresent ([skiplevelManager]), [skiplevelManager], IsPresent([director]), [director])&lt;/p&gt;
&lt;h2&gt;IsString&lt;/h2&gt;
&lt;p&gt;Function: IsString(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression can be evaluated to a string type, then the IsString function evaluates to True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- PageHeader=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Item&lt;/h2&gt;
&lt;p&gt;Function: Item(attribute, index)&lt;/p&gt;
&lt;p&gt;Description: The Item function returns one item from a multi-valued string/attribute. Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Item([proxyAddresses], 1) returns the first item in the multi-valued attribute. Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h3&gt;Join&lt;/h3&gt;
&lt;p&gt;Function: Join(separator, source1, source2, ... )&lt;/p&gt;
&lt;p&gt;Description: Join() is similar to Append(), except that it can combine multiple source string values into a single string, and each value will be separated by a separator string.&lt;/p&gt;
&lt;p&gt;If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &amp;quot;&amp;quot; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required, variable- number of times&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String String values to be joined together.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Left&lt;/h3&gt;
&lt;p&gt;Function: Left(String, NumChars)&lt;/p&gt;
&lt;p&gt;Description: The Left function returns a specified number of characters from the left of a string. If numChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in numChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;0] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;The string to return characters from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NumChars Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;A number identifying the number of characters to return from the beginning (left) of string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;p&gt;Mid&lt;/p&gt;
&lt;p&gt;Function: Mid(source, start, length)&lt;/p&gt;
&lt;p&gt;Description: Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- PageFooter=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;NormalizeDiacritics&lt;/h2&gt;
&lt;p&gt;Function: NormalizeDiacritics(source)&lt;/p&gt;
&lt;p&gt;Description: Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters (accent marks) into legal values that can be used in various user identifiers such as user principal names, SAM account names, and email addresses.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ä, à, â, ã, å, á, ą, ă, ā, á, à, â, ã, ã, ä, å, a, å&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Ä, À, Â, Ã, Å, Á, Ą, Ă, Ā, Á, À, Â, Ã, Å, Ä, Ă, A, Å&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, æ&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Æ&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, č, ć, č, c&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, Č, Ć, č, C&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ď, d, d&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Ď, Ď, D&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ë, è, é, ê, ę, ě, ė, ē, é, è, ê, ẽ, ē, e̱, ē, é&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;Ë, È, É, Ê, Ę, Ě, Ė, Ē, É, È, Ê, Ẽ, Ē, E, Ē, Ẻ&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character with Diacritic&lt;/td&gt;
&lt;td&gt;Normalized character&lt;/td&gt;
&lt;td&gt;Character with Diacritic&lt;/td&gt;
&lt;td&gt;Normalized character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ğ, ğ, g&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ğ, Ğ, Ģ&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ï, î, ì, í, ı, ī, ĺ, ì, î, ĩ, į&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Ï, Î, Ì, Í, i, Ī, Í, Ì, Î, Ī, Į&lt;/td&gt;
&lt;td&gt;I :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ľ, +, ī, Į, Į&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Ł, L, C, C, L&lt;/td&gt;
&lt;td&gt;L :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ñ, ń, ň, n̄, ṋ&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ñ, Ń, Ň, N̄, Ņ :selected: :selected: :selected: :selected:&lt;/td&gt;
&lt;td&gt;N :selected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ö, ò, ő, õ, ô, ó, õ, ó, ô, ô, õ, õ, ö, Q, õ, ỏ, o&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Ö, Ò, Ő, Õ, Ô, Ó, ō, Ó, Ò, Ô, 0 :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected: :unselected:  Õ, Ô, Ö, Q, Õ, ỏ, 0 :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ø,ð, œ&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Ø,Ở, Œ :selected:&lt;/td&gt;
&lt;td&gt;OE :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ř, ř, Ľ, į&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ř, Ŕ, R, Ř&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;SS&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;š, ś, ș, ș, š, s&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Š, Ś, Ș, Ș, S, Ş&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ť, ț, t, ţ&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ť, Ț, Ī, Ţ&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ü, ù, û, ú, ů, ű, ū, ú, ù, â, ũ, ū, ū, ü, u̱, u̱&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Ü, Ù, Û, Ú, Ů, Ű, Ū, Ú, Ù, Û, Õ, U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ÿ, ý, ÿ, ý, ỳ, ỹ, y&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Ÿ, Ý, Y, Ý, Ỳ, Ỹ, Y&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ź, ž, ż, ž, z&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;ź, ž,Ż,Ż,Z&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Remove diacritics from a string&lt;/h2&gt;
&lt;p&gt;Example: Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/p&gt;
&lt;p&gt;Expression: NormalizeDiacritics([givenName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (givenName): &amp;quot;Zoë&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;Zoe&amp;quot;&lt;/p&gt;
&lt;p&gt;Not&lt;/p&gt;
&lt;p&gt;Function: Not(source)&lt;/p&gt;
&lt;p&gt;Description: Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Boolean String Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Now&lt;/h2&gt;
&lt;p&gt;Function: Now()&lt;/p&gt;
&lt;p&gt;Description: The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;Example: Now()&lt;/p&gt;
&lt;p&gt;Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;h2&gt;NumFromDate&lt;/h2&gt;
&lt;p&gt;Function: NumFromDate(value)&lt;/p&gt;
&lt;p&gt;Description: The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 7 format. If the date variable is in a different format, use FormatDateTime function to convert the date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;. Workday example Assuming you want to map the attribute ContractEndDate from Workday, which is in the format 2020-12-31-08:00 to accountExpires field in AD, here&amp;#39;s how you can use this function and change the timezone offset to match your locale. NumFromDate (Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], ,&amp;quot;yyyy-MM- ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/p&gt;
&lt;p&gt;· SuccessFactors example Assuming you want to map the attribute endDate from SuccessFactors, which is in the format M/d/yyyy hh:mm:ss tt to accountExpires field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale. NumFromDate (Join(&amp;quot;&amp;quot;, FormatDateTime([endDate], ,&amp;quot;M/d/yyyy hh:mm: ss tt&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/p&gt;
&lt;h2&gt;PCase&lt;/h2&gt;
&lt;p&gt;Function: PCase(source, wordSeparators)&lt;/p&gt;
&lt;p&gt;Description: The PCase function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Specify a set of characters that is used as word  separators (example: &amp;quot; ,-&amp;#39;&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remarks:&lt;/h3&gt;
&lt;p&gt;. If the wordSeparators parameter isn&amp;#39;t specified, then PCase internally invokes the .NET function ToTitleCase to convert the source string to proper case. The .NET function ToTitleCase supports a comprehensive set of the Unicode character categories &amp;quot; as word separators.&lt;/p&gt;
&lt;p&gt;o Space character
 :unselected:
o New line character
 :unselected:
o Control characters like CRLF
 :unselected:
o Format control characters
 :unselected:
o ConnectorPunctuation characters like underscore
 :unselected:
o DashPunctuation characters like dash and hyphen (including characters such En :unselected: Dash, Em Dash, double hyphen, etc.)
:selected:
o OpenPunctuation and ClosePunctuation characters that occur in pairs like parenthesis, curly bracket, angle bracket, etc.&lt;/p&gt;
&lt;p&gt;o InitialQuotePunctuation and FinalQuotePunctuation characters like single quotes, double quotes and angular quotes.&lt;/p&gt;
&lt;p&gt;o OtherPunctuation characters like exclamation mark, number sign, percent sign, ampersand, asterisk, comma, full stop, colon, semi-colon, etc.&lt;/p&gt;
&lt;p&gt;o MathSymbol characters like plus sign, less-than and greater-than sign, vertical :unselected: line, tilde, equals sign, etc.&lt;/p&gt;
&lt;p&gt;o CurrencySymbol characters like dollar sign, cent sign, pound sign, euro sign, etc.
 :unselected:
· ModifierSymbol characters like macron, accents, arrow heads, etc.
 :unselected:
o OtherSymbol characters like copyright sign, degree sign, registered sign, etc.&lt;/p&gt;
&lt;p&gt;. If the wordSeparators parameter is specified, then PCase only uses the characters specified as word separators.&lt;/p&gt;
&lt;h4&gt;Example:&lt;/h4&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes firstName and lastName from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PCase([firstName])&lt;/td&gt;
&lt;td&gt;firstName =&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo&lt;/td&gt;
&lt;td&gt;As the wordSeparators parameter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;PABLO&lt;/td&gt;
&lt;td&gt;Gonsalves&lt;/td&gt;
&lt;td&gt;isn&amp;#39;t specified, the PCase function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;GONSALVES&lt;/td&gt;
&lt;td&gt;(Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;uses the default word separators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase([lastName],&amp;quot; &amp;#39;-&lt;/td&gt;
&lt;td&gt;lastName =&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-&lt;/td&gt;
&lt;td&gt;The PCase function uses characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;#39;)&lt;/td&gt;
&lt;td&gt;&amp;quot;PINTO-&lt;/td&gt;
&lt;td&gt;De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;in the wordSeparators parameter to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;identify words and transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase (Join(&amp;quot; &amp;quot;,&lt;/td&gt;
&lt;td&gt;firstName =&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory&lt;/td&gt;
&lt;td&gt;You can nest the Join function within&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[firstName] ,&lt;/td&gt;
&lt;td&gt;GREGORY,&lt;/td&gt;
&lt;td&gt;James&amp;quot;&lt;/td&gt;
&lt;td&gt;PCase. As the wordSeparators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[lastName]) )&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;RandomString&lt;/h2&gt;
&lt;p&gt;Function: RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)
:unselected: :unselected: :unselected: :unselected:
Description: The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified here.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: - Generate a random string without special character restrictions: RandomString(6,3,0,0,3) Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/p&gt;
&lt;p&gt;Example 2: - Generate a random string with special character restrictions: RandomString(10,2,2,2,1,&amp;quot;?,&amp;quot;) Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/p&gt;
&lt;h2&gt;Redact&lt;/h2&gt;
&lt;p&gt;Function: Redact()&lt;/p&gt;
&lt;p&gt;Description: The Redact function replaces the attribute value with the string literal &amp;#39; [Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;!-- PageHeader=&quot;[] Expand table&quot; --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;attribute/value Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Redact an attribute: Redact ([userPrincipalName]) Removes the userPrincipalName from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 2: Redact a string: Redact (&amp;quot;StringToBeRedacted&amp;quot;) Removes a constant string from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 3: Redact a random string: Redact (RandomString(6,3,0,0,3)) Removes the random string from the provisioning logs.&lt;/p&gt;
&lt;h2&gt;RemoveDuplicates&lt;/h2&gt;
&lt;p&gt;Function: RemoveDuplicates(attribute)&lt;/p&gt;
&lt;p&gt;Description: The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: RemoveDuplicates([proxyAddresses]) Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/p&gt;
&lt;h2&gt;Replace&lt;/h2&gt;
&lt;p&gt;Function: Replace(source, oldValue, regexPattern, regexGroupName, replacementValue, replacementAttributeName, template)&lt;/p&gt;
&lt;p&gt;Description: Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided:&lt;/p&gt;
&lt;p&gt;· When oldValue and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o Replaces all occurrences of oldValue in the source with replacementValue&lt;/p&gt;
&lt;p&gt;· When oldValue and template are provided:&lt;/p&gt;
&lt;p&gt;o Replaces all occurrences of the oldValue in the template with the source value&lt;/p&gt;
&lt;p&gt;· When regexPattern and replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o The function applies the regexPattern to the source string and you can use the regex group names to construct the string for replacementValue&lt;/p&gt;
&lt;p&gt;9 Note&lt;/p&gt;
&lt;p&gt;To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.&lt;/p&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementValue are provided:&lt;/p&gt;
&lt;p&gt;o The function applies the regexPattern to the source string and replaces all values matching regexGroupName with replacementValue&lt;/p&gt;
&lt;p&gt;· When regexPattern, regexGroupName, replacementAttributeName are provided:&lt;/p&gt;
&lt;p&gt;o If source has a value, source is returned&lt;/p&gt;
&lt;p&gt;o If source has no value, the function applies the regexPattern to the replacementAttributeName and returns the value matching regexGroupName&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in source or template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in source. When replacementAttributeName is used, the regexPattern is applied to extract a value from replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside regexPattern. When named replacementAttributeName is used, we&amp;#39;ll extract the value of the named regex group from the&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected: :unselected: :unselected: :unselected: :selected: :unselected: :unselected: :unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Required/ Repeating&lt;/td&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;replacementAttributeName and return it as the replacement value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;New value to replace old one with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the attribute to be used for replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;When template value is provided, we&amp;#39;ll look for oldValue inside the template and replace it with source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace characters using a regular expression&lt;/h2&gt;
&lt;p&gt;Example 1: Using oldValue and replacementValue to replace the entire source string with another string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your HR system has an attribute BusinessTitle. As part of recent job title changes, your company wants to update anyone with the business title &amp;quot;Product Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;p&gt;Replace([BusinessTitle], &amp;quot;Product Developer&amp;quot;, , , &amp;quot;Software Engineer&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [BusinessTitle]&lt;/p&gt;
&lt;p&gt;· oldValue: &amp;quot;Product Developer&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;Software Engineer&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: Software Engineer&lt;/p&gt;
&lt;p&gt;Example 2: Using oldValue and template to insert the source string into another templatized string.&lt;/p&gt;
&lt;p&gt;The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets replaced.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you want to always generate login ID in the format &lt;username&gt;@contoso.com. There is a source attribute called UserID and you want that value to be used for the &lt;username&gt; portion of the login ID. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;p&gt;Replace ([UserID], &amp;quot;&lt;username&gt;&amp;quot;, , , ,&lt;/p&gt;
&lt;p&gt;, &amp;quot;&lt;username&gt;@contoso.com&amp;quot;)&lt;/p&gt;
&lt;p&gt;· source: [UserID] = &amp;quot;jsmith&amp;quot;&lt;/p&gt;
&lt;p&gt;· oldValue: &amp;quot;&lt;username&gt; &amp;quot;&lt;/p&gt;
&lt;p&gt;· template: &amp;quot;&lt;username&gt;@contoso.com&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;Example 3: Using regexPattern and replacementValue to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you have a source attribute telephoneNumber that has components country code and phone number separated by a space character. For example, +91 9998887777 Then in this case, you can use the following expression in your attribute mapping to extract the 10 digit phone number.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;|+( ?&amp;lt; isdCode&amp;gt;\\d* ) ( ?&amp;lt; phoneNumber&amp;gt;\d{10})&amp;quot;, , &amp;quot;${phoneNumber}&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot; ${phoneNumber } &amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 9998887777&lt;/p&gt;
&lt;p&gt;You can also use this pattern to remove characters and collapse a string. For example, the expression below removes parenthesis, dashes and space characters in the mobile number string and returns only digits.&lt;/p&gt;
&lt;p&gt;Replace([mobile], , &amp;quot;[ () \s-]+&amp;quot;, , &amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;[()\\s-]+&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· Expression output: 19998887777&lt;/p&gt;
&lt;p&gt;Example 4: Using regexPattern, regexGroupName and replacementValue to extract a portion of the source string and replace it with another literal value or empty string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute AddressLineData with two components street number and street name. As part of a recent move, let&amp;#39;s say the street number of the address changed, and you want to update only the street number portion of the address line. Then in this case, you can use the following expression in your attribute mapping to extract the street number.&lt;/p&gt;
&lt;p&gt;Replace([AddressLineData], ,&amp;quot;( ?&amp;lt; streetNumber&amp;gt;^\\d*)&amp;quot;, &amp;quot;streetNumber&amp;quot;, &amp;quot;888&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [AddressLineData] = &amp;quot;545 Tremont Street&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;( ?&amp;lt; streetNumber&amp;gt;^\\d*) &amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;streetNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;888&amp;quot;&lt;/p&gt;
&lt;p&gt;. Expression output: 888 Tremont Street&lt;/p&gt;
&lt;p&gt;Here is another example where the domain suffix from a UPN is replaced with an empty string to generate login ID without domain suffix.&lt;/p&gt;
&lt;p&gt;Replace([userPrincipalName], , &amp;quot;( ?&amp;lt; Suffix&amp;gt;@(.)*)&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source: [userPrincipalName] =&amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot; (?‹Suffix&amp;gt;@(.)*) &amp;quot;&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;Suffix&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· Expression output: jsmith&lt;/p&gt;
&lt;p&gt;Example 5: Using regexPattern, regexGroupName and replacementAttributeName to handle scenarios when the source attribute is empty or doesn&amp;#39;t have a value.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute telephoneNumber. If telephoneNumber is empty, you want to extract the 10 digits of the mobile number attribute. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;|+( ?&amp;lt; isdCode&amp;gt; \d* ) ( ?&amp;lt; phoneNumber&amp;gt;\d{10})&amp;quot;,&lt;/p&gt;
&lt;p&gt;&amp;quot;phoneNumber&amp;quot; , , [mobile], )&lt;/p&gt;
&lt;p&gt;. source: [telephoneNumber] = &amp;quot;&amp;quot; (empty string)&lt;/p&gt;
&lt;p&gt;· regexPattern: &amp;quot;\\+( ?&amp;lt; isdCode&amp;gt;\\d* )( ?&amp;lt; phoneNumber&amp;gt;\\d{10})&lt;/p&gt;
&lt;p&gt;· regexGroupName: &amp;quot;phoneNumber&amp;quot;&lt;/p&gt;
&lt;p&gt;· replacementAttributeName: [mobile] = &amp;quot;+91 8887779999&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 8887779999&lt;/p&gt;
&lt;p&gt;Example 6: You need to find characters that match a regular expression value and remove them.&lt;/p&gt;
&lt;p&gt;Replace([mailNickname], , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;p&gt;· source [mailNickname]&lt;/p&gt;
&lt;p&gt;· oldValue: &amp;quot;john_doe72&amp;quot;&lt;/p&gt;
&lt;p&gt;· replaceValue: &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;· Expression output: 72&lt;/p&gt;
&lt;h1&gt;SelectUniqueValue&lt;/h1&gt;
&lt;p&gt;Function: SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ... )&lt;/p&gt;
&lt;p&gt;Description: Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;p&gt;. This function must be at the top-level and cannot be nested.&lt;/p&gt;
&lt;p&gt;. This function cannot be applied to attributes that have a matching precedence.&lt;/p&gt;
&lt;p&gt;. This function is only meant to be used for entry creations. When using it with an attribute, set the Apply Mapping property to Only during object creation.&lt;/p&gt;
&lt;p&gt;. This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/p&gt;
&lt;p&gt;. The LDAP search that SelectUniqueValue function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the NormalizeDiacritics function as shown in the example below to normalize special characters.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1 ...&lt;/td&gt;
&lt;td&gt;At least 2 are required,&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uniqueValueRuleN&lt;/td&gt;
&lt;td&gt;no upper bound&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/h2&gt;
&lt;p&gt;Example: Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;p&gt;Expression:&lt;/p&gt;
&lt;p&gt;ad-attr-mapping-expr
:unselected: :selected: :unselected: :unselected: :unselected: :unselected:
SelectUniqueValue (&lt;/p&gt;
&lt;p&gt;Join (&amp;quot;@&amp;quot;, NormalizeDiacritics (StripSpaces(Join(&amp;quot;.&amp;quot;,&lt;/p&gt;
&lt;p&gt;[PreferredFirstName], [PreferredLastName]) ) ), &amp;quot;contoso. com&amp;quot;),&lt;/p&gt;
&lt;p&gt;Join (&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;), Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;) )&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;. INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/p&gt;
&lt;p&gt;. INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/p&gt;
&lt;p&gt;. OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; doesn&amp;#39;t already exist in the directory&lt;/p&gt;
&lt;p&gt;. OUTPUT: &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; already exists in the directory&lt;/p&gt;
&lt;p&gt;. OUTPUT: &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in the directory&lt;/p&gt;
&lt;h2&gt;SingleAppRoleAssignment&lt;/h2&gt;
&lt;p&gt;Function: SingleAppRoleAssignment([appRoleAssignments])&lt;/p&gt;
&lt;p&gt;Description: Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Split&lt;/p&gt;
&lt;p&gt;Function: Split(source, delimiter)&lt;/p&gt;
&lt;p&gt;Description: Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;delimiter Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Split a string into a multi-valued array&lt;/h2&gt;
&lt;p&gt;Example: You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Expression: Split([extensionAttribute5], &amp;quot;,&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;. INPUT (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/p&gt;
&lt;p&gt;. OUTPUT: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/p&gt;
&lt;h2&gt;StripSpaces&lt;/h2&gt;
&lt;p&gt;Function: StripSpaces(source)&lt;/p&gt;
&lt;p&gt;Description: Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;:unselected:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Switch&lt;/h2&gt;
&lt;p&gt;Function: Switch(source, defaultValue, key1, value1, key2, value2, ... )&lt;/p&gt;
&lt;p&gt;Description: When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;h3&gt;1 Note&lt;/h3&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;) . In this example, the source attribute statusFlag may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;h2&gt;Caution&lt;/h2&gt;
&lt;p&gt; :selected:
For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. Example: Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;) . In this example, if the source attribute statusFlag is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;C3 Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;defaultValue Optional&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Default value to be used when source doesn&amp;#39;t match  any keys. Can be empty string (&amp;quot;&amp;quot;). :unselected:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;Replace a value based on predefined set of options&lt;/h1&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;Expression: Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (state): &amp;quot;QLD&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;Australia/Brisbane&amp;quot;&lt;/p&gt;
&lt;h2&gt;ToLower&lt;/h2&gt;
&lt;p&gt;Function: ToLower(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to lower case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String The format for the culture name based on RFC 4646 is  languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two- letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/p&gt;
&lt;p&gt;Example: You would like to generate the UPN value by concatenating the PreferredFirstName and PreferredLastName source fields and converting all characters to lower case.&lt;/p&gt;
&lt;p&gt;ToLower (Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/p&gt;
&lt;p&gt;. INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;h2&gt;ToUpper&lt;/h2&gt;
&lt;p&gt;Function: ToUpper(source, culture)&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;[] Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;String Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two- letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- PageFooter=&quot;Word&quot; --&gt;

&lt;!-- PageHeader=&quot;Function: Word(String, WordNumber,Delimiters)&quot; --&gt;

&lt;p&gt;Description: The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;p&gt;C) Expand table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Word (&amp;quot;The quick brown fox&amp;quot;, 3,&amp;quot; &amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;Word (&amp;quot;This, string!has&amp;amp;many separators&amp;quot;, 3, &amp;quot;, ! &amp;amp;#&amp;quot;)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h2&gt;Strip known domain name&lt;/h2&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;p&gt;Expression: Replace([mail], &amp;quot;@contoso.com&amp;quot;, , ,&amp;quot;&amp;quot;, ,)&lt;/p&gt;
&lt;p&gt;Sample input / output:&lt;/p&gt;
&lt;p&gt;. INPUT (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;john.doe&amp;quot;&lt;/p&gt;
&lt;h1&gt;Generate user alias by concatenating parts of first and last name&lt;/h1&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;p&gt;Expression: Append(Mid([givenName],1, 3), Mid([surname], 1, 5))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (givenName): &amp;quot;John&amp;quot;&lt;/p&gt;
&lt;p&gt;· INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;JohDoe&amp;quot;&lt;/p&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;Expression: Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT (givenName): &amp;quot;John&amp;quot;&lt;/p&gt;
&lt;p&gt;· INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;Doe, John&amp;quot;&lt;/p&gt;
&lt;p&gt;Generate an ID for a user based on their Microsoft Entra ID object ID. Remove any letters from the ID and add 1000 at the beginning.&lt;/p&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;p&gt;Expression: Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectld]), , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;, , ))&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;p&gt;· INPUT: &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/p&gt;
&lt;p&gt;· OUTPUT: &amp;quot;100064303565343762312333930392343435612626135652636136306362633065346234&amp;quot;&lt;/p&gt;
&lt;h1&gt;Related Articles&lt;/h1&gt;
&lt;p&gt;· Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/p&gt;
&lt;p&gt;· Customizing Attribute Mappings for User Provisioning&lt;/p&gt;
&lt;p&gt;. Scoping Filters for User Provisioning&lt;/p&gt;
&lt;p&gt;· Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/p&gt;
&lt;p&gt;· Account Provisioning Notifications&lt;/p&gt;
&lt;p&gt;. List of Tutorials on How to Integrate SaaS Apps&lt;/p&gt;
</content:encoded></item><item><title>mtoGPT4Turbo</title><link>https://www.elumenotion.com/journal/mtogpt4turbo/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtogpt4turbo/</guid><pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Multitenant organizations documentation&lt;/h2&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h3&gt;About multitenant organizations&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organization capabilities&lt;/li&gt;
&lt;li&gt;Compare multitenant capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure a multitenant organization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;p&gt;What is a multitenant organization?&lt;/p&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365 admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure cross-tenant synchronization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;p&gt;What is cross-tenant synchronization?&lt;/p&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Collaborate in Microsoft 365&lt;/h2&gt;
&lt;h3&gt;CONCEPT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Identity provisioning for Microsoft 365&lt;/li&gt;
&lt;li&gt;Microsoft 365 multitenant people search&lt;/li&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h2&gt;
&lt;h3&gt;Article • 04/23/2024&lt;/h3&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;What is a tenant?&lt;/h3&gt;
&lt;p&gt;A tenant is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h3&gt;What is a multitenant organization?&lt;/h3&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conglomerates: Organizations with multiple subsidiaries or business units that operate independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reasons for Multiple Tenants in Organizations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mergers and acquisitions:&lt;/strong&gt; Organizations that merge or acquire companies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Divestiture activity:&lt;/strong&gt; In a divestiture, one organization splits off part of its business to form a new organization or sell it to an existing organization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple clouds:&lt;/strong&gt; Organizations that have compliance or regulatory needs to exist in multiple cloud environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple geographical boundaries:&lt;/strong&gt; Organizations that operate in multiple geographic locations with various residency regulations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test or staging tenants:&lt;/strong&gt; Organizations that need multiple tenants for testing or staging purposes before deploying more broadly to primary tenants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Department or employee-created tenants:&lt;/strong&gt; Organizations where departments or employees have created tenants for development, testing, or separate control.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant Challenges&lt;/h2&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diagram illustrates connections between a &amp;quot;Primary tenant&amp;quot; and other &amp;quot;Tenant&amp;quot; entities showing successful and failed accesses with arrows and cross symbols.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;h2&gt;B2B Direct Connect&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use &lt;strong&gt;Microsoft Entra B2B direct connect&lt;/strong&gt;. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;h2&gt;B2B Direct Connect Constraint&lt;/h2&gt;
&lt;p&gt;Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    B2B_Direct_Connect_Users(&amp;quot;B2B direct connect users&amp;quot;) --&amp;gt;|connects to| Primary_Tenant(&amp;quot;Primary tenant&amp;quot;)
    Primary_Tenant --&amp;gt;|connects back to| Tenant(&amp;quot;Tenant&amp;quot;)
    Tenant --&amp;gt;|connection| B2B_Direct_Connect_Users
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://example.com&quot;&gt;B2B direct connect overview&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;B2B Collaboration&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Entra B2B collaboration&lt;/a&gt;. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;h3&gt;Primary Constraints with B2B Collaboration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Administrators must invite users using the B2B invitation process or build an onboarding experience using the &lt;a href=&quot;https://example.com&quot;&gt;B2B collaboration invitation manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Administrators might have to synchronize users using custom scripts.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    Tenant(&amp;quot;Tenant&amp;quot;) --&amp;gt;|invites| Primary_Tenant(&amp;quot;Primary tenant&amp;quot;)
    Primary_Tenant --&amp;gt;|controls| B2B_Collab_Users(&amp;quot;B2B collab users&amp;quot;)
    B2B_Collab_Users --&amp;gt;|access| Microsoft_Apps(&amp;quot;Microsoft apps&amp;quot;)
    Microsoft_Apps --&amp;gt;|provides service to| Non_Microsoft_Apps(&amp;quot;Non-Microsoft apps&amp;quot;)
    Non_Microsoft_Apps --&amp;gt;|receives services from| Tenant
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-access&quot;&gt;cross-tenant synchronization&lt;/a&gt;. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;h3&gt;Benefits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;li&gt;Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    A[Source tenant] --&amp;gt;|B2B collab users (External members)| B[Cross-tenant sync]
    B --&amp;gt;|B2B collab users (External members)| C[Target tenant]
    B --&amp;gt;|Sync| D[Microsoft apps]
    C --&amp;gt;|Sync| E[Non-Microsoft apps]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/external-identities/what-is-b2b&quot;&gt;What is cross-tenant synchronization?&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Multitenant organization&lt;/h2&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;li&gt;Improved collaborative experience in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Improved people search experience across tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The diagram illustrates the multitenant organization, showing an owner tenant (C) and member tenants (A) and (B) connected via cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Compare multitenant capabilities&lt;/h2&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;B2B Direct Connect&lt;/th&gt;
&lt;th&gt;B2B Collaboration&lt;/th&gt;
&lt;th&gt;Cross-tenant Synchronization&lt;/th&gt;
&lt;th&gt;Multitenant Organization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Support for External IDs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Configurations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Extensive&lt;/td&gt;
&lt;td&gt;Extensive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Comparison of Collaboration Types&lt;/h2&gt;
&lt;h3&gt;B2B Direct Connect (Org-to-org external or internal)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Users can access Teams Connect shared channels hosted in external tenants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: Enables external collaboration within Teams Connect shared channels only. More convenient for administrators because they don&amp;#39;t have to manage B2B users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Administrator Workflow&lt;/strong&gt;: Configure cross-tenant access to provide external users inbound access to tenant credentials for their home tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B2B Collaboration (Org-to-org external or internal)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Users can access apps/resources hosted in external tenants, usually with limited guest privileges. Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: Enables external collaboration. More control and monitoring for administrators by managing the B2B collaboration users. Administrators can limit the access that these external users have to their apps/resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Administrator Workflow&lt;/strong&gt;: Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant Synchronization (Org internal)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Users can seamlessly access apps/resources across the same organization, even if they&amp;#39;re hosted in different tenants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: Enables collaboration across organizational tenants. Administrators don&amp;#39;t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Administrator Workflow&lt;/strong&gt;: Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Multitenant Organization (Org internal)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: Enables collaboration across organizational tenants. Administrators have full configuration ability via cross-tenant access settings. Optional cross-tenant access templates allow pre-configuration of cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Administrator Workflow&lt;/strong&gt;: Create a multitenant organization, add (invite) tenants, join a multitenant organization. Leverage existing B2B collaboration users or use cross-tenant synchronization to enhance collaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Collaboration Models Comparison&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trust level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/td&gt;
&lt;td&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effect on users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/td&gt;
&lt;td&gt;External users are added to a tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;B2B direct connect user - N/A&lt;/td&gt;
&lt;td&gt;B2B collaboration user - External member - External guest (default)&lt;/td&gt;
&lt;td&gt;B2B collaboration user - External member (default) - External guest&lt;/td&gt;
&lt;td&gt;B2B collaboration user - External member (default) - External guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The following diagram shows how B2B direct connect, B2B collaboration, and cross-tenant synchronization capabilities could be used together.&lt;/p&gt;
&lt;h2&gt;Org-to-org external&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Org internal&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;B2B collaboration users (External members)&lt;ul&gt;
&lt;li&gt;Fabrikam (Acquired)&lt;/li&gt;
&lt;li&gt;Cross-tenant sync → Contoso (Primary tenant)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B2B collaboration&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;B2B collaboration users (External guests)&lt;/li&gt;
&lt;li&gt;B2B direct connect → Adatum Corporation (External collaborator)&lt;ul&gt;
&lt;li&gt;Trey Research (External collaborator)&lt;/li&gt;
&lt;li&gt;B2B direct connect users&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Terminology&lt;/h2&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, refer to the following list of terms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Glossary&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don’t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h2&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Why use multitenant organization?&lt;/h2&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define a group of tenants belonging to your organization&lt;/li&gt;
&lt;li&gt;Collaborate across your tenants in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Who should use it?&lt;/h2&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for external identities.&lt;/p&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.&lt;/p&gt;
&lt;h2&gt;Improved Collaborative Experience in Microsoft Teams&lt;/h2&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster. For more information, see &lt;a href=&quot;url&quot;&gt;Announcing more seamless collaboration in Microsoft Teams for multitenant organizations&lt;/a&gt; and &lt;a href=&quot;url&quot;&gt;Microsoft Teams: Advantages of the new architecture&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Improved People Search Experience Across Tenants&lt;/h2&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards. For more information, see &lt;a href=&quot;url&quot;&gt;Microsoft 365 multitenant organization people search&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How Does a Multitenant Organization Work?&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define a multitenant organization&lt;/strong&gt;
One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Join a multitenant organization&lt;/strong&gt;
Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leave a multitenant organization&lt;/strong&gt;
Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant Organization Collaboration&lt;/h2&gt;
&lt;p&gt;A multitenant organization is established as a collaboration of equals. Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h3&gt;Cross-tenant Access Settings&lt;/h3&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-tenant access partner configurations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-tenant access identity synchronization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and crossTenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Multitenant Organization Example&lt;/h3&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Member tenant (A)] --&amp;gt;|Cross-tenant access settings| C[Owner tenant (C)];
    B[Member tenant (B)] --&amp;gt;|Cross-tenant access settings| C;
    C --&amp;gt;|Cross-tenant access settings| A;
    C --&amp;gt;|Cross-tenant access settings| B;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tenant Description Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Templates for cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Tenant role and state&lt;/h2&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;h3&gt;Tenant Role Description Table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Tenant State&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant state&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator&amp;#39;s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user&amp;#39;s view of a multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Constraints&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any given tenant can only create or join a single multitenant organization.&lt;/li&gt;
&lt;li&gt;Any multitenant organization must have at least one active owner tenant.&lt;/li&gt;
&lt;li&gt;Each active tenant must have cross-tenant access settings for all active tenants.&lt;/li&gt;
&lt;li&gt;Any active tenant may leave a multitenant organization by removing themselves from it.&lt;/li&gt;
&lt;li&gt;A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limits&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;External User Segmentation&lt;/h2&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External members originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External guests originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External members originating from outside of your organization&lt;/li&gt;
&lt;li&gt;External guests originating from outside of your organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h2&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h3&gt;Step 1: Plan your deployment&lt;/h3&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;Plan for multitenant organizations in Microsoft 365&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Step 2: Create your multitenant organization&lt;/h2&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/li&gt;
&lt;li&gt;Owner tenant adds one or more joiner tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/li&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;h2&gt;Step 4: Synchronize users&lt;/h2&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;li&gt;Your alternative bulk provisioning engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see &lt;a href=&quot;#&quot;&gt;Compare generally available features of Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Article • 01/03/2024&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cross-tenant synchronization&lt;/strong&gt; automates creating, updating, and deleting &lt;a href=&quot;https://www.microsoft.com/security&quot;&gt;Microsoft Entra B2B collaboration&lt;/a&gt; users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seamless collaboration for a multitenant organization&lt;/li&gt;
&lt;li&gt;Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/li&gt;
&lt;li&gt;Automatically remove B2B accounts when a user leaves the organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7B-PQwNfGBc&quot;&gt;Video Link&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Why use cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as &lt;a href=&quot;https://www.servicenow.com&quot;&gt;ServiceNow&lt;/a&gt;, &lt;a href=&quot;https://www.adobe.com&quot;&gt;Adobe&lt;/a&gt;, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as &lt;a href=&quot;https://www.microsoft.com/security&quot;&gt;Microsoft Entra Conditional Access&lt;/a&gt; and &lt;a href=&quot;https://www.microsoft.com/security&quot;&gt;cross-tenant access settings&lt;/a&gt;, and can be governed through features such as &lt;a href=&quot;https://www.microsoft.com/security&quot;&gt;Microsoft Entra entitlement management&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;h2&gt;Who should use?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams and Microsoft 365&lt;/h2&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the &lt;code&gt;member&lt;/code&gt; userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.&lt;/p&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Microsoft Entra provisioning engine.&lt;/li&gt;
&lt;li&gt;Is a push process from the source tenant, not a pull process from the target tenant.&lt;/li&gt;
&lt;li&gt;Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/li&gt;
&lt;li&gt;Users in scope for synchronization are configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Attribute mapping is configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Extension attributes are supported.&lt;/li&gt;
&lt;li&gt;Target tenant administrators can stop a synchronization at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Cross-tenant synchronization setting&lt;/h2&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a check box with the name Allow users sync into this tenant that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.&lt;/p&gt;
&lt;h2&gt;Inbound Access Settings - Contoso&lt;/h2&gt;
&lt;h3&gt;B2B Collaboration | B2B Direct Connect | Trust Settings | Cross-tenant Sync&lt;/h3&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configuration Instructions&lt;/h3&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantIdentitySyncPolicyPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;Automatic Redemption Setting&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a check box with the following name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically redeem invitations with the tenant &lt;code&gt;&amp;lt;tenant&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;[ ] Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&amp;#39;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well. 
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Compare Setting for Different Scenarios&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;h2&gt;Contextual Settings Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When users are created in a target tenant using cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;When users are added to a resource tenant using B2B collaboration.&lt;/li&gt;
&lt;li&gt;When users access resources in a resource tenant using B2B direct connect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see &lt;a href=&quot;https://microsoft.com&quot;&gt;Consent experience for applications in Microsoft Entra ID&lt;/a&gt;. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h3&gt;When is consent prompt suppressed?&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;h4&gt;Process Flow&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    A[Source tenant] --&amp;gt;|Outbound access settings| B(Target tenant)
    A --&amp;gt;|Automatically redeem invitations| B
    B --&amp;gt;|Inbound access settings| A
    B --&amp;gt;|Automatically redeem invitations| A
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;h2&gt;Consent Prompt Behavior for Cross-tenant Synchronization&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home/source tenant&lt;/th&gt;
&lt;th&gt;Resource/target tenant&lt;/th&gt;
&lt;th&gt;Consent prompt behavior for source tenant users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the &lt;a href=&quot;&quot;&gt;Update crossTenantAccessPolicyConfigurationPartner API&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;How do users know what tenants they belong to?&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their &lt;a href=&quot;&quot;&gt;My Account&lt;/a&gt; page and select Organizations. In the Microsoft Entra admin center, users can open their &lt;a href=&quot;&quot;&gt;Portal settings&lt;/a&gt;, view their Directories + subscriptions, and switch directories.&lt;/p&gt;
&lt;h3&gt;Get started&lt;/h3&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Step 1: Define how to structure the tenants in your organization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see &lt;a href=&quot;#&quot;&gt;Topologies for cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The diagram illustrates different tenant structures: a central tenant with multiple satellite tenants, all of which are interconnected through various synchronization paths.&lt;/p&gt;
&lt;h2&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/h2&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see &lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Settings Screenshot Description&lt;/h3&gt;
&lt;p&gt;The screenshot shows a settings interface where you can enable user synchronization into this tenant and automate invitation redemption through checkbox selections.&lt;/p&gt;
&lt;h2&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/h2&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which users you want to synchronize&lt;/li&gt;
&lt;li&gt;What attributes you want to include&lt;/li&gt;
&lt;li&gt;Any transformations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured,&lt;/p&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant. To find the right license for your requirements, see &lt;a href=&quot;https://docs.microsoft.com&quot;&gt;Compare generally available features of Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing model. To understand the external identities licensing model, see &lt;a href=&quot;https://docs.microsoft.com&quot;&gt;MAU billing model for Microsoft Entra External ID&lt;/a&gt;. You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/p&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3&gt;Clouds&lt;/h3&gt;
&lt;p&gt;Which clouds can cross-tenant synchronization be used in?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/li&gt;
&lt;li&gt;Synchronization is only supported between two tenants in the same cloud.&lt;/li&gt;
&lt;li&gt;Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Existing B2B users&lt;/h3&gt;
&lt;p&gt;Will cross-tenant synchronization manage existing B2B users?&lt;/p&gt;
&lt;h3&gt;Synchronization Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization can update existing B2B users, ensuring each has only one account.&lt;/li&gt;
&lt;li&gt;It does not match an internal user in the source tenant with an internal user in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Synchronization Frequency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How often does cross-tenant synchronization run?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The sync interval is set at 40-minute intervals.&lt;/li&gt;
&lt;li&gt;Duration varies by the number of in-scope users.&lt;/li&gt;
&lt;li&gt;The initial sync cycle takes longer than subsequent cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scope&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How do I control what is synchronized into the target tenant?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Control which users are provisioned using configuration or attribute-based filters.&lt;/li&gt;
&lt;li&gt;Control which attributes on the user object are synchronized.&lt;/li&gt;
&lt;li&gt;For more info, see &lt;a href=&quot;#&quot;&gt;Scoping users or groups to be provisioned with scoping filters&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What happens if a user is removed from the scope of sync in a source tenant?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If removed, cross-tenant synchronization will soft delete them in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Object and User Types&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;What object types can be synchronized?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra users can be synchronized between tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What user types can be synchronized?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal members from source tenants.&lt;/li&gt;
&lt;li&gt;Users from source tenants can be synchronized to target tenants as external members or external guests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Existing B2B Collaboration Users&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/p&gt;
&lt;h2&gt;Attributes&lt;/h2&gt;
&lt;h3&gt;What user attributes can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Common Attributes&lt;/strong&gt;: Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including displayName, userPrincipalName, and directory extension attributes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manager Provisioning&lt;/strong&gt;: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Configurations created before January 2024:&lt;ul&gt;
&lt;li&gt;The manager attribute will automatically be added to the mappings.&lt;/li&gt;
&lt;li&gt;Manager updates apply on the incremental cycle for users undergoing changes (e.g., manager change). The synchronization engine doesn&amp;#39;t automatically update previously provisioned users but can update the manager for existing users in scope.&lt;/li&gt;
&lt;li&gt;For specific or restart provisioning, you can manually initiate provisioning for the manager attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configurations with a custom schema:&lt;ul&gt;
&lt;li&gt;You must manually add the manager attribute to your attribute mappings when they are changed from the default, which will trigger updates of all users in scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If a user’s manager is removed in the source tenant and no new manager is assigned, the manager attribute will not be updated in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What attributes can&amp;#39;t be synchronized?&lt;/h3&gt;
&lt;p&gt;(The PDF does not provide specifics on attributes that cannot be synchronized; only those that can are listed.)&lt;/p&gt;
&lt;h2&gt;User Attributes in Cross-Tenant Synchronization&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Attributes including photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Source and Management of User Attributes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization does not offer direct control over the source of authority. Attributes are authoritative at the source tenant and may reflect multiple underlying sources. For the tenant-to-tenant process, this is handled as the source tenant&amp;#39;s values being authoritative for the sync process. No support for reversing the sync process&amp;#39;s source of authority is currently available.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Attribute Changes Impact&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If changes to a synced user&amp;#39;s attributes occur in the target tenant, those changes will persist unless the user in the source tenant is updated. Subsequent syncs will then update the target tenant to match the source tenant&amp;#39;s updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Blocking User Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If no changes occur to the synced user in the source tenant, any manual blocks on sign-in settings in the target tenant will continue to be effective. If the user is updated in the source tenant, cross-tenant synchronization will address the blocking status based on the source tenant&amp;#39;s settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Structure of Cross-Tenant Synchronization&lt;/h2&gt;
&lt;h3&gt;Mesh Synchronization Across Multiple Tenants&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is typically configured as a single-direction peer-to-peer sync between one source and one target tenant. However, it&amp;#39;s possible to configure multiple instances to sync from a single source to various target tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-Tenant Synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;One sync instance can exist between a source and a target.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization only synchronizes users that are internal to the home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is written back to the same tenant.&lt;/li&gt;
&lt;li&gt;Multiple topologies are supported. For more information, see &lt;a href=&quot;#&quot;&gt;Topologies for cross-tenant synchronization&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FAQ&lt;/h3&gt;
&lt;h4&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;For privacy reasons, cross-tenant synchronization is intended for use within an organization. We recommend using &lt;a href=&quot;#&quot;&gt;entitlement management&lt;/a&gt; for inviting B2B collaboration users across organizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. In addition, tenant migrations would require migrating user data such as SharePoint and OneDrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B Collaboration&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Since cross-tenant synchronization is built on existing B2B collaboration technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;Support for UserType Member in Power BI is currently in preview. For more information, see &lt;a href=&quot;#&quot;&gt;Distribute Power BI content to external guest users with Microsoft Entra B2B&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;B2B Direct Connect&lt;/h2&gt;
&lt;h3&gt;How does cross-tenant synchronization relate to B2B direct connect?&lt;/h3&gt;
&lt;h2&gt;B2B Direct Connect and Cross-Tenant Synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;B2B direct connect is the underlying identity technology required for Teams Connect shared channels.&lt;/li&gt;
&lt;li&gt;We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/li&gt;
&lt;li&gt;B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft 365&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Yes, but you must set the value for the shownInAddressList attribute of synchronized users to True, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology. For more information, see Step 9: Review attribute mappings.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Integration&lt;/h2&gt;
&lt;h3&gt;Federation Options&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For each internal user in the source tenant, cross-tenant synchronization creates a federated external user in the target tenant, commonly used in B2B environments. It supports syncing:&lt;ul&gt;
&lt;li&gt;Internal users federated to other identity systems (including Active Directory Federation Services). It does not support syncing external users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SCIM Support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID supports a SCIM client but not a SCIM server. For more information, visit &lt;a href=&quot;https://docs.microsoft.com/en-us/microsoft-identity-manager/scim&quot;&gt;SCIM synchronization with Microsoft Entra ID&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deprovisioning&lt;/h2&gt;
&lt;h3&gt;Support for Deprovisioning Users&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant synchronization supports deprovisioning users when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A user is deleted in the source tenant; they are soft deleted in the target tenant.&lt;/li&gt;
&lt;li&gt;A user is unassigned from the cross-tenant synchronization configuration.&lt;/li&gt;
&lt;li&gt;A user is removed from a group associated with the cross-tenant synchronization configuration.&lt;/li&gt;
&lt;li&gt;An attribute on the user changes making them non-compliant with the scoping filter of the cross-tenant synchronization configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If a user in the source tenant has their &lt;code&gt;accountEnabled&lt;/code&gt; set to false, they will be blocked from signing in but not deleted in the target tenant. Their &lt;code&gt;accountEnabled&lt;/code&gt; property in the target tenant gets updated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Actions that do not result in soft deletion from the target tenant:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add the user to a group linked to the cross-tenant configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;accountEnabled&lt;/code&gt; to false in the source tenant.&lt;/li&gt;
&lt;li&gt;Reprovision the user so the same change applies in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Does cross-tenant synchronization support restoring users?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If the user in the source tenant is restored, reassigned to the app, and meets the scoping condition again within 30 days of soft deletion, they will be restored in the target tenant.&lt;/li&gt;
&lt;li&gt;IT admins can also manually restore the user directly in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unassign all users and/or groups from the cross-tenant synchronization configuration. This will trigger the deprovisioning of all users that were unassigned, either directly or through group membership, in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to &lt;strong&gt;Sync all users and groups&lt;/strong&gt;, you will also need to change it to &lt;strong&gt;Sync only assigned users and groups&lt;/strong&gt;. The scheduled users to be deleted will be automatically soft deleted by cross-tenant synchronization and can be selected for hard deletion by the target tenant. You can choose to hard delete the users directly from the target tenant or wait 30 days for them to be automatically hard deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;If the sync relationship is severed, are external users previously managed by cross-tenant synchronization deleted in the target tenant?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No. No changes are made to the external users previously managed by cross-tenant synchronization if the relationship is severed (for example, if the cross-tenant synchronization policy is deleted).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization identity provisioning for Microsoft 365&lt;/h2&gt;
&lt;p&gt;Article • 04/24/2024&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h3&gt;Microsoft 365 people search&lt;/h3&gt;
&lt;p&gt;Teams external access and Teams shared channels excluded, Microsoft 365 people search is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h3&gt;New Microsoft Teams&lt;/h3&gt;
&lt;p&gt;The new Microsoft Teams experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members.&lt;/p&gt;
&lt;h3&gt;Collaborating user set&lt;/h3&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;h2&gt;Collaborating Across Multiple Tenants&lt;/h2&gt;
&lt;p&gt;For people search to succeed, while scoped to local tenant boundaries, the entire collaborating user set must be represented within the scope of each multitenant organization tenant A, B, and C, in the form of either internal or B2B identities.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TD
  subgraph Tenant_A[&amp;quot;Tenant A&amp;quot;]
    Annie_Internal(Internal&amp;lt;br&amp;gt;Annie)
    Bob_External1(External&amp;lt;br&amp;gt;Bob)
    Barbara_External1(External&amp;lt;br&amp;gt;Barbara)
  end
  subgraph Tenant_B[&amp;quot;Tenant B&amp;quot;]
    Bob_Internal(Internal&amp;lt;br&amp;gt;Bob)
    Barbara_Internal(Internal&amp;lt;br&amp;gt;Barbara)
    Charles_External1(External&amp;lt;br&amp;gt;Charles)
    Annie_External1(External&amp;lt;br&amp;gt;Annie)
  end
  subgraph Tenant_C[&amp;quot;Tenant C&amp;quot;]
    Charles_Internal(Internal&amp;lt;br&amp;gt;Charles)
    Annie_External2(External&amp;lt;br&amp;gt;Annie)
    Bob_External2(External&amp;lt;br&amp;gt;Bob)
    Barbara_External2(External&amp;lt;br&amp;gt;Barbara)
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example of Individual Users in Each Tenant&lt;/h3&gt;
&lt;p&gt;Depending on your organization’s needs, the collaborating user set may contain a subset of collaborating employees, or eventually all employees.&lt;/p&gt;
&lt;h2&gt;Sharing your users&lt;/h2&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization them outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator A contributes or shares Annie&lt;/li&gt;
&lt;li&gt;Administrator B contributes or shares Bob and Barbara&lt;/li&gt;
&lt;li&gt;Administrator C contributes or shares Charles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft 365 Admin Center&lt;/h2&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Tenant Collaboration Diagram](image url) --&gt;

&lt;p&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;Alternatively, pair-wise configuration of inbound and outbound cross-tenant synchronization can be used to orchestrate such collating user set across multitenant organization tenants.&lt;/p&gt;
&lt;h2&gt;B2B Member Users&lt;/h2&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;h3&gt;User Synchronization Methods&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User synchronization method&lt;/th&gt;
&lt;th&gt;Default userType property&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Security Permissions Review&lt;/h2&gt;
&lt;p&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see Compare member and guest default permissions.&lt;/p&gt;
&lt;h2&gt;Changing UserType&lt;/h2&gt;
&lt;p&gt;To change the userType from &lt;strong&gt;Guest to Member&lt;/strong&gt; (or vice versa), a source tenant administrator can amend the attribute mappings, or a target tenant administrator can change the userType if the property is not recurrently synchronized.&lt;/p&gt;
&lt;h2&gt;Unsharing Your Users&lt;/h2&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization optional policy templates&lt;/h2&gt;
&lt;p&gt;Article • 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h3&gt;Autogeneration of cross-tenant access settings&lt;/h3&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional &lt;a href=&quot;https://example.com/cross-tenant-access&quot;&gt;cross-tenant access settings&lt;/a&gt;, for both, partner configuration and identity synchronization. These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross-tenant access settings pass through the default settings.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;h2&gt;Policy templates at multitenant organization formation&lt;/h2&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy behavior, it allows your organization to easily customize the cross-tenant access settings for partner tenants in the multitenant organization on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding cross-tenant access settings, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/li&gt;
&lt;li&gt;Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/li&gt;
&lt;li&gt;Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Policy Management and Coordination&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Administrator C joins the multitenant organization. Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/li&gt;
&lt;li&gt;Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see &lt;a href=&quot;#&quot;&gt;Configure multitenant organization templates&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Policy template scoping and additional properties&lt;/h3&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross-tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, &lt;em&gt;new partners&lt;/em&gt; refer to tenants for which you haven&amp;#39;t yet configured cross-tenant access settings, while &lt;em&gt;existing partners&lt;/em&gt; refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access &lt;a href=&quot;#&quot;&gt;partner configuration template&lt;/a&gt; and the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access &lt;a href=&quot;#&quot;&gt;identity synchronization template&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Interpretation of Template Property Values&lt;/h2&gt;
&lt;p&gt;Finally, in terms of interpretation of template property values, any template property value of &lt;code&gt;null&lt;/code&gt; has no effect on the corresponding property value in the targeted cross-tenant access settings, while a defined template property value causes the corresponding property value in the targeted cross-tenant access settings to be amended in accordance with the template. The following table illustrates how template property values are being applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Partner Settings Value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Partner Settings Value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Template Value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;any value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;Template Value&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Policy Templates used by Microsoft 365 Admin Center&lt;/h2&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity synchronization is set to allow users to synchronize into this tenant&lt;/li&gt;
&lt;li&gt;Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.inboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.outboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;userSyncInbound&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;Join or leave a multitenant organization in Microsoft 365&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Cross-tenant Access Settings at Time of Multitenant Organization Disassembly&lt;/h2&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limitations in multitenant organizations&lt;/h2&gt;
&lt;p&gt;Article Date: 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see &lt;a href=&quot;https://feedback.microsoft.com&quot;&gt;Microsoft Entra UserVoice&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Scope&lt;/h3&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;- Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;- Microsoft 365 admin center limitations related to multitenant organizations&lt;br&gt;- Microsoft 365 multitenant organization people search experiences&lt;br&gt;- Cross-tenant synchronization limitations related to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;- Cross-tenant synchronization unrelated to Microsoft 365&lt;br&gt;- End user experiences in new Teams&lt;br&gt;- End user experiences in Power BI&lt;br&gt;- Tenant migration or consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported scenarios&lt;/td&gt;
&lt;td&gt;- Seamless collaboration experience across multitenant organizations in classic Teams&lt;br&gt;- Self-service for multitenant organizations larger than 100 tenants&lt;br&gt;- Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet&lt;br&gt;- Cross-cloud multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;ul&gt;
&lt;li&gt;In the identity platform, both methods are represented as Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Synchronization Job Details&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Synchronization jobs created with Microsoft Entra ID will not appear in the Microsoft 365 admin center.&lt;/li&gt;
&lt;li&gt;If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/li&gt;
&lt;li&gt;You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/li&gt;
&lt;li&gt;By default, new B2B users are provisioned as B2B members, while existing B2B guests remain B2B guests.&lt;/li&gt;
&lt;li&gt;You can opt to convert B2B guests into B2B members by setting &lt;a href=&quot;mapping-to-always&quot;&gt;Apply this mapping to Always&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Provisioning Users with Entra Cross-Tenant Synchronization&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an &lt;strong&gt;Outbound sync status of Not configured&lt;/strong&gt;. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name &lt;code&gt;MT0_Sync_&amp;lt;TenantID&amp;gt;&lt;/code&gt;. Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Limitations and Usage Patterns&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross-tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with &lt;code&gt;userSyncInbound&lt;/code&gt; set to true, as facilitated by Microsoft 365 admin center.&lt;/li&gt;
&lt;li&gt;There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Join Requests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft apps&lt;/h2&gt;
&lt;h3&gt;SharePoint OneDrive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Promotion of B2B guests to B2B members might not happen automatically. If there&amp;#39;s a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try &lt;code&gt;Set-SPUser -SyncFromAD&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In user interfaces, sharing a file with &lt;strong&gt;People in Fabrikam&lt;/strong&gt;, the current interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards &lt;strong&gt;People in Fabrikam&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Microsoft Forms&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B2B member users might not be able to access forms.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Microsoft Power BI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Microsoft Power Apps, Microsoft Dynamics 365, and related workloads&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B2B member users may have restricted functionality. For more information, see Invite users with Microsoft Entra B2B collaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the &lt;a href=&quot;#&quot;&gt;default permissions&lt;/a&gt; for B2B members.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To promote B2B guests to B2B members, a source tenant administrator can amend the &lt;a href=&quot;#&quot;&gt;attribute mappings&lt;/a&gt;, or a target tenant administrator can &lt;a href=&quot;#&quot;&gt;change the userType&lt;/a&gt; if the property is not recurringly synchronized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As organizations roll out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others as B2B members. To achieve this, you might want to establish two Microsoft Entra cross-tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with &lt;a href=&quot;#&quot;&gt;Apply this mapping set to&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Always&lt;/h2&gt;
&lt;p&gt;By moving a user from one configuration&amp;#39;s scope to the other, you can easily control who will be a B2B guest or a B2B member in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As part of a multitenant organization, reset redemption for an already redeemed B2B user is currently disabled.&lt;/li&gt;
&lt;li&gt;The at-scale provisioning of B2B users might collide with contact objects. The handling or conversion of contact objects is currently not supported.&lt;/li&gt;
&lt;li&gt;Using Microsoft Entra cross-tenant synchronization to target hybrid identities that have been converted to B2B users has not been tested in source of authority conflicts and is not supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization deprovisioning&lt;/h2&gt;
&lt;p&gt;By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently, SkipOutOfScopeDeletions works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set Target Object Actions for Delete to disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Known issues for provisioning in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Topologies for cross-tenant collaboration&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article&lt;/strong&gt; • 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hub and spoke&lt;/li&gt;
&lt;li&gt;Mesh&lt;/li&gt;
&lt;li&gt;Just-in-time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hub and spoke&lt;/h3&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Option 1 (application hub):&lt;/strong&gt; In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Option 2 (user hub):&lt;/strong&gt; Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h3&gt;Mergers and acquisitions (application hub)&lt;/h3&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time limited access to additional applications such as Salesforce and Amazon Web Services.&lt;/p&gt;
&lt;h2&gt;Diagram Overview&lt;/h2&gt;
&lt;p&gt;The diagram illustrates the integration process of recently acquired tenants into a parent company&amp;#39;s systems, showing different types of applications and their relationship with HR and Active Directory.&lt;/p&gt;
&lt;h3&gt;Flowchart Description&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HR&lt;/strong&gt;: Serves as the starting point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active Directory&lt;/strong&gt;: Central management for user authentication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Applications Covered&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SaaS apps&lt;/strong&gt;: Includes third-party services such as Salesforce and AWS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft apps&lt;/strong&gt;: Involves typical Microsoft suite applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-premises apps&lt;/strong&gt;: Covers internally hosted applications like internal SQL databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Separate collaboration and resource tenants (user hub)&lt;/h2&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;h2&gt;HR&lt;/h2&gt;
&lt;h3&gt;Active Directory Architecture&lt;/h3&gt;
&lt;h4&gt;Mesh&lt;/h4&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h4&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h4&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;h2&gt;Cross-tenant Synchronization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction, and each arrow is a separate configuration.&lt;/p&gt;
&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The diagram illustrates a topology with three entities, designated by logos labeled &amp;quot;Microsoft Teams,&amp;quot; &amp;quot;AWS,&amp;quot; and &amp;quot;Salesforce,&amp;quot; all connected in a triangular layout with bi-directional arrows indicating synchronization between them.&lt;/p&gt;
&lt;h2&gt;Collaborate across business units (full-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;h2&gt;Just-in-time&lt;/h2&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h2&gt;Joint ventures&lt;/h2&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TB
    A(&amp;quot;Litware&amp;quot;) --&amp;gt;|request access| B(&amp;quot;Contoso&amp;quot;)
    B --&amp;gt;|provision resources| A
    A --&amp;gt;|periodic review| B
    B --&amp;gt;|compliance check| A
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The diagram above shows how two organizations can collaborate in a just-in-time manner using connected organizations and entitlement management.&lt;/p&gt;
&lt;h2&gt;Contoso&lt;/h2&gt;
&lt;h3&gt;Resources&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Marketing Group&lt;/strong&gt;  &lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![User Icons of three users](description of the image) --&gt;  
&lt;ul&gt;
&lt;li&gt;Marketing catalog&lt;/li&gt;
&lt;li&gt;Sales catalog&lt;/li&gt;
&lt;li&gt;Sales team group&lt;ul&gt;
&lt;li&gt;Sales app&lt;/li&gt;
&lt;li&gt;Sales site&lt;/li&gt;
&lt;li&gt;Salesperson access package&lt;/li&gt;
&lt;li&gt;Sales support access package&lt;/li&gt;
&lt;li&gt;Sales team group member&lt;/li&gt;
&lt;li&gt;Sales app contributor&lt;/li&gt;
&lt;li&gt;Sales site member&lt;/li&gt;
&lt;li&gt;Employees can request&lt;/li&gt;
&lt;li&gt;Outside sales reps can request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Connected Organization - Litware&lt;/strong&gt;  &lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![User Icons of three users, same as the first image just different organization](description of the image) --&gt;  
&lt;p&gt;Policies for access request, approval, review, lifecycle, separation of duties (SOD)&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful? &lt;a href=&quot;#&quot;&gt;Yes&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;No&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Provide product feedback&lt;/a&gt; | &lt;a href=&quot;#&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Governance and cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article • 03/21/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross-tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how Microsoft Entra ID Governance customers can use cross-tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h3&gt;Deployment example&lt;/h3&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage employee identity lifecycles across multiple tenants&lt;/li&gt;
&lt;li&gt;Use workflows to automate lifecycle processes for employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Assign resource access automatically to employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Allow employees to request access to resources in multiple tenants&lt;/li&gt;
&lt;li&gt;Review the access of synchronized users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant. The following diagram illustrates the topology.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    ContosoEMEA[Contoso EMEA] --&amp;gt; Contoso
    ContosoUS[Contoso US] --&amp;gt; Contoso
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cross-Tenant Synchronization&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;This supported topology for cross-tenant synchronization is one of many in Microsoft Entra ID. Tenants can be a source tenant, a target tenant, or both. In the following sections, learn how cross-tenant synchronization and Microsoft Entra ID Governance features address several scenarios.&lt;/p&gt;
&lt;h3&gt;Diagram Explanation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TB
    admin1[Hybrid Identity Administrator] --&amp;gt;|Cross-tenant sync| contoso_emea[Contoso EMEA]
    admin2[Hybrid Identity Administrator] --&amp;gt;|Cross-tenant sync| contoso_us[Contoso US]
    contoso_emea --&amp;gt;|Access Packages| contoso[Contoso]
    contoso_us --&amp;gt;|Access Packages| contoso
    contoso --&amp;gt; lifecycle[Lifecycle Workflows]
    subgraph access_packages [Access Packages]
        identity_catalog[Identity catalog]
        policies[Automatic assignment policy]
        reviews[Access Reviews]
        lifecycle --&amp;gt;|Properties include:| identity_catalog
        lifecycle --&amp;gt;|Properties include:| policies
        lifecycle --&amp;gt;|Properties include:| reviews
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Manage Employee Lifecycles Across Tenants&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/strong&gt; automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various &lt;a href=&quot;#&quot;&gt;properties of a Microsoft Entra B2B collaboration user&lt;/a&gt;. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in &lt;a href=&quot;#&quot;&gt;multitenant organizations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.&lt;/p&gt;
&lt;h3&gt;Cross-Tenant Synchronization and B2B Collaboration&lt;/h3&gt;
&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h3&gt;Automate lifecycle processes with workflows&lt;/h3&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the &lt;code&gt;createdDateTime&lt;/code&gt; event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as &lt;code&gt;userType&lt;/code&gt; and &lt;code&gt;userPrincipalName&lt;/code&gt; to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h3&gt;Govern synchronized user access with access packages&lt;/h3&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;h3&gt;Automatically assign access in target tenants to employees from source tenants&lt;/h3&gt;
&lt;h2&gt;Birthright Assignment&lt;/h2&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create &lt;a href=&quot;https://example.com&quot;&gt;automatic assignment policies for access packages&lt;/a&gt; in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;h2&gt;Cross-Tenant Synchronization&lt;/h2&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access.&lt;/li&gt;
&lt;li&gt;In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;h2&gt;Enable Source-Tenant Employees to Request Access to Target-Tenant Shared Resources&lt;/h2&gt;
&lt;p&gt;With identity governance access package policies, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;h2&gt;Review Synchronized-User Access&lt;/h2&gt;
&lt;p&gt;Access reviews in Microsoft Entra ID enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn’t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;h3&gt;Review Source-Tenant User Access&lt;/h3&gt;
&lt;h2&gt;Multitenant Organizations and Internal Users&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can include internal users in access reviews. This action enables access recertification in source tenants that synchronizes users. Use this approach for regular review of security groups assigned to cross-tenant synchronization. Therefore, ongoing B2B collaboration access to other tenants has approval in the user home tenant.&lt;/p&gt;
&lt;p&gt;Use access reviews of users in source tenants to avoid potential conflicts between cross-tenant synchronization and access reviews that remove denied users upon completion.&lt;/p&gt;
&lt;h3&gt;Review Target-Tenant User Access&lt;/h3&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users provisioned by cross-tenant synchronization in target tenants. This option enables access recertification of resources in target tenants. Although organizations can target all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn’t recommend removing denied guest users automatically from access reviews. Cross-tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organizations and Microsoft 365&lt;/li&gt;
&lt;li&gt;Multitenant organization templates&lt;/li&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h2&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/li&gt;
&lt;li&gt;Example topologies for how you can implement your lifecycle and access controls.&lt;/li&gt;
&lt;li&gt;Deployment considerations (roles, monitoring, APIs).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage the lifecycle and access of a SOC user&lt;/h3&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h4&gt;Lifecycle control&lt;/h4&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don’t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the target tenant.&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;h2&gt;Comparing entitlement management and cross-tenant synchronization&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Entitlement management&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td&gt;•&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Access control&lt;/h2&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;h3&gt;Entitlement management&lt;/h3&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access policies&lt;/h2&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;h2&gt;Deployment topologies&lt;/h2&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h3&gt;Topology 1&lt;/h3&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    A[Source tenant] --&amp;gt;|1. SoC users&amp;#39; governance| B((CROSS-TENANT SYNC))
    B --&amp;gt;|2. Guest accounts provisioning| D[Target tenant]
    D --&amp;gt;|3. Access packages assignment| E[Security Roles]
    B -.-&amp;gt; C(IMPACT)

    A &amp;amp; E -.-&amp;gt; F[ORGANIZATION TRUST]
    C -.-&amp;gt; D
    C --&amp;gt;|Approval Node| A
    subgraph &amp;quot; &amp;quot;
    F
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Steps to configure topology 1&lt;/h4&gt;
&lt;p&gt;Step 1: Source tenant admin configures entitlement management and sync settings.
Step 2: Synchronize user accounts to the target tenant.
Step 3: Target tenant admin assigns access packages to provisioned users.&lt;/p&gt;
&lt;h2&gt;Cross-Tenant Synchronization and Access Management&lt;/h2&gt;
&lt;h3&gt;Step-by-Step Configuration Guide&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;Step 1: Configure Cross-Tenant Synchronization&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;In the source tenant, configure cross-tenant synchronization to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/p&gt;
&lt;p&gt;When users are assigned to the cross-tenant synchronization service principal, they are automatically provisioned into the target tenant. As they are removed from the configuration, their accounts are automatically deprovisioned. Utilize attribute mappings to add directory extension attributes to users indicating their roles, such as SOC administrators. This attribute helps in skipping additional configuration steps by providing automatic access to necessary roles in the target tenant.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Step 2: Create Access Packages in the Source Tenant&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Create an access package in the source tenant that includes the cross-tenant synchronization service principal as a resource.&lt;/p&gt;
&lt;p&gt;This enables the users who are granted access to the package to also be assigned to the cross-tenant synchronization service principal. Regularly review and time-limit these assignments to ensure only necessary users have continued access.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Step 3: Create Access Packages in the Target Tenant&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Create access packages in the target tenant specifically tailored for roles involved in incident investigations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autoassigned Access Package:&lt;/strong&gt; Ideal for users needing the Security Reader role.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request-Based Access Package:&lt;/strong&gt; For users requiring Security Operator or Security Administrator roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Following setup, SOC users can navigate to a specific URL (myaccess.microsoft.com) to request access. This access, once granted, ensures users are provisioned roles in the target tenant(s) necessary for their responsibilities. Users can request additional access as needed and are deprovisioned from roles they no longer require after an access review.&lt;/p&gt;
&lt;h3&gt;Topology 2&lt;/h3&gt;
&lt;p&gt;In this topology, the target tenant&amp;#39;s administrator defines the access packages and resources that source users can request access to. If there is a need to restrict access selectively within the source tenant&amp;#39;s user base, a cross-tenant access policy supplemented by an access package can effectively block all access except for designated groups included in specific access packages. This setup ensures stringent access control tailored to organizational needs.&lt;/p&gt;
&lt;h2&gt;Steps to configure topology 2&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, add the source tenant as a connected organization.&lt;/p&gt;
&lt;p&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users from the source tenant can now request access packages in the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h2&gt;Topologies compared&lt;/h2&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;h2&gt;Deployment considerations&lt;/h2&gt;
&lt;h3&gt;Monitoring&lt;/h3&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;h3&gt;Scaling deployment with PowerShell / APIs&lt;/h3&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell commandlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Role-based access control&lt;/h3&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuring cross-tenant access settings - Security Administrator&lt;/li&gt;
&lt;li&gt;Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/li&gt;
&lt;li&gt;Configuring entitlement management - Identity Governance Administrator&lt;/li&gt;
&lt;li&gt;Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;What is entitlement management?&lt;/li&gt;
&lt;li&gt;Multitenant management in Defender XDR&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see &lt;a href=&quot;https://feedback.microsoft.com/forums/12345678-microsoft-entra-application-provision&quot;&gt;Microsoft Entra application provision UserVoice&lt;/a&gt;. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Authorization&lt;/h3&gt;
&lt;h4&gt;Unable to change provisioning mode back to manual&lt;/h4&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h3&gt;Attribute mappings&lt;/h3&gt;
&lt;h4&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/h4&gt;
&lt;p&gt;The attributes SamAccountName and userType aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see &lt;a href=&quot;https://help.microsoft.com/schema/missing-source-attribute&quot;&gt;Missing source attribute&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Source attribute dropdown missing for schema extension&lt;/h4&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and check if the dropdown is configured properly.&lt;/p&gt;
&lt;h2&gt;Null attribute can&amp;#39;t be provisioned&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h2&gt;Maximum characters for attribute-mapping expressions&lt;/h2&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h2&gt;Unsupported scoping filters&lt;/h2&gt;
&lt;p&gt;The appRoleAssignments, userType, and accountExpires attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h2&gt;Multivalue directory extensions&lt;/h2&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h2&gt;Service issues&lt;/h2&gt;
&lt;h3&gt;Unsupported scenarios&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provisioning passwords isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning nested groups isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/li&gt;
&lt;li&gt;Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h3&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h2&gt;Manager isn&amp;#39;t provisioned&lt;/h2&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h2&gt;The provisioning interval is fixed&lt;/h2&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h2&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Switching from Sync All to Sync Assigned not working&lt;/h2&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h2&gt;Provisioning cycle continues until completion&lt;/h2&gt;
&lt;p&gt;When you set provisioning to &lt;code&gt;enabled = off&lt;/code&gt; or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h2&gt;Member of group not provisioned&lt;/h2&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h2&gt;Global Reader&lt;/h2&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the &lt;code&gt;microsoft.directory/applications/synchronization/standard/read&lt;/code&gt; permission.&lt;/p&gt;
&lt;h2&gt;Microsoft Azure Government Cloud&lt;/h2&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h2&gt;On-premises application provisioning&lt;/h2&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h3&gt;Application and directories&lt;/h3&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;h3&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When a user is managed by Microsoft Entra Connect, the source of authority is on-premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/li&gt;
&lt;li&gt;Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on this website to track the status of the preview. Alternatively, you can use Microsoft Identity Manager for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. You can&amp;#39;t bring a user into the directory from a third-party application. Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.&lt;/p&gt;
&lt;h2&gt;Attributes and objects&lt;/h2&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multivalued attributes.&lt;/li&gt;
&lt;li&gt;Reference attributes (for example, manager).&lt;/li&gt;
&lt;li&gt;Groups.&lt;/li&gt;
&lt;li&gt;Complex anchors (for example, ObjectTypeName+UserName).&lt;/li&gt;
&lt;li&gt;Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;|&amp;quot;&lt;/li&gt;
&lt;li&gt;Binary attributes.&lt;/li&gt;
&lt;li&gt;On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSL certificates&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h2&gt;Anchor attributes&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h2&gt;Attribute discovery and mapping&lt;/h2&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;h2&gt;Provisioning agent&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/li&gt;
&lt;li&gt;The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR- driven provisioning.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;How provisioning works&lt;/p&gt;
&lt;h2&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article • 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named &lt;strong&gt;Cairo&lt;/strong&gt; and two member tenants named &lt;strong&gt;Berlin&lt;/strong&gt; and &lt;strong&gt;Athens&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see &lt;a href=&quot;https://example.com/set-up-multi-tenant-org&quot;&gt;Set up a multitenant org in Microsoft 365&lt;/a&gt; and &lt;a href=&quot;https://example.com/join-leave-multi-tenant-org&quot;&gt;Join or leave a multitenant organization in Microsoft 365&lt;/a&gt;. To learn how to configure Microsoft Teams for your multitenant organization, see &lt;a href=&quot;https://example.com/new-teams-client&quot;&gt;The new Microsoft Teams desktop client&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Organizational Structure&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    Cairo --&amp;gt;|Cross-tenant access settings| Athens;
    Cairo --&amp;gt;|Cross-tenant access settings| Berlin;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Owner tenant&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;https://example.com/license-requirements&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Administrator&lt;/strong&gt; role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global Administrator&lt;/strong&gt; role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Member tenant&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;https://example.com/license&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the owner tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# Start PowerShell.
Start PowerShell.

# If necessary, install the Microsoft Graph PowerShell SDK.
Install the Microsoft Graph PowerShell SDK.

# Get the tenant ID of the owner and member tenants and initialize variables.
$ownerTenantId = &amp;quot;OwnerTenantId&amp;quot;
$memberTenantIdB = &amp;quot;MemberTenantIdB&amp;quot;
$memberTenantIdA = &amp;quot;MemberTenantIdA&amp;quot;

# Use the Connect-MgGraph command to sign in to the owner tenant and consent to the following required permissions.
Connect-MgGraph -TenantId $ownerTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 2: Create a multitenant organization&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# In the owner tenant, use the following command to create your multitenant organization. This operation can take a few minutes.
Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;

# Use the following command to check that the operation has completed before proceeding.
Get-MgBetaTenantRelationshipMultiTenantOrganization | Format-List

# Output example
CreatedDateTime    : 1/8/2024 7:47:45 PM
Description        :
DisplayName        : Cairo
Id                 : &amp;lt;MtoIdC&amp;gt;
JoinRequest        :
Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
anizationJoinRequestRecord
State              : active
Tenants            :
AdditionalProperties : {[@odata.context, https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult
iTenantOrganization/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 3: Add tenants&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the &lt;code&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to add tenants to your multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantID -DisplayName &amp;quot;Berlin&amp;quot; | Format-List

New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantID -DisplayName &amp;quot;Athens&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to verify that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId       : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime         : 1/8/2024 7:47:45 PM
DeletedDateTime       : 
DisplayName           : Cairo
Id                    : &amp;lt;MtoIdC&amp;gt;
JoinedDateTime        : 
Role                  : owner
State                 : active
TenantId              : &amp;lt;OwnerTenantId&amp;gt;
TransitionDetails     : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tenant Information&lt;/h2&gt;
&lt;h3&gt;Berlin Tenant&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;OwnerTenantId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;MtoIdB&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;MemberTenantIdB&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{[multiTenantOrgLabelType, none]}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Athens Tenant&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;OwnerTenantId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:08:47 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Athens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;MtoIdA&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;MemberTenantIdA&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{[multiTenantOrgLabelType, none]}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 4: (Optional) Change the role of a tenant&lt;/h2&gt;
&lt;h3&gt;Owner Tenant&lt;/h3&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# In the owner tenant, use the following command to change a member tenant to an owner tenant:
Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Update Command&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Verification Command&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;MemberTenantIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;See TransitionDetails below&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;TransitionDetails&lt;/h3&gt;
&lt;p&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
&lt;strong&gt;AdditionalProperties:&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity&quot;&gt;odata.context&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;multiTenantOrgLabelType, none&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 5: (Optional) Remove a member tenant&lt;/h2&gt;
&lt;h3&gt;Owner Tenant Instructions&lt;/h3&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&amp;lt;Insert Remove Command Here&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 1: Remove a Member Tenant&lt;/h2&gt;
&lt;p&gt;In the owner tenant, use the &lt;strong&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/strong&gt; command to remove a member tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 2: Verify the Change&lt;/h2&gt;
&lt;p&gt;Use the &lt;strong&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/strong&gt; command to verify the change.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get:
Unable to read the company information from the directory.

Status: 404 (NotFound)
ErrorCode: Directory_ObjectNotFound
Date: 2024-01-08T20:35:11
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 6: Sign in to a Member Tenant&lt;/h2&gt;
&lt;h3&gt;Member Tenant&lt;/h3&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;h2&gt;PowerShell Instructions&lt;/h2&gt;
&lt;h3&gt;Start PowerShell&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $MemberTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 7: Join the multitenant organization&lt;/h3&gt;
&lt;h4&gt;Member tenant&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the member tenant, use the Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to join the multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest -AddedByTenantId $OwnerTenantId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest command to verify the join.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PowerShell Commands and Outputs&lt;/h2&gt;
&lt;h3&gt;1. Command to get multi-tenant organization join request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId      : &amp;lt;OwnerTenantId&amp;gt;
Id                   : &amp;lt;MtoJoinRequestIdB&amp;gt;
MemberState          : active
Role                 : member
TransitionDetails    : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
                        anizationJoinRequestTransitionDetails
AdditionalProperties : {[@odata.context,
                        https://graph.microsoft.com/beta/$metadata#tenantRelationships/mult
                        iTenantOrganization/joinRequest/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Command to get multitenant organization tenant details&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output 1&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId      : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime        : 1/8/2024 8:05:25 PM
DeletedDateTime      :
DisplayName          : Berlin
Id                   : &amp;lt;MtoJoinRequestIdB&amp;gt;
JoinedDateTime       : 1/8/2024 9:53:55 PM
Role                 : member
State                : active
TenantId             : &amp;lt;MemberTenantIdB&amp;gt;
TransitionDetails    : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg
                        anizationMemberTransitionDetails
AdditionalProperties : {[@multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output 2&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId      : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime        : 1/8/2024 7:47:45 PM
DeletedDateTime      :
DisplayName          : Cairo
Id                   : &amp;lt;Id&amp;gt;
JoinedDateTime       :
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 8: (Optional) Leave the multitenant organization&lt;/h2&gt;
&lt;h3&gt;Member tenant&lt;/h3&gt;
&lt;p&gt;You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.&lt;/p&gt;
&lt;p&gt;If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see Step 4: (Optional) Change the role of a tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: (Optional) Delete the multitenant organization&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;TenantId&lt;/th&gt;
&lt;th&gt;TransitionDetails&lt;/th&gt;
&lt;th&gt;AdditionalProperties&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrg anizationMemberTransitionDetails&lt;/td&gt;
&lt;td&gt;[{multiTenantOrgLabelType, none}]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To allow for asynchronous processing, wait up to 2 hours before joining a multitenant organization is completed.&lt;/p&gt;
&lt;h2&gt;Owner tenant&lt;/h2&gt;
&lt;p&gt;You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;In the final owner tenant, use the Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to remove the tenant. This operation takes a few minutes.

Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $OwnerTenantId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;The new Microsoft Teams desktop client&lt;/li&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article Date:&lt;/strong&gt; 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant access policy partner template&lt;/h3&gt;
&lt;p&gt;The cross-tenant access partner configuration handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h3&gt;Configure inbound and outbound automatic redemption&lt;/h3&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the Update multiTenantOrganizationPartnerConfigurationTemplate API. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration

{
  &amp;quot;inboundTrust&amp;quot;: {
    &amp;quot;isMfaAccepted&amp;quot;: true,
    &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
    &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
  },
  &amp;quot;automaticUserConsentSettings&amp;quot;: {
    &amp;quot;inboundAllowed&amp;quot;: true,
    &amp;quot;outboundAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration

{
  &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Patch Configuration&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration

{
  &amp;quot;inboundTrust&amp;quot;: {
    &amp;quot;isMfaAccepted&amp;quot;: true,
    &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
    &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
  },
  &amp;quot;automaticUserConsentSettings&amp;quot;: {
    &amp;quot;inboundAllowed&amp;quot;: true,
    &amp;quot;outboundAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the following API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cross-tenant synchronization template&lt;/h2&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h2&gt;Configure inbound user synchronization&lt;/h2&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the Update multiTenantOrganizationIdentitySyncPolicyTemplate API. If you create or join a multi-tenant organization without specifically configuring this policy template, default synchronization settings will apply.&lt;/p&gt;
&lt;h2&gt;Request&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners,existingPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PATCH Request for Template Update&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the &lt;code&gt;multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings&lt;/code&gt; API.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;POST https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article • 03/11/2024&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    Source([Source tenant]) --&amp;gt;|Cross-tenant synchronization| Target([Target tenant])
    Source --&amp;gt;|Outbound access settings| Conf([Configuration])
    Conf --&amp;gt;|Scoping filters&amp;lt;br/&amp;gt;Attribute mappings| Scope([Scope])
    
    subgraph Source
      US1([UserS1])
      US2([UserS2])
      US3([UserS3])
    end
    
    subgraph Target
      UT1([UserT1])
      UT2([UserT2])
      UT3([UserT3])
      GT1([GroupT1])
    end
    
    subgraph Conf
      SF([Scoping filters&amp;lt;br/&amp;gt;UserS1, UserS3&amp;lt;br/&amp;gt;department EQUALS Marketing])
      AM([Attribute mappings&amp;lt;br/&amp;gt;accountEnabled&amp;lt;br/&amp;gt;employeed&amp;lt;br/&amp;gt;userPrincipalName&amp;lt;br/&amp;gt;extensionName])
    end
    
    subgraph Scope 
      OS([UserS1, UserS3])
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Learning objectives&lt;/h3&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Remove B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Keep user attributes synchronized between your source and target tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 License. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Target tenant&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 License. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Plan your provisioning deployment&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Define how you would like to structure the tenants in your organization.&lt;/li&gt;
&lt;li&gt;Learn about how the provisioning service works.&lt;/li&gt;
&lt;li&gt;Determine who will be in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Determine what data to map between tenants.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip: Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the target tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;On the Organization settings tab, select Add organization.&lt;/li&gt;
&lt;li&gt;Add the source tenant by typing the tenant ID or domain name and selecting Add.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;External Identities | Cross-tenant access settings&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cross-tenant access settings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Organizational settings&lt;/li&gt;
&lt;li&gt;Default settings&lt;/li&gt;
&lt;li&gt;Microsoft cloud settings&lt;ul&gt;
&lt;li&gt;Add organization&lt;/li&gt;
&lt;li&gt;Refresh&lt;/li&gt;
&lt;li&gt;Columns&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inbound access settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;External collaboration settings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Diagnose and solve problems&lt;/li&gt;
&lt;li&gt;Self-service sign up&lt;/li&gt;
&lt;li&gt;Custom user attributes&lt;/li&gt;
&lt;li&gt;AI API connectors&lt;/li&gt;
&lt;li&gt;User flows&lt;/li&gt;
&lt;li&gt;Linked subscriptions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Search by domain name or tenant ID&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Inbound Access&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;No organizations found&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Steps to Manage Access&lt;/h3&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inbound Access&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under Inbound access of the added organization, select &lt;code&gt;Inherited from default&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-tenant Sync Tab&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select the Cross-tenant sync tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Sync Settings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check the &lt;code&gt;Allow users sync into this tenant&lt;/code&gt; checkbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Inbound access settings - Fabrikam](image-link-here) --&gt;  
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Note: Enabling will allow the admin of the specified (source) tenant to sync objects into this (target) tenant. Disabling will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. This setting should only be used between tenants that are part of the same organization.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save Settings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select Save.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable Cross-tenant Sync and Auto-redemption&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you see an Enable cross-tenant sync and auto-redemption dialog box asking if you want to enable auto-redemption, select &lt;code&gt;Yes&lt;/code&gt;.&lt;ul&gt;
&lt;li&gt;Selecting Yes will automatically redeem invitations in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Inbound Access Settings - Fabrikam&lt;/h2&gt;
&lt;h3&gt;Enable Cross-Tenant Sync and Auto-Redemption&lt;/h3&gt;
&lt;p&gt;To enable this setting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Target Tenant&lt;/strong&gt;: Automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Step-by-Step Instructions:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;Inbound access settings&lt;/strong&gt; page, navigate to the &lt;strong&gt;Trust settings&lt;/strong&gt; tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the &lt;strong&gt;Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/strong&gt; checkbox. (Note that if you previously enabled cross-tenant sync and auto-redemption, this might already be selected.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;|  | Setting |
|---|---------|
| &amp;lt;!-- Image reference points to missing/unhandled asset: ![checkbox](checked) --&amp;gt; | Automatically redeem invitations with the tenant Fabrikam |
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm by clicking &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Important Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;This setting must be enabled in both the source (outbound) and target (inbound) tenants.&lt;/li&gt;
&lt;li&gt;For more details on how to configure these settings effectively, refer to the &lt;a href=&quot;#&quot;&gt;Automatic redemption setting&lt;/a&gt; documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 4: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;On the Organization settings tab, select Add organization.&lt;/li&gt;
&lt;li&gt;Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Screenshot Description&lt;/h3&gt;
&lt;p&gt;The image illustrates the user interface of the Microsoft Entra admin center where you can manage External Identities and Cross-tenant access settings. Specifically, it shows the Add organization window where a user can type the tenant ID or domain name to add an external Microsoft Entra tenant.&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Under Outbound access for the target organization, select Inherited from default.&lt;/li&gt;
&lt;li&gt;Select the Trust settings tab.&lt;/li&gt;
&lt;li&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; checkbox.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Outbound access settings - Contoso&lt;/h2&gt;
&lt;h3&gt;B2B collaboration&lt;/h3&gt;
&lt;h3&gt;B2B direct connect&lt;/h3&gt;
&lt;h3&gt;Trust settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic redemption&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well.&lt;/li&gt;
&lt;li&gt;Automatically redeem invitations with the tenant Contoso.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 5: Create a configuration in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, select &lt;strong&gt;New configuration&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a name for the configuration and select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It can take up to 15 seconds for the configuration that you just created to appear in the list.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 6: Test the connection to the target tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabrikam to Contoso | Overview&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting &amp;amp; Support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Automate identity lifecycle management with Microsoft Entra&lt;/strong&gt;&lt;br&gt;Automatically create, update, and delete accounts when users join, leave, and move within your organization.&lt;/p&gt;
&lt;h3&gt;Instructions&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Get started&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the Provisioning Mode to Automatic.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Admin Credentials&lt;/strong&gt; section, change the Authentication Method to &lt;strong&gt;Cross Tenant Synchronization Policy&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Provisioning Configuration&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provisioning Mode&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication Method&lt;/td&gt;
&lt;td&gt;Cross Tenant Synchronization Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Admin Credentials&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra needs the following information to connect to Fabrikam to Contoso&amp;#39;s API and synchronize user data:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tenant Id&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 6: Test Connection&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Tenant Id&lt;/strong&gt; box, enter the tenant ID of the target tenant.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Test Connection&lt;/strong&gt; to test the connection.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see &lt;a href=&quot;#&quot;&gt;Troubleshooting tips&lt;/a&gt; later in this article.&lt;/p&gt;
&lt;h3&gt;Notifications&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Testing connection to Fabrikam to Contoso
The supplied credentials are authorized to enable provisioning
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mappings and Settings sections appear.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Close the Provisioning page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 7: Define who is in scope for provisioning&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on assignment to the configuration&lt;/li&gt;
&lt;li&gt;Based on attributes of the user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Settings&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabricam to Contoso | Provisioning&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;This screen provides a series of options and settings for provisioning users and groups from Fabricam to Contoso. Here is a description of the key parts visible in the screenshot:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admin Credentials&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mappings&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings&lt;/strong&gt; includes options such as:&lt;ul&gt;
&lt;li&gt;Send an email notification when a failure occurs&lt;/li&gt;
&lt;li&gt;Prevent accidental deletion (&lt;code&gt;Accidental deletion threshold&lt;/code&gt; set to &lt;code&gt;500&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Scope with options to &lt;code&gt;Sync only assigned users and groups&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provisioning Status&lt;/strong&gt; with toggles for &lt;code&gt;On&lt;/code&gt; and &lt;code&gt;Off&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configuration Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scope Selection:&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decide whether to synchronize all users in the source tenant or only those assigned to the configuration. &lt;/li&gt;
&lt;li&gt;It is advisable to select &lt;strong&gt;Sync only assigned users and groups&lt;/strong&gt; for efficiency and better performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Saving Changes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;Save&lt;/code&gt; after making any modifications to ensure they are applied.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specifying Users and Groups:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to &lt;code&gt;Users and groups&lt;/code&gt; on the configuration page.&lt;/li&gt;
&lt;li&gt;To enable cross-tenant synchronization, at least one internal user must be included in the configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adding Users/Groups:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose &lt;code&gt;Add user/group&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;Users and groups&lt;/code&gt; selection dialog to include specific users or groups in the configuration. Ensure to select from internal users or groups as required.&lt;/li&gt;
&lt;li&gt;Note: Only direct members of a selected group are in scope for provisioning. The scope does not extend to nested groups.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Finalizing Selection:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete the process by selecting &lt;code&gt;Select&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Select Assign&lt;/h2&gt;
&lt;h3&gt;Screenshot Description:&lt;/h3&gt;
&lt;p&gt;The screenshot displays the interface for assigning users and groups to an application. Under &amp;quot;Fabrikam to Contoso | Users and groups&amp;quot;, various options like Overview, Provisioning, and Users and groups are visible. A user interface element allows the addition of a user/group, editing assignment, and removal. The application visibility setting can be toggled to be not visible in &amp;quot;My Apps&amp;quot;. Below, a sub-panel lists users and groups with columns for Display Name, Object Type, and Role assigned, along with checkboxes to select the entities.&lt;/p&gt;
&lt;h3&gt;Step 8: (Optional) Define who is in scope for provisioning with scoping filters&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Regardless of the value you selected for &lt;strong&gt;Scope&lt;/strong&gt; in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabricam to Contoso | Provisioning&lt;/h2&gt;
&lt;h3&gt;Step-by-Step Guide&lt;/h3&gt;
&lt;h4&gt;1. Overview&lt;/h4&gt;
&lt;p&gt;In the &lt;strong&gt;Fabricam - Microsoft Entra ID&lt;/strong&gt; configuration, set up the provisioning to Contoso by following the instructions below.&lt;/p&gt;
&lt;h4&gt;2. Admin Credentials&lt;/h4&gt;
&lt;p&gt;Ensure the appropriate admin credentials are set to manage the mappings between Fabricam and Contoso.&lt;/p&gt;
&lt;h4&gt;3. Attribute Mapping&lt;/h4&gt;
&lt;p&gt;Navigate to the &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; setting under the &lt;strong&gt;Mappings&lt;/strong&gt; section to adjust how data should flow between Microsoft Entra ID and Azure Active Directory.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enabled&lt;/strong&gt;: Yes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restore default mappings&lt;/strong&gt;: Unchecked&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. Provisioning Settings&lt;/h4&gt;
&lt;p&gt;Make sure the provisioning status is set to &lt;strong&gt;On&lt;/strong&gt; for continuous synchronization.&lt;/p&gt;
&lt;h4&gt;5. Source Object Scope&lt;/h4&gt;
&lt;p&gt;Select &lt;strong&gt;All records&lt;/strong&gt; under the &lt;strong&gt;Source Object Scope&lt;/strong&gt; to ensure all user records are included in the synchronization process.&lt;/p&gt;
&lt;h4&gt;6. Target Object Actions&lt;/h4&gt;
&lt;p&gt;Specify actions for target objects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose these options based on the desired outcome for records that do not match between source and target systems.&lt;/p&gt;
&lt;h4&gt;7. Adding Scoping Filters&lt;/h4&gt;
&lt;p&gt;On the &lt;strong&gt;Source Object Scope&lt;/strong&gt; page, select &lt;strong&gt;Add scoping filter&lt;/strong&gt; to apply filters that define which users are included in the provisioning process.&lt;/p&gt;
&lt;h2&gt;Configure Scoping Filters&lt;/h2&gt;
&lt;p&gt;To configure scoping filters, refer to the instructions provided in Scoping users or groups to be provisioned with scoping filters.&lt;/p&gt;
&lt;h3&gt;Add Scoping Filter&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;Add New Scoping Clause&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If multiple scoping clauses are present, they are evaluated using &amp;quot;AND&amp;quot; logic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Ok&lt;/strong&gt; and &lt;strong&gt;Save&lt;/strong&gt; to save any changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Yes&lt;/strong&gt; and close the Attribute Mapping page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Review Attribute Mappings&lt;/h2&gt;
&lt;h3&gt;Source Tenant&lt;/h3&gt;
&lt;p&gt;Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see &lt;a href=&quot;#&quot;&gt;Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page, scroll down to review the user attributes that are synchronized between tenants in the &lt;strong&gt;Attribute Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Attribute Mapping&lt;/h2&gt;
&lt;p&gt;The first attribute, &lt;code&gt;alternativeSecurityIdentifier&lt;/code&gt;, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a &lt;code&gt;schemaInvalid&lt;/code&gt; error.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Active Directory Attribute&lt;/th&gt;
&lt;th&gt;Azure Active Directory (target tenant) Attribute&lt;/th&gt;
&lt;th&gt;Matching precedence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AltSecIdFromNetId(netId)&lt;/td&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;isSoftDeleted&lt;/td&gt;
&lt;td&gt;isSoftDeleted&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;User Type Selection and Settings&lt;/h2&gt;
&lt;h3&gt;Member (userType) Attribute&lt;/h3&gt;
&lt;p&gt;Select the &lt;code&gt;Member (userType)&lt;/code&gt; attribute to open the Edit Attribute page.&lt;/p&gt;
&lt;h3&gt;Constant Value Setting for userType&lt;/h3&gt;
&lt;p&gt;Review the &lt;strong&gt;Constant Value&lt;/strong&gt; setting for the userType attribute. This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see &lt;a href=&quot;#&quot;&gt;Properties of a Microsoft Entra B2B collaboration user&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constant Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Default. Users will be created as external members (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;Users will be created as external guests (B2B collaboration users) in the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Note&lt;/h2&gt;
&lt;p&gt;If the B2B user already exists in the target tenant then Member (userType) will not changed to Member, unless the Apply this mapping setting is set to Always.&lt;/p&gt;
&lt;h3&gt;User Type Limitations&lt;/h3&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;Support for UserType Member in Power BI is currently in preview. For more information, see &lt;a href=&quot;https://linktopowerbi.com&quot;&gt;Distribute Power BI content to external guest users with Microsoft Entra B2B.&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Edit Attribute&lt;/h3&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g., Users) should flow to and from this application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mapping type: Constant&lt;/li&gt;
&lt;li&gt;Constant Value: Member&lt;/li&gt;
&lt;li&gt;Target attribute: userType&lt;/li&gt;
&lt;li&gt;Match objects using this attribute: No&lt;/li&gt;
&lt;li&gt;Matching precedence: 0&lt;/li&gt;
&lt;li&gt;Apply this mapping: Only during object creation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Attribute Transformations&lt;/h3&gt;
&lt;p&gt;If you want to define any transformations, on the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page, select the attribute you want to transform, such as displayName.&lt;/p&gt;
&lt;h2&gt;Step 7: Set the Mapping Type&lt;/h2&gt;
&lt;p&gt;Set the Mapping type to &lt;strong&gt;Expression&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Step 8: Define the Transformation Expression&lt;/h2&gt;
&lt;p&gt;In the Expression box, enter the transformation expression. For example, with the display name, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flip the first name and last name and add a comma in between.&lt;/li&gt;
&lt;li&gt;Add the domain name in parentheses at the end of the display name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For examples, refer to Reference for writing expressions for attribute mappings in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Edit Attribute Interface&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mapping type:&lt;/strong&gt; Expression&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression:&lt;/strong&gt; [displayName]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The expression was correctly parsed.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target attribute:&lt;/strong&gt; displayName&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Expression Interface](#) --&gt;  &lt;!-- Image described as interface window for Edit Attribute --&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see &lt;a href=&quot;#&quot;&gt;Map directory extensions in cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Step 10: Specify Additional Provisioning Settings&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Source tenant&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Step 10: Configure advanced settings&lt;/h2&gt;
&lt;h3&gt;1. In the source tenant, select Provisioning and expand the Settings section.&lt;/h3&gt;
&lt;h3&gt;2. Check the Send an email notification when a failure occurs check box.&lt;/h3&gt;
&lt;h3&gt;3. In the Notification Email box, enter the email address of a person or group who should receive provisioning error notifications.&lt;/h3&gt;
&lt;p&gt;Email notifications are sent within 24 hours of the job entering quarantine state.
For custom alerts, see &lt;a href=&quot;https://docs.microsoft.com&quot;&gt;Understand how provisioning integrates with Azure Monitor logs&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;4. To prevent accidental deletion, select Prevent accidental deletion and specify a threshold value. By default, the threshold is set to 500.&lt;/h3&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://docs.microsoft.com&quot;&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;5. Select Save to save any changes.&lt;/h3&gt;
&lt;h2&gt;Step 11: Test provision on demand&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://example.com/provision_on_demand.png&quot; alt=&quot;Provision on Demand&quot;&gt;&lt;/p&gt;
&lt;h2&gt;On-Demand Provisioning Test Instructions&lt;/h2&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision on demand&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Select a user or group&lt;/strong&gt; box, search for and select one of your test users.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After a few moments, the &lt;strong&gt;Perform action&lt;/strong&gt; page appears with information about the provisioning of the test user in the target tenant.&lt;/p&gt;
&lt;h2&gt;Perform Action&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Modified Attributes (successful)&lt;/strong&gt; - User &lt;code&gt;User1@fictiban.com&lt;/code&gt; was created in Azure Active Directory (target tenant).&lt;/p&gt;
&lt;h3&gt;Data Flow&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Attribute Name&lt;/th&gt;
&lt;th&gt;Source Attribute Value&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Original Target Attribute Value&lt;/th&gt;
&lt;th&gt;Modified Target Attribute Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;isSoftDeleted&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;[isSoftDeleted]&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;[displayName]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mailNickname&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;[mailNickname]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;AIdSceFromId(nt:103...&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;&amp;quot;True&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;[preferredLanguage]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;User Scope Check&lt;/h2&gt;
&lt;h3&gt;Determine if user is in scope&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;The user &lt;code&gt;alice@fictiban.com&lt;/code&gt; will be skipped due to the following reasons: This object is not assigned to the application.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Reason Details:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; SkipReason&lt;br&gt;&lt;strong&gt;Attribute Value:&lt;/strong&gt; NotEffectivelyEntitled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; IsActive&lt;br&gt;&lt;strong&gt;Attribute Value:&lt;/strong&gt; True&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; Assigned to the application&lt;br&gt;&lt;strong&gt;Attribute Value:&lt;/strong&gt; False&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; isInProvisioningScope&lt;br&gt;&lt;strong&gt;Attribute Value:&lt;/strong&gt; True&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Provision on Demand&lt;/h2&gt;
&lt;p&gt;On the Provision on demand page, you can view details about the provision and have the option to retry.&lt;/p&gt;
&lt;h2&gt;Fabrikam to Contoso | Provision on Demand&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Provision on demand&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activity&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troubleshooting + Support&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Provision Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Import user&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;This step shows the user retrieved from the source system and the properties of the user in the source system.&lt;/li&gt;
&lt;li&gt;Status: Success&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Determine if user is in scope&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;This step shows the scoping conditions that were evaluated and which ones the user passed or failed.&lt;/li&gt;
&lt;li&gt;Status: Success&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match user between source and target system&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;This step shows whether the user was found in the target system as well as the properties of the user in the target system.&lt;/li&gt;
&lt;li&gt;Status: Success&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perform action&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;This step shows the action that was performed in the target application, such as creating a user or updating a user.&lt;/li&gt;
&lt;li&gt;Status: Success&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Actions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retry&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provision another object&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Verification in the target tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contoso Users&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Azure Active Directory as ID provider&lt;/li&gt;
&lt;li&gt;Details of provisioned user:&lt;ul&gt;
&lt;li&gt;Display name: User1&lt;/li&gt;
&lt;li&gt;User principal name: &lt;a href=&quot;mailto:user1@fabrikam.com-EXT&quot;&gt;user1@fabrikam.com-EXT&lt;/a&gt;@Contoso.ID&lt;/li&gt;
&lt;li&gt;User type: Member&lt;/li&gt;
&lt;li&gt;On-premises: No&lt;/li&gt;
&lt;li&gt;Identities: ExternalAzureAD&lt;/li&gt;
&lt;li&gt;Company name: -&lt;/li&gt;
&lt;li&gt;Creation type: Invitation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Additional Configuration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If all is working as expected, additional users can be assigned to the configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Documentation Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For more details, refer to the documentation on On-demand provisioning in Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 12: Start the Provisioning Job&lt;/h2&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;The provisioning job starts the initial synchronization cycle of all users defined in Scope of the Settings section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Select Configurations and then select your configuration.&lt;/li&gt;
&lt;li&gt;On the Overview page, review the provisioning details.&lt;/li&gt;
&lt;li&gt;Select Start provisioning to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Step 13: Monitor provisioning&lt;/h3&gt;
&lt;h4&gt;Source and target tenants&lt;/h4&gt;
&lt;p&gt;Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, on the Overview page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see Check the status of user provisioning.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Application Provisioning in Quarantine Status&lt;/h2&gt;
&lt;p&gt;If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see &lt;a href=&quot;#&quot;&gt;Application provisioning in quarantine status&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Overview Tab&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Current cycle status&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Initial cycle completed: &lt;strong&gt;100% complete&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Total Users: &lt;strong&gt;2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View provisioning logs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Statistics to Date&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;View provisioning details&lt;/li&gt;
&lt;li&gt;View technical information&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Select Provisioning Logs&lt;/h3&gt;
&lt;p&gt;Select &lt;strong&gt;Provisioning logs&lt;/strong&gt; to determine which users have been provisioned successfully or unsuccessfully. By default, the logs are filtered by the service principal ID of the configuration. For more information, see &lt;a href=&quot;#&quot;&gt;Provisioning logs in Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;| Date       | Identity Name     | Source System      | Action | Target System         | Status |
|------------|-------------------|--------------------|--------|-----------------------|--------|
| 1/22/2024  | Display Name Here | Azure Active Directory | Update | Azure Active Directory | Success|
| 1/22/2024  | Display Name Here | Azure Active Directory | Create | Azure Active Directory | Success|
| 1/22/2024  | Display Name Here | Azure Active Directory | Other  | Azure Active Directory | Skipped|
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Select Audit Logs&lt;/h3&gt;
&lt;p&gt;Select &lt;strong&gt;Audit logs&lt;/strong&gt; to view all logged events in Microsoft Entra ID. For more information, see &lt;a href=&quot;#&quot;&gt;Audit logs in Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Fabricam to Contoso: Audit Logs&lt;/h2&gt;
&lt;h3&gt;Viewing Audit Logs&lt;/h3&gt;
&lt;p&gt;You can also view audit logs in the target tenant.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;In the target tenant, select &lt;strong&gt;Users &amp;gt; Audit logs&lt;/strong&gt; to view logged events for user management.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 14: Configure Leave Settings&lt;/h2&gt;
&lt;h3&gt;Target Tenant&lt;/h3&gt;
&lt;p&gt;Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; External collaboration settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;External user leave settings&lt;/strong&gt;, choose whether to allow external users to leave your organization themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;h3&gt;Delete a configuration&lt;/h3&gt;
&lt;p&gt;Follows these steps to delete a configuration on the Configurations page.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;On the Configurations page, add a check mark next to the configuration you want to delete.&lt;/li&gt;
&lt;li&gt;Select Delete and then OK to delete the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure&lt;/h3&gt;
&lt;p&gt;When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:&lt;/p&gt;
&lt;p&gt;&amp;quot;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Error Details&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Error code: AzureDirectoryB2BManagementPolicyCheckFailure
Details: Policy permitting auto-redemption of invitations not configured.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Notifications&lt;/h2&gt;
&lt;h3&gt;Testing Connection to Fabrikam&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error&lt;/strong&gt;: You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error Code&lt;/strong&gt;: AzureDirectoryB2BManagementPolicyCheckFailure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Details&lt;/strong&gt;: Policy permitting auto-redemption of invitations not configured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request ID&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Follow the steps in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Automatically redeem invitations in the target tenant&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Automatically redeem invitations in the source tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Symptom - Automatic Redemption Check Box is Disabled&lt;/h2&gt;
&lt;p&gt;When configuring cross-tenant synchronization, the Automatic redemption check box is disabled.&lt;/p&gt;
&lt;h2&gt;Outbound Access Settings - Contoso&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You need Azure AD Premium to configure trust settings and target select users, groups, and applications in cross-tenant access settings.&lt;/p&gt;
&lt;h3&gt;Tabs:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B2B collaboration&lt;/li&gt;
&lt;li&gt;B2B direct connect&lt;/li&gt;
&lt;li&gt;Trust settings&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Automatic redemption&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[ ]&lt;/strong&gt; Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. &lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[x]&lt;/strong&gt; Automatically redeem invitations with the tenant aea5fea3-ecc3-49f6-aaf8-e50a26e228de.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;You must have Microsoft Entra ID P1 or P2 to configure trust settings.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Symptom - Recently Deleted User in the Target Tenant is Not Restored&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Issue&lt;/strong&gt;: After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;h4&gt;Cause&lt;/h4&gt;
&lt;p&gt;Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;Manually restore the soft-deleted user in the target tenant. For more information, see Restore or remove a recently deleted user using Microsoft Entra ID.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Symptom - Users are Skipped Because SMS Sign-in is Enabled on the User&lt;/h3&gt;
&lt;p&gt;[Explanation and solutions for the symptom would be described here, but content is not visible in the image provided.]&lt;/p&gt;
&lt;h2&gt;Users and Synchronization&lt;/h2&gt;
&lt;p&gt;Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecurityIds EQUALS &amp;#39;None&amp;#39;&amp;quot;&lt;/p&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;##### Disable SMS Sign-in options for the users

##### Import module
Install-Module Microsoft.Graph.Users.Actions
Install-Module Microsoft.Graph.Identity.SignIns
Import-Module Microsoft.Graph.Users.Actions

Connect-MgGraph -Scopes &amp;quot;User.Read.All&amp;quot;, &amp;quot;Group.ReadWrite.All&amp;quot;, &amp;quot;UserAuthenticationMethod.Read.All&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite.All&amp;quot;

##### The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-8b79702928f7
$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-8b79702928f7&amp;quot;

##### Get the User Details
$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;

##### validate the value for SmsSignInState
$smsSignIn = Get-MgUserAuthenticationPhoneMethod -UserId $userId

{
    if($smsSignIn.SmsSignInState -eq &amp;quot;ready&amp;quot;){
        ##### Disable Sms Sign-In for the user is set to ready
        Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId -PhoneAuthenticationMethodId $phoneAuthenticationMethodId
        Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green
    }
    else{
        Write-Host &amp;quot;SMS sign-in status not set or found for the user&amp;quot; -ForegroundColor Yellow
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h2&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see Configure external collaboration settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial: Reporting on automatic user account provisioning&lt;/li&gt;
&lt;li&gt;Managing user account provisioning for enterprise apps in the Azure portal&lt;/li&gt;
&lt;li&gt;What is single sign-on in Microsoft Entra ID?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article • 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see &lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Diagram Overview&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    A[Source Tenant] --&amp;gt;|Cross-tenant synchronization| B[Target Tenant]
    A --&amp;gt;|Outbound access settings| A1[UserS1, UserS2, UserS3]
    A1 -.-&amp;gt;|Automatically redeem invitations| A
    A --&amp;gt; C[Configuration]
    C -.-&amp;gt;|Scoping filters: department EQUALS Marketing| C
    C --&amp;gt;|Attribute mappings| C1{accountEnabled, employed, userPrincipalName, companyName}
    B -.-&amp;gt;|Inbound access settings| B1[Allow users sync into this tenant]
    B1 -.-&amp;gt;|Automatically redeem invitations| B
    B --&amp;gt; D[Internal User1, User2, User3, GroupT1]
    D --&amp;gt; E[External UserS1, UserS3]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see &lt;a href=&quot;#&quot;&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Roles and Permissions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the target tenant&lt;/h2&gt;
&lt;h3&gt;Instructions&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$SourceTenantId = &amp;quot;SourceTenantId&amp;quot;
$TargetTenantId = &amp;quot;TargetTenantId&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph command to sign in to the target tenant and consent to the following required permissions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;In the target tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.

If you get the error New-MgPolicyCrossTenantAccessPolicyPartner_Create:
Another object with the same value for property tenantId already exists, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.

$Params = @{
    TenantId = $SourceTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
B2BCollaborationInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BCollaborationOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
IdentitySynchronization : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SyncPolicyPartner&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;InboundTrust:&lt;/strong&gt; Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust&lt;br&gt;&lt;strong&gt;IsServiceProvider:&lt;/strong&gt; :&lt;br&gt;&lt;strong&gt;TenantId:&lt;/strong&gt; &lt;code&gt;&amp;lt;SourceTenantId&amp;gt;&lt;/code&gt;&lt;br&gt;&lt;strong&gt;TenantRestrictions:&lt;/strong&gt; Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions&lt;br&gt;&lt;strong&gt;AdditionalProperties:&lt;/strong&gt; &lt;code&gt;{[@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary\&lt;/code&gt;2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}`&lt;/p&gt;
&lt;h3&gt;2. Enable User Synchronization&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;Invoke-MgGraphRequest&lt;/code&gt; command to enable user synchronization in the target tenant.&lt;/p&gt;
&lt;p&gt;If you encounter an &lt;code&gt;Request_MultipleObjectsWithSameKeyValue&lt;/code&gt; error, you might already have an existing policy. For more details, refer to Symptom - &lt;code&gt;Request_MultipleObjectsWithSameKeyValue&lt;/code&gt; error.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Verify User Synchronization Setting&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;/code&gt; command to confirm &lt;code&gt;IsSyncAllowed&lt;/code&gt; is set to True.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IsSyncAllowed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# In the target tenant, use the following command to automatically redeem invitations and suppress consent prompts for inbound access:
$AutomaticUserConsentSettings = @{
    &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $sourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4: Sign in to the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# Start an instance of PowerShell.
# Get the tenant ID of the source and target tenants and initialize variables.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PowerShell Scripts and Permissions&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Connect-MgGraph Command Usage&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;Connect-MgGraph&lt;/code&gt; command to sign in to the source tenant and consent to the following required permissions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;li&gt;AuditLog.Read.All&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;, &amp;quot;AuditLog.Read.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;h3&gt;PowerShell Script for Source Tenant&lt;/h3&gt;
&lt;p&gt;In the source tenant, use the &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner&lt;/code&gt; command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-MgPolicyCrossTenantAccessPolicyPartner -TenantId $SourceTenantId -Properties @{TargetTenantId = $TargetTenantId}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Error Handling:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you get the error &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists&lt;/code&gt;, you might already have an existing configuration. For more information, see &lt;code&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Tenant Access Policy Script Execution&lt;/h2&gt;
&lt;h3&gt;Commands and Outputs&lt;/h3&gt;
&lt;p&gt;Run PowerShell command with parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$Params = @{
    TenantId = $TargetTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output display structure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AutomaticUserConsentSettings :
    Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
    B2BCollaborationInbound :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
    B2BCollaborationOutbound :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
    B2BDirectConnectInbound :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
    B2BDirectConnectOutbound :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
    IdentitySynchronization :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity
    SyncPolicyPartner
    InboundTrust
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
    IsServiceProvider : 
    TenantId : &amp;lt;TargetTenantId&amp;gt;
    TenantRestrictions :
        Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
    AdditionalProperties :
        [{@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity},
         {crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]},
         {protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]}]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Redeem Invitations Command&lt;/h3&gt;
&lt;p&gt;Use this command to automatically redeem invitations and suppress consent prompts for outbound access:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Update-MgPolicyCrossTenantAccessPolicyPartner
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 6: Create a configuration application in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$AutomaticUserConsentSettings = @{
    &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, use the Invoke-MgInstantiateApplicationTemplate command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0def7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgServicePrincipal command to get the service principal ID and app role ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AccountEnabled: True
AddIns: {}
AlternativeNames: {}
AppDescription: 
AppDisplayName: Fabrikam
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Application Properties&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AppId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;AppId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppManagementPolicies&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;AppManagementPolicies&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppOwnerOrganizationId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;AppOwnerOrganizationId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppRoleAssignedTo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppRoleAssignmentRequired&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppRoleAssignments&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppRoles&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&amp;lt;AppRoleId&amp;gt;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ApplicationTemplateId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;518e5f48-1fc8-4c48-9387-9fddf2b80def&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClaimsMappingPolicies&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CreatedObjects&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CustomSecurityAttributes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttribute...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DelegatedPermissionClassifications&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisabledByMicrosoftStatus&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ErrorUrl&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FederatedIdentityCredentials&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HomeRealmDiscovery policies&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homepage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://account.activedirectory.windowsazure.com:444/applications/...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ServicePrincipalId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Info&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KeyCredentials&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LicenseDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h3&gt;PowerShell Script Initialization&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$ServicePrincipalId = &amp;quot;&amp;lt;ServicePrincipalId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$AppRoleId = &amp;quot;&amp;lt;AppRoleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 7: Test the connection to the target tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    &amp;quot;useSavedCredentials&amp;quot; = $false
    &amp;quot;templateId&amp;quot; = &amp;quot;Azure2Azure&amp;quot;
    &amp;quot;credentials&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        }
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
    )
}
Invoke-MgGraphRequest -Method POST -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 8: Create a provisioning job in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;In the source tenant, to enable provisioning, create a provisioning job.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# Determine the synchronization template to use, such as Azure2Azure.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: Save your credentials&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;# The PowerShell command to initiate provisioning job with pre-configured synchronization settings
New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output Information&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Id                           : &amp;lt;JobId&amp;gt;
Schedule                     :
Schema                       : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema
Status                       :
SynchronizationJobSettings   : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}
TemplateId                   : Azure2Azure
AdditionalProperties         : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(&amp;#39;ServicePrincipalId&amp;#39;)/synchronization/jobs/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Initialize job ID&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$JobId = &amp;quot;&amp;lt;JobId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 10: Assign a user to the configuration&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    &amp;quot;PrincipalId&amp;quot; = &amp;quot;&amp;lt;PrincipalId&amp;gt;&amp;quot;
    &amp;quot;ResourceId&amp;quot; = &amp;quot;&amp;lt;ServicePrincipalId&amp;gt;&amp;quot;
    &amp;quot;AppRoleId&amp;quot; = &amp;quot;&amp;lt;AppRoleId&amp;gt;&amp;quot;
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/&amp;lt;ServicePrincipalId&amp;gt;/appRoleAssignments&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New-MgServicePrincipalAppRoleAssignedTo Command&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AppRoleId&lt;/td&gt;
&lt;td&gt;&lt;AppRoleId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CreatedDateTime&lt;/td&gt;
&lt;td&gt;7/31/2023 10:27:12 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;Id&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalDisplayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalId&lt;/td&gt;
&lt;td&gt;&lt;PrincipalId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalType&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResourceDisplayName&lt;/td&gt;
&lt;td&gt;Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResourceId&lt;/td&gt;
&lt;td&gt;&lt;ServicePrincipalId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{ [[odata.context], [&lt;a href=&quot;https://graph.microsoft.com/v1.0/metadata#appRoleAssignments/$entity%5D%5D&quot;&gt;https://graph.microsoft.com/v1.0/metadata#appRoleAssignments/$entity]]&lt;/a&gt; }&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 11: Test Provision on Demand&lt;/h2&gt;
&lt;h3&gt;Source Tenant&lt;/h3&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;In the source tenant, use the Get-MgServicePrincipalSynchronizationJobSchema command to get the schema rule ID.
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$SynchronizationSchema = Get-MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
$SynchronizationSchema.SynchronizationRules | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ContainerFilter&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphContainerFilter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Editable Configuration Details&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Editable&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GroupFilter&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;RuleId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata&lt;/td&gt;
&lt;td&gt;{defaultSourceObjectMappings, supportsProvisionOnDemand}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;USER_INBOUND_USER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ObjectMappings&lt;/td&gt;
&lt;td&gt;{Provision Azure Active Directory Users, , , ...}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SourceDirectoryName&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TargetDirectoryName&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;PowerShell Commands&lt;/h2&gt;
&lt;h3&gt;Initialize a variable for the rule ID&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$RuleId = &amp;quot;RuleId&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Provision a User on Demand&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    Parameters = @(
        @{
            Subjects = @(
                @{
                    ObjectId = &amp;quot;UserObjectId&amp;quot;
                    ObjectTypeName = &amp;quot;User&amp;quot;
                }
            )
            RuleId = $RuleId
        }
    )
}
New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Command Output&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Key&lt;/td&gt;
&lt;td&gt;Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;[{&amp;quot;name&amp;quot;:&amp;quot;EntryImport&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Import&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;Success&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Retrieved User&amp;quot;}]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&amp;quot;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&amp;quot; from Azure Active Directory,&amp;quot;timestamp&amp;quot;: &amp;quot;2023-07-31T22:31:15.911659Z&amp;quot;, &amp;quot;details&amp;quot;:&lt;br&gt;{&amp;quot;objectId&amp;quot;:&lt;br&gt;  &lt;UserObjectId&gt;&amp;quot;, &amp;quot;accountEnabled&amp;quot;: &amp;quot;True&amp;quot;, &amp;quot;displayName&amp;quot;: &amp;quot;User1&amp;quot;, &amp;quot;mailNickname&amp;quot;: &amp;quot;user1&amp;quot;, &amp;quot;userPrincipalName&amp;quot;: &amp;quot;use&lt;br&gt;  AdditionalProperties : [{@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKeyStringValuePair%7D%5D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKeyStringValuePair}]&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Step 12: Start the provisioning job&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;1. Now that the provisioning job is configured, in the source tenant, use the Start-MgServicePrincipalSynchronizationJob command to start the provisioning job.

    Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;1. Now that the provisioning job is running, in the source tenant, use the Get-MgServicePrincipalSynchronizationJob command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;h3&gt;Get-MgServicePrincipalSynchronizationJob&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Id                          : &amp;lt;JobId&amp;gt;
Schedule                    : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule
Schema                      : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema
Status                      : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus
SynchronizationJobSettings  : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}
TemplateId                  : Azure2Azure
AdditionalProperties        : {{@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(&amp;#39;&amp;lt;ServicePrincipalId&amp;gt;&amp;#39;)/synchronization/jobs/&amp;lt;entityId&amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Monitoring Status of Provisioning&lt;/h3&gt;
&lt;h4&gt;Get-MgAuditLogProvisioning&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ActivityDateTime       : 7/31/2023 12:08:17 AM
ActivityDisplayName    : Export
AdditionalDetails      : {Details, ErrorCode, EventName, ipaddr...}
Category               : ProvisioningManagement
CorrelationId          : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
Id                     : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_LSBFV_161778479
InitiatedBy            : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1
LoggedByService        : Account Provisioning
OperationType          : Account Provisioning
Result                 : success
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Result Details&lt;/h2&gt;
&lt;h3&gt;Entry 1:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResultReason:&lt;/strong&gt; User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetResources:&lt;/strong&gt; {&lt;ServicePrincipalId&gt;, }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalProperties:&lt;/strong&gt; {}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Activity Details:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DateTime:&lt;/strong&gt; 7/31/2023 12:08:17 AM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DisplayName:&lt;/strong&gt; Export&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Details:&lt;/strong&gt; {Details, ErrorCode, EventName, ipaddr...}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; ProvisioningManagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CorrelationId:&lt;/strong&gt; cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id:&lt;/strong&gt; Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778264&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitiatedBy:&lt;/strong&gt; Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoggedByService:&lt;/strong&gt; Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OperationType:&lt;/strong&gt; Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; success&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Entry 2:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResultReason:&lt;/strong&gt; User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetResources:&lt;/strong&gt; {&lt;ServicePrincipalId&gt;, }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalProperties:&lt;/strong&gt; {}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Activity Details:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DateTime:&lt;/strong&gt; 7/31/2023 12:08:14 AM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DisplayName:&lt;/strong&gt; Synchronization rule action&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Details:&lt;/strong&gt; {Details, ErrorCode, EventName, ipaddr...}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; ProvisioningManagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CorrelationId:&lt;/strong&gt; cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id:&lt;/strong&gt; Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778395&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitiatedBy:&lt;/strong&gt; Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoggedByService:&lt;/strong&gt; Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OperationType:&lt;/strong&gt; Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; success&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ResultReason:&lt;/strong&gt; User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching user was found in Azure Active Directory (target tenant).)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use PowerShell for further analysis and troubleshooting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Symptom - Insufficient privileges error&lt;/h2&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/li&gt;
&lt;li&gt;When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/h2&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Symptom - Request_MultipleObjectsWithSameKeyValue error&lt;/h2&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invoke-MgGraphRequest: PUT
https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&amp;lt;SourceTenantId&amp;gt;/identitySynchronization
HTTP/1.1 409 Conflict
{
  &amp;quot;error&amp;quot;:{
    &amp;quot;code&amp;quot;:&amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;,
    &amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,
    &amp;quot;details&amp;quot;:[
      {
        &amp;quot;code&amp;quot;:&amp;quot;ConflictingObjects&amp;quot;,
        &amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one more of the specified property values is present in the directory.&amp;quot;
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;/code&gt; command to list the &lt;code&gt;IsSyncAllowed&lt;/code&gt; setting.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId.UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing policy, you might need to make an update using &lt;code&gt;Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;/code&gt; command to enable user synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra synchronization API overview&lt;/li&gt;
&lt;li&gt;Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h2&gt;
&lt;p&gt;Article • 01/18/2024&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h3&gt;Scoping filter use cases&lt;/h3&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Outbound provisioning from Microsoft Entra ID to SaaS applications.&lt;/strong&gt; When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory.&lt;/strong&gt; When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scoping filter construction&lt;/h2&gt;
&lt;p&gt;A scoping filter consists of one or more &lt;strong&gt;clauses&lt;/strong&gt;. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;h3&gt;Example of a scoping filter configuration:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart TD
    A([New York Engineering]) --&amp;gt;|city EQUALS New York| B((Department EQUALS Engineering))
    B --&amp;gt; C{employeeId extension RESEARCH MATCH}
    C --&amp;gt;|jobTitle IS NOT NULL| D[Provisioned]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They must be in New York.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Create scoping filters&lt;/h2&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for one of the supported applications and are adding a scoping filter to it.&lt;/p&gt;
&lt;h3&gt;Create a scoping filter&lt;/h3&gt;
&lt;h4&gt;Tip&lt;/h4&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; All applications.&lt;/li&gt;
&lt;li&gt;Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/li&gt;
&lt;li&gt;Select the Provisioning tab.&lt;/li&gt;
&lt;li&gt;In the Mappings section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/li&gt;
&lt;li&gt;Select the Source object scope menu.&lt;/li&gt;
&lt;li&gt;Select Add scoping filter.&lt;/li&gt;
&lt;li&gt;Define a clause by selecting a source Attribute Name, an Operator, and an Attribute Value to match against. The following operators are supported:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!&amp;amp;&lt;/code&gt; Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Criteria for Scope Filter Application&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;They must work in the Engineering department.&lt;/li&gt;
&lt;li&gt;Their company employee ID must be between 1,000,000 and 2,000,000.&lt;/li&gt;
&lt;li&gt;Their job title must not be null or empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;C. ENDS_WITH&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;h3&gt;D. EQUALS&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;h3&gt;E. Greater_Than&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;h3&gt;F. Greater_Than_OR_EQUALS&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;h3&gt;G. Includes&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described here.&lt;/p&gt;
&lt;h3&gt;H. IS_FALSE&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;h3&gt;I. IS_NOT_NULL&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;h3&gt;J. IS_NULL&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;h3&gt;K. IS_TRUE&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;h3&gt;L. NOT_EQUALS&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;h3&gt;M. NOT_REGEX_MATCH&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;h3&gt;N. REGEX_MATCH&lt;/h3&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: &lt;code&gt;([1-9][0-9])&lt;/code&gt; matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;h3&gt;Important&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The IsMemberOf filter is not supported currently.&lt;/li&gt;
&lt;li&gt;The members attribute on a group is not supported currently.&lt;/li&gt;
&lt;li&gt;Filtering is not supported for multi-valued attributes.&lt;/li&gt;
&lt;li&gt;Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Steps for Configuring Scoping Filters&lt;/h2&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;&lt;p&gt;Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;strong&gt;Scoping Filter Title&lt;/strong&gt;, add a name for your scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select OK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select OK again on the &lt;strong&gt;Scoping Filters&lt;/strong&gt; screen. Optionally, repeat steps 6-11 to add another scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save on the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; screen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Important Note&lt;/h3&gt;
&lt;p&gt;Saving a new scoping filter triggers a new full sync for the application, where all users in the source system are evaluated again against the new scoping filter. If a user in the application was previously in scope for provisioning, but falls out of scope, their account is disabled or deprovisioned in the application. To override this default behavior, refer to &lt;a href=&quot;#&quot;&gt;Skip deletion for user accounts that go out of scope&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Common Scoping Filters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.*@domain.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All users with &lt;code&gt;userPrincipalName&lt;/code&gt; that have the domain &lt;code&gt;@domain.com&lt;/code&gt; are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.*@domain.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All users with &lt;code&gt;userPrincipalName&lt;/code&gt; that has the domain &lt;code&gt;@domain.com&lt;/code&gt; are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sales&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;([1-9][0-9][0-9][0-9][0-9][0-9])-([0-9][0-9][0-9][0-9])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All employees with &lt;code&gt;workerID&lt;/code&gt; between 100000 and 200000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Related articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate user provisioning and deprovisioning to SaaS applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;User Provisioning Guide&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Customize attribute mappings for user provisioning&lt;/li&gt;
&lt;li&gt;Write expressions for attribute mappings&lt;/li&gt;
&lt;li&gt;Account provisioning notifications&lt;/li&gt;
&lt;li&gt;Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;List of tutorials on how to integrate SaaS apps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article • 10/23/2023&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h3&gt;Configure accidental deletion prevention&lt;/h3&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a &lt;strong&gt;Application Administrator&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Browse to &lt;strong&gt;Identity &amp;gt; Applications &amp;gt; Enterprise applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt; and then on the provisioning page select &lt;strong&gt;Edit provisioning&lt;/strong&gt;.&lt;ol&gt;
&lt;li&gt;Under &lt;strong&gt;Settings&lt;/strong&gt;, select the &lt;strong&gt;Prevent accidental deletions&lt;/strong&gt; check box and specify a deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the &lt;strong&gt;Notification Email&lt;/strong&gt; address is completed. If the deletion threshold is met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Save&lt;/strong&gt; to save the changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. To learn more about quarantine behavior, see &lt;a href=&quot;#&quot;&gt;Application provisioning in quarantine status&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Recovering from an accidental deletion&lt;/h3&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says &lt;strong&gt;Provisioning has been quarantined&lt;/strong&gt;. See &lt;a href=&quot;#&quot;&gt;quarantine details for more information&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Allowing deletions&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Allow deletes&lt;/strong&gt; action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Allow deletes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Yes&lt;/strong&gt; on the confirmation to allow the deletions.&lt;/li&gt;
&lt;li&gt;View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Rejecting deletions&lt;/h2&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/li&gt;
&lt;li&gt;Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/li&gt;
&lt;li&gt;Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test deletion prevention&lt;/h2&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example, 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h2&gt;Common deprovisioning scenarios to test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Delete a user / put them into the recycle bin.&lt;/li&gt;
&lt;li&gt;Block sign in for a user.&lt;/li&gt;
&lt;li&gt;Unassign a user or group from the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;What scenarios count toward the deletion threshold?&lt;/h3&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h3&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h3&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the “circuit breaker” isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h3&gt;How are these deletion events logged?&lt;/h3&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven’t due to the deletion threshold. Navigation to Provisioning logs and then filter Action with StagedAction or StagedDelete.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How application provisioning works&lt;/li&gt;
&lt;li&gt;Plan an application provisioning deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful?&lt;br&gt;&lt;a href=&quot;&quot;&gt;Yes&lt;/a&gt; &lt;a href=&quot;&quot;&gt;No&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Provide Product Feedback&lt;/h2&gt;
&lt;p&gt;Visit &lt;em&gt;Microsoft Q&amp;amp;A&lt;/em&gt; for support and to give feedback.&lt;/p&gt;
&lt;h2&gt;On-demand provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article • 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshoot configuration issues quickly.&lt;/li&gt;
&lt;li&gt;Validate expressions that you&amp;#39;ve defined.&lt;/li&gt;
&lt;li&gt;Test scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to use on-demand provisioning&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;br&gt;Steps in this article may vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a href=&quot;https://portal.microsoft.com&quot;&gt;Microsoft Entra admin center&lt;/a&gt; as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning.&lt;/li&gt;
&lt;li&gt;Configure provisioning by providing your admin credentials.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision on demand&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;br&gt;For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &amp;quot;WorkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in Workday. For SuccessFactors scenario, please provide &amp;quot;personIdExternal&amp;quot; of the user in SuccessFactors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Provision&lt;/strong&gt; at the bottom of the page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Understand the provisioning steps&lt;/h2&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h3&gt;Step 1: Test connection&lt;/h3&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h4&gt;Troubleshooting tips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the &lt;a href=&quot;link&quot;&gt;tutorial list&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the matching attributes defined in the Attribute mappings pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/li&gt;
&lt;li&gt;For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds appropriately.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 2: Import user&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluate whether the user is in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Check the target system for an existing user.&lt;/li&gt;
&lt;li&gt;Determine what user attributes to export to the target system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;ul&gt;
&lt;li&gt;Update the user object with a value for the matching attribute.&lt;/li&gt;
&lt;li&gt;Change the matching attribute in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/li&gt;
&lt;li&gt;Make sure that the Attribute mapping page of your provisioning configuration contains the attribute that you expect.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Determine if user is in scope&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the user is assigned to the application.&lt;/li&gt;
&lt;li&gt;Whether scope is set to Sync assigned or Sync all.&lt;/li&gt;
&lt;li&gt;The scoping filters defined in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;h2&gt;View details&lt;/h2&gt;
&lt;p&gt;The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Active in source system&lt;/strong&gt; indicates that the user has the property &lt;code&gt;IsActive&lt;/code&gt; set to true in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assigned to application&lt;/strong&gt; indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope sync all&lt;/strong&gt; indicates that the scope setting allows all users and groups in the tenant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User has required role&lt;/strong&gt; indicates that the user has the necessary roles to be provisioned into the application.&lt;/li&gt;
&lt;li&gt;Scoping filters are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/li&gt;
&lt;li&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 4: Match user between source and target&lt;/h2&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If no users are matched in the target system, no properties are shown.&lt;/li&gt;
&lt;li&gt;If one user matches in the target system, the properties of that user are shown.&lt;/li&gt;
&lt;li&gt;If multiple users match, the properties of both users are shown.&lt;/li&gt;
&lt;li&gt;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensure all matching attributes are accurately configured.&lt;/li&gt;
&lt;li&gt;Verify that attribute mappings are correctly set up to prevent mismatches.&lt;/li&gt;
&lt;li&gt;Regularly update the attribute mappings to reflect any changes in the source or target systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 5: Perform action&lt;/h2&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Screenshot description: Provision on demand window in a browser showing a group&amp;#39;s details after an action has been taken. Includes elements like operation status, user list and their respective statuses among other details.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;View details&lt;/h2&gt;
&lt;p&gt;The View details section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Failures for exporting changes can vary greatly. Check the documentation for provisioning logs for common failures.&lt;/li&gt;
&lt;li&gt;On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;Do you need to turn provisioning off to use on-demand provisioning?&lt;/h3&gt;
&lt;p&gt;For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on-demand provisioning for all applications without having to stop provisioning jobs.&lt;/p&gt;
&lt;h3&gt;How long does on-demand provisioning take?&lt;/h3&gt;
&lt;p&gt;On-demand provisioning typically takes less than 30 seconds.&lt;/p&gt;
&lt;h2&gt;Known Limitations&lt;/h2&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your suggestions and feedback so we can better determine what improvements to make next.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;
The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/li&gt;
&lt;li&gt;On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/li&gt;
&lt;li&gt;Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/li&gt;
&lt;li&gt;On-demand provisioning of roles isn&amp;#39;t supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/li&gt;
&lt;li&gt;On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/li&gt;
&lt;li&gt;The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshooting provisioning&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;&quot;&gt;Yes&lt;/a&gt; &lt;a href=&quot;&quot;&gt;No&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;&quot;&gt;Provide product feedback&lt;/a&gt; | &lt;a href=&quot;&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What are the Microsoft Entra user provisioning logs?&lt;/h2&gt;
&lt;p&gt;Article • 01/25/2024&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sign-ins&lt;/strong&gt; - Information about sign-ins and how your resources are used by your users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit&lt;/strong&gt; - Information about changes applied to your tenant such as users and group management or updates applied to your tenant’s resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h2&gt;License and role requirements&lt;/h2&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the Zero Trust guidance.&lt;/p&gt;
&lt;h3&gt;Log / Report&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader&lt;br&gt;Security Reader&lt;br&gt;Security Administrator&lt;br&gt;Global Reader&lt;br&gt;A custom role with AuditLogsRead or CustomSecAuditLogsRead permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader&lt;br&gt;Security Reader&lt;br&gt;Security Administrator&lt;br&gt;Global Reader&lt;br&gt;A custom role with SignInLogsRead permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus&lt;br&gt;Security Operator&lt;br&gt;Application Administrator&lt;br&gt;Cloud App Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Log / Report Access&lt;/h2&gt;
&lt;h3&gt;Roles and Licenses&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Log / Report&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Roles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Licenses&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A custom role with &lt;code&gt;ProvisioningLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;Security Reader&lt;br&gt;Reports Reader&lt;br&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection*&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;br&gt;Security Operator&lt;br&gt;Security Reader&lt;br&gt;Global Reader&lt;br&gt;A custom role with &lt;code&gt;IdentityRiskEventReadWrite&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID Free&lt;br&gt;Microsoft 365 Apps&lt;br&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph activity logs&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;br&gt;A custom role with &lt;code&gt;ListKeys&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the &lt;a href=&quot;#&quot;&gt;license requirements for Identity Protection&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What can you do with the provisioning logs?&lt;/h2&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What groups were successfully created in ServiceNow?&lt;/li&gt;
&lt;li&gt;What users were successfully removed from Adobe?&lt;/li&gt;
&lt;li&gt;What users from Workday were successfully created in Active Directory?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What do the logs show?&lt;/h2&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steps:&lt;/strong&gt; This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Object Synchronization Steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Import the object.&lt;/li&gt;
&lt;li&gt;Match the object between source and target.&lt;/li&gt;
&lt;li&gt;Determine if the object is in scope.&lt;/li&gt;
&lt;li&gt;Evaluate the object before synchronization.&lt;/li&gt;
&lt;li&gt;Provision the object (create, update, delete, or disable).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;Provides an overview of what happened and identifiers for the object in the source and target systems.&lt;/p&gt;
&lt;h3&gt;Troubleshooting &amp;amp; Recommendations&lt;/h3&gt;
&lt;p&gt;If there was an error, this tab provides the error code and reason.&lt;/p&gt;
&lt;h3&gt;Modified Properties&lt;/h3&gt;
&lt;p&gt;If there were changes, this tab shows the old value and the new value.&lt;/p&gt;
&lt;h3&gt;Example of Provisioning User in Box&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;EntryExportAdd&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Result&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;User &amp;#39;&lt;a href=&quot;mailto:cheryl@f12.info&quot;&gt;cheryl@f12.info&lt;/a&gt;&amp;#39; was created in Box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReportableIdentifier&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;mailto:cheryl@f12.info&quot;&gt;cheryl@f12.info&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Map directory extensions in cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article · 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. Custom security attributes are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Create directory extensions&lt;/h3&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see Syncing extension attributes for Microsoft Entra Application Provisioning.&lt;/p&gt;
&lt;h3&gt;Map directory extensions&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Select Configurations and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select Provisioning and expand the Mappings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabrikam to Contoso | Provisioning&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Manage&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users and groups&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mappings&lt;ul&gt;
&lt;li&gt;Allow data flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Name: Provision Microsoft Entra ID Users
Enabled: Yes
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Activity&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting + Support&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Settings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provisioning Status: On / Off&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Instructions&lt;/h3&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select &lt;code&gt;Provision Microsoft Entra ID Users&lt;/code&gt; to open the Attribute Mapping page.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scroll to the bottom of the page and select &lt;code&gt;Add new mapping&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Attribute&lt;/th&gt;
&lt;th&gt;Mapping&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;preferredlanguage&lt;/td&gt;
&lt;td&gt;preferredlanguage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showinAddressList&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;strong&gt;In the Source attribute drop-down list, select a source attribute.&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;If a directory extension exists in the source tenant, select the directory extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Edit Attribute&lt;/h2&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mapping Type:&lt;/strong&gt; &lt;em&gt;Direct&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Attribute:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;employeeHireDate&lt;/li&gt;
&lt;li&gt;employeeId&lt;/li&gt;
&lt;li&gt;employeeLeaveDateTime&lt;/li&gt;
&lt;li&gt;employeeOrgData.costCenter&lt;/li&gt;
&lt;li&gt;employeeOrgData.division&lt;/li&gt;
&lt;li&gt;employeeType&lt;/li&gt;
&lt;li&gt;testExtension (extension_c44d2dc1add4fd32f924e8de5c3937_testExtension)&lt;/li&gt;
&lt;li&gt;extensionAttribute1&lt;/li&gt;
&lt;li&gt;extensionAttribute10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;In the &lt;strong&gt;Target attribute&lt;/strong&gt; drop-down list, select a target attribute.&lt;/li&gt;
&lt;li&gt;If you created a directory extension in the target tenant, select the directory extension.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Ok&lt;/strong&gt; to save the mapping.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Manually add directory extensions to the attribute list&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Source tenant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your directory extension wasn&amp;#39;t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Configuring Microsoft Entra Identity Synchronization&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Visit the Microsoft Entra admin page:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate through the following path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;strong&gt;Provisioning&lt;/strong&gt; and click on the &lt;strong&gt;Mappings&lt;/strong&gt; section to expand it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the bottom of the page, select the &lt;strong&gt;Show advanced settings&lt;/strong&gt; checkbox.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;| Source Attribute  | Target Attribute  | Action   |
|-------------------|-------------------|----------|
| userPrincipalName | userPrincipalName | Delete   |
| true              | showinAddresslist | Delete   |
| mail              | mail              | Delete   |
| Member            | userType          | Delete   |
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Additional Information&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supported Attributes&lt;/strong&gt;: Edit and view the list of attributes for Microsoft Entra ID and for Azure Active Directory (target tenant) using the expression builder.&lt;/li&gt;
&lt;li&gt;You can review, download, and edit the JSON representation of your schema here.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Tip&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Ensure you&amp;#39;re signed into Microsoft Entra admin center to access the &lt;strong&gt;Edit attribute list&lt;/strong&gt; links.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;If a directory extension was created in the source tenant, select the &lt;strong&gt;Edit attribute list for Microsoft Entra ID&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If an extension was established in the target tenant, access the &lt;strong&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proceed to add the directory extension and select the required options.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Edit Attribute List&lt;/h2&gt;
&lt;h3&gt;Steps:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt;: Click the save button to keep your changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discard&lt;/strong&gt;: Click the discard button to ignore any changes made.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Tips:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Editing the attribute list informs the provisioning service what attributes exist in your system(s).&lt;/li&gt;
&lt;li&gt;Leave &amp;quot;Metadata&amp;quot; blank for new attributes unless instructed by documentation. Requires a JSON-encoded object.&lt;/li&gt;
&lt;li&gt;Leave &amp;quot;Reference Object Attribute&amp;quot; blank unless the &amp;quot;Type&amp;quot; is set to &amp;quot;Reference&amp;quot;. Enter referenced attribute in the form of &lt;code&gt;objectName.attributeName&lt;/code&gt; or just &lt;code&gt;objectName&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;See the online documentation on attribute editing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Procedure:&lt;/h3&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Refresh the browser.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Attribute mappings&lt;/strong&gt; page and attempt to map the directory extension as described earlier in this article.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Manually add directory extensions by editing the schema&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema via the schema editor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a href=&quot;#&quot;&gt;Microsoft Entra admin center&lt;/a&gt; of the source tenant.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then choose your configuration.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step-by-Step Configuration Guide&lt;/h2&gt;
&lt;h3&gt;6. Enable Advanced Settings&lt;/h3&gt;
&lt;p&gt;Scroll to the bottom of the screen and select the &lt;strong&gt;Show advanced settings&lt;/strong&gt; checkbox under the Attribute Mapping section. This will enable you to access and configure more complex settings.&lt;/p&gt;
&lt;h4&gt;Attribute Mapping Table:&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Mapped Attribute&lt;/th&gt;
&lt;th&gt;Options&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;7. Schema Review and Editing&lt;/h3&gt;
&lt;p&gt;Select the &lt;strong&gt;Review your schema here&lt;/strong&gt; link to open the Schema editor page for advanced configuration. This page allows you to adjust and define the synchronization rules and object mappings through a JSON formatted schema.&lt;/p&gt;
&lt;h4&gt;JSON Schema Example:&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;@odata.context&amp;quot;: &amp;quot;https://graph.microsoft.com/beta/$metadata#servicePrincipals&amp;quot;,
  &amp;quot;id&amp;quot;: &amp;quot;Azure2...&amp;quot;,
  &amp;quot;version&amp;quot;: &amp;quot;v1.2&amp;quot;,
  &amp;quot;synchronizationRules&amp;quot;: [
    {
      &amp;quot;containerFilter&amp;quot;: null,
      &amp;quot;editable&amp;quot;: true,
      &amp;quot;id&amp;quot;: &amp;quot;f0f8ff81-9e60-4ed3-b8df-09bbb40d2b7e&amp;quot;,
      &amp;quot;name&amp;quot;: &amp;quot;USER_INBOUND_USER&amp;quot;,
      &amp;quot;priority&amp;quot;: 1,
      &amp;quot;sourceDirectoryName&amp;quot;: &amp;quot;Microsoft Entra ID&amp;quot;,
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8. Schema Backup&lt;/h3&gt;
&lt;p&gt;Download an original copy of the schema as a backup to ensure you have a recoverable point in case changes need to be rolled back.&lt;/p&gt;
&lt;h3&gt;9. Modify the Schema&lt;/h3&gt;
&lt;p&gt;Modify the schema following the specific configurations required for your setup. This step involves changing values or adding new attributes and rules within the JSON structure provided.&lt;/p&gt;
&lt;h3&gt;10. Save Your Changes&lt;/h3&gt;
&lt;p&gt;After finalizing changes in the schema editor, select &lt;strong&gt;Save&lt;/strong&gt; to apply all changes made to the attribute mappings and synchronization rules.&lt;/p&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article • 01/26/2024&lt;/p&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h3&gt;Syntax overview&lt;/h3&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: &lt;code&gt;FunctionName(&amp;lt;argument 1&amp;gt;, &amp;lt;argument N&amp;gt;)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can nest functions within each other. For example:
&lt;code&gt;FunctionOne(FunctionTwo(&amp;lt;argument1&amp;gt;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can pass three different types of arguments into functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example:
&lt;code&gt;[attributeName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example:
&lt;code&gt;&amp;quot;United States&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: &lt;code&gt;FunctionOne(&amp;lt;argument1&amp;gt;), FunctionTwo(&amp;lt;argument2&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For string constants, if you need a backslash (&lt;code&gt;\&lt;/code&gt;) or quotation mark (&lt;code&gt;&amp;quot;&lt;/code&gt;) in the string, it must be escaped with the backslash (&lt;code&gt;\&lt;/code&gt;) symbol. For example: &lt;code&gt;&amp;quot;Company name: \&amp;quot;Contoso\&amp;quot;&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;List of Functions&lt;/h3&gt;
&lt;p&gt;[Insert detailed function list and descriptions here, formatted appropriately]&lt;/p&gt;
&lt;h2&gt;Append&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;Append(source, suffix)&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Append constant suffix to user name&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Append([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AppRoleAssignmentsComplex&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;AppRoleAssignmentsComplex([appRoleAssignments])&lt;/p&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;Used to configure multiple roles for a user. For detailed usage, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;appRoleAssignments&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;appRoleAssignments object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;BitAnd&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;BitAnd(value1, value2)&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/li&gt;
&lt;li&gt;1 - if both of the corresponding bits are 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;BitAnd(8#F, 8#F7)&lt;/p&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;CBool(Expression)&lt;/p&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: &lt;code&gt;CBool&lt;/code&gt; returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then &lt;code&gt;CBool&lt;/code&gt; returns &lt;code&gt;True&lt;/code&gt;, else it returns &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;CBool([attribute1] = [attribute2])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;h2&gt;CDate&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: &lt;code&gt;CDate(expression)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as &lt;code&gt;FormatDateTime&lt;/code&gt; and &lt;code&gt;DateAdd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Remarks&lt;/strong&gt;: The returned string is always in UTC and follows the format &lt;code&gt;M/d/yyyy h:mm:ss tt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt;: &lt;code&gt;CDate([StatusHireDate])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;3/16/2020 7:00:00 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 2&lt;/h2&gt;
&lt;p&gt;CDate(&amp;quot;2021-06-30+08:00&amp;quot;)&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; &amp;quot;2021-06-30+08:00&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3&lt;/h2&gt;
&lt;p&gt;CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coalesce&lt;/h2&gt;
&lt;h3&gt;Function: Coalesce(source1, source2, ..., defaultValue)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when all source values are NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Flow&lt;/h3&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;h2&gt;Expression: Coalesce&lt;/h2&gt;
&lt;p&gt;Example: You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;h3&gt;Expression&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Coalesce([mail],[userPrincipalName])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample Input/Output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): NULL&lt;/li&gt;
&lt;li&gt;INPUT (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ConvertToBase64&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToBase64(source)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The ConvertToBase64 function converts a string to a Unicode base64 string.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABlAGwAbABvACAAcwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h2&gt;ConvertToUTF8Hex&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToUTF8Hex(source)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Example: ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)&lt;/h2&gt;
&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h2&gt;Count&lt;/h2&gt;
&lt;h3&gt;Function: Count(attribute)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Count function returns the number of elements in a multi-valued attribute.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that will have elements counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;CStr&lt;/h2&gt;
&lt;h3&gt;Function: CStr(value)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The CStr function converts a value to a string data type.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example: CStr([dn])&lt;/h3&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;h2&gt;DateAdd&lt;/h2&gt;
&lt;h2&gt;Function:&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;DateAdd(interval, value, dateTime)&lt;/code&gt;&lt;/h3&gt;
&lt;h2&gt;Description:&lt;/h2&gt;
&lt;p&gt;Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below this table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTime&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use CDate function to wrap the datetime string. To get system time in UTC, use the Now function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example:&lt;/h2&gt;
&lt;h3&gt;Generate a date value based on incoming StatusHireDate from Workday&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Example Modifications using Date Functions&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;dateTime (value of variable StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Add 7 days to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012 7:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a date ten days prior to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012 7:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two weeks to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;ww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012 7:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add ten months to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013 7:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two years to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014 7:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;DateDiff Function Documentation&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;DateDiff(interval, date1, date2)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;This function uses the &lt;code&gt;interval&lt;/code&gt; parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a positive number if date2 &amp;gt; date1,&lt;/li&gt;
&lt;li&gt;a negative number if date2 &amp;lt; date1,&lt;/li&gt;
&lt;li&gt;0 if date2 == date1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Note: When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expandable detailed values in documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Date and Time Unit Descriptions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 1: Compare current date with hire date from Workday with different intervals&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Table of Differences in Date Intervals&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Positive difference in days between dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative difference in days between dates&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in weeks between two dates&lt;/td&gt;
&lt;td&gt;ww&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in months between two dates&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in years between two dates&lt;/td&gt;
&lt;td&gt;yyyy&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference when both dates are same&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in hours between two dates&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in minutes between two dates&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in seconds between two dates&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Example 2: Combine DateDiff with IIF function to set attribute value&lt;/h2&gt;
&lt;p&gt;If an account is Active in Workday, set the &lt;code&gt;accountEnabled&lt;/code&gt; attribute of the user to True only if hire date is within the next five days.&lt;/p&gt;
&lt;h2&gt;DateFromNum&lt;/h2&gt;
&lt;h3&gt;Function: DateFromNum(value)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The DateFromNum function converts a value in AD&amp;#39;s date format to a DateTime type.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;AD Date to be converted to DateTime type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;DateFromNum([LastLogonTimestamp])&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DateFromNum(129699324000000000)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns a DateTime representing January 1, 2012 at 11:00PM.&lt;/p&gt;
&lt;h2&gt;FormatDateTime&lt;/h2&gt;
&lt;h3&gt;Function: FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Takes a date string from one format and converts it into a different format.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTimeStyles&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;inputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Expected format of the source value. For supported formats, see &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings&quot;&gt;.NET custom date and time format strings&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Format of the output date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Output date as a string in a certain format&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FormatDateTime([extensionAttribute1], &amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: &amp;quot;2015-01-23&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Guid&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Guid()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The function Guid generates a new random GUID&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Guid()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sample output:&lt;/strong&gt; &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;h3&gt;IgnoreFlowIfNullOrEmpty&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; IgnoreFlowIfNullOrEmpty(expression)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example 1: Don&amp;#39;t flow an attribute if it is null&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;IgnoreFlowIfNullorEmpty([department])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;h3&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s say the SuccessFactors attribute prefix is mapped to the on-premises Active Directory attribute personalTitle using the following expression mapping:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IgnoreFlowIfNullorEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr.&amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The above expression first evaluates the Switch function. If the prefix attribute doesn&amp;#39;t have any of the values listed within the Switch function, then Switch will return an empty string and the attribute personalTitle will not be included in the provisioning flow to on-premises Active Directory.&lt;/p&gt;
&lt;h2&gt;IIF&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; IIF(condition,valueIfTrue,valueIfFalse)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valueIfTrue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Function Definitions and Comparison Operators&lt;/h2&gt;
&lt;h3&gt;valueIfFalse&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;valueIfFalse&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to false, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Comparison operators for condition:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Equal to (=) and not equal to (&amp;lt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)&lt;/li&gt;
&lt;li&gt;Less than (&amp;lt;) and less than equal to (&amp;lt;=)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute. IIF([country]=&amp;quot;USA&amp;quot;, [country], [department])
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Known Limitations&lt;/h2&gt;
&lt;h3&gt;Issues and Workarounds&lt;/h3&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For more on troubleshooting user creation issues, see related documentation on handling null or empty values.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The IIF function does not support AND and OR logical operators directly. For AND logic, use nested IIF statements:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot; AND [state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;)
IIF([country]=&amp;quot;USA&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;), &amp;quot;False&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To achieve OR logic, similar nesting can be applied:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot; OR [state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;)
IIF([country]=&amp;quot;USA&amp;quot;, &amp;quot;True&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the source attribute in the IIF function is empty or null, the function fails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unsupported IIF expressions: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;IIF([country]=&amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;, [country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF([IsNullorEmpty([country])], &amp;quot;Other&amp;quot;, [country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF([IsPresent([country])], [country], &amp;quot;Other&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recommended solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the Switch function to check for null or empty values and set defaults:&lt;pre&gt;&lt;code&gt;Switch([country], [country], &amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Function: InStr(value1, value2, start, compareType)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The InStr function finds the first occurrence of a substring in a string&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compareType&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;InStr(&amp;quot;The quick brown fox&amp;quot;,&amp;quot;quick&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluates to 5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;InStr(&amp;quot;repeated&amp;quot;, &amp;quot;e&amp;quot;, 3, vbBinaryCompare)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluates to 7&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Function: IsNull(Expression)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;IsNull([displayName])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Function: IsNullOrEmpty&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;IsNullOrEmpty([email])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns True if the email field is either null or an empty string.&lt;/p&gt;
&lt;h2&gt;Function: IsNullOrEmpty&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;IsNullOrEmpty([displayName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h2&gt;Function: IsPresent&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Switch(IsPresent([directManager]),[directManager], IsPresent([skipleveManager]),[skipleveManager], IsPresent([director]),[director])&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Function: IsString&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;If the expression can be evaluated to a string type, then the IsString function evaluates to True.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Expression&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Required&lt;/strong&gt;: Yes&lt;br&gt;&lt;strong&gt;Type&lt;/strong&gt;: Expression&lt;br&gt;&lt;strong&gt;Notes&lt;/strong&gt;: Expression to be evaluated&lt;/p&gt;
&lt;h2&gt;Item&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Item(attribute, index)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Item function returns one item from a multi-valued string/attribute.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;Item([proxyAddresses], 1)&lt;/code&gt; returns the first item in the multi-valued attribute.
Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h2&gt;Join&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Join(separator, source1, source2, ...)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Join() is similar to Append(), except that it can combine multiple source string values into a single string, and each value will be separated by a separator string. If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &amp;quot;&amp;quot; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Left&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;Left(String, NumChars)&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The Left function returns a specified number of characters from the left of a string. If NumChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in numChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;The string to return characters from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumChars&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;A number identifying the number of characters to return from the beginning (left) of string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Mid&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;Mid(source, start, length)&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;Expandable details not directly provided
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;NormalizeDiacritics&lt;/h2&gt;
&lt;h3&gt;Function: NormalizeDiacritics(source)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;
Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters into legal values for various user identifiers.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Diacritic Conversion Table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized Character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized Character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;á, à, â, ã, å, ā, ă, ą, ä, ã&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Á, À, Â, Ã, Å, Ā, Ă, Ą, Ä, Ã&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, ä&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Ä&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, ć, č, ĉ, ç&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, Ć, Č, Ĉ, Ç&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;đ, ď, đ&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Đ, Ď, Đ&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;é, è, ê, ē, ĕ, ė, ë, ē, ė, ë&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;É, È, Ê, Ē, Ĕ, Ė, Ë, Ē, Ė, Ë&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Character Diacritic Normalization Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ğ, ğ, ğ&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ğ, Ğ, Ğ&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ì, í, î, ï, ĩ, ĭ, į, i̇, i̇&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Ì, Í, Î, Ï, Ĩ, Ĭ, Į, İ, İ&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ĺ, ļ, ľ, ł&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Ĺ, Ļ, Ľ, Ł&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ń, ņ, ň, ǹ&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ń, Ņ, Ň, Ǹ&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ò, ó, ô, ö, õ, ő, ơ, o̊, ő, ó̌, ò̌, ǒ, ǫ&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;Ò, Ó, Ô, Ö, Õ, Ő, Ơ, O̊, Ő, Ó̌, Ò̌, Ǒ, Ǫ&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;œ, ö, œ&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Œ, Ö, Œ&lt;/td&gt;
&lt;td&gt;OE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ŕ, ŗ, ř&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ŕ, Ŗ, Ř&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;ss&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ś, ŝ, š, ş, s̩&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Ś, Ŝ, Š, Ş, S̩&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ţ, ť, ŧ&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ţ, Ť, Ŧ&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ù, ú, û, ü, ũ, ű, ů, ų, ut̄, út̄, ùt̄, ǔ, ų&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Ù, Ú, Û, Ü, Ũ, Ű, Ů, Ų, Ut̄, Út̄, Ùt̄, Ǔ, Ų&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ý, ÿ, ŷ, ỳ, ỹ, y̌&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Ý, Ÿ, Ŷ, Ỳ, Ỹ, Y̌&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ź, ż, ž, z̧&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;Ź, Ż, Ž, Z̧&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remove Diacritics from a String&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NormalizeDiacritics([givenName])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (givenName):&lt;/strong&gt; &amp;quot;Zoë&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;Zoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Not Function&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Not(source)&lt;/p&gt;
&lt;h2&gt;Description: Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/h2&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Boolean String&lt;/td&gt;
&lt;td&gt;Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Now&lt;/h2&gt;
&lt;h3&gt;Function: Now()&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Now()&lt;br&gt;Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;h2&gt;NumFromDate&lt;/h2&gt;
&lt;h3&gt;Function: NumFromDate(value)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 format. If the date variable is in a different format, use FormatDateTime function to convert the date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;h2&gt;Workday Example&lt;/h2&gt;
&lt;p&gt;Assuming you want to map the attribute &lt;strong&gt;ContractEndDate&lt;/strong&gt; from Workday, which is in the format &lt;code&gt;2020-12-31-08:00&lt;/code&gt; to &lt;strong&gt;accountExpires&lt;/strong&gt; field in AD, here&amp;#39;s how you can use this function and change the timezone offset to match your locale:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], &amp;quot;yyyy-MM-ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot;:23:59:59-08:00&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SuccessFactors Example&lt;/h2&gt;
&lt;p&gt;Assuming you want to map the attribute &lt;strong&gt;endDate&lt;/strong&gt; from SuccessFactors, which is in the format &lt;code&gt;M/d/yyyy hh:mm:ss tt&lt;/code&gt; to &lt;strong&gt;accountExpires&lt;/strong&gt; field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([endDate], &amp;quot;M/d/yyyy hh:mm:ss tt&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot;:23:59:59-08:00&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PCase Function&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;PCase&lt;/code&gt; function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify a set of characters used as word separators (example: &amp;quot;-&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remarks&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If the &lt;code&gt;wordSeparators&lt;/code&gt; parameter isn&amp;#39;t specified, then &lt;code&gt;PCase&lt;/code&gt; internally invokes the .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; to convert the &lt;code&gt;source&lt;/code&gt; string to proper case. &lt;/li&gt;
&lt;li&gt;The .NET &lt;code&gt;ToTitleCase&lt;/code&gt; supports a comprehensive set of the Unicode character categories as word separators.&lt;ul&gt;
&lt;li&gt;Space character&lt;/li&gt;
&lt;li&gt;New line character&lt;/li&gt;
&lt;li&gt;Control characters like CRLF&lt;/li&gt;
&lt;li&gt;Format control characters&lt;/li&gt;
&lt;li&gt;Connector/Punctuation characters like underscore&lt;/li&gt;
&lt;li&gt;Dash/Punctuation characters like dash and hyphen (including characters such as En Dash, Em Dash, double hyphen, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RandomString&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)&lt;/p&gt;
&lt;h2&gt;Character Types&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenPunctuation and ClosePunctuation&lt;/strong&gt; characters that occur in pairs like parenthesis, curly bracket, angle bracket, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitialQuotePunctuation and FinalQuotePunctuation&lt;/strong&gt; characters like single quotes, double quotes and angular quotes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OtherPunctuation&lt;/strong&gt; characters like exclamation mark, number sign, percent sign, ampersand, asterisk, comma, full stop, colon, semi-colon, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MathSymbol&lt;/strong&gt; characters like plus sign, less-than and greater-than sign, vertical line, tilde, equals sign, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CurrencySymbol&lt;/strong&gt; characters like dollar sign, cent sign, pound sign, euro sign, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ModifierSymbol&lt;/strong&gt; characters like macron, accents, arrow heads, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OtherSymbol&lt;/strong&gt; characters like copyright sign, degree sign, registered sign, etc.&lt;/li&gt;
&lt;li&gt;If the &lt;strong&gt;wordSeparators&lt;/strong&gt; parameter is specified, then PCase only uses the characters specified as word separators.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes &lt;code&gt;firstName&lt;/code&gt; and &lt;code&gt;lastName&lt;/code&gt; from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PCase([firstName])&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;PABLO GONSALVES (SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo Gonsalves (Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase([lastName], &amp;#39; .&amp;#39;)&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;PINTO-DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;The PCase function uses characters in the wordSeparators parameter to identify words and transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCase(Join(&amp;#39; &amp;#39;, [firstName], [lastName]))&lt;/td&gt;
&lt;td&gt;firstName = GREGORY, lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory James&amp;quot;&lt;/td&gt;
&lt;td&gt;You can nest the Join function within PCase. As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified &lt;a href=&quot;#&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example 1:&lt;/h3&gt;
&lt;p&gt;Generate a random string without special character restrictions:
&lt;code&gt;RandomString(6, 3, 0, 0, 3)&lt;/code&gt; Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/p&gt;
&lt;h3&gt;Example 2:&lt;/h3&gt;
&lt;p&gt;Generate a random string with special character restrictions:
&lt;code&gt;RandomString(10, 2, 2, 2, 1, &amp;quot;?.&amp;quot;)&lt;/code&gt; Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/p&gt;
&lt;h2&gt;Redact&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;Redact()&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Redact function replaces the attribute value with the string literal &amp;quot;[Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;p&gt;(Paint text table similar as above with parameter details)&lt;/p&gt;
&lt;h2&gt;Redact Function&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute/value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Examples:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Redact an attribute: &lt;code&gt;Redact([userPrincipalName])&lt;/code&gt; Removes the userPrincipalName from the provisioning logs.&lt;/li&gt;
&lt;li&gt;Redact a string: &lt;code&gt;Redact(&amp;quot;StringToBeRedacted&amp;quot;)&lt;/code&gt; Removes a constant string from the provisioning logs.&lt;/li&gt;
&lt;li&gt;Redact a random string: &lt;code&gt;Redact(RandomString(6,3,0,0,3))&lt;/code&gt; Removes the random string from the provisioning logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RemoveDuplicates Function&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RemoveDuplicates([proxyAddresses])&lt;/code&gt; Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Replace Function&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source string where replacements are to be made&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to find in the source string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Pattern to match in the source string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Part of the matched pattern to replace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to replace in the source string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Attribute name for the replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Template for forming the replacement string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Functionality Overview&lt;/h2&gt;
&lt;h3&gt;Replacement Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When oldValue and replacementValue are provided:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of oldValue in the source with replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When oldValue and template are provided:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of the oldValue in the template with the source value&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When regexPattern and replacementValue are provided:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;The function applies the regexPattern to the source string and you can use the regex group names to construct the string for replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Regex Group Functionality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When regexPattern, regexGroupName, replacementValue are provided:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;The function applies the regexPattern to the source string and replaces all values matching regexGroupName with replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When regexPattern, regexGroupName, replacementAttributeName are provided:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;If source has a value, source is returned&lt;/li&gt;
&lt;li&gt;If source has no value, the function applies the regexPattern to the replacementAttributeName and returns the value matching regexGroupName&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Important Note&lt;/h3&gt;
&lt;p&gt;To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.&lt;/p&gt;
&lt;h3&gt;Parameters Table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in source or template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in source. When replacementAttributeName is used, the regexPattern is applied to extract a value from replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside regexPattern. When named replacementAttributeName is used, we&amp;#39;ll extract the value of the named regex group from the&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Attribute Details&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;New value to replace old one with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the attribute to be used for replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;When template value is provided, we&amp;#39;ll look for oldValue inside the template and replace it with source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace characters using a regular expression&lt;/h2&gt;
&lt;h3&gt;Example 1: Basic Replacement&lt;/h3&gt;
&lt;p&gt;Using oldValue and replacementValue to replace the entire source string with another string.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;[BusinessTitle]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;oldValue&lt;/strong&gt;: &amp;quot;Product Developer&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &amp;quot;Software Engineer&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: Software Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 2: Using Templates&lt;/h3&gt;
&lt;p&gt;Using oldValue and template to insert the source string into another templated string.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;[UserID]&lt;/code&gt; = &amp;quot;jsmith&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;template&lt;/strong&gt;: &lt;code&gt;&amp;lt;username&amp;gt;@contoso.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: Using the UserID value, the result is &lt;code&gt;jsmith@contoso.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3: Regex Pattern and Replacement Value&lt;/h2&gt;
&lt;p&gt;Using regexPattern and replacementValue to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/p&gt;
&lt;h3&gt;Scenario&lt;/h3&gt;
&lt;p&gt;You have a source attribute &lt;code&gt;telephoneNumber&lt;/code&gt; that includes &lt;code&gt;country code&lt;/code&gt; and &lt;code&gt;phone number&lt;/code&gt; separated by a space character. For instance, +91 9998887777. &lt;/p&gt;
&lt;p&gt;To extract the 10 digit phone number, you can use the following expression in your attribute mapping:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([[telephoneNumber]], &amp;quot;^\+(\d{2})\s(\d{10})&amp;quot;, &amp;quot;${phoneNumber}&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;telephoneNumber&lt;/code&gt; = &amp;quot;+91 9998887777&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;^\+(\d{2})\s(\d{10})&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;${phoneNumber}&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;9998887777&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also use this pattern to remove characters and condense a string. For example, the next expression removes parentheses, dashes, and space characters from the mobile number string and returns only digits:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([mobile], &amp;quot;[()\\s-]+&amp;quot;, &amp;quot;&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;mobile&lt;/code&gt; = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;[()\\s-]+&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; (empty string)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;19998887777&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 4: Regex Pattern, Regex Group Name, and Replacement Value&lt;/h2&gt;
&lt;p&gt;You can use regexPattern, regexGroupName, and replacementValue to extract a specific portion of the source string and replace it with another literal value or empty string.&lt;/p&gt;
&lt;h3&gt;Scenario&lt;/h3&gt;
&lt;p&gt;Your source system has an attribute &lt;code&gt;AddressLineData&lt;/code&gt; with street number and name. For a recent move, only the street number of the address changed. To update only the street number part of the address:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([AddressLineData], &amp;quot;(?&amp;lt;=^)(\d+)(?=\s.*)&amp;quot;, &amp;quot;888&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;AddressLineData&lt;/code&gt; = &amp;quot;545 Tremont Street&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;(?&amp;lt;=^)(\d+)(?=\s.*)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;888&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;ul&gt;
&lt;li&gt;&amp;quot;888 Tremont Street&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Regular Expressions and Attribute Replacement Examples&lt;/h2&gt;
&lt;h3&gt;Example 4: Street Number Replacement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;streetNumber=&amp;quot;123&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;code&gt;&amp;quot;(?&amp;lt;=streetNumber^)\d+&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexGroupName&lt;/strong&gt;: &lt;code&gt;&amp;quot;streetNumber&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &lt;code&gt;&amp;quot;888&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;code&gt;888 Tremont Street&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 5: Domain Suffix Removal&lt;/h3&gt;
&lt;p&gt;Removes the domain suffix from a UPN to generate login ID without domain suffix.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;[userPrincipalName] = &amp;quot;jsmith@contoso.com&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;code&gt;&amp;quot;(?&amp;lt;=\@.*)&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexGroupName&lt;/strong&gt;: &lt;code&gt;&amp;quot;Suffix&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue&lt;/strong&gt;: &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; (empty string)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;code&gt;jsmith&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 6: Handling Empty Telephone Numbers&lt;/h3&gt;
&lt;p&gt;Uses regex to extract exact 10 digits of the mobile number attribute when the source attribute is empty.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;[telephoneNumber] = &amp;quot;&amp;quot;&lt;/code&gt; (empty string)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern&lt;/strong&gt;: &lt;code&gt;&amp;quot;\+(\d{2})(\d{10})&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexGroupName&lt;/strong&gt;: &lt;code&gt;&amp;quot;phoneNumber&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementAttributeName&lt;/strong&gt;: &lt;code&gt;[mobile] = &amp;quot;+91 8887779999&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;code&gt;8887779999&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 7: Removing Certain Characters&lt;/h3&gt;
&lt;p&gt;Targets and removes specific characters from a string value using regex.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source&lt;/strong&gt;: &lt;code&gt;[mailNickname] = &amp;quot;john_doe72&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;oldValue&lt;/strong&gt;: &lt;code&gt;&amp;quot;[\-a-zA-Z]+,&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replaceValue&lt;/strong&gt;: &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output&lt;/strong&gt;: &lt;code&gt;72&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SelectUniqueValue&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ...)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This function must be at the top-level and cannot be nested.&lt;/li&gt;
&lt;li&gt;This function cannot be applied to attributes that have a matching precedence.&lt;/li&gt;
&lt;li&gt;This function is only meant to be used for entry creations. When using it with an attribute, set the Apply Mapping property to Only during object creation.&lt;/li&gt;
&lt;li&gt;This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/li&gt;
&lt;li&gt;The LDAP search that &lt;code&gt;SelectUniqueValue&lt;/code&gt; function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jessica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the &lt;code&gt;NormalizeDiacritics&lt;/code&gt; function as shown in the example below to normalize special characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1…&lt;/td&gt;
&lt;td&gt;At least 2 are required, no upper bound&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/h3&gt;
&lt;p&gt;Example: Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;h4&gt;Expression:&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ad-attr-mapping-expr&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Select Unique Value Function&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;SelectUniqueValue(
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, 
    [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, 
    Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, 
    Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; doesn&amp;#39;t already exist in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; already exists in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in the directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SingleAppRoleAssignment&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SingleAppRoleAssignment({appRoleAssignments})&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;appRoleAssignments object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Split&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Split(source, delimiter)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Split a String into a Multi-Valued Array&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiter&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Split(extensionAttribute5, &amp;quot;,&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;StripSpaces&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;StripSpaces(source)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Switch&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;Switch(source, defaultValue, key1, value1, key2, value2, ...)&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: &lt;code&gt;Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, the source attribute statusFlag may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;h3&gt;Caution&lt;/h3&gt;
&lt;p&gt;For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. Example: &lt;code&gt;Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, if the source attribute statusFlag is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when source doesn&amp;#39;t match any keys. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace a value based on predefined set of options&lt;/h2&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression&lt;/strong&gt;: &lt;code&gt;Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (state): &amp;quot;QLD&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Australia/Brisbane&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ToLower&lt;/h2&gt;
&lt;h3&gt;Function: ToLower(source, culture)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Takes a &lt;code&gt;source&lt;/code&gt; string value and converts it to lower case using the culture rules that are specified. If there is no &lt;code&gt;culture&lt;/code&gt; info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, &lt;a href=&quot;https://example.com&quot;&gt;update the schema for your target application&lt;/a&gt; and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is &lt;code&gt;languagecode2-country/regioncode2&lt;/code&gt;, where &lt;code&gt;languagecode2&lt;/code&gt; is the two-letter language code and &lt;code&gt;country/regioncode2&lt;/code&gt; is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/h2&gt;
&lt;h2&gt;Example: Generating UPN Value&lt;/h2&gt;
&lt;p&gt;You would like to generate the UPN value by concatenating the PreferredFirstName and PreferredLastName source fields and converting all characters to lower case.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample Input/Output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (PreferredFirstName):&lt;/strong&gt; &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT (PreferredLastName):&lt;/strong&gt; &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ToUpper&lt;/h2&gt;
&lt;h3&gt;Function: ToUpper(source, culture)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn’t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Function: Word(String,WordNumber,Delimiters)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Word(&amp;quot;The quick brown fox&amp;quot;,3, &amp;quot; &amp;quot;)&lt;br&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;Word(&amp;quot;This,string!has&amp;amp;many separators&amp;quot;,3,&amp;quot; !&amp;amp;#&amp;quot;)&lt;br&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h4&gt;Strip known domain name&lt;/h4&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;p&gt;Expression: Replace([mail], &amp;quot;@contoso.com&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)&lt;/p&gt;
&lt;h2&gt;Sample Input / Output&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;john.doe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate User Alias by Concatenating Parts of First and Last Name&lt;/h2&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;JohDoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Add a Comma Between Last Name and First Name&lt;/h2&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Join(&amp;quot;, &amp;quot;, [surname], [givenName])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Doe, John&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate an ID for a User Based on Their Microsoft Entra ID Object ID&lt;/h2&gt;
&lt;p&gt;Remove any letters from the ID and add 1000 at the beginning.&lt;/p&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectId]), &amp;quot;[a-zA-Z]*&amp;quot;, &amp;quot;&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;OUTPUT:&lt;/h2&gt;
&lt;p&gt;&amp;quot;10006430356534376231233393039234343561262613565263613630636263065346234&amp;quot;&lt;/p&gt;
&lt;h2&gt;Related Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/li&gt;
&lt;li&gt;Customizing Attribute Mappings for User Provisioning&lt;/li&gt;
&lt;li&gt;Scoping Filters for User Provisioning&lt;/li&gt;
&lt;li&gt;Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;Account Provisioning Notifications&lt;/li&gt;
&lt;li&gt;List of Tutorials on How to Integrate SaaS Apps&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>mtoGPT4Omni</title><link>https://www.elumenotion.com/journal/mtogpt4omni/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtogpt4omni/</guid><pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Multitenant organizations documentation&lt;/h2&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h3&gt;About multitenant organizations&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organization capabilities&lt;/li&gt;
&lt;li&gt;Compare multitenant capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure a multitenant organization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;What is a multitenant organization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365 admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure cross-tenant synchronization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Collaborate in Microsoft 365&lt;/h2&gt;
&lt;h3&gt;CONCEPT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Identity provisioning for Microsoft 365&lt;/li&gt;
&lt;li&gt;Microsoft 365 multitenant people search&lt;/li&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article • 04/23/2024&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;What is a tenant?&lt;/h3&gt;
&lt;p&gt;A &lt;em&gt;tenant&lt;/em&gt; is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h3&gt;What is a multitenant organization?&lt;/h3&gt;
&lt;p&gt;A &lt;em&gt;multitenant organization&lt;/em&gt; is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conglomerates&lt;/strong&gt;: Organizations with multiple subsidiaries or business units that operate independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant challenges&lt;/h2&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    A(Tenant) --&amp;gt;|x| B(Primary tenant)
    B --&amp;gt;|x| C(Tenant)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;h2&gt;B2B direct connect&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use Microsoft Entra B2B direct connect. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![Diagram showing B2B direct connect with Teams Connect shared channels.]&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://www.microsoft.com&quot;&gt;B2B direct connect overview&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;B2B collaboration&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use &lt;a href=&quot;https://www.microsoft.com&quot;&gt;Microsoft Entra B2B collaboration&lt;/a&gt;. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;p&gt;Here are the primary constraints with using B2B collaboration across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrators must invite users using the B2B invitation process or build an onboarding experience using the &lt;a href=&quot;https://www.microsoft.com&quot;&gt;B2B collaboration invitation manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Administrators might have to synchronize users using custom scripts.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![Diagram showing B2B collaboration with Microsoft apps and Non-Microsoft apps.]&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use &lt;a href=&quot;#&quot;&gt;cross-tenant synchronization&lt;/a&gt;. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits with using cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the primary constraints with using cross-tenant synchronization across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;li&gt;Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Diagram&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Microsoft apps] --&amp;gt; B(B2B collab users&amp;lt;br&amp;gt;(External members)&amp;lt;br&amp;gt;Target tenant);
    A --&amp;gt; C[Non-Microsoft apps];
    B --&amp;gt; D[B2B collab users&amp;lt;br&amp;gt;(External members)&amp;lt;br&amp;gt;Source tenant];
    C --&amp;gt; D;
    style A fill:#ff9e00,color:#fff,stroke-width:2px;
    style B fill:#0078d4,color:#fff,stroke-width:2px;
    style C fill:#00bcf2,color:#fff,stroke-width:2px;
    style D fill:#ff2d2d,color:#fff,stroke-width:2px;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Multitenant organization&lt;/h2&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;li&gt;Improved collaborative experience in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Improved people search experience across tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Image not found: diagram.jpg --&gt;
&lt;!-- ![Diagram of multitenant organization showing cross-tenant access settings between owner tenant (C) and member tenants (A) and (B)](diagram.jpg) --&gt;

&lt;p&gt;For more information, see What is a multitenant organization in Microsoft Entra ID?.&lt;/p&gt;
&lt;h2&gt;Compare multitenant capabilities&lt;/h2&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature. For more information about different external identity scenarios, see Comparing External Identities feature sets.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;B2B direct connect&lt;/td&gt;
&lt;td&gt;Direct connect external users for real-time collaboration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B collaboration&lt;/td&gt;
&lt;td&gt;Invite external users, who sign in with either their organization’s identity or an external account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;Automatically synchronize users across different tenants in your organization for collaboration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multitenant organization&lt;/td&gt;
&lt;td&gt;Form a tenant group within your organization to simplify cross-tenant access and synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Purpose&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Users can access Teams Connect shared channels hosted in external tenants.&lt;/td&gt;
&lt;td&gt;Users can access apps/resources hosted in external tenants, usually with limited guest privileges. Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant.&lt;/td&gt;
&lt;td&gt;Users can seamlessly access apps/resources across the same organization, even if they’re hosted in different tenants.&lt;/td&gt;
&lt;td&gt;Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Value&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Enables external collaboration within Teams Connect shared channels only. More convenient for administrators because they don’t have to manage B2B users.&lt;/td&gt;
&lt;td&gt;Enables external collaboration. More control and monitoring for administrators by managing the B2B collaboration users. Administrators can limit the access that these external users have to their apps/resources.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators don’t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/td&gt;
&lt;td&gt;Enables collaboration across organizational tenants. Administrators continue to have full configuration ability via cross-tenant access settings. Optional cross-tenant access templates allow pre-configuration of cross-tenant access settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Primary administrator workflow&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Configure cross-tenant access to provide external users inbound access to tenant the credentials for their home tenant.&lt;/td&gt;
&lt;td&gt;Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration&lt;/td&gt;
&lt;td&gt;Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Create a multitenant organization, add (invite) tenants, join a multitenant organization. Leverage existing B2B collaboration users or use cross-tenant synchronization to [Med]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Trust level&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/td&gt;
&lt;td&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;td&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Effect on users&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;B2B collaboration (Org-to-org external or internal)&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization (Org internal)&lt;/th&gt;
&lt;th&gt;Multitenant organization (Org internal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/td&gt;
&lt;td&gt;External users are added to a tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/td&gt;
&lt;td&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;User type&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;B2B direct connect user - N/A&lt;/th&gt;
&lt;th&gt;B2B collaboration user&lt;/th&gt;
&lt;th&gt;B2B collaboration user&lt;/th&gt;
&lt;th&gt;B2B collaboration user&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External member&lt;/td&gt;
&lt;td&gt;- External member (default)&lt;/td&gt;
&lt;td&gt;- External member (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- External guest (default)&lt;/td&gt;
&lt;td&gt;- External guest&lt;/td&gt;
&lt;td&gt;- External guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following diagram shows how B2B direct connect, B2B collaboration, and cross-tenant synchronization capabilities could be used together.&lt;/p&gt;
&lt;h2&gt;Terminology&lt;/h2&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, you can refer back to the following list of terms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but that hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Term Definition&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don&amp;#39;t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;What is cross-tenant synchronization?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article • 04/24/2024&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Why use multitenant organization?&lt;/h2&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define a group of tenants belonging to your organization&lt;/li&gt;
&lt;li&gt;Collaborate across your tenants in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Who should use it?&lt;/h2&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for &lt;a href=&quot;https://example.com&quot;&gt;external identities&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.&lt;/p&gt;
&lt;h2&gt;Improved collaborative experience in Microsoft Teams&lt;/h2&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations and Microsoft Teams: Advantages of the new architecture.&lt;/p&gt;
&lt;h2&gt;Improved people search experience across tenants&lt;/h2&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards. For more information, see Microsoft 365 multitenant organization people search.&lt;/p&gt;
&lt;h2&gt;How does a multitenant organization work?&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define a multitenant organization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Join a multitenant organization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leave a multitenant organization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A multitenant organization is established as a collaboration of equals. Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant access partner configurations&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant access identity synchronization&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and crossTenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization example&lt;/h2&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization.&lt;/p&gt;
&lt;!-- Image not found: multitenant_organization_diagram.png --&gt;
&lt;!-- ![Multitenant Organizational Diagram](multitenant_organization_diagram.png) --&gt;

&lt;h2&gt;Tenant&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Templates for cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Tenant role and state&lt;/h2&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;h3&gt;Tenant role&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Tenant state&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant state&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator’s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user’s view of a multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Constraints&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any given tenant can only create or join a single multitenant organization.&lt;/li&gt;
&lt;li&gt;Any multitenant organization must have at least one active owner tenant.&lt;/li&gt;
&lt;li&gt;Each active tenant must have cross-tenant access settings for all active tenants.&lt;/li&gt;
&lt;li&gt;Any active tenant may leave a multitenant organization by removing themselves from it.&lt;/li&gt;
&lt;li&gt;A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limits&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;External user segmentation&lt;/h2&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External members originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External guests originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External members originating from outside of your organization&lt;/li&gt;
&lt;li&gt;External guests originating from outside of your organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h2&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h3&gt;Step 1: Plan your deployment&lt;/h3&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://docs.microsoft.com/&quot;&gt;Plan for multitenant organizations in Microsoft 365&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Step 2: Create your multitenant organization&lt;/h2&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/li&gt;
&lt;li&gt;Owner tenant adds one or more joiner tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/li&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;h2&gt;Step 4: Synchronize users&lt;/h2&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;li&gt;Your alternative bulk provisioning engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. &lt;/p&gt;
&lt;p&gt;Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 01/03/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cross-tenant synchronization&lt;/strong&gt; automates creating, updating, and deleting &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/external-identities/what-is-b2b&quot;&gt;Microsoft Entra B2B collaboration&lt;/a&gt; users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seamless collaboration for a multitenant organization&lt;/li&gt;
&lt;li&gt;Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/li&gt;
&lt;li&gt;Automatically remove B2B accounts when a user leaves the organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBc&quot;&gt;Video on cross-tenant synchronization&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Why use cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as &lt;a href=&quot;https://www.servicenow.com/&quot;&gt;ServiceNow&lt;/a&gt;, &lt;a href=&quot;https://www.adobe.com/&quot;&gt;Adobe&lt;/a&gt;, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/&quot;&gt;Microsoft Entra Conditional Access&lt;/a&gt; and &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-access-settings&quot;&gt;cross-tenant access settings&lt;/a&gt;, and can be governed through features such as &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/governance/entitlement-management-overview&quot;&gt;Microsoft Entra entitlement management&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;h2&gt;Who should use?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams and Microsoft 365&lt;/h2&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the &lt;code&gt;member&lt;/code&gt; userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.&lt;/p&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Microsoft Entra provisioning engine.&lt;/li&gt;
&lt;li&gt;Is a push process from the source tenant, not a pull process from the target tenant.&lt;/li&gt;
&lt;li&gt;Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/li&gt;
&lt;li&gt;Users in scope for synchronization are configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Attribute mapping is configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Extension attributes are supported.&lt;/li&gt;
&lt;li&gt;Target tenant administrators can stop a synchronization at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Cross-tenant synchronization setting&lt;/h3&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a check box with the name &lt;strong&gt;Allow users sync into this tenant&lt;/strong&gt; that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.&lt;/p&gt;
&lt;h2&gt;Inbound access settings - Contoso&lt;/h2&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allow users sync into this tenant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Save&lt;/em&gt; &lt;em&gt;Discard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the &lt;a href=&quot;https://docs.microsoft.com/en-us/graph/api/crosstenantidentitysyncpolicypartner-update&quot;&gt;Update crossTenantIdentitySyncPolicyPartner&lt;/a&gt; API. For more information, see &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-synchronization&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Automatic redemption setting&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a check box with the following name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Automatically redeem invitations with the tenant fc19f62b-c752-43d3-a13a-c75e9a85a7dc.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Save&lt;/em&gt; &lt;em&gt;Discard&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Compare setting for different scenarios&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When users are created in a target tenant using cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;When users are added to a resource tenant using B2B collaboration.&lt;/li&gt;
&lt;li&gt;When users access resources in a resource tenant using B2B direct connect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see &lt;a href=&quot;https://learn.microsoft.com/consent-experience&quot;&gt;Consent experience for applications in Microsoft Entra ID&lt;/a&gt;. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h3&gt;When is consent prompt suppressed?&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    A[Source tenant] --&amp;gt;|Outbound access settings\n Automatically redeem invitations| B[Target tenant]
    B --&amp;gt;|Inbound access settings\n Automatically redeem invitations| B 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;h2&gt;Home/source tenant | Resource/target tenant | Consent prompt behavior for source tenant users&lt;/h2&gt;
&lt;p&gt;|---|---|---|
| Outbound | Inbound | Suppressed |
| ✔️ | ❌ | Not suppressed |
| ❌ | ✔️ | Not suppressed |
| ❌ | ❌ | Not suppressed |
| Inbound | Outbound | Not suppressed |
| ✔️ | ✔️ | Not suppressed |
| ✔️ | ❌ | Not suppressed |
| ❌ | ✔️ | Not suppressed |
| ❌ | ❌ | Not suppressed |&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the &lt;a href=&quot;https://learn.microsoft.com/graph/api/resources/cross-tenant-access-policy-configuration-partner?view=graph-rest-1.0&quot;&gt;Update crossTenantAccessPolicyConfigurationPartner&lt;/a&gt; API. For more information, see &lt;a href=&quot;https://learn.microsoft.com/entra/identity/secure-enterprise-cross-tenant-access&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;How do users know what tenants they belong to?&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their &lt;a href=&quot;https://myaccount.microsoft.com/organizations&quot;&gt;My Account&lt;/a&gt; page and select &lt;em&gt;Organizations&lt;/em&gt;. In the Microsoft Entra admin center, users can open their &lt;a href=&quot;https://entra.microsoft.com&quot;&gt;Portal settings&lt;/a&gt;, view their &lt;em&gt;Directories + subscriptions&lt;/em&gt;, and switch directories.&lt;/p&gt;
&lt;p&gt;For more information, including privacy information, see &lt;a href=&quot;https://learn.microsoft.com/azure/active-directory/b2b/leave-the-organization&quot;&gt;Leave an organization as an external user&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Step 1: Define how to structure the tenants in your organization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Cross-tenant topologies](image.png) --&gt;

&lt;h2&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/h2&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Target tenant settings](image.png) --&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target tenant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Inbound access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[x] Allow users sync into this tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[x] Automatically redeem invitations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/h2&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which users you want to synchronize&lt;/li&gt;
&lt;li&gt;What attributes you want to include&lt;/li&gt;
&lt;li&gt;Any transformations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured, your tenants are now set up for cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;In the source tenant: Using this feature requires Microsoft Entra ID P1 licenses. Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;In the target tenant: Cross-tenant sync relies on the Microsoft Entra External ID billing model. To understand the external identities licensing model, see MAU billing model for Microsoft Entra External ID. You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/p&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3&gt;Clouds&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Which clouds can cross-tenant synchronization be used in?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/li&gt;
&lt;li&gt;Synchronization is only supported between two tenants in the same cloud.&lt;/li&gt;
&lt;li&gt;Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Existing B2B users&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Will cross-tenant synchronization manage existing B2B users?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Synchronization frequency&lt;/h2&gt;
&lt;h3&gt;How often does cross-tenant synchronization run?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The sync interval is currently fixed to start at 40-minute intervals. Sync duration varies based on the number of in-scope users. The initial sync cycle is likely to take significantly longer than the following incremental sync cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;h3&gt;How do I control what is synchronized into the target tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, you can control which users are provisioned with the configuration or attribute-based filters. You can also control what attributes on the user object are synchronized.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;If a user is removed from the scope of sync in a source tenant, will cross-tenant synchronization soft delete them in the target?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant synchronization will soft delete them in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Object types&lt;/h2&gt;
&lt;h3&gt;What object types can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra users can be synchronized between tenants. (Groups, devices, and contacts aren&amp;#39;t currently supported.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What user types can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t be synchronized from source tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users can be synchronized to target tenants as external members (default) or external guests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For more information about the UserType definitions, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have existing B2B collaboration users. What will happen to them?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Attributes&lt;/h2&gt;
&lt;p&gt;What user attributes can be synchronized?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including (but not limited to) displayName, userPrincipalName, and directory extension attributes.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;ul&gt;
&lt;li&gt;For cross-tenant synchronization configurations created before January 2024 with the default schema / attribute mappings:&lt;ul&gt;
&lt;li&gt;The manager attribute will automatically be added to the mappings.&lt;/li&gt;
&lt;li&gt;This does not trigger an initial sync cycle.&lt;/li&gt;
&lt;li&gt;Manager updates will apply on the incremental cycle for users that are undergoing changes (e.g. manager change). The sync engine doesn’t automatically update all existing users that were provisioned previously.&lt;/li&gt;
&lt;li&gt;To update the manager for existing users that are in scope for provisioning, you can use on-demand provisioning for specific users or do a restart to provision the manager for all users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For cross-tenant synchronization configurations created before January 2024 with a custom schema / attribute mappings (e.g. you added an attribute to the mappings or changed the default mappings):&lt;ul&gt;
&lt;li&gt;You need to manually add the manager attribute to your attribute mappings. This will trigger a restart and update all users that are in scope for provisioning. This should be a direct mapping of the manager attribute in the source tenant to the manager in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If the manager of a user is removed in the source tenant and no new manager is assigned in the source tenant, the manager attribute will not be updated in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What attributes can&amp;#39;t be synchronized?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attributes including (but not limited to) photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can I control where user attributes are sourced/managed?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority. The user and its attributes are deemed authoritative at the source tenant. There are parallel sources of authority workstreams that will evolve source of authority controls for users down to the attribute level and a user object at the source may ultimately reflect multiple underlying sources. For the tenant-to-tenant process, this is still treated as the source tenant&amp;#39;s values being authoritative for the sync process (even if pieces actually originate elsewhere) into the target tenant. Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization only supports source of authority at the object level. That means all attributes of a user must come from the same source, including credentials. It isn&amp;#39;t possible to reverse the source of authority or federation direction of a synchronized object.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What happens if attributes for a synced user are changed in the target tenant?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no changes are made to the synced user in the source tenant, then user attribute changes made in the target tenant will persist. However, if changes are made to the user in the source tenant, then during the next synchronization cycle, the user in the target tenant will be updated to match the user in the source tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can the target tenant manually block sign-in for a specific home/source tenant user that is synced?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If no changes are made to the synced user in the source tenant, then the block sign-in setting in the target tenant will persist. If a change is detected for the user in the source tenant, cross-tenant synchronization will re-enable that user blocked from sign-in in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Structure&lt;/h2&gt;
&lt;h3&gt;Can I sync a mesh between multiple tenants?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is configured as a single-direction peer-to-peer sync, meaning sync is configured between one source and one target tenant. Multiple instances of cross-tenant synchronization can be configured to sync from a single&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For privacy reasons, cross-tenant synchronization is intended for use within an organization. We recommend using entitlement management for inviting B2B collaboration users across organizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. In addition, tenant migrations would require migrating user data such as SharePoint and OneDrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B collaboration&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Since cross-tenant synchronization is built on existing B2B collaboration technology, existing limitations apply. Examples include (but aren&amp;#39;t limited to):&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see &lt;a href=&quot;https://learn.microsoft.com/power-bi/shared-with-me-publish-to-web&quot;&gt;Distribute Power BI content to external guest users with Microsoft Entra B2B&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;B2B direct connect&lt;/h2&gt;
&lt;p&gt;How does cross-tenant synchronization relate to &lt;a href=&quot;https://learn.microsoft.com/b2b-direct-connect&quot;&gt;B2B direct connect&lt;/a&gt;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;B2B direct connect is the underlying identity technology required for &lt;a href=&quot;#link&quot;&gt;Teams Connect shared channels&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/li&gt;
&lt;li&gt;B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft 365&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yes, but you must set the value for the &lt;strong&gt;showInAddressList&lt;/strong&gt; attribute of synchronized users to &lt;strong&gt;True&lt;/strong&gt;, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a &lt;a href=&quot;#link&quot;&gt;mesh peer-to-peer topology&lt;/a&gt;. For more information, see &lt;a href=&quot;#link&quot;&gt;Step 9: Review attribute mappings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Integration&lt;/h2&gt;
&lt;h3&gt;What federation options are supported for users in the target tenant back to the source tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For each internal user in the source tenant, cross-tenant synchronization creates a federated external user (commonly used in B2B) in the target. It supports syncing internal users. This includes internal users federated to other identity systems using domain federation (such as Active Directory Federation Services). It doesn&amp;#39;t support syncing external users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Does cross-tenant synchronization use System for Cross-Domain Identity Management (SCIM)?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For more information, see SCIM synchronization with Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deprovisioning&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization support deprovisioning users?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Yes, when the below actions occur in the source tenant, the user will be soft deleted in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delete the user in the source tenant&lt;/li&gt;
&lt;li&gt;Unassign the user from the cross-tenant synchronization configuration&lt;/li&gt;
&lt;li&gt;Remove the user from a group that is assigned to the cross-tenant synchronization configuration&lt;/li&gt;
&lt;li&gt;An attribute on the user changes such that they do not meet the scoping filter conditions defined on the cross-tenant synchronization configuration anymore&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the user is blocked from sign-in in the source tenant (accountEnabled = false) they will be blocked from sign-in in the target. This is not a deletion, but an update to the accountEnabled property.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a user to a group and assign it to the cross-tenant synchronization configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Update the account enabled status to false on the user in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle. The account enabled status is changed to false in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Does cross-tenant synchronization support restoring users?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If the user in the source tenant is restored, reassigned to the app, meets the scoping condition again within 30 days of soft deletion, it will be restored in the target tenant.&lt;/li&gt;
&lt;li&gt;IT admins can also manually restore the user directly in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unassign all users and / or groups from the cross-tenant synchronization configuration. This will trigger all the users that were unassigned, either directly or through group membership, to be deprovisioned in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to Sync all users and groups, you will also need to change it to Sync only assigned users and groups. The users will be automatically soft deleted by cross-tenant synchronization. The users will be automatically hard deleted after 30 days or you can choose to hard delete the users directly from the target tenant. You can choose to hard delete the users directly in the target tenant or wait 30 days for the users to be automatically hard deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;If the sync relationship is severed, are external users previously managed by cross-tenant synchronization deleted in the target tenant?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No. No changes are made to the external users previously managed by cross-tenant synchronization if the relationship is severed (for example, if the cross-tenant synchronization policy is deleted).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Topologies for cross-tenant synchronization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization identity provisioning for Microsoft 365&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 04/24/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h2&gt;Microsoft 365 people search&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Teams external access&lt;/a&gt; and &lt;a href=&quot;#&quot;&gt;Teams shared channels&lt;/a&gt; excluded, &lt;a href=&quot;#&quot;&gt;Microsoft 365 people search&lt;/a&gt; is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h2&gt;New Microsoft Teams&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;#&quot;&gt;new Microsoft Teams&lt;/a&gt; experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members. For more information, see &lt;a href=&quot;#&quot;&gt;Announcing more seamless collaboration in Microsoft Teams for multitenant organizations&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Collaborating user set&lt;/h2&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;h2&gt;Sharing your users&lt;/h2&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization them outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator A contributes or shares Annie&lt;/li&gt;
&lt;li&gt;Administrator B contributes or shares Bob and Barbara&lt;/li&gt;
&lt;li&gt;Administrator C contributes or shares Charles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B member users&lt;/h2&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User synchronization method&lt;/th&gt;
&lt;th&gt;Default userType property&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Member Remains Guest, if the B2B identity already existed as Guest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see &lt;a href=&quot;https://link&quot;&gt;Compare member and guest default permissions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To change the userType from Guest to Member (or vice versa), a source tenant administrator can amend the &lt;a href=&quot;https://link&quot;&gt;attribute mappings&lt;/a&gt;, or a target tenant administrator can &lt;a href=&quot;https://link&quot;&gt;change the userType&lt;/a&gt; if the property is not recurringly synchronized.&lt;/p&gt;
&lt;h2&gt;Unsharing your users&lt;/h2&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see &lt;a href=&quot;https://link&quot;&gt;Deprovisioning&lt;/a&gt; and &lt;a href=&quot;https://link&quot;&gt;Define who is in scope for provisioning&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://link&quot;&gt;Plan for multitenant organizations in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://link&quot;&gt;Set up a multitenant org in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization optional policy templates&lt;/h2&gt;
&lt;p&gt;Article • 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h3&gt;Autogeneration of cross-tenant access settings&lt;/h3&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional &lt;a href=&quot;#&quot;&gt;cross-tenant access settings&lt;/a&gt;, for both, partner configuration and identity synchronization. These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross-tenant access settings pass through the &lt;a href=&quot;#&quot;&gt;default settings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;h2&gt;Policy templates at multitenant organization formation&lt;/h2&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per the previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding &lt;a href=&quot;#&quot;&gt;cross-tenant access settings&lt;/a&gt;, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Administrator C joins the multitenant organization. Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see Configure multitenant organization templates.&lt;/p&gt;
&lt;h2&gt;Policy template scoping and additional properties&lt;/h2&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross-tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, &lt;em&gt;new&lt;/em&gt; partners refer to tenants for which you haven&amp;#39;t yet configured cross-tenant access settings, while &lt;em&gt;existing&lt;/em&gt; partners refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access partner configuration template and the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access identity synchronization template.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Partner Settings Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;td&gt;&lt;any value&gt;&lt;/td&gt;
&lt;td&gt;&lt;Template Value&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Policy templates used by Microsoft 365 admin center&lt;/h3&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity synchronization is set to allow users to synchronize into this tenant&lt;/li&gt;
&lt;li&gt;Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.inboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.outboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;userSyncInbound&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant access settings at time of multitenant organization disassembly&lt;/h3&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/graph/api/resources/organization?preserve-view=true&amp;view=graph-rest-beta&quot;&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limitations in multitenant organizations&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 04/24/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see &lt;a href=&quot;https://link.com&quot;&gt;Microsoft Entra UserVoice&lt;/a&gt;. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;- Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;- Microsoft 365 admin center limitations related to multitenant organizations  - Microsoft 365 multitenant organization people search experiences - Cross-tenant synchronization limitations related to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;- Cross-tenant synchronization unrelated to Microsoft 365 - End user experiences in new Teams - End user experiences in Power BI - Tenant migration or consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported scenarios&lt;/td&gt;
&lt;td&gt;- Seamless collaboration experience across multitenant organizations in classic Teams - Self-service for multitenant organizations larger than 100 tenants - Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet - Cross-cloud multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the identity platform, both methods are represented as Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Synchronization jobs created with Microsoft Entra ID will not appear in the Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By default, new B2B users are provisioned as B2B members, while existing B2B guests remain B2B guests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can opt to convert B2B guests into B2B members by setting Apply this mapping to Always.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an &lt;strong&gt;Outbound sync status of Not configured&lt;/strong&gt;. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants to or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name &lt;code&gt;MTO_Sync_&amp;lt;TenantID&amp;gt;&lt;/code&gt;. Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross-tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with &lt;code&gt;userSyncInbound&lt;/code&gt; set to true, as facilitated by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Join requests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you followed the correct sequence to create a multitenant organization and add a tenant to the multitenant organization, and the added tenant&amp;#39;s join request keeps failing, submit a support request in the Microsoft Entra or Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft apps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href=&quot;https://example.com&quot;&gt;SharePoint OneDrive&lt;/a&gt;, the promotion of B2B guests to B2B members might not happen automatically. If faced with a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try &lt;a href=&quot;https://example.com&quot;&gt;Set-SPUser [-SyncFromAD]&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href=&quot;https://example.com&quot;&gt;SharePoint OneDrive&lt;/a&gt; user interfaces, when sharing a file with &lt;em&gt;People in Fabrikam&lt;/em&gt;, the current user interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards &lt;em&gt;People in Fabrikam&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Forms&lt;/a&gt;, B2B member users might not be able to access forms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Power BI&lt;/a&gt;, B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Power Apps&lt;/a&gt;, &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Dynamics 365&lt;/a&gt;, and related workloads, B2B member users may have restricted functionality. For more information, see &lt;a href=&quot;https://example.com&quot;&gt;Invite users with Microsoft Entra B2B collaboration&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the &lt;a href=&quot;https://example.com&quot;&gt;default permissions&lt;/a&gt; for B2B members.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To promote B2B guests to B2B members, a source tenant administrator can amend the &lt;a href=&quot;https://example.com&quot;&gt;attribute mappings&lt;/a&gt;, or a target tenant administrator can &lt;a href=&quot;https://example.com&quot;&gt;change the userType&lt;/a&gt; if the property is not recurringly synchronized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As your organization rolls out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others users as B2B members. To achieve this, you might want to establish two Microsoft Entra cross-tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with &lt;a href=&quot;https://example.com&quot;&gt;Apply this mapping&lt;/a&gt; set to&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Always&lt;/h3&gt;
&lt;p&gt;By moving a user from one configuration&amp;#39;s scope to the other, you can easily control who will be a B2B guest or a B2B member in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As part of a multitenant organization, reset redemption for an already redeemed B2B user is currently disabled.&lt;/li&gt;
&lt;li&gt;The at-scale provisioning of B2B users might collide with contact objects. The handling or conversion of contact objects is currently not supported.&lt;/li&gt;
&lt;li&gt;Using Microsoft Entra cross-tenant synchronization to target hybrid identities that have been converted to B2B users has not been tested in source of authority conflicts and is not supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant synchronization deprovisioning&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see Deprovisioning and Define who is in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Currently, SkipOutOfScopeDeletions works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set Target Object Actions for Delete to disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Next steps&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Known issues for provisioning in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Topologies for cross-tenant collaboration&lt;/h2&gt;
&lt;p&gt;Article • 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;p&gt;✔️ Hub and spoke&lt;br&gt;✔️ Mesh&lt;br&gt;✔️ Just-in-time  &lt;/p&gt;
&lt;h3&gt;Hub and spoke&lt;/h3&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Option 1 (application hub)&lt;/strong&gt;: In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Option 2 (user hub)&lt;/strong&gt;: Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h3&gt;Mergers and acquisitions (application hub)&lt;/h3&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time-limited access to additional applications such as Salesforce and Amazon Web Services.&lt;/p&gt;
&lt;p&gt;that contain business critical data. The following diagram shows recently acquired tenants on the left and their users being provisioned into the parent company&amp;#39;s tenant, which grants users access to the necessary resources.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[HR] --&amp;gt; B[Active Directory];
    B --&amp;gt; C[SaaS apps];
    B --&amp;gt; D[Microsoft apps];
    B --&amp;gt; E[On-premises apps];
    F --&amp;gt; B;
    G --&amp;gt; B;
    H --&amp;gt; B;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Separate collaboration and resource tenants (user hub)&lt;/h3&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;h2&gt;Mesh&lt;/h2&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h2&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;h2&gt;Collaborate across business units (full-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph LR
    A[Azure Tenant 1] --&amp;gt; B[Azure Tenant 2]
    B --&amp;gt; A
    A --&amp;gt; C[Azure Tenant 3]
    C --&amp;gt; A
    A --&amp;gt; D[Azure Tenant 4]
    D --&amp;gt; A
    B --&amp;gt; C
    C --&amp;gt; B
    C --&amp;gt; D
    D --&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;cross-tenant synchronization is shown with arrows indicating synchronization going in both directions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is one way. An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a separate configuration.&lt;/p&gt;
&lt;h2&gt;Just-in-time&lt;/h2&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h2&gt;Joint ventures&lt;/h2&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;p&gt;The following diagram shows how two organizations can just-in-time collaborate by using connected organizations and entitlement management.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;What is cross-tenant synchronization?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was this page helpful?&lt;/strong&gt; &lt;a href=&quot;#&quot;&gt;Yes&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;No&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Provide product feedback&lt;/a&gt;  |  &lt;a href=&quot;#&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Governance and cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article • 03/21/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross-tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how &lt;a href=&quot;https://aka.ms/entra-id-governance&quot;&gt;Microsoft Entra ID Governance&lt;/a&gt; customers can use cross-tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h2&gt;Deployment example&lt;/h2&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage employee identity lifecycles across multiple tenants&lt;/li&gt;
&lt;li&gt;Use workflows to automate lifecycle processes for employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Assign resource access automatically to employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Allow employees to request access to resources in multiple tenants&lt;/li&gt;
&lt;li&gt;Review the access of synchronized users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant. The following diagram illustrates the topology.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
    subgraph Source Tenants
    ContosoEMEA((Contoso EMEA))
    ContosoUS((Contoso US))
    end
    subgraph Target Tenant
    Contoso((Contoso))
    end

    ContosoEMEA --&amp;gt; Contoso
    ContosoUS --&amp;gt; Contoso
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Manage employee lifecycles across tenants&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/link-to-cross-tenant-synchronization&quot;&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/a&gt; automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various &lt;a href=&quot;https://learn.microsoft.com/link-to-properties-b2b-collaboration-user&quot;&gt;properties of a Microsoft Entra B2B collaboration user&lt;/a&gt;. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in &lt;a href=&quot;https://learn.microsoft.com/link-to-multitenant-organizations&quot;&gt;multitenant organizations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.&lt;/p&gt;
&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h2&gt;Automate lifecycle processes with workflows&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the &lt;code&gt;createdDateTime&lt;/code&gt; event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as &lt;code&gt;userType&lt;/code&gt; and &lt;code&gt;userPrincipalName&lt;/code&gt; to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h2&gt;Govern synchronized user access with access packages&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;h3&gt;Automatically assign access in target tenants to employees from source tenants&lt;/h3&gt;
&lt;h2&gt;Enable cross-tenant synchronization management in the source tenant&lt;/h2&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create automatic assignment policies for access packages in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access&lt;/li&gt;
&lt;li&gt;In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;h2&gt;Enable source-tenant employees to request access to target-tenant shared resources&lt;/h2&gt;
&lt;p&gt;With identity governance access package policies, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;h2&gt;Review synchronized-user access&lt;/h2&gt;
&lt;p&gt;Access reviews in Microsoft Entra ID enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn’t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;h3&gt;Review source-tenant user access&lt;/h3&gt;
&lt;h2&gt;Review target-tenant user access&lt;/h2&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users provisioned by cross-tenant synchronization in target tenants. This option enables access recertification of resources in target tenants. Although organizations can target all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn’t recommend removing denied guest users automatically from access reviews. Cross-tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organizations and Microsoft 365&lt;/li&gt;
&lt;li&gt;Multitenant organization templates&lt;/li&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h2&gt;
&lt;p&gt;Article • 05/02/2024&lt;/p&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/li&gt;
&lt;li&gt;Example topologies for how you can implement your lifecycle and access controls.&lt;/li&gt;
&lt;li&gt;Deployment considerations (roles, monitoring, APIs).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage the lifecycle and access of a SOC user&lt;/h3&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h4&gt;Lifecycle control&lt;/h4&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don’t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;h2&gt;Comparing entitlement management and cross-tenant synchronization&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Entitlement management&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td&gt;●&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Access control&lt;/h2&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;h3&gt;Entitlement management&lt;/h3&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access policies&lt;/h2&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;h2&gt;Deployment topologies&lt;/h2&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h3&gt;Topology 1&lt;/h3&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant.&lt;/p&gt;
&lt;h4&gt;Steps to configure topology 1&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, configure &lt;a href=&quot;https://link_to_cross-tenant_synchronization&quot;&gt;cross-tenant synchronization&lt;/a&gt; to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/p&gt;
&lt;p&gt; As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll automatically be provisioned into the target tenant. As they&amp;#39;re removed from the configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute mappings, you can add a new mapping of type constant to provision a &lt;a href=&quot;https://link_to_directory_extension&quot;&gt;directory extension&lt;/a&gt; attribute on the user to indicate that they&amp;#39;re a SOC administrator. Alternatively, if you have an attribute such as department that you can rely on for this step, you can skip creating the extension. This attribute will be used in the target tenant to provide them with access to the necessary roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, create an access package that includes the cross-tenant synchronization service principal as a resource.&lt;/p&gt;
&lt;p&gt; As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant synchronization service principal. Ensure that you set up periodic access reviews of the access package or time-limit the assignments to ensure that only the users that need access to the target tenant continue to have access.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, &lt;a href=&quot;https://link_to_create_access_packages&quot;&gt;create access packages&lt;/a&gt; to provide the necessary roles for investigating an incident.&lt;/p&gt;
&lt;p&gt; We recommend one &lt;a href=&quot;https://link_to_autoassigned_access_package&quot;&gt;autoassigned&lt;/a&gt; access package to provide the Security Reader role and one request based package for the Security Operator and Security Administrator roles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to &lt;a href=&quot;https://myaccess.microsoft.com&quot;&gt;myaccess.microsoft.com&lt;/a&gt; to request time-limited access to the necessary access packages in the source tenant. Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the security reader role. They can then request additional access in any tenants where they need the Security Operator or Security Administrator roles. Once their access period is over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the target tenants they don&amp;#39;t need access to anymore.&lt;/p&gt;
&lt;h2&gt;Topology 2&lt;/h2&gt;
&lt;p&gt;In topology 2 the target tenant administrator defines the access packages and resources that the source users can request access to. If the source tenant administrator would like to restrict which of their users can access the target tenant, you can use a cross-tenant access policy coupled with an access package to block all access to the target tenant, except for users that are part of a group that is included in an access package in the home tenant.&lt;/p&gt;
&lt;h2&gt;Steps to configure topology 2&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, add the source tenant as a &lt;a href=&quot;#&quot;&gt;connected organization&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users from the source tenant can now request access packages in the target tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h2&gt;Topologies compared&lt;/h2&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;h2&gt;Deployment considerations&lt;/h2&gt;
&lt;h3&gt;Monitoring&lt;/h3&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Defender are also audited.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Scaling deployment with PowerShell / APIs&lt;/h3&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell cmdlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Role-based access control&lt;/h3&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuring cross-tenant access settings - Security Administrator&lt;/li&gt;
&lt;li&gt;Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/li&gt;
&lt;li&gt;Configuring entitlement management - Identity Governance Administrator&lt;/li&gt;
&lt;li&gt;Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;What is entitlement management?&lt;/li&gt;
&lt;li&gt;Multitenant management in Defender XDR&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 02/14/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see &lt;a href=&quot;https://feedback.azure.com/d365community/forum/e8276f76-c62d-ec11-b6e6-000d3a4f0da0&quot;&gt;Microsoft Entra application provision UserVoice&lt;/a&gt;. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Authorization&lt;/h3&gt;
&lt;h4&gt;Unable to change provisioning mode back to manual&lt;/h4&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h3&gt;Attribute mappings&lt;/h3&gt;
&lt;h4&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/h4&gt;
&lt;p&gt;The attributes &lt;strong&gt;SamAccountName&lt;/strong&gt; and &lt;strong&gt;userType&lt;/strong&gt; aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/app-provisioning/missing-source-attribute&quot;&gt;Missing source attribute&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Source attribute dropdown missing for schema extension&lt;/h4&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and extend your schema to add the necessary attributes.&lt;/p&gt;
&lt;h2&gt;Null attribute can&amp;#39;t be provisioned&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h2&gt;Maximum characters for attribute-mapping expressions&lt;/h2&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h2&gt;Unsupported scoping filters&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;appRoleAssignments&lt;/code&gt;, &lt;code&gt;userType&lt;/code&gt;, and &lt;code&gt;accountExpires&lt;/code&gt; attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h2&gt;Multivalue directory extensions&lt;/h2&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h2&gt;Service issues&lt;/h2&gt;
&lt;h3&gt;Unsupported scenarios&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provisioning passwords isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning nested groups isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/li&gt;
&lt;li&gt;Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h3&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h2&gt;Manager isn&amp;#39;t provisioned&lt;/h2&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h2&gt;The provisioning interval is fixed&lt;/h2&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h2&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Switching from Sync All to Sync Assigned not working&lt;/h2&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h2&gt;Provisioning cycle continues until completion&lt;/h2&gt;
&lt;p&gt;When you set provisioning to &lt;code&gt;enabled = off&lt;/code&gt; or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h2&gt;Member of group not provisioned&lt;/h2&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h2&gt;Global Reader&lt;/h2&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the &lt;code&gt;microsoft.directory/applications/synchronization/standard/read&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Microsoft Azure Government Cloud&lt;/h2&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h2&gt;On-premises application provisioning&lt;/h2&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h2&gt;Application and directories&lt;/h2&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;h3&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When a user is managed by Microsoft Entra Connect, the source of authority is on-premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/li&gt;
&lt;li&gt;Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on this website to track the status of the preview. Alternatively, you can use Microsoft Identity Manager for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Microsoft Entra ID&lt;/h3&gt;
&lt;p&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. &lt;em&gt;You can&amp;#39;t bring a user into the directory from a third-party application.&lt;/em&gt; Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.&lt;/p&gt;
&lt;h2&gt;Attributes and objects&lt;/h2&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multivalued attributes.&lt;/li&gt;
&lt;li&gt;Reference attributes (for example, manager).&lt;/li&gt;
&lt;li&gt;Groups.&lt;/li&gt;
&lt;li&gt;Complex anchors (for example, ObjectTypeName+UserName).&lt;/li&gt;
&lt;li&gt;Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;&lt;/li&gt;
&lt;li&gt;Binary attributes.&lt;/li&gt;
&lt;li&gt;On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSL certificates&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h2&gt;Anchor attributes&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h2&gt;Attribute discovery and mapping&lt;/h2&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;h2&gt;Provisioning agent&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/li&gt;
&lt;li&gt;The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR- driven provisioning.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;How provisioning works&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 04/24/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named Cairo and two member tenants named Berlin and Athens.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see Set up a multitenant org in Microsoft 365 and Join or leave a multitenant organization in Microsoft 365. To learn how to configure Microsoft Teams for your multitenant organization, see The new Microsoft Teams desktop client.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Owner tenant (Cairo)] --&amp;gt; B[Member tenant (Athens)];
    A[Owner tenant (Cairo)] --&amp;gt; C[Member tenant (Berlin)];
    B[Member tenant (Athens)] --&amp;gt; C[Member tenant (Berlin)];
    C[Member tenant (Berlin)] --&amp;gt; B[Member tenant (Athens)];
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Member tenant&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;#&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the owner tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the &lt;a href=&quot;#&quot;&gt;Microsoft Graph PowerShell SDK&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the owner and member tenants and initialize variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$OwnerTenantId = &amp;quot;&amp;lt;OwnerTenantId&amp;gt;&amp;quot;
$MemberTenantIdB = &amp;quot;&amp;lt;MemberTenantIdB&amp;gt;&amp;quot;
$MemberTenantIdA = &amp;quot;&amp;lt;MemberTenantIdA&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;#&quot;&gt;Connect-MgGraph&lt;/a&gt; command to sign in to the owner tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MultiTenantOrganization.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $OwnerTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;,&amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;,&amp;quot;Application.ReadWrite.All&amp;quot;,&amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Create a multitenant organization&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the owner tenant, use the &lt;a href=&quot;#&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization&lt;/a&gt; command to create your multitenant organization. This operation can take a few minutes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;#&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization&lt;/a&gt; command to check that the operation has completed before proceeding.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;CreatedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 7:47:45 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Cairo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdC&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinRequest&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationJoinRequestRecord&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tenants&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;[{@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/$entity%7D%5D&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/$entity}]&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 3: Add tenants&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the &lt;a href=&quot;https://link&quot;&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to add tenants to your multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdB -DisplayName &amp;quot;Berlin&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdA -DisplayName &amp;quot;Athens&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://link&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to verify that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 7:47:45 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Cairo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdC&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{{multiTenantOrgLabelType, none}}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;AddedByTenantId&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;MemberTenantIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{{multiTenantOrgLabelType, none}}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;AddedByTenantId&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:08:47 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Athens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdA&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;MemberTenantIdA&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{{multiTenantOrgLabelType, none}}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 4: (Optional) Change the role of a tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the &lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to change a member tenant to an owner tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedByTenantId&lt;/td&gt;
&lt;td&gt;&lt;OwnerTenantId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 8:05:25 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Berlin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;MtoIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;MemberTenantIdB&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{{@odata.context, &lt;a href=&quot;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity%7D&quot;&gt;https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity}&lt;/a&gt;, [multiTenantOrgLabelType, none]}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 5: (Optional) Remove a member tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the owner tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.multitenantorganization/remove-mgbetatenantrelationshipmultitenantorganizationtenant?view=graph-powershell-beta&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to remove any member tenant. This operation takes a few minutes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantIdID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.multitenantorganization/get-mgbetatenantrelationshipmultitenantorganizationtenant?view=graph-powershell-beta&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to verify the change.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantIdID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```Output
Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get:
Unable to read the company information from the directory.

Status: 404 (NotFound)
ErrorCode: Directory_ObjectNotFound
Date: 2024-01-08T20:35:11

...

```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 6: Sign in to a member tenant&lt;/h2&gt;
&lt;h3&gt;Member tenant&lt;/h3&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.authentication/connect-mggraph&quot;&gt;Connect-MgGraph&lt;/a&gt; command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MultiTenantOrganization.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.ReadWrite.CrossTenantAccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Application.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Directory.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $MemberTenantIdB -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;,&amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;,&amp;quot;Application.ReadWrite.All&amp;quot;,&amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 7: Join the multitenant organization&lt;/h3&gt;
&lt;h4&gt;Member tenant&lt;/h4&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In the member tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.tenantrelationships/update-mgbetatenantrelationshipmultitenantorganizationjoinrequest&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest&lt;/a&gt; command to join the multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest -AddedByTenantId $OwnerTenantId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.tenantrelationships/get-mgbetatenantrelationshipmultitenantorganizationjoinrequest&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest&lt;/a&gt; command to verify the join.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId       : &amp;lt;OwnerTenantId&amp;gt;
Id                   : &amp;lt;MtoJoinRequestIdB&amp;gt;
MemberState          : active
Role                 : member
TransitionDetails    :
Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationJoinRequestTransitionDetails
AdditionalProperties : {[[@odata.context,
https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/joinRequest/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://docs.microsoft.com/powershell/module/mgBeta/IdentityDirectory/Use-Custom-Module?view=graph-powershell-%60command%60&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to check the multitenant organization itself. It should reflect the join operation.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId     : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime       : 1/8/2024 8:05:25 PM
DeletedDateTime     :
DisplayName         : Berlin
Id                  : &amp;lt;MtoJoinRequestIdB&amp;gt;
JoinedDateTime      : 1/8/2024 9:53:55 PM
Role                : member
State               : active
TenantId            : &amp;lt;MemberTenantIdB&amp;gt;
TransitionDetails   : 
Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties : {[multiTenantOrgLabelType, none]}

AddedByTenantId     : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime       : 1/8/2024 7:47:45 PM
DeletedDateTime     :
DisplayName         : Cairo
Id                  : &amp;lt;Id&amp;gt;
JoinedDateTime      :
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Role        : owner&lt;/h2&gt;
&lt;h2&gt;State       : active&lt;/h2&gt;
&lt;h2&gt;TenantId    : &lt;OwnerTenantId&gt;&lt;/h2&gt;
&lt;h2&gt;TransitionDetails : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/h2&gt;
&lt;h2&gt;AdditionalProperties : {[multiTenantOrgLabelType, none]}&lt;/h2&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;To allow for asynchronous processing, wait &lt;strong&gt;up to 2 hours&lt;/strong&gt; before joining a multitenant organization is completed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 8: (Optional) Leave the multitenant organization&lt;/h2&gt;
&lt;h4&gt;Member tenant&lt;/h4&gt;
&lt;p&gt;You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.&lt;/p&gt;
&lt;p&gt;If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see &lt;a href=&quot;#&quot;&gt;Step 4: (Optional) Change the role of a tenant&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;In the tenant, use the &lt;a href=&quot;#&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to remove the tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: (Optional) Delete the multitenant organization&lt;/h2&gt;
&lt;h2&gt;Owner tenant&lt;/h2&gt;
&lt;p&gt;You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In the final owner tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.tenantrelationships/remove-mgbetatenantrelationshipmultitenantorganizationtenant?view=graph-powershell-beta&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/a&gt; command to remove the tenant. This operation takes a few minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $OwnerTenantId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-365/enterprise/set-up-multitenant-org&quot;&gt;Set up a multitenant org in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-365/enterprise/synchronize-users&quot;&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aka.ms/GetTeams&quot;&gt;The new Microsoft Teams desktop client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/graph/api/resources/multitenantorganization?view=graph-rest-beta&quot;&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 04/24/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;https://example.com&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant access policy partner template&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://example.com&quot;&gt;cross-tenant access partner configuration&lt;/a&gt; handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h3&gt;Configure inbound and outbound automatic redemption&lt;/h3&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the &lt;a href=&quot;https://example.com&quot;&gt;Update multiTenantOrganizationPartnerConfigurationTemplate API&lt;/a&gt;. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;h4&gt;Request&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&quot;&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP

PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration

{
    &amp;quot;inboundTrust&amp;quot;: {
        &amp;quot;isMfaAccepted&amp;quot;: true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot;: {
        &amp;quot;inboundAllowed&amp;quot;: true,
        &amp;quot;outboundAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP

PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration

{
    &amp;quot;inboundTrust&amp;quot;: {
        &amp;quot;isMfaAccepted&amp;quot;: true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot;: {
        &amp;quot;inboundAllowed&amp;quot;: true,
        &amp;quot;outboundAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PATCH&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;inboundTrust&amp;quot;: {
        &amp;quot;isMfaAccepted&amp;quot;: true,
        &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
        &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
    },
    &amp;quot;automaticUserConsentSettings&amp;quot;: {
        &amp;quot;inboundAllowed&amp;quot;: true,
        &amp;quot;outboundAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the &lt;code&gt;multiTenantOrganizationPartnerConfigurationTemplate: resetToDefaultSettings&lt;/code&gt; API.&lt;/p&gt;
&lt;h3&gt;HTTP&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;POST https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization template&lt;/h2&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h3&gt;Configure inbound user synchronization&lt;/h3&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the &lt;code&gt;Update multiTenantOrganizationIdentitySyncPolicyTemplate&lt;/code&gt; API. If you create or join a&lt;/p&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization

{
    &amp;quot;userSyncInbound&amp;quot;: {
        &amp;quot;isSyncAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization

{
    &amp;quot;userSyncInbound&amp;quot;: {
        &amp;quot;isSyncAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PATCH&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;userSyncInbound&amp;quot;: {
        &amp;quot;isSyncAllowed&amp;quot;: true
    },
    &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the &lt;a href=&quot;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&quot;&gt;multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings&lt;/a&gt; API.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-synchronization&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 03/11/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see &lt;a href=&quot;#&quot;&gt;Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Configuration Diagram](#) --&gt;

&lt;h3&gt;Learning objectives&lt;/h3&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Remove B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Keep user attributes synchronized between your source and target tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
- Microsoft Entra ID P1 or P2 license. For more information, see [License requirements](https://example.com).
- Security Administrator role to configure cross-tenant access settings.
- Hybrid Identity Administrator role to configure cross-tenant synchronization.
- Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.

### Target tenant

- Microsoft Entra ID P1 or P2 license. For more information, see [License requirements](https://example.com).
- Security Administrator role to configure cross-tenant access settings.

## Step 1: Plan your provisioning deployment

1. Define how you would like to [structure the tenants in your organization](https://example.com).

2. Learn about [how the provisioning service works](https://example.com).

3. Determine who will be in [scope for provisioning](https://example.com).

4. Determine what data to [map between tenants](https://example.com).

## Step 2: Enable user synchronization in the target tenant

&amp;gt; **Tip**  
&amp;gt; Steps in this article might vary slightly based on the portal you start from.

### Target tenant

1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com) of the target tenant.

2. Browse to **Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings**.

3. On the **Organization settings** tab, select **Add organization**.

4. Add the source tenant by typing the tenant ID or domain name and selecting **Add**.

## External Identities | Cross-tenant access settings

### Add organization

1. Under **Inbound access** of the added organization, select **Inherited from default**.

2. Select the **Cross-tenant sync** tab.

3. Check the **Allow users sync into this tenant** check box.

![Allow Users Sync Screenshot](https://example.com/allow_users_sync.png)

4. Select **Save**.

5. If you see an **Enable cross-tenant sync and auto-redemption** dialog box asking if you want to enable auto-redemption, select **Yes**.

Selecting **Yes** will automatically redeem invitations in the target tenant.

## Step 3: Automatically redeem invitations in the target tenant

### Target tenant

In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt. This setting must be checked in both the source tenant (outbound) and target tenant (inbound). For more information, see Automatic redemption setting.

1. In the target tenant, on the same **Inbound access settings** page, select the **Trust settings** tab.

2. Check the **Automatically redeem invitations with the tenant &amp;lt;tenant&amp;gt;** check box.

    This box might already be checked if you previously selected **Yes** in the Enable cross-tenant sync and auto-redemption dialog box.

    &amp;lt;!-- Image not found: automatic-redemption.png --&amp;gt;
&amp;lt;!-- ![Image showing Automatic redemption option enabled](automatic-redemption.png) --&amp;gt;

3. Select **Save**.

## Step 4: Automatically redeem invitations in the source tenant

**Source tenant**

In this step, you automatically redeem invitations in the source tenant.

1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com) of the source tenant.

2. Browse to **Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings**.

3. On the **Organization settings** tab, select **Add organization**.

4. Add the target tenant by typing the tenant ID or domain name and selecting **Add**.

&amp;lt;!-- Image reference points to missing/unhandled asset: ![Add organization](image_url) --&amp;gt;

5. Under **Outbound access** for the target organization, select **Inherited from default**.

6. Select the **Trust settings** tab.

7. Check the **Automatically redeem invitations with the tenant &amp;lt;tenant&amp;gt;** check box.

## Outbound access settings - Contoso

### B2B collaboration
### B2B direct connect
### Trust settings

**Automatic redemption**

[ ] Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. 

This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well.

[ ] Automatically redeem invitations with the tenant Contoso.

Save | Discard

1. Select **Save**.

## Step 5: Create a configuration in the source tenant

### Source tenant

1. In the source tenant, browse to **Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization**.

2. Select **Configurations**.

3. At the top of the page, select **New configuration**.

4. Provide a name for the configuration and select **Create**.

*It can take up to 15 seconds for the configuration that you just created to appear in the list.*

## Step 6: Test the connection to the target tenant

### Source tenant

1. In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.

## Fabrikam to Contoso | Overview

- Overview
- Provision on demand

### Manage

- Users and groups
- Provisioning
- Expression builder

### Activity

- Audit logs
- Provisioning logs
- Insights

### Troubleshooting + Support

- New support request

---

Automate identity lifecycle management with Microsoft Entra. Automatically create, update, and delete accounts when users join, leave, and move within your organization.

### 2. Select Get started.

### 3. Set the Provisioning Mode to Automatic.

### 4. Under the Admin Credentials section, change the Authentication Method to Cross Tenant Synchronization Policy.

---

## Provisioning

| **Provisioning Mode** |
|-----------------------|
| Automatic             |
  
Use Microsoft Entra to manage the creation and synchronization of user accounts in Fabrikam to Contoso based on user and group assignment.

### Admin Credentials

Microsoft Entra needs the following information to connect to Fabrikam to Contoso’s API and synchronize user data.

| **Authentication Method**               |
|-----------------------------------------|
| Cross Tenant Synchronization Policy     |

**Tenant Id**

[Test Connection]

5. In the **Tenant Id** box, enter the tenant ID of the target tenant.

6. Select **Test Connection** to test the connection.

You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see Troubleshooting tips later in this article.

![Notifications]
Testing connection to Fabrikam to Contoso
The supplied credentials are authorized to enable provisioning

7. Select **Save**.

Mappings and Settings sections appear.

8. Close the **Provisioning** page.

## Step 7: Define who is in scope for provisioning

### Source tenant

The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:

- Based on assignment to the configuration
- Based on attributes of the user

Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.

1. In the source tenant, select **Provisioning** and expand the **Settings** section.

## Fabrikam to Contoso | Provisioning

2. In the **Scope** list, select whether to synchronize all users in the source tenant or only users assigned to the configuration.

    It&amp;#39;s recommended that you select **Sync only assigned users and groups** instead of **Sync all users and groups**. Reducing the number of users in scope improves performance.

3. If you made any changes, select **Save**.

4. On the configuration page, select **Users and groups**.

    For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.

5. Select **Add user/group**.

6. On the **Add Assignment** page, under **Users and groups**, select **None Selected**.

7. On the **Users and groups** pane, search for and select one or more internal users or groups you want to assign to the configuration.

    If you select a group to assign to the configuration, only users that are direct members in the group will be in scope for provisioning. You can select a static group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.

8. Select **Select**.

9. Select **Assign**.

&amp;lt;!-- Image reference points to missing/unhandled asset: ![Fabikam to Contoso | Users and groups](image) --&amp;gt;

For more information, see [Assign users and groups to an application](https://docs.microsoft.com).

## Step 8: (Optional) Define who is in scope for provisioning with scoping filters

### Source tenant

Regardless of the value you selected for **Scope** in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.

1. In the source tenant, select **Provisioning** and expand the **Mappings** section.

## 2. Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.

## 3. Under Source Object Scope, select All records.

&amp;lt;!-- Image not found: attribute-mapping.png --&amp;gt;
&amp;lt;!-- ![Attribute Mapping](attribute-mapping.png) --&amp;gt;

## 4. On the Source Object Scope page, select Add scoping filter.

## 5. Add any scoping filters to define which users are in scope for provisioning.

To configure scoping filters, refer to the instructions provided in [Scoping users or groups to be provisioned with scoping filters](URL LINK).

&amp;lt;!-- Image reference points to missing/unhandled asset: ![Add Scoping Filter Interface](IMAGE DESCRIPTION: Screenshot of the Add Scoping Filter user interface in a software platform. Shows fields like Target Attribute, Operator, Value, and Add/Remove button.) --&amp;gt;

| Target Attribute      | Operator | Value     | Add/Remove           |
|-----------------------|----------|-----------|----------------------|
| No scoping filters found |          |           |                      |
| department            | EQUALS   | Marketing | Add New Scoping Clause|

Scoping Filter Title: Marketing department filter

If multiple scoping clauses are present, they are evaluated using &amp;quot;AND&amp;quot; logic.

[Ok Button] [Save Button]

6. Select **Ok** and **Save** to save any changes.

   If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.

7. Select **Yes** and close the **Attribute Mapping** page.

## Step 9: Review attribute mappings

**Source tenant**

Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see [Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.](URL LINK)

1. In the source tenant, select **Provisioning** and expand the **Mappings** section.

2. Select **Provision Microsoft Entra ID Users**.

3. On the **Attribute Mapping** page, scroll down to review the user attributes that are synchronized between tenants in the **Attribute Mappings** section.

The first attribute, alternativeSecurityIdentifier, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a `schemaInvalid` error.

## Attribute Mapping

| Azure Active Directory Attribute (source tenant) | Azure Active Directory (target tenant) Attribute | Matching precedence | Remove |
|--------------------------------------------------|--------------------------------------------------|---------------------|--------|
| AltSecIdFromNetId(netId)                         | alternativeSecurityIds                           | 1                   | Delete |
| isSoftDeleted                                    | isSoftDeleted                                    |                     | Delete |
| accountEnabled                                   | accountEnabled                                   |                     | Delete |
| streetAddress                                    | streetAddress                                    |                     | Delete |
| city                                             | city                                             |                     | Delete |
| state                                            | state                                            |                     | Delete |
| postalCode                                       | postalCode                                       |                     | Delete |
| country                                          | country                                          |                     | Delete |
| department                                       | department                                       |                     | Delete |
| employeeId                                       | employeeId                                       |                     | Delete |
| displayName                                      | displayName                                      |                     | Delete |
| givenName                                        | givenName                                        |                     | Delete |

4. Select the **Member (userType)** attribute to open the Edit Attribute page.

5. Review the **Constant Value** setting for the **userType** attribute.

This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see [Properties of a Microsoft Entra B2B collaboration user](#).

| Constant Value | Description                                                                                                             |
|----------------|-------------------------------------------------------------------------------------------------------------------------|
| Member         | Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant. |
| Guest          | Users will be created as external guests (B2B collaboration users) in the target tenant.                                 |

&amp;gt; 💡 Note
&amp;gt;
&amp;gt; If the B2B user already exists in the target tenant then Member (userType) will not change to Member, unless the Apply this mapping setting is set to Always.

The user type you choose has the following limitations for apps or services (but aren&amp;#39;t limited to):

| App or service         | Limitations                                                                                                                                                                                                                                                       |
|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Power BI               | - Support for UserType Member in Power BI is currently in preview. For more information, see [Distribute Power BI content to external guest users with Microsoft Entra B2B.](https://learn.microsoft.com/en-us/power-bi/admin/service-admin-azure-ad-b2b)           |
| Azure Virtual Desktop  | - External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.                                                                                                                                                                                    |


...

&amp;lt;!-- Image reference points to missing/unhandled asset: ![Edit Attribute settings window showing &amp;quot;Member&amp;quot; as the Constant Value.](image_placeholder) --&amp;gt;

...

6. If you want to define any transformations, on the **Attribute Mapping** page, select the attribute you want to transform, such as **displayName**.


7. Set the **Mapping type** to **Expression**.

8. In the **Expression** box, enter the transformation expression. For example with the display name, you can do the following:

- Flip the first name and last name and add a comma in between.
- Add the domain name in parentheses at the end of the display name.

For examples, see [Reference for writing expressions for attribute mappings in Microsoft Entra ID](#).

&amp;lt;!-- Image not found: Interface.png --&amp;gt;
&amp;lt;!-- ![Edit Attribute Interface](Interface.png) --&amp;gt;

&amp;gt; **Tip**
&amp;gt; You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see [Map directory extensions in cross-tenant synchronization](#).

## Step 10: Specify additional provisioning settings

&amp;lt;!-- Image not found: SourceTenant.png --&amp;gt;
&amp;lt;!-- ![Source Tenant Icon](SourceTenant.png) --&amp;gt; 

**Source tenant**

1. In the source tenant, select **Provisioning** and expand the **Settings** section.

&amp;lt;!-- Image reference points to missing/unhandled asset: ![Provisioning settings page](image) --&amp;gt;

2. Check the **Send an email notification when a failure occurs** check box.

3. In the **Notification Email** box, enter the email address of a person or group who should receive provisioning error notifications.

   Email notifications are sent within 24 hours of the job entering quarantine state. For custom alerts, see [Understand how provisioning integrates with Azure Monitor logs](https://example.com).

4. To prevent accidental deletion, select **Prevent accidental deletion** and specify a threshold value. By default, the threshold is set to 500.

   For more information, see [Enable accidental deletions prevention in the Microsoft Entra provisioning service](https://example.com).

5. Select **Save** to save any changes.

## Step 11: Test provision on demand

### Source tenant

Now that you have a configuration, you can test on-demand provisioning with one of your users.

1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.

2. Select Configurations and then select your configuration.

3. Select Provision on demand.

4. In the Select a user or group box, search for and select one of your test users.

&amp;lt;!-- Image reference points to missing/unhandled asset: ![![Provision on demand screen showing &amp;quot;Selected user&amp;quot; option](image) --&amp;gt;]
 
5. Select Provision.

After a few moments, the Perform action page appears with information about the provisioning of the test user in the target tenant.

## Perform action

| Modified attributes (successful) | Data Flow                                                                                                                                   |
|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| `User &amp;#39;User1@fabrikam.com&amp;#39; was created in Azure Active Directory (target tenant)`                                                                                             |
| Target attribute name            | Source attribute value                           | Expression            | Original target attribute value | Modified target attribute value |
| `isSoftDeleted`                  | `False`                                          | `[isSoftDeleted]`     |                                | `False`                         |
| `accountEnabled`                 | `True`                                           | `[accountEnabled]`    |                                | `True`                          |
| `displayName`                    | `User1`                                          | `[displayName]`       |                                | `User1`                         |
| `mailNickname`                   | `USER1`                                          | `[mailNickname]`      |                                | `user1`                         |
| `alternativeSecurityIds`         | `AltSecIdFromNextId:1033...`                     |                       |                                | `(1 values)`                    |
| `showInAddressList`              | `&amp;quot;True&amp;quot;`                                         |                       |                                | `true`                          |
| `userType`                       | `&amp;quot;Member&amp;quot;`                                       | `&amp;quot;Member&amp;quot;`            |                                | `Member`                        |
| `preferredLanguage`              | `undefined`                                      | `[preferredLanguage]` |                                | `en-US`                         |

If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why test user was skipped.

## Determine if user is in scope

The User `alice@fabrikam.com` will be skipped due to the following reasons: 1) This object is not assigned to the application. If you did not expect the object to be skipped, assign the object to the application or change your scoping filter to allow all users and groups to be in scope for provisioning. 2) This object does not have required entitlement for provisioning. If you did not expect the object to be skipped, update provisioning scope to &amp;#39;Sync all users and groups&amp;#39; or assign the object to the application with entitlement of provisioning category

| Attribute name                    | Attribute value                  |
|-----------------------------------|----------------------------------|
| `SkipReason`                      | `NotEffectivelyEntitled`         |
| `isActive`                        | `True`                           |
| `Assigned to the application`     | `False`                          |
| `isInProvisioningScope`           | `True`                           |

On the **Provision on demand** page, you can view details about the provision and have the option to retry.

## User

**US**  
**User1**  
user1@fabrikam.com

### 1. Import user
This step shows the user retrieved from the source system and the properties of the user in the source system.

![Success icon] Success | View details

### 2. Determine if user is in scope
This step shows the scoping conditions that were evaluated and which ones the user passed or failed.

![Success icon] Success | View details

### 3. Match user between source and target system
This step shows whether the user was found in the target system as well as the properties of the user in the target system.

![Success icon] Success | View details

### 4. Perform action
This step shows the action that was performed in the target application, such as creating a user or updating a user.

![Success icon] Success | View details

**[Retry]** **[Provision another object]**

6. In the target tenant, verify that the test user was provisioned.

| Display name | User principal name                               | User type | On-premises | Identities       | Company name  | Creation type     |
|--------------|---------------------------------------------------|-----------|-------------|------------------|---------------|-------------------|
| User1        | user1_fabrikam.com#EXT#@.onmicrosoft.com          | Member    | No          | ExternalAzureAD  |               | Invitation        |

7. If all is working as expected, assign additional users to the configuration.

For more information, see [On-demand provisioning in Microsoft Entra ID](#).

## Step 12: Start the provisioning job

## Source tenant

The provisioning job starts the initial synchronization cycle of all users defined in **Scope** of the **Settings** section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.

1. In the source tenant, browse to **Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization**.
2. Select **Configurations** and then select your configuration.
3. On the **Overview** page, review the provisioning details.
4. Select **Start provisioning** to start the provisioning job.

### &amp;lt;!-- Image reference points to missing/unhandled asset: ![Provisioning Details](Image url) --&amp;gt;
Current cycle status
Initial cycle not run.

0% complete

[View provisioning logs]

Statistics to date
- View provisioning details
- View technical information

## Step 13: Monitor provisioning

### Source and target tenants

Once you&amp;#39;ve started a provisioning job, you can monitor the status.

1. In the source tenant, on the **Overview** page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see [Check the status of user provisioning](URL).


If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see [Application provisioning in quarantine status](#).

![Provisioning Overview Screenshot](https://example.com/provisioning-overview)

1. Select **Provisioning logs** to determine which users have been provisioned successfully or unsuccessfully. By default, the logs are filtered by the service principal ID of the configuration. For more information, see [Provisioning logs in Microsoft Entra ID](#).

![Provisioning Logs Screenshot](https://example.com/provisioning-logs)

| Date/Time             | Identity                                     | Action | Source System       | Target System                         | Status  |
|-----------------------|----------------------------------------------|--------|---------------------|---------------------------------------|---------|
| 1/2/2024 6:18:47 PM   | Display Name User1&amp;lt;br&amp;gt;Source ID Target ID    | Update | Azure Active Directory | Azure Active Directory (target tenant) | Success |
| 1/2/2024 6:18:19 PM   | Display Name User2&amp;lt;br&amp;gt;Source ID Target ID    | Create | Azure Active Directory | Azure Active Directory (target tenant) | Success |
| 1/2/2024 6:18:19 PM   | Display Name User3&amp;lt;br&amp;gt;Source ID Target ID    | Update | Azure Active Directory | Azure Active Directory (target tenant) | Skipped |
| 1/2/2024 6:07:48 PM   | Display Name User4&amp;lt;br&amp;gt;Source ID Target ID    | Create | Azure Active Directory | Azure Active Directory (target tenant) | Success |
| 1/2/2024 6:07:48 PM   | Display Name User5&amp;lt;br&amp;gt;Source ID Target ID    | Create | Azure Active Directory | Azure Active Directory (target tenant) | Success |

2. Select **Audit logs** to view all logged events in Microsoft Entra ID. For more information, see [Audit logs in Microsoft Entra ID](#).

## 
You can also view audit logs in the target tenant.

1. In the target tenant, select Users &amp;gt; Audit logs to view logged events for user management.

## 
| Date | Service | Category | Activity | Status | Status reason | Target(s) | Initiated by |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1/2/2022, 6:41:24 PM  | Core Directory | UserManagement | Update user | Success | Success | user1@fabrikam.com | Microsoft System |
| 1/2/2022, 6:37:44 PM  | Invited Users | UserManagement | Redeem external user invite | Success | Success | user2@skarbo inc. | Azure AD B2B Collaboration |
| 1/2/2022, 6:37:44 PM  | Invited Users | UserManagement | Redeem external user invite | Success | Success | user2@skarbo inc. | Microsoft System |
| 1/2/2022, 6:36:07 PM  | Invited Users | UserManagement | Redeem external user invite | Error | Success | user3@contoso.com | Microsoft System |
| 1/2/2022, 6:34:12 PM  | Core Directory | UserManagement | Update user | Success | Success | user1@fabrikam.com | Microsoft 365 Admin Center |

## Step 14: Configure leave settings

### Target tenant

Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they’ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.

1. In the target tenant, browse to Identity &amp;gt; External Identities &amp;gt; External collaboration settings.

2. Under External user leave settings, choose whether to allow external users to leave your organization themselves.

## Troubleshooting tips

### Delete a configuration

Follows these steps to delete a configuration on the _Configurations_ page.

1. In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.
2. On the _Configurations_ page, add a check mark next to the configuration you want to delete.
3. Select _Delete_ and then _OK_ to delete the configuration.

&amp;lt;!-- Image reference had an empty URL in source and breaks the build: Cross-tenant synchronization screenshot --&amp;gt;

## Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure

When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
## Error code: AzureDirectoryB2BManagementPolicyCheckFailure
Details: Policy permitting auto-redemption of invitations not configured.

![Notification Image: Testing connection to Fabrikam. You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account. Error code: AzureDirectoryB2BManagementPolicyCheckFailure. Details: Policy permitting auto-redemption of invitations not configured. Request id: 16 minutes ago]

### Cause

This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.

### Solution

Follow the steps in [Step 3: Automatically redeem invitations in the target tenant](#) and [Step 4: Automatically redeem invitations in the source tenant](#).

### Symptom - Automatic redemption check box is disabled

When configuring cross-tenant synchronization, the **Automatic redemption** check box is disabled.

## Cause

Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.

## Solution

You must have Microsoft Entra ID P1 or P2 to configure trust settings.

### Symptom - Recently deleted user in the target tenant is not restored

After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.

#### Cause

Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.

#### Solution

Manually restore the soft-deleted user in the target tenant. For more information, see [Restore or remove a recently deleted user using Microsoft Entra ID](https://example-link).

### Symptom - Users are skipped because SMS sign-in is enabled on the user

Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecurityIds EQUALS &amp;#39;None&amp;#39;&amp;quot;

## Cause

If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.

## Solution

Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.

```powershell
###### Disable SMS Sign-in options for the users

#### Import module
Install-Module Microsoft.Graph.Users.Actions
Install-Module Microsoft.Graph.Identity.SignIns
Import-Module Microsoft.Graph.Users.Actions

Connect-MgGraph -Scopes &amp;quot;User.Read.All&amp;quot;, &amp;quot;Group.ReadWrite.All&amp;quot;, &amp;quot;UserAuthenticationMethod.Read.All&amp;quot;,&amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot;,&amp;quot;UserAuthenticationMethod.ReadWrite.All&amp;quot;

##### The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-87b9720928f7

$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;

#### Get the User Details

$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;

#### validate the value for SmsSignInState

$smssignin = Get-MgUserAuthenticationPhoneMethod -UserId $userId

{
    if($smssignin.SmsSignInState -eq &amp;quot;ready&amp;quot;){
    #### Disable Sms Sign-In for the user is set to ready
        Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId - 
        PhoneAuthenticationMethodId $phoneAuthenticationMethodId
        Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green
    }
    else{
        Write-Host &amp;quot;SMS sign-in status not set or found for the user &amp;quot; - 
        ForegroundColor Yellow
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h2&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see Configure external collaboration settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial: Reporting on automatic user account provisioning&lt;/li&gt;
&lt;li&gt;Managing user account provisioning for enterprise apps in the Azure portal&lt;/li&gt;
&lt;li&gt;What is single sign-on in Microsoft Entra ID?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article&lt;/strong&gt; • 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://learn.microsoft.com/images/logo.png&quot; alt=&quot;Source tenant&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source tenant&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Microsoft Entra ID P1 or P2 license. For more information, see &lt;a href=&quot;https://example.com&quot;&gt;License requirements&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://example.com&quot;&gt;Security Administrator&lt;/a&gt; role to configure cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://example.com&quot;&gt;Hybrid Identity Administrator&lt;/a&gt; role to configure cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Global Administrator role to consent to required permissions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Target tenant&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/microsoftgraph/installation&quot;&gt;Microsoft Graph PowerShell SDK&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/microsoft.graph.authentication/connect-mggraph&quot;&gt;Connect-MgGraph&lt;/a&gt; command to sign in to the target tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Policy.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.ReadWrite.CrossTenantAccess&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, use the &lt;a href=&quot;New-MgPolicyCrossTenantAccessPolicyPartner&quot;&gt;New-MgPolicyCrossTenantAccessPolicyPartner&lt;/a&gt; command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.&lt;/p&gt;
&lt;p&gt; If you get the error &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists&lt;/code&gt;, you might already have an existing configuration. For more information, see [Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.](Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;$Params = @{
    TenantId = $SourceTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;p&gt;AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
B2BCollaborationInbound     : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BCollaborationOutbound    : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectInbound     : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectOutbound    : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
IdentitySynchronization     : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity&lt;/p&gt;
&lt;h2&gt;SyncPolicyPartner&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;InboundTrust                       :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
IsServiceProvider                  :
TenantId                           : &amp;lt;SourceTenantId&amp;gt;
TenantRestrictions                 :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
AdditionalProperties               : {[odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration,
System.Collections.Generic.Dictionary`2[System.String,System.Object]], [protectedContentSharing, 
System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Invoke-MgGraphRequest command to enable user synchronization in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get an &lt;code&gt;Request_MultipleObjectsWithSameKeyValue&lt;/code&gt; error, you might already have an existing policy. For more information, see Symptom - Request_MultipleObjectsWithSameKeyValue error.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to verify &lt;code&gt;IsSyncAllowed&lt;/code&gt; is set to True.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/microsoft.graph.identity.signins/update-mgpolicycrosstenantaccesspolicypartner?view=graph-powershell-beta&quot;&gt;Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/a&gt; command to automatically redeem invitations and suppress consent prompts for inbound access.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$AutomaticUserConsentSettings = @{
    &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $sourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4: Sign in to the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start an instance of PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.graph.sdk.connect.connect-mggraph&quot;&gt;Connect-MgGraph&lt;/a&gt; command to sign in to the source tenant and consent to the following required permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Policy.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.ReadWrite.CrossTenantAccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Application.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Directory.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AuditLog.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;,&amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;,&amp;quot;Application.ReadWrite.All&amp;quot;,&amp;quot;Directory.ReadWrite.All&amp;quot;,&amp;quot;AuditLog.Read.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Source tenant&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the &lt;a href=&quot;https://learn.microsoft.com/powershell/module/microsoft.graph.sdk.policy.new-mgpolicycrosstenantaccesspolicy_partner&quot;&gt;New-MgPolicyCrossTenantAccessPolicyPartner&lt;/a&gt; command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists&lt;/code&gt;, you might already have an existing configuration. For more information, see &lt;a href=&quot;https://learn.microsoft.com/troubleshoot/access-control/policies/symptom-new-mgpolicycrosstenantaccesspolicypartner_create&quot;&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;$Params = @{&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;TenantId = $TargetTenantId
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List&lt;/p&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;AutomaticUserConsentSettings :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
B2BCollaborationInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BCollaborationOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
IdentitySynchronization :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner
InboundTrust :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
IsServiceProvider :
TenantId : &lt;TargetTenantId&gt;
TenantRestrictions :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
AdditionalProperties : @{[odata.context,
&lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity%5D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity]&lt;/a&gt;,
    [crossCloudMeetingConfiguration,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;System.Collections.Generic.Dictionary`2[System.String,System.Object ]], [protectedContentSharing,

System.Collections.Generic.Dictionary`2[System.String,System.Object ]]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Use the Update-MgPolicyCrossTenantAccessPolicyPartner command to automatically redeem invitations and suppress consent prompts for outbound access.&lt;/h2&gt;
&lt;h2&gt;Step 6: Create a configuration application in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$AutomaticUserConsentSettings = @{
    &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the &lt;a href=&quot;https://docs.microsoft.com/powershell/module/microsoft.graph.application/invoke-mginstantiateapplicationtemplate&quot;&gt;Invoke-MgInstantiateApplicationTemplate&lt;/a&gt; command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://docs.microsoft.com/powershell/module/microsoft.graph.application/get-mgserviceprincipal&quot;&gt;Get-MgServicePrincipal&lt;/a&gt; command to get the service principal ID and app role ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AccountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddIns&lt;/td&gt;
&lt;td&gt;{}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlternativeNames&lt;/td&gt;
&lt;td&gt;{}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDescription&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AppDisplayName&lt;/td&gt;
&lt;td&gt;Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;AppId              : &lt;AppId&gt;&lt;/h2&gt;
&lt;h2&gt;AppManagementPolicies :&lt;/h2&gt;
&lt;h2&gt;AppOwnerOrganizationId : &lt;AppOwnerOrganizationId&gt;&lt;/h2&gt;
&lt;h2&gt;AppRoleAssignedTo :&lt;/h2&gt;
&lt;h2&gt;AppRoleAssignmentRequired : True&lt;/h2&gt;
&lt;h2&gt;AppRoleAssignments :&lt;/h2&gt;
&lt;h2&gt;AppRoles : {&lt;AppRoleId&gt;}&lt;/h2&gt;
&lt;h2&gt;ApplicationTemplateId : 518e5f48-1fc8-4c48-9387-9fdf28b0fef7&lt;/h2&gt;
&lt;h2&gt;ClaimsMappingPolicies :&lt;/h2&gt;
&lt;h2&gt;CreatedObjects :&lt;/h2&gt;
&lt;h2&gt;CustomSecurityAttributes :&lt;/h2&gt;
&lt;h2&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttributeValue&lt;/h2&gt;
&lt;h2&gt;DelegatedPermissionClassifications :&lt;/h2&gt;
&lt;h2&gt;DeletedDateTime :&lt;/h2&gt;
&lt;h2&gt;Description :&lt;/h2&gt;
&lt;h2&gt;DisabledByMicrosoftStatus :&lt;/h2&gt;
&lt;h2&gt;DisplayName : Fabrikam&lt;/h2&gt;
&lt;h2&gt;Endpoints :&lt;/h2&gt;
&lt;h2&gt;ErrorUrl :&lt;/h2&gt;
&lt;h2&gt;FederatedIdentityCredentials :&lt;/h2&gt;
&lt;h2&gt;HomeRealmDiscoveryPolicies :&lt;/h2&gt;
&lt;h2&gt;Homepage :&lt;/h2&gt;
&lt;h2&gt;&lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync%7CISV9.1%7Cprimary%7Cz&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync|ISV9.1|primary|z&lt;/a&gt;&lt;/h2&gt;
&lt;h2&gt;Id : &lt;ServicePrincipalId&gt;&lt;/h2&gt;
&lt;h2&gt;Info :&lt;/h2&gt;
&lt;h2&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl&lt;/h2&gt;
&lt;h2&gt;KeyCredentials : {}&lt;/h2&gt;
&lt;h2&gt;LicenseDetails :&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;3. Initialize a variable for the service principal ID.&lt;/h3&gt;
&lt;p&gt;Be sure to use the service principal ID instead of the application ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$ServicePrincipalId = &amp;quot;&amp;lt;ServicePrincipalId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. Initialize a variable for the app role ID.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$AppRoleId= &amp;quot;&amp;lt;AppRoleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 7: Test the connection to the target tenant&lt;/h2&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    &amp;quot;useSavedCredentials&amp;quot; = $false
    &amp;quot;templateId&amp;quot; = &amp;quot;Azure2Azure&amp;quot;
    &amp;quot;credentials&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        }
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
    )
}
Invoke-MgGraphRequest -Method POST -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 8: Create a provisioning job in the source tenant&lt;/h2&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;In the source tenant, to enable provisioning, create a provisioning job.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;1. Determine the synchronization template to use, such as Azure2Azure.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A template has pre-configured synchronization settings.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In the source tenant, use the &lt;a href=&quot;https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/synchronizationjob_post&quot;&gt;New-MgServicePrincipalSynchronizationJob&lt;/a&gt; command to create a provisioning job based on a template.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;: &lt;JobId&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schedule&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SynchronizationJobSettings&lt;/td&gt;
&lt;td&gt;: {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TemplateId&lt;/td&gt;
&lt;td&gt;: Azure2Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;: [[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;ServicePrincipalId&gt;&amp;#39;)/synchronization/jobs/$entity]]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Initialize a variable for the job ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$JobId = &amp;quot;&amp;lt;JobId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: Save your credentials&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 10: Assign a user to the configuration&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the &lt;a href=&quot;#&quot;&gt;New-MgServicePrincipalAppRoleAssignedTo&lt;/a&gt; command to assign an internal user to the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    PrincipalId = &amp;quot;&amp;lt;PrincipalId&amp;gt;&amp;quot;
    ResourceId = $ServicePrincipalId
    AppRoleId = $AppRoleId
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AppRoleId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CreatedDateTime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalDisplayName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PrincipalType&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResourceDisplayName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResourceId&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Step 11: Test provision on demand&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;p&gt;PowerShell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/mgserviceprincipal/Get-MgServicePrincipalSynchronizationJobSchema&quot;&gt;Get-MgServicePrincipalSynchronizationJobSchema&lt;/a&gt; command to get the schema rule ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SynchronizationSchema = Get-MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
$SynchronizationSchema.SynchronizationRules | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ContainerFilter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Editable : True&lt;/h2&gt;
&lt;h2&gt;GroupFilter :&lt;/h2&gt;
&lt;h3&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroupFilter&lt;/h3&gt;
&lt;h2&gt;Id : &lt;RuleId&gt;&lt;/h2&gt;
&lt;h2&gt;Metadata : {defaultSourceObjectMappings, supportsProvisionOnDemand}&lt;/h2&gt;
&lt;h2&gt;Name : USER_INBOUND_USER&lt;/h2&gt;
&lt;h3&gt;ObjectMappings : {Provision Azure Active Directory Users, , , …}&lt;/h3&gt;
&lt;h2&gt;Priority : 1&lt;/h2&gt;
&lt;h2&gt;SourceDirectoryName : Azure Active Directory&lt;/h2&gt;
&lt;h2&gt;TargetDirectoryName : Azure Active Directory (target tenant)&lt;/h2&gt;
&lt;h2&gt;AdditionalProperties : {}&lt;/h2&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Initialize a variable for the rule ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$RuleId = &amp;quot;&amp;lt;RuleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://docs.microsoft.com/powershell/module/microsoft.graph.identity.signins/New-MgServicePrincipalSynchronizationJobOnDemand&quot;&gt;New-MgServicePrincipalSynchronizationJobOnDemand&lt;/a&gt; command to provision a test user on demand.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    Parameters = @(
        @{
            Subjects = @(
                @{
                    ObjectId = &amp;quot;&amp;lt;UserObjectId&amp;gt;&amp;quot;
                    ObjectTypeName = &amp;quot;User&amp;quot;
                }
            )
            RuleId = $RuleId
        }
    )
}

New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;| Key  | : |
|------| : --------------------------------------------------|
| Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo |
| Value  | : [{&amp;quot;provisioningSteps&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;EntryImport&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Import&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;Success&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Retrieved User&lt;/p&gt;
&lt;h2&gt;Step 12: Start the provisioning job&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is configured, in the source tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.serviceprincipal/start-mgserviceprincipalsynchronizationjob?view=graph-powershell-1.0&quot;&gt;Start-MgServicePrincipalSynchronizationJob&lt;/a&gt; command to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is running, in the source tenant, use the &lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.serviceprincipal/get-mgserviceprincipalsynchronizationjob?view=graph-powershell-1.0&quot;&gt;Get-MgServicePrincipalSynchronizationJob&lt;/a&gt; command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Id                      : &amp;lt;JobId&amp;gt;
Schedule                : 
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule
Schema                  :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema
Status                  :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus
SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}
TemplateId              : Azure2Azure
AdditionalProperties    : {@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(&amp;#39;&amp;lt;ServicePrincipalId&amp;gt;&amp;#39;)/synchronization/jobs/$entity}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;In addition to monitoring the status of the provisioning job, use the Get-MgAuditLogProvisioning command to retrieve the provisioning logs and get all the provisioning events that occur. For example, query for a particular user and determine if they were successfully provisioned.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ActivityDateTime        : 7/31/2023 12:08:17 AM
ActivityDisplayName     : Export
AdditionalDetails       : {Details, ErrorCode, EventName, ipaddr...}
Category                : ProvisioningManagement
CorrelationId           : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
Id                      : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778479
InitiatedBy             : 
Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1
LoggedByService         : Account Provisioning
OperationType           :
Result                  : success
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Activity Date/Time: 7/31/2023 12:08:17 AM&lt;/h2&gt;
&lt;h3&gt;Activity Display Name: Export&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Additional Details&lt;/strong&gt;: {Details, ErrorCode, EventName, ipaddr...}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: Provisioning Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlation Id&lt;/strong&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id&lt;/strong&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778264&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initiated By&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logged By Service&lt;/strong&gt;: Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operation Type&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;: success&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result Reason&lt;/strong&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target Resources&lt;/strong&gt;: {{ServicePrincipalId, }}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Properties&lt;/strong&gt;: {}&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Activity Date/Time: 7/31/2023 12:08:17 AM&lt;/h2&gt;
&lt;h3&gt;Activity Display Name: Synchronization rule action&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Additional Details&lt;/strong&gt;: {Details, ErrorCode, EventName, ipaddr...}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: Provisioning Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlation Id&lt;/strong&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id&lt;/strong&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778395&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initiated By&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logged By Service&lt;/strong&gt;: Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operation Type&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;: success&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result Reason&lt;/strong&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant))&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target Resources&lt;/strong&gt;: {{ServicePrincipalId, }}&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional Properties&lt;/strong&gt;: {}&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;h2&gt;Symptom - Insufficient privileges error&lt;/h2&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/h2&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;#&quot;&gt;Get-MgPolicyCrossTenantAccessPolicyPartner&lt;/a&gt; command to list the existing object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing object, you might need to make an update using &lt;a href=&quot;#&quot;&gt;Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Symptom - Request_MultipleObjectsWithSameKeyValue error&lt;/h2&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invoke-MgGraphRequest: PUT https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&amp;lt;sourceTenantId&amp;gt;/identitySynchronization
HTTP/1.1 409 Conflict
...
{&amp;quot;error&amp;quot;:{&amp;quot;code&amp;quot;:&amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,&amp;quot;details&amp;quot;:[{&amp;quot;code&amp;quot;:&amp;quot;ConflictingObjects&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;A conflicting object with one or more of the specified property values is present in the directory.&amp;quot;,...
}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;a href=&quot;#&quot;&gt;Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;/a&gt; command to list the &lt;code&gt;IsSyncAllowed&lt;/code&gt; setting.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an existing policy, you might need to make an update using &lt;a href=&quot;#&quot;&gt;Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization&lt;/a&gt; command to enable user synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $sourceTenantId -BodyParameter $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra synchronization API overview&lt;/li&gt;
&lt;li&gt;Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Article • 01/18/2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h2&gt;Scoping filter use cases&lt;/h2&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outbound provisioning from Microsoft Entra ID to SaaS applications.&lt;/strong&gt; When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;h3&gt;Tip&lt;/h3&gt;
&lt;p&gt;The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory.&lt;/strong&gt; When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, Microsoft Entra provisioning connectors don&amp;#39;t have any attribute-based scoping filters configured.&lt;/p&gt;
&lt;h2&gt;Scoping filter construction&lt;/h2&gt;
&lt;p&gt;A scoping filter consists of one or more clauses. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;p&gt;As an example, consider the following scoping filter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Source Object Query:
Scoping Filter Group: 
New York Engineering

TARGET ATTRIBUTE | OPERATOR   | VALUE
----------------|-------------|-------------
city            | EQUALS      | New York
department      | EQUALS      | Engineering
employeeID      | REGEX MATCH | ([0-9]{3}-[0-9]{3}-[0-9]{3}-[0-9]{3})
jobTitle        | IS NOT NULL |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;They must be in New York.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They must work in the Engineering department.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their company employee ID must be between 1,000,000 and 2,000,000.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their job title must not be null or empty.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Create scoping filters&lt;/h2&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for &lt;a href=&quot;#&quot;&gt;one of the supported applications&lt;/a&gt; and are adding a scoping filter to it.&lt;/p&gt;
&lt;h3&gt;Create a scoping filter&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 Tip&lt;br&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the &lt;a href=&quot;#&quot;&gt;Microsoft Entra admin center&lt;/a&gt; as at least a &lt;a href=&quot;#&quot;&gt;Application Administrator&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to &lt;strong&gt;Identity&lt;/strong&gt; &amp;gt; &lt;strong&gt;Applications&lt;/strong&gt; &amp;gt; &lt;strong&gt;Enterprise applications&lt;/strong&gt; &amp;gt; &lt;strong&gt;All applications&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;strong&gt;Provisioning&lt;/strong&gt; tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Mappings&lt;/strong&gt; section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;strong&gt;Source object scope&lt;/strong&gt; menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Add scoping filter&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define a clause by selecting a source &lt;strong&gt;Attribute Name&lt;/strong&gt;, an &lt;strong&gt;Operator&lt;/strong&gt;, and an &lt;strong&gt;Attribute Value&lt;/strong&gt; to match against. The following operators are supported:&lt;/p&gt;
&lt;p&gt;a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/p&gt;
&lt;p&gt;b. !&amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;c. ENDS_WITH&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;h2&gt;d. EQUALS&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;h2&gt;e. Greater_Than&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;h2&gt;f. Greater_Than_OR_EQUALS&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;h2&gt;g. Includes&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described here.&lt;/p&gt;
&lt;h2&gt;h. IS FALSE&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;h2&gt;i. IS NOT NULL&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;h2&gt;j. IS NULL&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;h2&gt;k. IS TRUE&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;h2&gt;l. NOT EQUALS&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;h2&gt;m. NOT REGEX MATCH&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;h2&gt;n. REGEX MATCH&lt;/h2&gt;
&lt;p&gt;Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: &lt;code&gt;([1-9][0-9])&lt;/code&gt; matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Important&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IsMemberOf filter is not supported currently.&lt;/li&gt;
&lt;li&gt;The members attribute on a group is not supported currently.&lt;/li&gt;
&lt;li&gt;Filtering is not supported for multi-valued attributes.&lt;/li&gt;
&lt;li&gt;Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Common scoping filters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with &lt;code&gt;userPrincipal&lt;/code&gt; that have the domain &lt;code&gt;@domain.com&lt;/code&gt; are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with &lt;code&gt;userPrincipal&lt;/code&gt; that has the domain &lt;code&gt;@domain.com&lt;/code&gt; are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9][0-9][0-9][0-9] [0-9][0-9])&lt;/td&gt;
&lt;td&gt;All employees with &lt;code&gt;workerID&lt;/code&gt; between 1000000 and 2000000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Related articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Automate user provisioning and deprovisioning to SaaS applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Customize attribute mappings for user provisioning&lt;/h2&gt;
&lt;h2&gt;Write expressions for attribute mappings&lt;/h2&gt;
&lt;h2&gt;Account provisioning notifications&lt;/h2&gt;
&lt;h2&gt;Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/h2&gt;
&lt;h2&gt;List of tutorials on how to integrate SaaS apps&lt;/h2&gt;
&lt;h2&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article • 10/23/2023&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h3&gt;Configure accidental deletion prevention&lt;/h3&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a href=&quot;https://entra.microsoft.com&quot;&gt;Microsoft Entra admin center&lt;/a&gt; as at least a &lt;a href=&quot;https://entra.microsoft.com&quot;&gt;Application Administrator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning and then on the provisioning page select Edit provisioning.&lt;ol&gt;
&lt;li&gt;Under Settings, select the Prevent accidental deletions check box and specify a deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the Notification Email address is completed. If the deletion threshold is met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select Save to save the changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. To learn more about quarantine behavior, see &lt;a href=&quot;https://entra.microsoft.com/quarantine&quot;&gt;Application provisioning in quarantine status&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Recovering from an accidental deletion&lt;/h3&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says &lt;code&gt;Provisioning has been quarantined. See quarantine details for more information&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can click either Allow deletes or View provisioning logs.&lt;/p&gt;
&lt;h2&gt;Allowing deletions&lt;/h2&gt;
&lt;p&gt;The Allow deletes action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Allow deletes.&lt;/li&gt;
&lt;li&gt;Click Yes on the confirmation to allow the deletions.&lt;/li&gt;
&lt;li&gt;View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Rejecting deletions&lt;/h2&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/li&gt;
&lt;li&gt;Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/li&gt;
&lt;li&gt;Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test deletion prevention&lt;/h2&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h2&gt;Common deprovisioning scenarios to test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Delete a user / put them into the recycle bin.&lt;/li&gt;
&lt;li&gt;Block sign in for a user.&lt;/li&gt;
&lt;li&gt;Unassign a user or group from the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;What scenarios count toward the deletion threshold?&lt;/h3&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h3&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h3&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the “circuit breaker” isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h3&gt;How are these deletion events logged?&lt;/h3&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven’t due to the deletion threshold. Navigation to &lt;strong&gt;Provisioning logs&lt;/strong&gt; and then filter &lt;strong&gt;Action&lt;/strong&gt; with &lt;strong&gt;StagedAction&lt;/strong&gt; or &lt;strong&gt;StagedDelete&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;How application provisioning works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;Plan an application provisioning deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was this page helpful?&lt;/strong&gt; &lt;a href=&quot;&quot;&gt;👍 Yes&lt;/a&gt; &lt;a href=&quot;&quot;&gt;👎 No&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Provide product feedback&lt;/h2&gt;
&lt;h2&gt;Get help at Microsoft Q&amp;amp;A&lt;/h2&gt;
&lt;h2&gt;On-demand provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article • 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshoot configuration issues quickly.&lt;/li&gt;
&lt;li&gt;Validate expressions that you&amp;#39;ve defined.&lt;/li&gt;
&lt;li&gt;Test scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to use on-demand provisioning&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;&lt;br&gt;Steps in this article may vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the &lt;a href=&quot;https://entra.microsoft.com&quot;&gt;Microsoft Entra admin center&lt;/a&gt; as at least an &lt;a href=&quot;https://docs.microsoft.com/azure/active-directory/roles/permissions-reference#application-administrator&quot;&gt;Application Administrator&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to &lt;strong&gt;Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt;&lt;/strong&gt; select your application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure provisioning by providing your admin credentials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provision on demand&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Note&lt;/strong&gt;&lt;br&gt;For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &amp;quot;WorkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in Workday. For SuccessFactors scenario, please provide &amp;quot;personIdExternal&amp;quot; of the user in SuccessFactors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Provision&lt;/strong&gt; at the bottom of the page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Understand the provisioning steps&lt;/h2&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h3&gt;Step 1: Test connection&lt;/h3&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the tutorial list.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the matching attributes defined in the &lt;strong&gt;Attribute mappings&lt;/strong&gt; pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/li&gt;
&lt;li&gt;For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 2: Import user&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluate whether the user is in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Check the target system for an existing user.&lt;/li&gt;
&lt;li&gt;Determine what user attributes to export to the target system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;View details&lt;/strong&gt; section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;ul&gt;
&lt;li&gt;Update the user object with a value for the matching attribute.&lt;/li&gt;
&lt;li&gt;Change the matching attribute in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/li&gt;
&lt;li&gt;Make sure that the &lt;strong&gt;Attribute mapping&lt;/strong&gt; page of your provisioning configuration contains the attribute that you expect.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Determine if user is in scope&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the user is assigned to the application.&lt;/li&gt;
&lt;li&gt;Whether scope is set to Sync assigned or Sync all.&lt;/li&gt;
&lt;li&gt;The scoping filters defined in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;h2&gt;The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Active in source system&lt;/strong&gt; indicates that the user has the property &lt;code&gt;IsActive&lt;/code&gt; set to true in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assigned to application&lt;/strong&gt; indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope sync all&lt;/strong&gt; indicates that the scope setting allows all users and groups in the tenant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User has required role&lt;/strong&gt; indicates that the user has the necessary roles to be provisioned into the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scoping filters&lt;/strong&gt; are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/li&gt;
&lt;li&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 4: Match user between source and target&lt;/h2&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;View details&lt;/strong&gt; page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If no users are matched in the target system, no properties are shown.&lt;/li&gt;
&lt;li&gt;If one user matches in the target system, the properties of that user are shown.&lt;/li&gt;
&lt;li&gt;If multiple users match, the properties of both users are shown.&lt;/li&gt;
&lt;li&gt;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The provisioning service might not be able to match a user in the source system uniquely with a user in the target. Resolve this problem by ensuring that the matching attribute is unique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that the target system supports filtering on the attribute that&amp;#39;s defined as the matching attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 5: Perform action&lt;/h2&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Perform action screen](image_url) --&gt;

&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;View details&lt;/strong&gt; section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Failures for exporting changes can vary greatly. Check the &lt;a href=&quot;link_to_docs&quot;&gt;documentation for provisioning logs&lt;/a&gt; for common failures.&lt;/li&gt;
&lt;li&gt;On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do you need to turn provisioning off to use on-demand provisioning?&lt;/strong&gt; For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on-demand provisioning for all applications without having to stop provisioning jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How long does on-demand provisioning take?&lt;/strong&gt; On-demand provisioning typically takes less than 30 seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Known limitations&lt;/h2&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your &lt;a href=&quot;#&quot;&gt;suggestions and feedback&lt;/a&gt; so we can better determine what improvements to make next.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning of roles isn&amp;#39;t supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Troubleshooting provisioning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was this page helpful?&lt;/strong&gt;&lt;/p&gt;
&lt;!-- Removed invalid image-link placeholders that break builds: [&lt;!-- Image reference points to missing/unhandled asset: ![Yes](#) --&gt;][&lt;!-- Image reference points to missing/unhandled asset: ![No](#) --&gt;] --&gt;

&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Provide product feedback&lt;/a&gt; &amp;#124; &lt;a href=&quot;#&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What are the Microsoft Entra user provisioning logs?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Article • 01/25/2024&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sign-ins&lt;/strong&gt; - Information about sign-ins and how your resources are used by your users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit&lt;/strong&gt; - Information about changes applied to your tenant such as users and group management or updates applied to your tenant’s resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h2&gt;License and role requirements&lt;/h2&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the &lt;a href=&quot;https://learn.microsoft.com/en-us/security/zero-trust/overview&quot;&gt;Zero Trust guidance&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader Security Reader Security Administrator Global Reader A custom role with &lt;code&gt;AuditLogsRead&lt;/code&gt; or &lt;code&gt;CustomSecAuditLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader Security Reader Security Administrator Global Reader A custom role with &lt;code&gt;SignInLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus Security Operator Application Administrator Cloud App Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Log / Report | Roles | Licenses&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A custom role with permission&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ProvisioningLogsRead&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage and insights&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Reports Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Protection*&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with permission&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IdentityRiskEventReadWrite&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph activity logs&lt;/td&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;A custom role with permission&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ListKeys&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the [license requirements for Identity Protection](https://&lt;license requirements link&gt;).&lt;/p&gt;
&lt;h3&gt;What can you do with the provisioning logs?&lt;/h3&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What groups were successfully created in ServiceNow?&lt;/li&gt;
&lt;li&gt;What users were successfully removed from Adobe?&lt;/li&gt;
&lt;li&gt;What users from Workday were successfully created in Active Directory?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;What do the logs show?&lt;/h3&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steps&lt;/strong&gt;: This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;◦ Import the object.
◦ Match the object between source and target.
◦ Determine if the object is in scope.
◦ Evaluate the object before synchronization.
◦ Provision the object (create, update, delete, or disable).&lt;/p&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Troubleshooting &amp;amp; Recommendations&lt;/th&gt;
&lt;th&gt;Modified Properties&lt;/th&gt;
&lt;th&gt;Summary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1.&lt;/td&gt;
&lt;td&gt;Import User from Azure Active Directory ✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.&lt;/td&gt;
&lt;td&gt;Determine if User is in scope ✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.&lt;/td&gt;
&lt;td&gt;Match User between Azure Active Directory and Box ✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.&lt;/td&gt;
&lt;td&gt;Provision User in Box ✔&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;EntryExportAdd&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Result&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User &amp;#39;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;#39; was created in Box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ReportableIdentifier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Troubleshooting &amp;amp; Recommendations&lt;/strong&gt;: If there was an error, this tab provides the error code and reason.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modified Properties&lt;/strong&gt;: If there were changes, this tab shows the old value and the new value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summary&lt;/strong&gt;: Provides an overview of what happened and identifiers for the object in the source and target systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Map directory extensions in cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article • 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. &lt;a href=&quot;#&quot;&gt;Custom security attributes&lt;/a&gt; are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Hybrid Identity Administrator&lt;/a&gt; role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Cloud Application Administrator&lt;/a&gt; or &lt;a href=&quot;#&quot;&gt;Application Administrator&lt;/a&gt; role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Create directory extensions&lt;/h3&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see &lt;a href=&quot;#&quot;&gt;Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Map directory extensions&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a href=&quot;#&quot;&gt;Microsoft Entra admin center&lt;/a&gt; of the source tenant.&lt;/li&gt;
&lt;li&gt;Browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabrikam to Contoso | Provisioning&lt;/h2&gt;
&lt;h3&gt;Admin Credentials&lt;/h3&gt;
&lt;h3&gt;Mappings&lt;/h3&gt;
&lt;p&gt;Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Restore default mappings&lt;/p&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;p&gt;Provisioning Status: On&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom of the page and select &lt;strong&gt;Add new mapping&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Attribute&lt;/th&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Add New Mapping&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Source attribute&lt;/strong&gt; drop-down list, select a source attribute.&lt;/p&gt;
&lt;p&gt; If you created a directory extension in the source tenant, select the directory extension.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Edit Attribute&lt;/h2&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mapping type&lt;/th&gt;
&lt;th&gt;Direct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source attribute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;employeeHireDate&lt;/li&gt;
&lt;li&gt;employeeid&lt;/li&gt;
&lt;li&gt;employeeLeaveDateTime&lt;/li&gt;
&lt;li&gt;employeeOrgData.costCenter&lt;/li&gt;
&lt;li&gt;employeeOrgData.division&lt;/li&gt;
&lt;li&gt;employeeType&lt;/li&gt;
&lt;li&gt;testExtension (extension_c4d42adc1dd4f3f29f29428de653397_testExtension)&lt;/li&gt;
&lt;li&gt;extensionAttribute1&lt;/li&gt;
&lt;li&gt;extensionAttribute10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;If the directory extension isn’t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Target attribute&lt;/strong&gt; drop-down list, select a target attribute.&lt;/p&gt;
&lt;p&gt; If you created a directory extension in the target tenant, select the directory extension.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Ok&lt;/strong&gt; to save the mapping.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Manually add directory extensions to the attribute list&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;If your directory extension wasn’t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true&quot;&gt;https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;Browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom and select the &lt;strong&gt;Show advanced settings&lt;/strong&gt; check box.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;th&gt;userPrincipalName&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Supported Attributes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit attribute list for Microsoft Entra ID&lt;/li&gt;
&lt;li&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;Use the expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. Review your schema here.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;⚠️ **Tip**

If you don&amp;#39;t see the **Edit attribute list** links, be sure that you are signed in to the Microsoft Entra admin center using the link in Step 1.
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created a directory extension in the source tenant, select the &lt;strong&gt;Edit attribute list for Microsoft Entra ID&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created an extension in the target tenant, select the &lt;strong&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the directory extension and select the appropriate options.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Manually add directory extensions by editing the schema&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema by using the schema editor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;6. Scroll to the bottom and select the &lt;strong&gt;Show advanced settings&lt;/strong&gt; check box.&lt;/h2&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Attribute Mapping](image.png) --&gt;

&lt;h2&gt;7. Select the &lt;strong&gt;Review your schema here&lt;/strong&gt; link to open the &lt;strong&gt;Schema editor&lt;/strong&gt; page.&lt;/h2&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Schema editor](image.png) --&gt;

&lt;h2&gt;8. Download an original copy of the schema as a backup.&lt;/h2&gt;
&lt;h2&gt;9. Modify the schema following your required configuration.&lt;/h2&gt;
&lt;h2&gt;10. Select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/h2&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the &lt;strong&gt;Attribute mappings&lt;/strong&gt; page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com&quot;&gt;Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h3&gt;Syntax overview&lt;/h3&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: &lt;code&gt;FunctionName(&amp;lt;argument 1&amp;gt;, &amp;lt;argument N&amp;gt;)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can nest functions within each other. For example: &lt;code&gt;FunctionOne(FunctionTwo(&amp;lt;argument1&amp;gt;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can pass three different types of arguments into functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example: &lt;code&gt;[attributeName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example: &lt;code&gt;&amp;quot;United States&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: &lt;code&gt;FunctionOne(&amp;lt;argument1&amp;gt;, FunctionTwo(&amp;lt;argument2&amp;gt;))&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For string constants, if you need a backslash (&lt;code&gt;\&lt;/code&gt;) or quotation mark (&lt;code&gt;&amp;quot;&lt;/code&gt;) in the string, it must be escaped with the backslash (&lt;code&gt;\&lt;/code&gt;) symbol. For example: &lt;code&gt;Company name: \&amp;quot;Contoso\&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;List of Functions&lt;/h2&gt;
&lt;p&gt;Append&lt;br&gt;AppRoleAssignmentsComplex&lt;br&gt;BitAnd&lt;br&gt;CBool&lt;br&gt;CDate&lt;br&gt;Coalesce&lt;br&gt;ConvertToBase64&lt;br&gt;ConvertToUTF8Hex&lt;br&gt;Count&lt;br&gt;CStr&lt;br&gt;DateAdd&lt;br&gt;DateDiff&lt;br&gt;DateFromNum&lt;br&gt;FormatDateTime&lt;br&gt;Guid&lt;br&gt;IgnoreFlowIfNullOrEmpty&lt;br&gt;IIF&lt;br&gt;InStr&lt;br&gt;IsNull&lt;br&gt;IsNullOrEmpty&lt;br&gt;IsPresent&lt;br&gt;IsString&lt;br&gt;Item&lt;br&gt;Join&lt;br&gt;Left&lt;br&gt;Mid&lt;br&gt;NormalizeDiacritics&lt;br&gt;Not&lt;br&gt;Now&lt;br&gt;NumFromDate&lt;br&gt;PCase&lt;br&gt;RandomString&lt;br&gt;Redact&lt;br&gt;RemoveDuplicates&lt;br&gt;Replace&lt;br&gt;SelectUniqueValue&lt;br&gt;SingleAppRoleAssignment&lt;br&gt;Split&lt;br&gt;StripSpaces&lt;br&gt;Switch&lt;br&gt;ToLower&lt;br&gt;ToUpper&lt;br&gt;Word&lt;/p&gt;
&lt;h2&gt;Append&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Append(source, suffix)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Append constant suffix to user name&lt;/h3&gt;
&lt;p&gt;Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Append([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com.test&quot;&gt;John.Doe@contoso.com.test&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AppRoleAssignmentsComplex&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; AppRoleAssignmentsComplex([appRoleAssignments])&lt;/p&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;Used to configure multiple roles for a user. For detailed usage, see &lt;a href=&quot;https://example.com&quot;&gt;Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;BitAnd&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;BitAnd(value1, value2)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/li&gt;
&lt;li&gt;1 - if both of the corresponding bits are 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;BitAnd(&amp;amp;HF, &amp;amp;HF7)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so &lt;code&gt;BitAnd&lt;/code&gt; returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;CBool(Expression)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; CBool returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then CBool returns True, else it returns False.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;CBool([attribute1] = [attribute2])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;h2&gt;CDate&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt;
&lt;code&gt;CDate(expression)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;
The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as FormatDateTime and DateAdd.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Remarks:&lt;/strong&gt;
The returned string is always in UTC and follows the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;
&lt;code&gt;CDate([StatusHireDate])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 2:&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CDate(&amp;quot;2021-06-30+08:00&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; &amp;quot;2021-06-30+08:00&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3:&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coalesce&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Coalesce(source1, source2, ..., defaultValue)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when all source values are NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;p&gt;Example: You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Coalesce([mail],[userPrincipalName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (mail): NULL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ConvertToBase64&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: ConvertToBase64(source)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The ConvertToBase64 function converts a string to a Unicode base64 string.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABlAGwAbABvACAAdwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h2&gt;ConvertToUTF8Hex&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: ConvertToUTF8Hex(source)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns &amp;quot;48656c6c6f20776f726c6421&amp;quot;&lt;/p&gt;
&lt;p&gt;Example: &lt;code&gt;ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h2&gt;Count&lt;/h2&gt;
&lt;h3&gt;Function: Count(attribute)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The Count function returns the number of elements in a multi-valued attribute&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that will have elements counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;CStr&lt;/h2&gt;
&lt;h3&gt;Function: CStr(value)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The CStr function converts a value to a string data type.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;CStr([dn])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;h2&gt;DateAdd&lt;/h2&gt;
&lt;h2&gt;Function:&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DateAdd(interval, value, dateTime)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Description:&lt;/h2&gt;
&lt;p&gt;Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below this table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTime&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;interval&lt;/strong&gt; string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 1: Generate a date value based on incoming StatusHireDate from Workday&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;dateTime (value of variable StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Add 7 days to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get a date ten days prior to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two weeks to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;ww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add ten months to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add two years to hire date&lt;/td&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;DateDiff&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DateDiff(interval, date1, date2)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;This function uses the &lt;code&gt;interval&lt;/code&gt; parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a positive number if &lt;code&gt;date2 &amp;gt; date1&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;a negative number if &lt;code&gt;date2 &amp;lt; date1&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;0 if &lt;code&gt;date2 == date1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;interval&lt;/code&gt; string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 1: Compare current date with hire date from Workday with different intervals&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Positive difference in days between&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative difference in days between&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in weeks between two dates&lt;/td&gt;
&lt;td&gt;ww&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in months between two dates&lt;/td&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in years between two dates&lt;/td&gt;
&lt;td&gt;yyyy&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference when both dates are same&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in hours between two dates&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in minutes between two dates&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difference in seconds between two dates&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example 2: Combine DateDiff with IIF function to set attribute value&lt;/h3&gt;
&lt;p&gt;If an account is Active in Workday, set the &lt;code&gt;accountEnabled&lt;/code&gt; attribute of the user to True only if hire date is within the next five days.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Switch([Active],,
&amp;quot;1&amp;quot;, IIF(DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate])) &amp;gt; 5, &amp;quot;False&amp;quot;,
&amp;quot;True&amp;quot;),
&amp;quot;0&amp;quot;, &amp;quot;False&amp;quot;)

## DateFromNum

**Function:** DateFromNum(value)

**Description:** The DateFromNum function converts a value in AD&amp;#39;s date format to a DateTime type.

**Parameters:**

| Name  | Required/ Repeating | Type | Notes                                     |
|-------|----------------------|------|-------------------------------------------|
| value | Required             | Date | AD Date to be converted to DateTime type |

**Example:** `DateFromNum([lastLogonTimestamp])`

`DateFromNum(129699324000000000)`

Returns a DateTime representing January 1, 2012 at 11:00PM.

## FormatDateTime

**Function:** FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)

**Description:** Takes a date string from one format and converts it into a different format.

**Parameters:**

| Name           | Required/ Repeating | Type   | Notes                                                                                  |
|----------------|----------------------|--------|----------------------------------------------------------------------------------------|
| source         | Required             | String | Usually name of the attribute from the source object.                                   |
| dateTimeStyles | Optional             | String | Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is |
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;inputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Expected format of the source value. For supported formats, see .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputFormat&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Format of the output date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Output date as a string in a certain format&lt;/h2&gt;
&lt;p&gt;Example: You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;h3&gt;Expression:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;FormatDateTime([extensionAttribute1], ,&amp;quot;yyyyMMddHHmmss.fZ&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (extensionAttribute1): &amp;quot;20150123105347.1Z&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;2015-01-23&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Guid&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Guid()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The function Guid generates a new random GUID&lt;/p&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Guid()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;h2&gt;IgnoreFlowIfNullOrEmpty&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; IgnoreFlowIfNullOrEmpty(expression)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example 1: Don&amp;#39;t flow an attribute if it is null&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;IgnoreFlowIfNullorEmpty([department])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;h3&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s say the SuccessFactors attribute &lt;code&gt;prefix&lt;/code&gt; is mapped to the on-premises Active Directory attribute &lt;code&gt;personalTitle&lt;/code&gt; using the following expression mapping:
&lt;code&gt;IgnoreFlowIfNullorEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr.&amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The above expression first evaluates the &lt;code&gt;Switch&lt;/code&gt; function. If the &lt;code&gt;prefix&lt;/code&gt; attribute doesn&amp;#39;t have any of the values listed within the &lt;code&gt;Switch&lt;/code&gt; function, then &lt;code&gt;Switch&lt;/code&gt; will return an empty string and the attribute &lt;code&gt;personalTitle&lt;/code&gt; will not be included in the provisioning flow to on-premises Active Directory.&lt;/p&gt;
&lt;h2&gt;IIF&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; IIF(condition,valueIfTrue,valueIfFalse)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valueIfTrue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Name | Required/ Repeating | Type | Notes&lt;/h2&gt;
&lt;p&gt;--- | --- | --- | ---
valueIfFalse | Required | Variable or String | If the condition evaluates to false, the returned value.&lt;/p&gt;
&lt;p&gt;The following comparison operators can be used in the &lt;em&gt;condition&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Equal to (=) and not equal to (&amp;lt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;Greater than (&amp;gt;) and greater than equal to (&amp;gt;=)&lt;/li&gt;
&lt;li&gt;Less than (&amp;lt;) and less than equal to (&amp;lt;=)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example: Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute. &lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;,[country],[department])&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Known limitations&lt;/h2&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For information about troubleshooting user creation issues, see &lt;a href=&quot;#&quot;&gt;Creation fails due to null / empty values&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IIF function currently doesn&amp;#39;t support AND and OR logical operators.&lt;/li&gt;
&lt;li&gt;To implement AND logic, use nested IIF statement chained along the trueValue path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. &lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;,IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;,&amp;quot;False&amp;quot;),&amp;quot;False&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To implement OR logic, use nested IIF statement chained along the falseValue path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;. &lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;,&amp;quot;True&amp;quot;,IIF([state]=&amp;quot;CA&amp;quot;,&amp;quot;True&amp;quot;,&amp;quot;False&amp;quot;))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If the source attribute used within the IIF function is empty or null, the condition check fails.&lt;ul&gt;
&lt;li&gt;Unsupported IIF expression examples:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;IIF([country]=&amp;quot;&amp;quot;,&amp;quot;Other&amp;quot;,[country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF(IsNullOrEmpty([country]),&amp;quot;Other&amp;quot;,[country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF(IsPresent([country]),[country],&amp;quot;Other&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Recommended workaround: Use the Switch function to check for empty/null values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present, pass the country attribute value to target attribute.&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Switch([country],[country],&amp;quot;&amp;quot;,&amp;quot;Other&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;InStr&lt;/h2&gt;
&lt;h2&gt;Function: InStr(value1, value2, start, compareType)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The InStr function finds the first occurrence of a substring in a string&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compareType&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-vb&quot;&gt;InStr(&amp;quot;The quick brown fox&amp;quot;,&amp;quot;quick&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluates to 5&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vb&quot;&gt;InStr(&amp;quot;repEated&amp;quot;,&amp;quot;e&amp;quot;,3,vbBinaryCompare)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Evaluates to 7&lt;/p&gt;
&lt;h2&gt;Function: IsNull(Expression)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-vb&quot;&gt;IsNull([displayName])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;h2&gt;Function: IsNullOrEmpty(Expression)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;IsNullOrEmpty([displayName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h2&gt;IsPresent&lt;/h2&gt;
&lt;h3&gt;Function: IsPresent(Expression)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;code&gt;Switch(IsPresent([directManager]),[directManager], IsPresent([skiplevelManager]),[skiplevelManager], IsPresent([director]),[director])&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;IsString&lt;/h2&gt;
&lt;h3&gt;Function: IsString(Expression)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; If the expression can be evaluated to a string type, then the IsString function evaluates to True.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Item&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Item(attribute, index)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The Item function returns one item from a multi-valued string/attribute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: 
&lt;code&gt;Item([proxyAddresses], 1)&lt;/code&gt; returns the first item in the multi-valued attribute. Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h2&gt;Join&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Join(separator, source1, source2, ...)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Join() is similar to Append(), except that it can combine multiple &lt;strong&gt;source&lt;/strong&gt; string values into a single string, and each value will be separated by a &lt;strong&gt;separator&lt;/strong&gt; string.&lt;/p&gt;
&lt;p&gt;If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Name&lt;/h2&gt;
&lt;h3&gt;Required/Repeating&lt;/h3&gt;
&lt;h3&gt;Type&lt;/h3&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;p&gt;source1 ... sourceN | Required, variable-number of times | String | String values to be joined together.&lt;/p&gt;
&lt;h2&gt;Left&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Left(String, NumChars)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The Left function returns a specified number of characters from the left of a string. If numChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in numChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;h2&gt;Name&lt;/h2&gt;
&lt;h3&gt;Required/Repeating&lt;/h3&gt;
&lt;h3&gt;Type&lt;/h3&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;p&gt;String | Required | Attribute | The string to return characters from
NumChars | Required | Integer | A number identifying the number of characters to return from the beginning (left) of string&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: &lt;code&gt;Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Mid&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Mid(source, start, length)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:&lt;/p&gt;
&lt;h2&gt;Source and Substring&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;NormalizeDiacritics&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;NormalizeDiacritics(source)&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters (accent marks) into legal values that can be used in various user identifiers such as user principal names, SAM account names, and email addresses.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Character Mapping Table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ä, à, á, â, ã, ā, ă, ą, å, ǟ, à, ȁ, Ả, Ạ, Ậ, Ắ, Ằ, Ẳ, Ẵ, Ặ&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Ä, À, Á, Â, Ã, Ǎ, Ā, Ă, Å, Ǟ, Á, À, À, À, Ả, Ạ, Ậ, Ắ, Ằ, Ẳ, Ẵ, Ặ&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, ǣ&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Ǣ&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, č, ć, ċ, c&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, Č, Ć, Ċ, Ĉ&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ď, ḑ, ḏ&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Ď, Ḍ, Ḑ&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ē, ė, è, é, ë, ě, ȅ, ê, ệ, ȇ, ȩ&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;Ē, Ê, É, È, Ë, Ě, Ȅ, Ë, Ĕ, Ế, Ề, Ẽ, Ệ, Ȇ&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Remove diacritics from a string&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ğ, ǧ, g&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ǧ, Ğ, G&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ï, î, ì, í, ì, ĩ, ĩ, i, ï, Î, Ï, i&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Ĩ, Ī, Ĭ, Î, Ï, Ĩ, Ĭ, Ï, Ī&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ŀ, ł, Ľ, Ĺ, l&lt;/td&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Ł, Ľ, Ļ, Ĺ, L&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ñ, ń, ň, ņ, n&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ń, Ń, Ň, Ň, N&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ò, ó, ő, o, ò, ớ, ô, õ, ô, o, ố, ǫ, ǫ, ǒ&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;Ó, Ò, Ó, Ó, Ô, Ò, Ô, Ǒ, Ǭ, Ǭ, Ớ, Ố, ơ&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ø, ǿ, œ&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Ø, Ø, Œ&lt;/td&gt;
&lt;td&gt;OE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ř, ŕ, ř, ŗ&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ř, Ř, Ŕ, ŗ&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;ss&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;š, š, ṣ, ş, ş, ṣ&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Š, Š, Ş, Ş, Š&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ť, ţ, ŧ, t&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ť, Ŧ, Ť, Ţ&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ù, û, ü, ù, ú, ù, ú, ù, û, û, ü, û&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Ų, Ũ, Ů, Ŭ, Ü, Ŷ, Ŵ, Ü, Ú, ů&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ÿ, ŷ, ẏ, ÿ, ŷ, ý, ÿ&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Ŷ, Ŷ, Ÿ, Ŷ, Ÿ, Ŷ, Ý&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ž, ž, ž, ž, z&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;Ž, Ž, Ź, Ž, Ż, Ž&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;NormalizeDiacritics([givenName])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample input/output:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (givenName): &amp;quot;Zoë&amp;quot;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;Zoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Not&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Not(source)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Boolean String&lt;/td&gt;
&lt;td&gt;Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Now&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Now()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;
The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;Now()&lt;/code&gt;
Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;h2&gt;NumFromDate&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; NumFromDate(value)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 format. If the date variable is in a different format, use FormatDateTime function to convert the date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Workday example Assuming you want to map the attribute &lt;code&gt;ContractEndDate&lt;/code&gt; from Workday, which is in the format &lt;code&gt;2020-12-31-08:00&lt;/code&gt; to &lt;code&gt;accountExpires&lt;/code&gt; field in AD, here&amp;#39;s how you can use this function and change the timezone offset to match your locale. &lt;code&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], ,&amp;quot;yyyy-MM-ddzzz&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SuccessFactors example Assuming you want to map the attribute &lt;code&gt;endDate&lt;/code&gt; from SuccessFactors, which is in the format &lt;code&gt;M/d/yyyy hh:mm:ss tt&lt;/code&gt; to &lt;code&gt;accountExpires&lt;/code&gt; field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale. &lt;code&gt;NumFromDate(Join(&amp;quot;&amp;quot;,FormatDateTime([endDate] , &amp;quot;M/d/yyyy hh:mm:ss tt&amp;quot;,&amp;quot;yyyy-MM-dd&amp;quot;),&amp;quot; 23:59:59-08:00&amp;quot;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PCase&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; PCase(source, wordSeparators)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The PCase function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt; value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify a set of characters that is used as word separators (example: &amp;quot;, -_&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remarks:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If the &lt;code&gt;wordSeparators&lt;/code&gt; parameter isn&amp;#39;t specified, then PCase internally invokes the .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; to convert the &lt;code&gt;source&lt;/code&gt; string to proper case. The .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; supports a comprehensive set of the &lt;a href=&quot;https://www.unicode.org/versions/Unicode13.0.0/ch04.pdf&quot;&gt;Unicode character categories&lt;/a&gt; as word separators.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Space character&lt;/li&gt;
&lt;li&gt;New line character&lt;/li&gt;
&lt;li&gt;Control characters like CRLF&lt;/li&gt;
&lt;li&gt;Format control characters&lt;/li&gt;
&lt;li&gt;ConnectorPunctuation characters like underscore&lt;/li&gt;
&lt;li&gt;DashPunctuation characters like dash and hyphen (including characters such En Dash, Em Dash, double hyphen, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example:&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes &lt;em&gt;firstName&lt;/em&gt; and &lt;em&gt;lastName&lt;/em&gt; from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase([firstName])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;PABLO GONSALVES (SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo Gonsalves (Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;As the &lt;em&gt;wordSeparators&lt;/em&gt; parameter isn&amp;#39;t specified, the &lt;em&gt;PCase&lt;/em&gt; function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase([lastName], &amp;quot; &amp;#39; &amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;PINTO-DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;The &lt;em&gt;PCase&lt;/em&gt; function uses characters in the &lt;em&gt;wordSeparators&lt;/em&gt; parameter to identify words and transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase(Join(&amp;quot; &amp;quot;, [firstName], [lastName]))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;firstName = GREGORY, lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory James&amp;quot;&lt;/td&gt;
&lt;td&gt;You can nest the Join function within &lt;em&gt;PCase&lt;/em&gt;. As the &lt;em&gt;wordSeparators&lt;/em&gt; parameter isn&amp;#39;t specified, the &lt;em&gt;PCase&lt;/em&gt; function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;RandomString&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified &lt;a href=&quot;#&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example 1&lt;/strong&gt;: - Generate a random string without special character restrictions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RandomString(6,3,0,0,3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 2&lt;/strong&gt;: - Generate a random string with special character restrictions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RandomString(10,2,2,2,1,&amp;quot;;,&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/p&gt;
&lt;h2&gt;Redact&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: Redact()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The Redact function replaces the attribute value with the string literal &amp;quot;[Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;h2&gt;Redact&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute/value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Redact an attribute: &lt;code&gt;Redact([userPrincipalName])&lt;/code&gt; Removes the userPrincipalName from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 2: Redact a string: &lt;code&gt;Redact(&amp;quot;StringToBeRedacted&amp;quot;)&lt;/code&gt; Removes a constant string from the provisioning logs.&lt;/p&gt;
&lt;p&gt;Example 3: Redact a random string: &lt;code&gt;Redact(RandomString(6,3,0,0,3))&lt;/code&gt; Removes the random string from the provisioning logs.&lt;/p&gt;
&lt;h2&gt;RemoveDuplicates&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; RemoveDuplicates(attribute)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;RemoveDuplicates([proxyAddresses])&lt;/code&gt; Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/p&gt;
&lt;h2&gt;Replace&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Replace(source, oldValue, regexPattern, regexGroupName, replacementValue, replacementAttributeName, template)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;oldValue&lt;/code&gt; and &lt;code&gt;replacementValue&lt;/code&gt; are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of &lt;code&gt;oldValue&lt;/code&gt; in the &lt;code&gt;source&lt;/code&gt; with &lt;code&gt;replacementValue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;oldValue&lt;/code&gt; and &lt;code&gt;template&lt;/code&gt; are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of the &lt;code&gt;oldValue&lt;/code&gt; in the &lt;code&gt;template&lt;/code&gt; with the &lt;code&gt;source&lt;/code&gt; value&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;regexPattern&lt;/code&gt; and &lt;code&gt;replacementValue&lt;/code&gt; are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The function applies the &lt;code&gt;regexPattern&lt;/code&gt; to the &lt;code&gt;source&lt;/code&gt; string and you can use the regex group names to construct the string for &lt;code&gt;replacementValue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;p&gt;To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;regexPattern&lt;/code&gt;, &lt;code&gt;regexGroupName&lt;/code&gt;, &lt;code&gt;replacementValue&lt;/code&gt; are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The function applies the &lt;code&gt;regexPattern&lt;/code&gt; to the &lt;code&gt;source&lt;/code&gt; string and replaces all values matching &lt;code&gt;regexGroupName&lt;/code&gt; with &lt;code&gt;replacementValue&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code&gt;regexPattern&lt;/code&gt;, &lt;code&gt;regexGroupName&lt;/code&gt;, &lt;code&gt;replacementAttributeName&lt;/code&gt; are provided:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;source&lt;/code&gt; has a value, &lt;code&gt;source&lt;/code&gt; is returned&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;source&lt;/code&gt; has no value, the function applies the &lt;code&gt;regexPattern&lt;/code&gt; to the &lt;code&gt;replacementAttributeName&lt;/code&gt; and returns the value matching &lt;code&gt;regexGroupName&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the &lt;code&gt;source&lt;/code&gt; object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oldValue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in &lt;code&gt;source&lt;/code&gt; or &lt;code&gt;template&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regexPattern&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in &lt;code&gt;source&lt;/code&gt;. When &lt;code&gt;replacementAttributeName&lt;/code&gt; is used, the &lt;code&gt;regexPattern&lt;/code&gt; is applied to extract a value from &lt;code&gt;replacementAttributeName&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regexGroupName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside &lt;code&gt;regexPattern&lt;/code&gt;. When named &lt;code&gt;replacementAttributeName&lt;/code&gt; is used, we&amp;#39;ll extract the value of the named regex group from the&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Name | Required/Repeating | Type | Notes&lt;/h2&gt;
&lt;p&gt;--- | --- | --- | ---
replacementValue | Optional | String | New value to replace old one with.
replacementAttributeName | Optional | String | Name of the attribute to be used for replacement value.
template | Optional | String | When template value is provided, we’ll look for oldValue inside the template and replace it with source value.
replacementAttributeName |  |  | replacementAttributeName and return it as the replacement value.&lt;/p&gt;
&lt;h2&gt;Replace characters using a regular expression&lt;/h2&gt;
&lt;h3&gt;Example 1: Using oldValue and replacementValue to replace the entire source string with another string.&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s say your HR system has an attribute &lt;code&gt;BusinessTitle&lt;/code&gt;. As part of recent job title changes, your company wants to update anyone with the business title &amp;quot;Product Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([BusinessTitle],&amp;quot;Product Developer&amp;quot;, , , &amp;quot;Software Engineer&amp;quot;, , )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source:&lt;/strong&gt; &lt;code&gt;[BusinessTitle]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;oldValue:&lt;/strong&gt; &amp;quot;Product Developer&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue:&lt;/strong&gt; &amp;quot;Software Engineer&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output:&lt;/strong&gt; Software Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 2: Using oldValue and template to insert the source string into another templated string.&lt;/h3&gt;
&lt;p&gt;The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets replaced.&lt;br&gt;Let&amp;#39;s say you want to always generate login ID in the format &lt;code&gt;&amp;lt;username&amp;gt;@contoso.com&lt;/code&gt;. There is a source attribute called UserID and you want that value to be used for the &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; portion of the login ID. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([UserID],&amp;quot;&amp;lt;username&amp;gt;&amp;quot;, , , , , &amp;quot;&amp;lt;username&amp;gt;@contoso.com&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source:&lt;/strong&gt; &lt;code&gt;[UserID]&lt;/code&gt; = &amp;quot;jsmith&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3: Using regexPattern and replacementValue&lt;/h2&gt;
&lt;p&gt;Example 3: Using &lt;strong&gt;regexPattern&lt;/strong&gt; and &lt;strong&gt;replacementValue&lt;/strong&gt; to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say you have a source attribute &lt;strong&gt;telephoneNumber&lt;/strong&gt; that has components &lt;strong&gt;country&lt;/strong&gt; &lt;strong&gt;code&lt;/strong&gt; and &lt;strong&gt;phone number&lt;/strong&gt; separated by a space character. For example, +91 9998887777. Then in this case, you can use the following expression in your attribute mapping to extract the 10 digit phone number.&lt;/p&gt;
&lt;p&gt;Replace([telephoneNumber], , &amp;quot;\+(?&lt;isdCode&gt;\\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;, , &amp;quot;${phoneNumber}&amp;quot;, , )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source:&lt;/strong&gt; [telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern:&lt;/strong&gt; &amp;quot;\+(?&lt;isdCode&gt;\\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue:&lt;/strong&gt; &amp;quot;${phoneNumber}&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output:&lt;/strong&gt; 9998887777&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also use this pattern to remove characters and collapse a string. For example, the expression below removes parenthesis, dashes and space characters in the mobile number string and returns only digits.&lt;/p&gt;
&lt;p&gt;Replace([mobile], , &amp;quot;[()\s-]+&amp;quot;, , &amp;quot;&amp;quot;, , )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;source:&lt;/strong&gt; [mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regexPattern:&lt;/strong&gt; &amp;quot;[()\s-]+&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacementValue:&lt;/strong&gt; &amp;quot;&amp;quot; (empty string)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expression output:&lt;/strong&gt; 19998887777&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 4: Using regexPattern, regexGroupName and replacementValue&lt;/h2&gt;
&lt;p&gt;Example 4: Using &lt;strong&gt;regexPattern, regexGroupName&lt;/strong&gt; and &lt;strong&gt;replacementValue&lt;/strong&gt; to extract a portion of the source string and replace it with another literal value or empty string.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute &lt;strong&gt;AddressLineData&lt;/strong&gt; with two components street number and street name. As part of a recent move, let&amp;#39;s say the street number of the address changed, and you want to update only the street number portion of the address line. Then in this case, you can use the following expression in your attribute mapping to extract the street number.&lt;/p&gt;
&lt;p&gt;Replace([AddressLineData], , &amp;quot;(?&lt;streetNumber&gt;^\d*)&amp;quot;,&amp;quot;streetNumber&amp;quot;, &amp;quot;888&amp;quot;, , )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;source:&lt;/strong&gt; [AddressLineData] = &amp;quot;545 Tremont Street&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;regexPattern: &amp;quot;(?&amp;lt;streetNumber^\d*)&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;regexGroupName: &amp;quot;streetNumber&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replacementValue: &amp;quot;888&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expression output: 888 Tremont Street&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is another example where the domain suffix from a UPN is replaced with an empty string to generate login ID without domain suffix.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([userPrincipalName], , &amp;quot;(?&amp;lt;Suffix&amp;gt;@(.*))&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, , )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [userPrincipalName] = &amp;quot;&lt;a href=&quot;mailto:jsmith@contoso.com&quot;&gt;jsmith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;regexPattern: &amp;quot;(?&lt;Suffix&gt;@(.*))&amp;quot;&lt;/li&gt;
&lt;li&gt;regexGroupName: &amp;quot;Suffix&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;&amp;quot; (empty string)&lt;/li&gt;
&lt;li&gt;Expression output: jsmith&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 5: Using regexPattern, regexGroupName and replacementAttributeName to handle scenarios when the source attribute is empty or doesn&amp;#39;t have a value&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute telephoneNumber. If telephoneNumber is empty, you want to extract the 10 digits of the mobile number attribute. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([telephoneNumber], , &amp;quot;\\+(?&amp;lt;isdCode)\\d* )(?&amp;lt;phoneNumber&amp;gt;\\d{10})&amp;quot;, &amp;quot;phoneNumber&amp;quot; , , [mobile], )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [telephoneNumber] = &amp;quot;&amp;quot; (empty string)&lt;/li&gt;
&lt;li&gt;regexPattern: &amp;quot;\+(?&amp;lt;isdCode)\d* )(?&lt;phoneNumber&gt;\d{10})&amp;quot;&lt;/li&gt;
&lt;li&gt;regexGroupName: &amp;quot;phoneNumber&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementAttributeName: [mobile] = &amp;quot;+91 8887779999&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: 8887779999&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 6: You need to find characters that match a regular expression value and remove them.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Replace([mailNickname], , &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, , )
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source [mailNickname]&lt;/li&gt;
&lt;li&gt;oldValue: &amp;quot;john_doe72&amp;quot;&lt;/li&gt;
&lt;li&gt;replaceValue: &amp;quot;&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: 72&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SelectUniqueValue&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function: SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ...)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This function must be at the top-level and cannot be nested.&lt;/li&gt;
&lt;li&gt;This function cannot be applied to attributes that have a matching precedence.&lt;/li&gt;
&lt;li&gt;This function is only meant to be used for entry creations. When using it with an attribute, set the &lt;strong&gt;Apply Mapping&lt;/strong&gt; property to &lt;strong&gt;Only during object creation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/li&gt;
&lt;li&gt;The LDAP search that SelectUniqueValue function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the &lt;strong&gt;NormalizeDiacritics&lt;/strong&gt; function as shown in the example below to normalize special characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1 ... uniqueValueRuleN&lt;/td&gt;
&lt;td&gt;At least 2 are required, no upper bound&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ad-attr-mapping-expr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;SelectUniqueValue(
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
    Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;)
)

Sample input/output:

- INPUT (PreferredFirstName): &amp;quot;John&amp;quot;
- INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;
- OUTPUT: &amp;quot;John.Smith@contoso.com&amp;quot; if UPN value of John.Smith@contoso.com doesn&amp;#39;t already exist in the directory
- OUTPUT: &amp;quot;J.Smith@contoso.com&amp;quot; if UPN value of John.Smith@contoso.com already exists in the directory
- OUTPUT: &amp;quot;Jo.Smith@contoso.com&amp;quot; if the above two UPN values already exist in the directory

## SingleAppRoleAssignment

### Function: SingleAppRoleAssignment([appRoleAssignments])

**Description:** Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.

### Parameters:

| Name                 | Required/ Repeating | Type   | Notes                          |
| -------------------- | ------------------- | ------ | ------------------------------ |
| [appRoleAssignments] | Required            | String | [appRoleAssignments] object.   |

## Split

### Function: Split(source, delimiter)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Split a string into a multi-valued array&lt;/h2&gt;
&lt;p&gt;Description: Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt; value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiter&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Split a string into a multi-valued array&lt;/h3&gt;
&lt;p&gt;Example: You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Split([extensionAttribute5], &amp;quot;,&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;StripSpaces&lt;/h2&gt;
&lt;p&gt;Function: &lt;code&gt;StripSpaces(source)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description: Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt; value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Switch&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; Switch(source, defaultValue, key1, value1, key2, value2, ...)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4&gt;Note&lt;/h4&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: &lt;code&gt;Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, the source attribute &lt;code&gt;statusFlag&lt;/code&gt; may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;h4&gt;Caution&lt;/h4&gt;
&lt;p&gt;For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. Example: &lt;code&gt;Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, if the source attribute &lt;code&gt;statusFlag&lt;/code&gt; is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when source doesn&amp;#39;t match any keys. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace a value based on predefined set of options&lt;/h2&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (state): &amp;quot;QLD&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: &amp;quot;Australia/Brisbane&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;ToLower&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; ToLower(source, culture)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Takes a &lt;code&gt;source&lt;/code&gt; string value and converts it to lower case using the culture rules that are specified. If there is no &lt;code&gt;culture&lt;/code&gt; info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, update the schema for your target application and set the property &lt;code&gt;caseExact&lt;/code&gt; to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is &lt;code&gt;languagecode2-country/regioncode2&lt;/code&gt;, where &lt;code&gt;languagecode2&lt;/code&gt; is the two-letter language code and &lt;code&gt;country/regioncode2&lt;/code&gt; is the two-letter subculture code. Examples include &lt;code&gt;ja-JP&lt;/code&gt; for Japanese (Japan) and &lt;code&gt;en-US&lt;/code&gt; for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/h2&gt;
&lt;p&gt;Example: You would like to generate the UPN value by concatenating the PreferredFirstName and PreferredLastName source fields and converting all characters to lower case.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;_&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt;: &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ToUpper&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function&lt;/strong&gt;: ToUpper(source, culture)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is &lt;code&gt;languagecode2-country/regioncode2&lt;/code&gt;, where &lt;code&gt;languagecode2&lt;/code&gt; is the two-letter language code and &lt;code&gt;country/regioncode2&lt;/code&gt; is the two-letter subculture code. Examples include &lt;code&gt;ja-JP&lt;/code&gt; for Japanese (Japan) and &lt;code&gt;en-US&lt;/code&gt; for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Word&lt;/h2&gt;
&lt;h2&gt;Function: Word(String,WordNumber,Delimiters)&lt;/h2&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Word(&amp;quot;The quick brown fox&amp;quot;,3,&amp;quot; &amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Word(&amp;quot;This,string!has&amp;amp;many separators&amp;quot;,3,&amp;quot;,!&amp;amp;#&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h3&gt;Strip known domain name&lt;/h3&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;h4&gt;Expression:&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;Replace([mail], &amp;quot;@contoso.com&amp;quot;, , , &amp;quot;&amp;quot;, , )&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Sample input / output:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (mail):&lt;/strong&gt; &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;john.doe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate user alias by concatenating parts of first and last name&lt;/h2&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (givenName):&lt;/strong&gt; &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT (surname):&lt;/strong&gt; &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;JohDoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Add a comma between last name and first name&lt;/h2&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;INPUT (givenName):&lt;/strong&gt; &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT (surname):&lt;/strong&gt; &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt; &amp;quot;Doe, John&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate an ID for a user based on their Microsoft Entra ID object ID. Remove any letters from the ID and add 1000 at the beginning.&lt;/h2&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expression:&lt;/strong&gt; &lt;code&gt;Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectId]), &amp;quot;[a-zA-Z]*&amp;quot;, &amp;quot;&amp;quot;, , ))&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;INPUT:&lt;/strong&gt; &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OUTPUT:
&amp;quot;10006430356534376231233393930392343435612626135652636136306362633065346234&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Related Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/li&gt;
&lt;li&gt;Customizing Attribute Mappings for User Provisioning&lt;/li&gt;
&lt;li&gt;Scoping Filters for User Provisioning&lt;/li&gt;
&lt;li&gt;Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;Account Provisioning Notifications&lt;/li&gt;
&lt;li&gt;List of Tutorials on How to Integrate SaaS Apps&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>mtoGPT4VisionPreviewAndAzureComputerVisionOCR</title><link>https://www.elumenotion.com/journal/mtogpt4visionpreviewandazurecomputervisionocr/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/mtogpt4visionpreviewandazurecomputervisionocr/</guid><pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Multitenant organizations documentation&lt;/h2&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Describes ways that users can have a seamless experience accessing resources and collaborating across multiple tenants.&lt;/p&gt;
&lt;h3&gt;About multitenant organizations&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organization capabilities&lt;/li&gt;
&lt;li&gt;Compare multitenant capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure a multitenant organization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;What is a multitenant organization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft 365 admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configure cross-tenant synchronization&lt;/h3&gt;
&lt;h4&gt;OVERVIEW&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HOW-TO GUIDE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra admin center&lt;/li&gt;
&lt;li&gt;PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Collaborate in Microsoft 365&lt;/h2&gt;
&lt;h3&gt;CONCEPT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Identity provisioning for Microsoft 365&lt;/li&gt;
&lt;li&gt;Microsoft 365 multitenant people search&lt;/li&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization capabilities in Microsoft Entra ID&lt;/h2&gt;
&lt;h3&gt;Article · 04/23/2024&lt;/h3&gt;
&lt;p&gt;This article provides an overview of the multitenant organization scenario and the related capabilities in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;What is a tenant?&lt;/h3&gt;
&lt;p&gt;A tenant is an instance of Microsoft Entra ID in which information about a single organization resides including organizational objects such as users, groups, and devices and also application registrations, such as Microsoft 365 and third-party applications. A tenant also contains access and compliance policies for resources, such as applications registered in the directory. The primary functions served by a tenant include identity authentication as well as resource access management.&lt;/p&gt;
&lt;p&gt;From a Microsoft Entra perspective, a tenant forms an identity and access management scope. For example, a tenant administrator makes an application available to some or all the users in the tenant and enforces access policies on that application for users in that tenant. In addition, a tenant contains organizational branding data that drives end-user experiences, such as the organizations email domains and SharePoint URLs used by employees in that organization. From a Microsoft 365 perspective, a tenant forms the default collaboration and licensing boundary. For example, users in Microsoft Teams or Microsoft Outlook can easily find and collaborate with other users in their tenant, but don&amp;#39;t have the ability to find or see users in other tenants.&lt;/p&gt;
&lt;p&gt;Tenants contain privileged organizational data and are securely isolated from other tenants. In addition, tenants can be configured to have data persisted and processed in a specific region or cloud, which enables organizations to use tenants as a mechanism to meet data residency and handling compliance requirements.&lt;/p&gt;
&lt;h3&gt;What is a multitenant organization?&lt;/h3&gt;
&lt;p&gt;A multitenant organization is an organization that has more than one instance of Microsoft Entra ID. Here are the primary reasons why an organization might have multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conglomerates: Organizations with multiple subsidiaries or business units that operate independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Mergers and acquisitions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that merge or acquire companies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Divestiture activity&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In a divestiture, one organization splits off part of its business to form a new organization or sell it to an existing organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multiple clouds&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that have compliance or regulatory needs to exist in multiple cloud environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multiple geographical boundaries&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that operate in multiple geographic locations with various residency regulations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test or staging tenants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that need multiple tenants for testing or staging purposes before deploying more broadly to primary tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Department or employee-created tenants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations where departments or employees have created tenants for development, testing, or separate control.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant challenges&lt;/h2&gt;
&lt;p&gt;Your organization may have recently acquired a new company, merged with another company, or restructured based on newly formed business units. If you have disparate identity management systems, it might be challenging for users in different tenants to access resources and collaborate.&lt;/p&gt;
&lt;p&gt;The following diagram shows how users in other tenants might not be able to access applications across tenants in your organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TB
    A[Tenant] --&amp;gt;|X| B[Primary tenant]
    B --&amp;gt;|X| C[Tenant]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As your organization evolves, your IT team must adapt to meet the changing needs. This often includes integrating with an existing tenant or forming a new one. Regardless of how the identity infrastructure is managed, it&amp;#39;s critical that users have a seamless experience accessing resources and collaborating. Today, you may be using custom scripts or on-premises solutions to bring the tenants together to provide a seamless experience across tenants.&lt;/p&gt;
&lt;h2&gt;B2B direct connect&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate in Teams Connect shared channels, you can use Microsoft Entra B2B direct connect. B2B direct connect is a feature of External Identities that lets you set up a mutual trust relationship with another Microsoft Entra organization for seamless collaboration in Teams. When the trust is established, the B2B direct connect user has single sign-on access using credentials from their home tenant.&lt;/p&gt;
&lt;h2&gt;Here&amp;#39;s the primary constraint with using B2B direct connect across multiple tenants:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Currently, B2B direct connect works only with Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Diagram 1: B2B Direct Connect Users Workflow&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
A[B2B direct connect users] --&amp;gt;|connects to| B[Primary tenant]
B --&amp;gt;|has shared channel with| C[Tenant]
C --&amp;gt;|connected to| A
B --&amp;gt;|Teams Connect shared channel| D[Teams Connect shared channels]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see B2B direct connect overview.&lt;/p&gt;
&lt;h2&gt;B2B collaboration&lt;/h2&gt;
&lt;p&gt;To enable users across tenants to collaborate, you can use Microsoft Entra B2B collaboration. B2B collaboration is a feature within External Identities that lets you invite guest users to collaborate with your organization. Once the external user has redeemed their invitation or completed sign-up, they&amp;#39;re represented in your tenant as a user object. With B2B collaboration, you can securely share your company&amp;#39;s applications and services with external users, while maintaining control over your own corporate data.&lt;/p&gt;
&lt;h3&gt;Here are the primary constraints with using B2B collaboration across multiple tenants:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Administrators must invite users using the B2B invitation process or build an onboarding experience using the B2B collaboration invitation manager.&lt;/li&gt;
&lt;li&gt;Administrators might have to synchronize users using custom scripts.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt and follow a redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;By default, users are of type external guest, which has different permissions than external member and might not be the desired user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Diagram 2: B2B Collaboration Users Workflow&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
E[B2B collab users] --&amp;gt;|connects to| F[Primary tenant]
F --&amp;gt;|has collaboration with| G[Tenant]
G --&amp;gt;|connected to| E
F --&amp;gt;|Microsoft apps| H[Microsoft apps]
F --&amp;gt;|Non-Microsoft apps| I[Non-Microsoft apps]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;If you want users to have a more seamless collaboration experience across tenants, you can use cross-tenant synchronization. Cross-tenant synchronization is a one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization. Cross-tenant synchronization builds on the B2B collaboration functionality and utilizes existing B2B cross-tenant access settings. Users are represented in the target tenant as a B2B collaboration user object.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits with using cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the primary constraints with using cross-tenant synchronization across multiple tenants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doesn&amp;#39;t enhance the current Teams or Microsoft 365 experiences. Synchronized users will have the same cross-tenant Teams and Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;li&gt;Doesn&amp;#39;t synchronize groups, devices, or contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    A[Source tenant] --&amp;gt;|Cross-tenant sync| B[Target tenant]
    B --&amp;gt;|Cross-tenant sync| A
    B --&amp;gt; C[Microsoft apps]
    B --&amp;gt; D[Non-Microsoft apps]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;What is cross-tenant synchronization?&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Multitenant organization&lt;/h2&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;li&gt;Improved collaborative experience in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Improved people search experience across tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    A[Member tenant (A)] --&amp;gt;|Cross-tenant access settings| C[Owner tenant (C)]
    B[Member tenant (B)] --&amp;gt;|Cross-tenant access settings| C[Owner tenant (C)]
    C --&amp;gt;|Cross-tenant access settings| A
    C --&amp;gt;|Cross-tenant access settings| B
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more information, see What is a multitenant organization in Microsoft Entra ID?.&lt;/p&gt;
&lt;h2&gt;Compare multitenant capabilities&lt;/h2&gt;
&lt;p&gt;Depending on the needs of your organization, you can use any combination of B2B direct connect, B2B collaboration, cross-tenant synchronization, and multitenant organization capabilities. B2B direct connect and B2B collaboration are independent capabilities, while cross-tenant synchronization and multitenant organization capabilities are independent of each other, though both rely on underlying B2B collaboration.&lt;/p&gt;
&lt;p&gt;The following table compares the capabilities of each feature. For more information about different external identity scenarios, see Comparing External Identities feature sets.&lt;/p&gt;
&lt;h2&gt;B2B direct connect (Org-to-org external or internal)&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users can access Teams Connect shared channels hosted in external tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Value&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enables external collaboration within Teams Connect shared channels only.&lt;/li&gt;
&lt;li&gt;More convenient for administrators because they don&amp;#39;t have to manage B2B users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Primary administrator workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Configure cross-tenant access to provide external users inbound access to tenant the credentials for their home tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B collaboration (Org-to-org external or internal)&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users can access apps/resources hosted in external tenants, usually with limited guest privileges.&lt;/li&gt;
&lt;li&gt;Depending on automatic redemption settings, users might need to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Value&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enables external collaboration.&lt;/li&gt;
&lt;li&gt;More control and monitoring for administrators by managing the B2B collaboration users.&lt;/li&gt;
&lt;li&gt;Administrators can limit the access that these external users have to their apps/resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Primary administrator workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add external users to resource tenant by using the B2B invitation process or build your own onboarding experience using the B2B collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization (Org internal)&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users can seamlessly access apps/resources across the same organization, even if they&amp;#39;re hosted in different tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Value&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enables collaboration across organizational tenants.&lt;/li&gt;
&lt;li&gt;Administrators don&amp;#39;t have to manually invite and synchronize users between tenants to ensure continuous access to apps/resources within the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Primary administrator workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Configure the cross-tenant synchronization engine to synchronize users between multiple tenants as B2B collaboration users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization (Org internal)&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users can more seamlessly collaborate across a multitenant organization in new Teams and people search.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Value&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enables collaboration across organizational tenants.&lt;/li&gt;
&lt;li&gt;Administrators continue to have full configuration ability via cross-tenant access settings. Optional cross-tenant access templates allow pre-configuration of cross-tenant access settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Primary administrator workflow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a multitenant organization, add (invite) tenants, join a multitenant organization.&lt;/li&gt;
&lt;li&gt;Leverage existing B2B collaboration users or use cross-tenant synchronization to.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B direct connect (Org-to-org external or internal)&lt;/h2&gt;
&lt;h3&gt;Trust level&lt;/h3&gt;
&lt;p&gt;Mid trust. B2B direct connect users are less easy to track, mandating a certain level of trust with the external organization.&lt;/p&gt;
&lt;h3&gt;Effect on users&lt;/h3&gt;
&lt;p&gt;Users access the resource tenant using the credentials for their home tenant. User objects aren&amp;#39;t created in the resource tenant.&lt;/p&gt;
&lt;h3&gt;User type&lt;/h3&gt;
&lt;p&gt;B2B direct connect user - N/A&lt;/p&gt;
&lt;h2&gt;B2B collaboration (Org-to-org external or internal)&lt;/h2&gt;
&lt;h3&gt;Trust level&lt;/h3&gt;
&lt;p&gt;Low to mid trust. User objects can be tracked easily and managed with granular controls.&lt;/p&gt;
&lt;h3&gt;Effect on users&lt;/h3&gt;
&lt;p&gt;External users are added to a tenant as B2B collaboration users.&lt;/p&gt;
&lt;h3&gt;User type&lt;/h3&gt;
&lt;p&gt;B2B collaboration user&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External member&lt;/li&gt;
&lt;li&gt;External guest (default)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization (Org internal)&lt;/h2&gt;
&lt;h3&gt;Trust level&lt;/h3&gt;
&lt;p&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/p&gt;
&lt;h3&gt;Effect on users&lt;/h3&gt;
&lt;p&gt;Within the same organization, users are synchronized from their home tenant to the resource tenant as B2B collaboration users.&lt;/p&gt;
&lt;h3&gt;User type&lt;/h3&gt;
&lt;p&gt;B2B collaboration user&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External member (default)&lt;/li&gt;
&lt;li&gt;External guest&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization (Org internal)&lt;/h2&gt;
&lt;h3&gt;Trust level&lt;/h3&gt;
&lt;p&gt;High trust. All tenants are part of the same organization, and users are typically granted member access to all apps/resources.&lt;/p&gt;
&lt;h3&gt;Effect on users&lt;/h3&gt;
&lt;p&gt;Within the same multitenant organization, B2B collaboration users, particularly member users, benefit from enhanced, seamless collaboration across Microsoft 365.&lt;/p&gt;
&lt;h3&gt;User type&lt;/h3&gt;
&lt;p&gt;B2B collaboration user&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External member (default)&lt;/li&gt;
&lt;li&gt;External guest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following diagram shows how B2B direct connect, B2B collaboration, and cross-tenant synchronization capabilities could be used together.&lt;/p&gt;
&lt;h2&gt;Org-to-org external&lt;/h2&gt;
&lt;h3&gt;Org internal&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;B2B collaboration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adatum Corporation (External collaborator)&lt;ul&gt;
&lt;li&gt;B2B collab users (External members)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;B2B collab users (External guests)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Contoso (Primary tenant)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant sync&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fabrikam (Acquired)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;B2B direct connect&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trey Research (External collaborator)&lt;ul&gt;
&lt;li&gt;B2B direct connect users&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Terminology&lt;/h2&gt;
&lt;p&gt;To better understand multitenant organization scenario related Microsoft Entra capabilities, you can refer back to the following list of terms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;tenant&lt;/td&gt;
&lt;td&gt;An instance of Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organization&lt;/td&gt;
&lt;td&gt;The top level of a business hierarchy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization&lt;/td&gt;
&lt;td&gt;An organization that has more than one instance of Microsoft Entra ID, as well as a capability to group those instances in Microsoft Entra ID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;creator tenant&lt;/td&gt;
&lt;td&gt;The tenant that created the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;owner tenant&lt;/td&gt;
&lt;td&gt;A tenant with the owner role. Initially, the creator tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;added tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;joiner tenant&lt;/td&gt;
&lt;td&gt;A tenant that is joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;join request&lt;/td&gt;
&lt;td&gt;A joiner or added tenant submits a join request to join the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pending tenant&lt;/td&gt;
&lt;td&gt;A tenant that was added by an owner but that hasn&amp;#39;t yet joined.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;active tenant&lt;/td&gt;
&lt;td&gt;A tenant that created or joined the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Terms and Definitions&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;member tenant&lt;/td&gt;
&lt;td&gt;A tenant with the member role. Most joiner tenants start as members.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multitenant organization tenant&lt;/td&gt;
&lt;td&gt;An active tenant of the multitenant organization, not pending.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;A one-way synchronization service in Microsoft Entra ID that automates creating, updating, and deleting B2B collaboration users across tenants in an organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings&lt;/td&gt;
&lt;td&gt;Settings to manage collaboration for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-tenant access settings template&lt;/td&gt;
&lt;td&gt;An optional template to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;organizational settings&lt;/td&gt;
&lt;td&gt;Cross-tenant access settings for specific Microsoft Entra organizations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;configuration&lt;/td&gt;
&lt;td&gt;An application and underlying service principal in Microsoft Entra ID that includes the settings (such as target tenant, user scope, and attribute mappings) needed for cross-tenant synchronization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;provisioning&lt;/td&gt;
&lt;td&gt;The process of automatically creating or synchronizing objects across a boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automatic redemption&lt;/td&gt;
&lt;td&gt;A B2B setting to automatically redeem invitations so newly created users don&amp;#39;t receive an invitation email or have to accept a consent prompt when added to a target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is a multitenant organization in Microsoft Entra ID?&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;Multitenant organization is a feature in Microsoft Entra ID and Microsoft 365 that enables you to form a tenant group within your organization. Each pair of tenants in the group is governed by cross-tenant access settings that you can use to configure B2B or cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Why use multitenant organization?&lt;/h2&gt;
&lt;p&gt;Here are the primary goals of multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define a group of tenants belonging to your organization&lt;/li&gt;
&lt;li&gt;Collaborate across your tenants in new Microsoft Teams&lt;/li&gt;
&lt;li&gt;Enable search and discovery of user profiles across your tenants through Microsoft 365 people search&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Who should use it?&lt;/h2&gt;
&lt;p&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365.&lt;/p&gt;
&lt;p&gt;The multitenant organization capability is built on the assumption of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;As such, the multitenant organization capability assumes the simultaneous use of Microsoft Entra cross-tenant synchronization or an alternative bulk provisioning engine for external identities.&lt;/p&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;Here are the primary benefits of a multitenant organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Differentiate in-organization and out-of-organization external users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Microsoft Entra ID, external users originating from within a multitenant organization can be differentiated from external users originating from outside the multitenant organization. This differentiation facilitates the application of different policies for in-organization and out-of-organization external users.&lt;/p&gt;
&lt;h2&gt;Improved collaborative experience in Microsoft Teams&lt;/h2&gt;
&lt;p&gt;In new Microsoft Teams, multitenant organization users can expect an improved collaborative experience across tenants with chat, calling, and meeting start notifications from all connected tenants across the multitenant organization. Tenant switching is more seamless and faster.&lt;/p&gt;
&lt;h2&gt;Improved people search experience across tenants&lt;/h2&gt;
&lt;p&gt;Across Microsoft 365 services, the multitenant organization people search experience is a collaboration feature that enables search and discovery of people across multiple tenants. Once enabled, users are able to search and discover synced user profiles in a tenant&amp;#39;s global address list and view their corresponding people cards.&lt;/p&gt;
&lt;h2&gt;How does a multitenant organization work?&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability enables you to form a tenant group within your organization. The following list describes the basic lifecycle of a multitenant organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Define a multitenant organization
One tenant administrator defines a multitenant organization as a grouping of tenants. The grouping of tenants isn&amp;#39;t reciprocal until each listed tenant takes action to join the multitenant organization. The objective is a reciprocal agreement between all listed tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Join a multitenant organization
Tenant administrators of listed tenants take action to join the multitenant organization. After joining, the multitenant organization relationship is reciprocal between each and every tenant that joined the multitenant organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave a multitenant organization
Tenant administrators of listed tenants can leave a multitenant organization at any time. While a tenant administrator who defined the multitenant organization can add and remove listed tenants they don&amp;#39;t control the other tenants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A multitenant organization is established as a collaboration of equals.&lt;/h2&gt;
&lt;p&gt;Each tenant administrator stays in control of their tenant and their membership in the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure, as needed, the following policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant access partner configurations&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant access settings for B2B collaboration and crossTenantAccessPolicyConfigurationPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-tenant access identity synchronization&lt;/p&gt;
&lt;p&gt;For more information, see Configure cross-tenant synchronization and crossTenantIdentitySyncPolicyPartner resource type.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization example&lt;/h2&gt;
&lt;p&gt;The following diagram shows three tenants A, B, and C that form a multitenant organization.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
    C[Owner tenant (C)] -- Cross-tenant access settings --&amp;gt; A[Member tenant (A)];
    C -- Cross-tenant access settings --&amp;gt; B[Member tenant (B)];
    A -- Cross-tenant access settings --&amp;gt; B;
    B -- Cross-tenant access settings --&amp;gt; A;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[Expand table]&lt;/p&gt;
&lt;h2&gt;Tenant Description&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for B and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and C.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Administrators see a multitenant organization consisting of A, B, C. They also see cross-tenant access settings for A and B.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Templates for cross-tenant access settings&lt;/h2&gt;
&lt;p&gt;To ease the setup of homogenous cross-tenant access settings applied to partner tenants in the multitenant organization, the administrator of each multitenant organization tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. These templates can be used to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Tenant role and state&lt;/h2&gt;
&lt;p&gt;To facilitate the management of a multitenant organization, any given multitenant organization tenant has an associated role and state.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Owner&lt;/td&gt;
&lt;td&gt;One tenant creates the multitenant organization. The multitenant organization creating tenant receives the role of owner. The privilege of the owner tenant is to add tenants into a pending state as well as to remove tenants from the multitenant organization. Also, an owner tenant can change the role of other multitenant organization tenants.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Tenant state&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Pending&lt;br&gt;A pending tenant has yet to join a multitenant organization. While listed in an administrator&amp;#39;s view of the multitenant organization, a pending tenant isn&amp;#39;t yet part of the multitenant organization, and as such is hidden from an end user&amp;#39;s view of a multitenant organization.&lt;/p&gt;
&lt;p&gt;Active&lt;br&gt;Following the addition of pending tenants to the multitenant organization, pending tenants need to join the multitenant organization to turn their state from pending to active. Joined tenants typically start in the member role. Any member tenant has the privilege to leave the multitenant organization.&lt;/p&gt;
&lt;h2&gt;Constraints&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability has been designed with the following constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any given tenant can only create or join a single multitenant organization.&lt;/li&gt;
&lt;li&gt;Any multitenant organization must have at least one active owner tenant.&lt;/li&gt;
&lt;li&gt;Each active tenant must have cross-tenant access settings for all active tenants.&lt;/li&gt;
&lt;li&gt;Any active tenant may leave a multitenant organization by removing themselves from it.&lt;/li&gt;
&lt;li&gt;A multitenant organization is deleted when the only remaining active (owner) tenant leaves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limits&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Maximum number of active tenants, including the owner tenant&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;The owner tenant can add more than 100 pending tenants, but they won&amp;#39;t be able to join the multitenant organization if the limit is exceeded. This limit is applied at the time a pending tenant joins a multitenant organization. This limit is specific to the number of tenants in a multitenant organization. It does not apply to cross-tenant synchronization by itself. To increase this limit, submit a support request in the Microsoft Entra or Microsoft 365 admin center. In the Microsoft Graph APIs, the default limit of 100 tenants is only enforced at the time of joining. In Microsoft 365 admin center, the default limit is enforced at multitenant organization creation time and at time of joining.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;External user segmentation&lt;/h2&gt;
&lt;p&gt;By defining a multitenant organization, as well as pivoting on the Microsoft Entra user property of userType, external identities are segmented as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;External members originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External guests originating from within a multitenant organization&lt;/li&gt;
&lt;li&gt;External members originating from outside of your organization&lt;/li&gt;
&lt;li&gt;External guests originating from outside of your organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This segmentation of external users, due to the definition of a multitenant organization, enables administrators to better differentiate in-organization from out-of-organization external users.&lt;/p&gt;
&lt;p&gt;External members originating from within a multitenant organization are called multitenant organization members.&lt;/p&gt;
&lt;p&gt;Multitenant collaboration capabilities in Microsoft 365 aim to provide a seamless collaboration experience across tenant boundaries when collaborating with multitenant organization member users.&lt;/p&gt;
&lt;h2&gt;Choosing between Microsoft 365 admin center and cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you haven&amp;#39;t previously used Microsoft Entra cross-tenant synchronization, and you intend to establish a collaborating user set topology where the same set of users is shared to all multitenant organization tenants, you might want to use the Microsoft 365 admin center share users functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re already using Microsoft Entra cross-tenant synchronization, for various multi-hub multi-spoke topologies, you don&amp;#39;t need to use the Microsoft 365 admin center share users functionality. Instead, you might want to continue using your existing Microsoft Entra cross-tenant synchronization jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using multitenant organization.&lt;/p&gt;
&lt;h3&gt;Step 1: Plan your deployment&lt;/h3&gt;
&lt;p&gt;For more information, see Plan for multitenant organizations in Microsoft 365.&lt;/p&gt;
&lt;h2&gt;Step 2: Create your multitenant organization&lt;/h2&gt;
&lt;p&gt;Create your multitenant organization using Microsoft 365 admin center, Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First tenant, soon-to-be owner tenant, creates a multitenant organization.&lt;/li&gt;
&lt;li&gt;Owner tenant adds one or more joiner tenants.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Join a multitenant organization&lt;/h2&gt;
&lt;p&gt;Join a multitenant organization using Microsoft 365 admin center or Microsoft Graph PowerShell, or Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joiner tenants submit a join request to join the multitenant organization of owner tenant.&lt;/li&gt;
&lt;li&gt;To allow for asynchronous processing, wait up to 2 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your multitenant organization is formed.&lt;/p&gt;
&lt;h2&gt;Step 4: Synchronize users&lt;/h2&gt;
&lt;p&gt;Depending on your use case, you may want to synchronize users using one of the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/li&gt;
&lt;li&gt;Your alternative bulk provisioning engine&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;p&gt;The multitenant organization capability requires Microsoft Entra ID P1 licenses. Only one Microsoft Entra ID P1 license is required per employee per multitenant organization. Also, you must have at least one Microsoft Entra ID P1 license per tenant. To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Plan for multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Article · 01/03/2024&lt;/p&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/identity/microsoft-entra&quot;&gt;Microsoft Entra B2B collaboration&lt;/a&gt; users across tenants in an organization. It enables users to access applications and collaborate across tenants, while still allowing the organization to evolve.&lt;/p&gt;
&lt;p&gt;Here are the primary goals of cross-tenant synchronization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seamless collaboration for a multitenant organization&lt;/li&gt;
&lt;li&gt;Automate lifecycle management of B2B collaboration users in a multitenant organization&lt;/li&gt;
&lt;li&gt;Automatically remove B2B accounts when a user leaves the organization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube-nocookie.com/embed/7B-PQwNfGBc&quot;&gt;Video about cross-tenant synchronization&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Why use cross-tenant synchronization?&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization automates creating, updating, and deleting B2B collaboration users. Users created with cross-tenant synchronization are able to access both Microsoft applications (such as Teams and SharePoint) and non-Microsoft applications (such as ServiceNow, Adobe, and many more), regardless of which tenant the apps are integrated with. These users continue to benefit from the security capabilities in Microsoft Entra ID, such as &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/identity/entra-conditional-access&quot;&gt;Microsoft Entra Conditional Access&lt;/a&gt; and &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-access&quot;&gt;cross-tenant access settings&lt;/a&gt;, and can be governed through features such as &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/identity/entra-identity-governance&quot;&gt;Microsoft Entra entitlement management&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following diagram shows how you can use cross-tenant synchronization to enable users to access applications across tenants in your organization.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![](Description of the image: A diagram showcasing the process of cross-tenant synchronization, with arrows indicating the flow of user access across different tenants in an organization, highlighting the interoperability of Microsoft and non-Microsoft applications under this system.) --&gt;

&lt;h2&gt;Who should use?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant application access.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization is not currently suitable for use across organizational boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;With cross-tenant synchronization, you can do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically create B2B collaboration users within your organization and provide them access to the applications they need, without creating and maintaining custom scripts.&lt;/li&gt;
&lt;li&gt;Improve the user experience and ensure that users can access resources, without receiving an invitation email and having to accept a consent prompt in each tenant.&lt;/li&gt;
&lt;li&gt;Automatically update users and remove them when they leave the organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams and Microsoft 365&lt;/h2&gt;
&lt;p&gt;Users created by cross-tenant synchronization will have the same experience when accessing Microsoft Teams and other Microsoft 365 services as B2B collaboration users created through a manual invitation. If your organization uses shared channels, please see the known issues document for additional details. Over time, the &lt;code&gt;member&lt;/code&gt; userType will be used by the various Microsoft 365 services to provide differentiated end user experiences for users in a multitenant organization.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Cross-tenant synchronization diagram](image-url) --&gt;

&lt;h3&gt;Diagram Description&lt;/h3&gt;
&lt;p&gt;The diagram illustrates the cross-tenant synchronization process involving internal and external users across different entities such as Fabrikam Mexico, Fabrikam US, Contoso, Microsoft apps, and non-Microsoft apps. It visually represents how users from different internal and external organizations are linked and synced to enable cross-tenant application access via Microsoft&amp;#39;s services.&lt;/p&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;p&gt;When you configure cross-tenant synchronization, you define a trust relationship between a source tenant and a target tenant. Cross-tenant synchronization has the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Microsoft Entra provisioning engine.&lt;/li&gt;
&lt;li&gt;Is a push process from the source tenant, not a pull process from the target tenant.&lt;/li&gt;
&lt;li&gt;Supports pushing only internal members from the source tenant. It doesn&amp;#39;t support syncing external users from the source tenant.&lt;/li&gt;
&lt;li&gt;Users in scope for synchronization are configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Attribute mapping is configured in the source tenant.&lt;/li&gt;
&lt;li&gt;Extension attributes are supported.&lt;/li&gt;
&lt;li&gt;Target tenant administrators can stop a synchronization at any time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows the parts of cross-tenant synchronization and which tenant they&amp;#39;re configured.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Cross-tenant access settings&lt;/th&gt;
&lt;th&gt;Automatic redemption&lt;/th&gt;
&lt;th&gt;Sync settings configuration&lt;/th&gt;
&lt;th&gt;Users in scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Source tenant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target tenant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Cross-tenant synchronization setting&lt;/h2&gt;
&lt;p&gt;The cross-tenant synchronization setting is an inbound only organizational setting to allow the administrator of a source tenant to synchronize users into a target tenant. This setting is a checkbox with the name &amp;quot;Allow users sync into this tenant&amp;quot; that is specified in the target tenant. This setting doesn&amp;#39;t impact B2B invitations created through other processes such as manual invitation or Microsoft Entra entitlement management.&lt;/p&gt;
&lt;h2&gt;Inbound access settings - Contoso&lt;/h2&gt;
&lt;h3&gt;B2B collaboration&lt;/h3&gt;
&lt;h3&gt;B2B direct connect&lt;/h3&gt;
&lt;h3&gt;Trust settings&lt;/h3&gt;
&lt;h3&gt;Cross-tenant sync&lt;/h3&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Save&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Discard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the &lt;a href=&quot;#&quot;&gt;Update crossTenantIdentitySyncPolicyPartner API&lt;/a&gt;. For more information, see &lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Automatic redemption setting&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting is an inbound and outbound organizational trust setting to automatically redeem invitations so users don&amp;#39;t have to accept the consent prompt the first time they access the resource/target tenant. This setting is a checkbox with the following name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically redeem invitations with the tenant &lt;code&gt;&amp;lt;tenant&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Automatic redemption&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 
Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&amp;#39;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well. &lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 
Automatically redeem invitations with the tenant fc19f6b2-c752-43d3-a1aa-c75e9a85a7dc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Save&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Discard&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Compare setting for different scenarios&lt;/h2&gt;
&lt;p&gt;The automatic redemption setting applies to cross-tenant synchronization, B2B collaboration, and B2B direct connect in the following situations:&lt;/p&gt;
&lt;h2&gt;When users are created in a target tenant using cross-tenant synchronization.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When users are added to a resource tenant using B2B collaboration.&lt;/li&gt;
&lt;li&gt;When users access resources in a resource tenant using B2B direct connect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table shows how this setting compares when enabled for these scenarios:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;th&gt;B2B collaboration&lt;/th&gt;
&lt;th&gt;B2B direct connect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Automatic redemption setting&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration invitation email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users must accept a consent prompt&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users receive a B2B collaboration notification email&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This setting doesn&amp;#39;t impact application consent experiences. For more information, see Consent experience for applications in Microsoft Entra ID. This setting isn&amp;#39;t supported for organizations across different Microsoft cloud environments, such as Azure commercial and Azure Government.&lt;/p&gt;
&lt;h3&gt;When is consent prompt suppressed?&lt;/h3&gt;
&lt;p&gt;The automatic redemption setting will only suppress the consent prompt and invitation email if both the home/source tenant (outbound) and resource/target tenant (inbound) checks this setting.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Flowchart depicting that automatic redemption of invitations is enabled for both outbound and inbound access settings between Source tenant and Target tenant.](image) --&gt;

&lt;p&gt;The following table shows the consent prompt behavior for source tenant users when the automatic redemption setting is checked for different cross-tenant access setting combinations.&lt;/p&gt;
&lt;h2&gt;Configure cross-tenant synchronization&lt;/h2&gt;
&lt;h3&gt;Expand table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home/source tenant&lt;/th&gt;
&lt;th&gt;Resource/target tenant&lt;/th&gt;
&lt;th&gt;Consent prompt behavior for source tenant users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;Not suppressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;To configure this setting using Microsoft Graph, see the Update crossTenantAccessPolicyConfigurationPartner API. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;How do users know what tenants they belong to?&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization, users don&amp;#39;t receive an email or have to accept a consent prompt. If users want to see what tenants they belong to, they can open their My Account page and select Organizations. In the Microsoft Entra admin center, users can open their Portal settings, view their Directories + subscriptions, and switch directories.&lt;/p&gt;
&lt;p&gt;For more information, including privacy information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h2&gt;Get started&lt;/h2&gt;
&lt;p&gt;Here are the basic steps to get started using cross-tenant synchronization.&lt;/p&gt;
&lt;h2&gt;Step 1: Define how to structure the tenants in your organization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization provides a flexible solution to enable collaboration, but every organization is different. For example, you might have a central tenant, satellite tenants, or sort of a mesh of tenants. Cross-tenant synchronization supports any of these topologies. For more information, see Topologies for cross-tenant synchronization.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Cross-tenant Topologies Diagram](image_url) --&gt;

&lt;h2&gt;Step 2: Enable cross-tenant synchronization in the target tenants&lt;/h2&gt;
&lt;p&gt;In the target tenant where users are created, navigate to the Cross-tenant access settings page. Here you enable cross-tenant synchronization and the B2B automatic redemption settings by selecting the respective check boxes. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target tenant&lt;/th&gt;
&lt;th&gt;Inbound access settings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓ Allow users sync into this tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓ Automatically redeem invitations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Step 3: Enable cross-tenant synchronization in the source tenants&lt;/h2&gt;
&lt;p&gt;In any source tenant, navigate to the Cross-tenant access settings page and enable the B2B automatic redemption feature. Next, you use the Cross-tenant synchronization page to set up a cross-tenant synchronization job and specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which users you want to synchronize&lt;/li&gt;
&lt;li&gt;What attributes you want to include&lt;/li&gt;
&lt;li&gt;Any transformations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anyone that has used Microsoft Entra ID to provision identities into a SaaS application, this experience will be familiar. Once you have synchronization configured,&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;you can start testing with a few users and make sure they&amp;#39;re created with all the attributes that you need. When testing is complete, you can quickly add additional users to synchronize and roll out across your organization. For more information, see Configure cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;Cross-tenant synchronization flowchart&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Source tenant&lt;ul&gt;
&lt;li&gt;Outbound access settings&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;strong&gt;Cross-tenant synchronization&lt;/strong&gt; arrow pointing right&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Target tenant&lt;ul&gt;
&lt;li&gt;Inbound access settings&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;License requirements&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Using this feature requires Microsoft Entra ID P1 licenses.&lt;/li&gt;
&lt;li&gt;Each user who is synchronized with cross-tenant synchronization must have a P1 license in their home/source tenant.&lt;/li&gt;
&lt;li&gt;To find the right license for your requirements, see Compare generally available features of Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant sync relies on the Microsoft Entra External ID billing model.&lt;/li&gt;
&lt;li&gt;To understand the external identities licensing model, see MAU billing model for Microsoft Entra External ID.&lt;/li&gt;
&lt;li&gt;You will also need at least one Microsoft Entra ID P1 license in the target tenant to enable auto-redemption.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3&gt;Clouds&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Which clouds can cross-tenant synchronization be used in?&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is supported within the commercial cloud and Azure Government.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization isn&amp;#39;t supported within the Microsoft Azure operated by 21Vianet cloud.&lt;/li&gt;
&lt;li&gt;Synchronization is only supported between two tenants in the same cloud.&lt;/li&gt;
&lt;li&gt;Cross-cloud (such as public cloud to Azure Government) isn&amp;#39;t currently supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Existing B2B users&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Will cross-tenant synchronization manage existing B2B users?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Yes. Cross-tenant synchronization uses an internal attribute called the alternativeSecurityIdentifier to uniquely match an internal user in the source tenant with an external / B2B user in the target tenant. Cross-tenant synchronization can update existing B2B users, ensuring that each user has only one account.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization cannot match an internal user in the source tenant with an internal user in the target tenant (both type member and type guest).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Synchronization frequency&lt;/h2&gt;
&lt;h3&gt;How often does cross-tenant synchronization run?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The sync interval is currently fixed to start at 40-minute intervals. Sync duration varies based on the number of in-scope users. The initial sync cycle is likely to take significantly longer than the following incremental sync cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scope&lt;/h2&gt;
&lt;h3&gt;How do I control what is synchronized into the target tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, you can control which users are provisioned with the configuration or attribute-based filters. You can also control what attributes on the user object are synchronized. For more information, see Scoping users or groups to be provisioned with scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;If a user is removed from the scope of sync in a source tenant, will cross-tenant synchronization soft delete them in the target?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Yes. If a user is removed from the scope of sync in a source tenant, cross-tenant synchronization will soft delete them in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Object types&lt;/h2&gt;
&lt;h3&gt;What object types can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra users can be synchronized between tenants. (Groups, devices, and contacts aren&amp;#39;t currently supported.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What user types can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Internal members can be synchronized from source tenants. Internal guests can&amp;#39;t be synchronized from source tenants.&lt;/li&gt;
&lt;li&gt;Users can be synchronized to target tenants as external members (default) or external guests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;For more information about the UserType definitions, see Properties of a Microsoft Entra B2B collaboration user.&lt;/h2&gt;
&lt;h3&gt;I have existing B2B collaboration users. What will happen to them?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization will match the user and make any necessary updates to the user, such as update the display name. By default, the UserType won&amp;#39;t be updated from guest to member, but you can configure this in the attribute mappings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Attributes&lt;/h2&gt;
&lt;h3&gt;What user attributes can be synchronized?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization will sync commonly used attributes on the user object in Microsoft Entra ID, including (but not limited to) displayName, userPrincipalName, and directory extension attributes.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization supports provisioning the manager attribute. Both the user and their manager must be in scope for provisioning.&lt;ul&gt;
&lt;li&gt;For cross-tenant synchronization configurations created before January 2024 with the default schema / attribute mappings:&lt;ul&gt;
&lt;li&gt;The manager attribute will automatically be added to the mappings.&lt;/li&gt;
&lt;li&gt;This does not trigger an initial sync cycle.&lt;/li&gt;
&lt;li&gt;Manager updates will apply on the incremental cycle for users that are undergoing changes (e.g. manager change). The sync engine doesn&amp;#39;t automatically update all existing users that were provisioned previously.&lt;ul&gt;
&lt;li&gt;To update the manager for existing users that are in scope for provisioning, you can use on-demand provisioning for specific users or do a restart to provision the manager for all users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For cross-tenant synchronization configurations created before January 2024 with a custom schema / attribute mappings (e.g. you added an attribute to the mappings or changed the default mappings):&lt;ul&gt;
&lt;li&gt;You need to manually add the manager attribute to your attribute mappings. This will trigger a restart and update all users that are in scope for provisioning. This should be a direct mapping of the manager attribute in the source tenant to the manager in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If the manager of a user is removed in the source tenant and no new manager is assigned in the source tenant, the manager attribute will not be updated in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What attributes can&amp;#39;t be synchronized?&lt;/h3&gt;
&lt;h2&gt;Cross-Tenant Synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Attributes including (but not limited to) photos, custom security attributes, and user attributes outside of the directory can&amp;#39;t be synchronized by cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can I control where user attributes are sourced/managed?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization doesn&amp;#39;t offer direct control over source of authority. The user and its attributes are deemed authoritative at the source tenant. There are parallel sources of authority workstreams that will evolve source of authority controls for users down to the attribute level and a user object at the source may ultimately reflect multiple underlying sources. For the tenant-to-tenant process, this is still treated as the source tenant&amp;#39;s values being authoritative for the sync process (even if pieces actually originate elsewhere) into the target tenant.&lt;/li&gt;
&lt;li&gt;Currently, there&amp;#39;s no support for reversing the sync process&amp;#39;s source of authority.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization only supports source of authority at the object level. That means all attributes of a user must come from the same source, including credentials. It isn&amp;#39;t possible to reverse the source of authority or federation direction of a synchronized object.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What happens if attributes for a synced user are changed in the target tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization doesn&amp;#39;t query for changes in the target. If no changes are made to the synced user in the source tenant, then user attribute changes made in the target tenant will persist. However, if changes are made to the user in the source tenant, then during the next synchronization cycle, the user in the target tenant will be updated to match the user in the source tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can the target tenant manually block sign-in for a specific home/source tenant user that is synced?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If no changes are made to the synced user in the source tenant, then the block sign-in setting in the target tenant will persist. If a change is detected for the user in the source tenant, cross-tenant synchronization will re-enable that user blocked from sign-in in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Structure&lt;/h2&gt;
&lt;h3&gt;Can I sync a mesh between multiple tenants?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is configured as a single-direction peer-to-peer sync, meaning sync is configured between one source and one target tenant. Multiple instances of cross-tenant synchronization can be configured to sync from a single source to multiple target tenants, or vice-versa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization enables you to synchronize identities from a source to multiple targets and from multiple sources into a single target. But only one sync instance can exist between a source and a target.&lt;/li&gt;
&lt;li&gt;Only synchronizes users that are internal to the home/source tenant, ensuring that you can&amp;#39;t end up with a loop where a user is written back to the same tenant.&lt;/li&gt;
&lt;li&gt;Multiple topologies are supported. For more information, see &lt;a href=&quot;#&quot;&gt;Topologies for cross-tenant synchronization&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can I use cross-tenant synchronization across organizations (outside my multitenant organization)?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization is intended for use within an organization for privacy reasons. We recommend using &lt;a href=&quot;#&quot;&gt;entitlement management&lt;/a&gt; for inviting B2B collaboration users across organizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can cross-tenant synchronization be used to migrate users from one tenant to another tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No. Cross-tenant synchronization isn&amp;#39;t a migration tool because the source tenant is required for synchronized users to authenticate. Tenant migrations would also require migrating user data such as SharePoint and OneDrive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B collaboration&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization resolve any present B2B collaboration limitations?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Built on existing B2B collaboration technology, hence existing limitations apply. Examples include:&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;Support for UserType Member in Power BI is currently in preview. For more information, see &lt;a href=&quot;#&quot;&gt;Distribute Power BI content to external guest users with Microsoft Entra B2B&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;B2B direct connect&lt;/h2&gt;
&lt;h3&gt;How does cross-tenant synchronization relate to B2B direct connect?&lt;/h3&gt;
&lt;p&gt;[The content below this section is not visible in the image and hence not included.]&lt;/p&gt;
&lt;h2&gt;B2B Direct Connect&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;B2B direct connect is the underlying identity technology required for Teams Connect shared channels.&lt;/li&gt;
&lt;li&gt;We recommend B2B collaboration for all other cross-tenant application access scenarios, including both Microsoft and non-Microsoft applications.&lt;/li&gt;
&lt;li&gt;B2B direct connect and cross-tenant synchronization are designed to co-exist, and you can enable them both for broad coverage of cross-tenant scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#39;re trying to determine the extent to which we&amp;#39;ll need to utilize cross-tenant synchronization in our multitenant organization. Do you plan to extend support for B2B direct connect beyond Teams Connect?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;#39;s no plan to extend support for B2B direct connect beyond Teams Connect shared channels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft 365&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization enhance any cross-tenant Microsoft 365 app access user experiences?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant synchronization utilizes a feature that improves the user experience by suppressing the first-time B2B consent prompt and redemption process in each tenant.&lt;/li&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Can cross-tenant synchronization enable people search scenarios where synchronized users appear in the global address list of the target tenant?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Yes, but you must set the value for the showInAddressList attribute of synchronized users to True, which is not set by default. If you want to create a unified address list, you&amp;#39;ll need to set up a mesh peer-to-peer topology. For more information, see Step 9: Review attribute mappings.&lt;/li&gt;
&lt;li&gt;Cross-tenant synchronization creates B2B collaboration users and doesn&amp;#39;t create contacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Teams&lt;/h2&gt;
&lt;h3&gt;Does cross-tenant synchronization enhance any current Teams experiences?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Synchronized users will have the same cross-tenant Microsoft 365 experiences available to any other B2B collaboration user.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Integration&lt;/h2&gt;
&lt;p&gt;What federation options are supported for users in the target tenant back to the source tenant?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For each internal user in the source tenant, cross-tenant synchronization creates a federated external user (commonly used in B2B) in the target. It supports syncing internal users. This includes internal users federated to other identity systems using domain federation (such as Active Directory Federation Services). It doesn&amp;#39;t support syncing external users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Does cross-tenant synchronization use System for Cross-Domain Identity Management (SCIM)?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No. Currently, Microsoft Entra ID supports a SCIM client, but not a SCIM server. For more information, see SCIM synchronization with Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deprovisioning&lt;/h2&gt;
&lt;p&gt;Does cross-tenant synchronization support deprovisioning users?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Yes, when the below actions occur in the source tenant, the user will be soft deleted in the target tenant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delete the user in the source tenant&lt;/li&gt;
&lt;li&gt;Unassign the user from the cross-tenant synchronization configuration&lt;/li&gt;
&lt;li&gt;Remove the user from a group that is assigned to the cross-tenant synchronization configuration&lt;/li&gt;
&lt;li&gt;An attribute on the user changes such that they do not meet the scoping filter conditions defined on the cross-tenant synchronization configuration anymore&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the user is blocked from sign-in in the source tenant (accountEnabled = false) they will be blocked from sign-in in the target. This is not a deletion, but an updated to the accountEnabled property.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users are not soft deleted from the target tenant in this scenario:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a user to a group and assign it to the cross-tenant synchronization configuration in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle.&lt;/li&gt;
&lt;li&gt;Update the account enabled status to false on the user in the source tenant.&lt;/li&gt;
&lt;li&gt;Provision the user on-demand or through the incremental cycle. The account enabled status is changed to false in the target tenant.&lt;/li&gt;
&lt;li&gt;Remove the user from the group in the source tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Does cross-tenant synchronization support restoring users?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If the user in the source tenant is restored, reassigned to the app, meets the scoping condition again within 30 days of soft deletion, it will be restored in the target tenant.&lt;/li&gt;
&lt;li&gt;IT admins can also manually restore the user directly in the target tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How can I deprovision all the users that are currently in scope of cross-tenant synchronization?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unassign all users and / or groups from the cross-tenant synchronization configuration. This will trigger all the users that were unassigned, either directly or through group membership, to be deprovisioned in subsequent sync cycles. Please note that the target tenant will need to keep the inbound policy for sync enabled until deprovisioning is complete. If the scope is set to Sync all users and groups, you will also need to change it to Sync only assigned users and groups. The users will be automatically soft deleted by cross-tenant synchronization. The users will be automatically hard deleted after 30 days or you can choose to hard delete the users directly from the target tenant. You can choose to hard delete the users directly in the target tenant or wait 30 days for the users to be automatically hard deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;If the sync relationship is severed, are external users previously managed by cross-tenant synchronization deleted in the target tenant?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No. No changes are made to the external users previously managed by cross-tenant synchronization if the relationship is severed (for example, if the cross-tenant synchronization policy is deleted).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization identity provisioning for Microsoft 365&lt;/h2&gt;
&lt;h3&gt;Article · 04/24/2024&lt;/h3&gt;
&lt;p&gt;The multitenant organization capability is designed for organizations that own multiple Microsoft Entra tenants and want to streamline intra-organization cross-tenant collaboration in Microsoft 365. It&amp;#39;s built on the premise of reciprocal provisioning of B2B member users across multitenant organization tenants.&lt;/p&gt;
&lt;h3&gt;Microsoft 365 people search&lt;/h3&gt;
&lt;p&gt;Teams external access and Teams shared channels excluded, Microsoft 365 people search is typically scoped to within local tenant boundaries. In multitenant organizations with increased need for cross-tenant coworker collaboration, it&amp;#39;s recommended to reciprocally provision users from their home tenants into the resource tenants of collaborating coworkers.&lt;/p&gt;
&lt;h3&gt;New Microsoft Teams&lt;/h3&gt;
&lt;p&gt;The new Microsoft Teams experience improves upon Microsoft 365 people search and Teams external access for a unified seamless collaboration experience. For this improved experience to light up, the multitenant organization representation in Microsoft Entra ID is required and collaborating users shall be provisioned as B2B members. For more information, see Announcing more seamless collaboration in Microsoft Teams for multitenant organizations.&lt;/p&gt;
&lt;h3&gt;Collaborating user set&lt;/h3&gt;
&lt;p&gt;Collaboration in Microsoft 365 is built on the premise of reciprocal provisioning of B2B identities across multitenant organization tenants.&lt;/p&gt;
&lt;p&gt;For example, say Annie in tenant A, Bob and Barbara in tenant B, and Charlie in tenant C want to collaborate. Conceptually, these four users represent a collaborating user set of four internal identities across three tenants.&lt;/p&gt;
&lt;h2&gt;For people search to succeed, while scoped to local tenant boundaries, the entire collaborating user set must be represented within the scope of each multitenant organization tenant A, B, and C, in the form of either internal or B2B identities.&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant A&lt;/th&gt;
&lt;th&gt;Tenant B&lt;/th&gt;
&lt;th&gt;Tenant C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;td&gt;Internal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annie&lt;/td&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;Barbara&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Charles&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Tenant Relationships](image.png) --&gt;

&lt;p&gt;Depending on your organization&amp;#39;s needs, the collaborating user set may contain a subset of collaborating employees, or eventually all employees.&lt;/p&gt;
&lt;h2&gt;Sharing your users&lt;/h2&gt;
&lt;p&gt;One of the simpler ways to achieve a collaborating user set in each multitenant organization tenant is for each tenant administrator to define their user contribution and synchronization them outbound. Tenant administrators on the receiving end should accept the shared users inbound.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrator A contributes or shares Annie&lt;/li&gt;
&lt;li&gt;Administrator B contributes or shares Bob and Barbara&lt;/li&gt;
&lt;li&gt;Administrator C contributes or shares Charles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft 365 admin center facilitates orchestration of such a collaborating user set across multitenant organization tenants.&lt;/h2&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://link&quot;&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alternatively, pair-wise configuration of inbound and outbound cross-tenant synchronization can be used to orchestrate such collating user set across multitenant organization tenants. For more information, see &lt;a href=&quot;https://link&quot;&gt;What is a cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;B2B member users&lt;/h3&gt;
&lt;p&gt;To ensure a seamless collaboration experience across the multitenant organization in new Microsoft Teams, B2B identities are provisioned as B2B users of Member userType.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| User synchronization method                                  | Default userType property         |
|--------------------------------------------------------------|-----------------------------------|
| Synchronize users in multitenant organizations in Microsoft 365 | Member                          |
|                                                              | Remains Guest, if the B2B identity already existed as Guest |
| Cross-tenant synchronization in Microsoft Entra ID           | Member                          |
|                                                              | Remains Guest, if the B2B identity already existed as Guest |
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    A[Tenant A] --&amp;gt;|Internal Annie&amp;lt;br&amp;gt;External Bob, Barbara, Charles| B[Tenant B]
    B --&amp;gt;|Internal Bob, Barbara&amp;lt;br&amp;gt;External Annie, Charles| C[Tenant C]
    C --&amp;gt;|Internal Charles&amp;lt;br&amp;gt;External Annie, Bob, Barbara| A
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;From a security perspective, you should review the default permissions granted to B2B member users. For more information, see &lt;a href=&quot;#&quot;&gt;Compare member and guest default permissions&lt;/a&gt;.&lt;/h2&gt;
&lt;p&gt;To change the userType from &lt;strong&gt;Guest to Member&lt;/strong&gt; (or vice versa), a source tenant administrator can amend the &lt;a href=&quot;#&quot;&gt;attribute mappings&lt;/a&gt;, or a target tenant administrator can &lt;a href=&quot;#&quot;&gt;change the userType&lt;/a&gt; if the property is not recurringly synchronized.&lt;/p&gt;
&lt;h2&gt;Unsharing your users&lt;/h2&gt;
&lt;p&gt;To unshare users, you deprovision users by using the user deprovisioning capabilities available in Microsoft Entra cross-tenant synchronization. By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless Target Object Actions for Delete is disabled. For more information, see &lt;a href=&quot;#&quot;&gt;Deprovisioning&lt;/a&gt; and &lt;a href=&quot;#&quot;&gt;Define who is in scope for provisioning&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Plan for multitenant organizations in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Set up a multitenant org in Microsoft 365&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Multitenant organization optional policy templates&lt;/h2&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;Administrators staying in control of their resources is a guiding principle for multitenant organization collaboration. Cross-tenant access settings are required for each tenant-to-tenant relationship. Tenant administrators explicitly configure cross-tenant access partner configurations and identity synchronization settings for partner tenants inside the multitenant organization.&lt;/p&gt;
&lt;p&gt;To help apply homogenous cross-tenant access settings to partner tenants in the multitenant organization, the administrator of each tenant can configure optional cross-tenant access settings templates dedicated to the multitenant organization. This article describes how to use templates to preconfigure cross-tenant access settings that are applied to any partner tenant newly joining the multitenant organization.&lt;/p&gt;
&lt;h3&gt;Autogeneration of cross-tenant access settings&lt;/h3&gt;
&lt;p&gt;Within a multitenant organization, each pair of tenants must have bi-directional cross-tenant access settings, for both, partner configuration and identity synchronization.
These settings provide the underlying policy framework for enabling trust and for sharing users and applications.&lt;/p&gt;
&lt;p&gt;When your tenant joins a new multitenant organization, or when a partner tenant joins your existing multitenant organization, cross-tenant access settings to other partner tenants in the enlarged multitenant organization, if they don&amp;#39;t already exist, are automatically generated in an unconfigured state. In an unconfigured state, these cross-tenant access settings pass through the default settings.&lt;/p&gt;
&lt;p&gt;Default cross-tenant access settings apply to all external tenants for which you haven&amp;#39;t created organization-specific customized settings. Typically, these settings are configured to be nontrusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be disabled and user and group sharing in B2B direct connect or B2B collaboration might be disallowed.&lt;/p&gt;
&lt;p&gt;In multitenant organizations, on the other hand, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While the autogeneration of cross-tenant access settings for multitenant organization partner tenants in and of itself doesn&amp;#39;t change any authentication or authorization policy behavior, it allows your organization to easily customize the cross-tenant access settings for partner tenants in the multitenant organization on a per-tenant basis.&lt;/p&gt;
&lt;h2&gt;Policy templates at multitenant organization formation&lt;/h2&gt;
&lt;p&gt;As previously described, in multitenant organizations, cross-tenant access settings are typically expected to be trusting. For example, cross-tenant trusts for multifactor authentication and compliant device claims might be enabled and user and group sharing in B2B direct connect or B2B collaboration might be allowed.&lt;/p&gt;
&lt;p&gt;While autogeneration of cross-tenant access settings, per previous section, guarantees the existence of cross-tenant access settings for every multitenant organization partner tenant, further maintenance of the cross-tenant access settings for multitenant organization partner tenants is conducted individually, on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To reduce the workload for administrators at the time of multitenant organization formation, you can optionally use policy templates for preemptive configuration of cross-tenant access settings. These template settings are applied at the time of your tenant joins a multitenant organization to all external multitenant organization partner tenants as well as at the time of any partner tenant joins your existing multitenant organization to such new partner tenant.&lt;/p&gt;
&lt;p&gt;Enablement or configuration of the optional policy templates, at the time of a partner tenant joins a multitenant organization, preemptively amend the corresponding cross-tenant access settings, for both partner configuration and identity synchronization.&lt;/p&gt;
&lt;p&gt;As an example, consider the actions of the administrators for an anticipated multitenant organization with three tenants, A, B, and C.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The administrators of all three tenants enable and configure their respective optional policy templates to enable cross-tenant trusts for multifactor authentication and compliant device claims and to allow user and group sharing in B2B direct connect and B2B collaboration.&lt;/li&gt;
&lt;li&gt;Administrator A creates the multitenant organization and adds tenants B and C as pending tenants to the multitenant organization.&lt;/li&gt;
&lt;li&gt;Administrator B joins the multitenant organization. Cross-tenant access settings in tenant A for partner tenant B are amended, according to tenant A policy template settings. Vice versa, cross-tenant access settings in tenant B for partner tenant A are amended, according to tenant B policy template settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Administrator C joins the multitenant organization.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cross-tenant access settings in tenants A (and B) for partner tenant C are amended, according to tenant A (and B) policy template settings. Similarly, cross-tenant access settings in tenant C for partner tenants A and B are amended, according to tenant C policy template settings.&lt;/li&gt;
&lt;li&gt;Following the formation of this multitenant organization of three tenants, the cross-tenant access settings of all tenant pairs in the multitenant organization have preemptively been configured.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, configuration of the optional policy templates enable you to homogeneously initialize cross-tenant access settings across your multitenant organization, while maintaining maximum flexibility to customize your cross-tenant access settings as needed on a per-tenant basis.&lt;/p&gt;
&lt;p&gt;To stop using the policy templates, you can reset them to their default state. For more information, see Configure multitenant organization templates.&lt;/p&gt;
&lt;h2&gt;Policy template scoping and additional properties&lt;/h2&gt;
&lt;p&gt;To provide administrators with further configurability, you can choose when cross-tenant access settings are to be amended according to the policy templates. For example, you can choose to apply the policy templates for the following tenants when a tenant joins a multitenant organization:&lt;/p&gt;
&lt;h3&gt;Expand table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tenant&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Only new partner tenants&lt;/td&gt;
&lt;td&gt;Tenants whose cross-tenant access settings are autogenerated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only existing partner tenants&lt;/td&gt;
&lt;td&gt;Tenants who already have cross-tenant access settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All partner tenants&lt;/td&gt;
&lt;td&gt;Both new partner tenants and existing partner tenants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No partner tenants&lt;/td&gt;
&lt;td&gt;Policy templates are effectively disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In this context, new partners refer to tenants for which you haven&amp;#39;t yet configured cross-tenant access settings, while existing partners refer to tenants for which you have already configured cross-tenant access settings. This scoping is specified with the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access partner configuration template and the &lt;code&gt;templateApplicationLevel&lt;/code&gt; property on the cross-tenant access identity synchronization template.&lt;/p&gt;
&lt;h2&gt;Interpretation of Template Property Values&lt;/h2&gt;
&lt;p&gt;Finally, in terms of interpretation of template property values, any template property value of &lt;code&gt;null&lt;/code&gt; has no effect on the corresponding property value in the targeted cross-tenant access settings, while a defined template property value causes the corresponding property value in the targeted cross-tenant access settings to be amended in accordance with the template. The following table illustrates how template property values are being applied to corresponding cross-tenant access setting values.&lt;/p&gt;
&lt;h3&gt;Table: Template Property Value Application&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template Value&lt;/th&gt;
&lt;th&gt;Initial Partner Settings Value (Before joining multitenant org)&lt;/th&gt;
&lt;th&gt;Final Partner Settings Value (After joining multitenant org)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&amp;lt;Partner Settings Value&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;Partner Settings Value&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;Template Value&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;any value&amp;gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;Template Value&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Policy templates used by Microsoft 365 admin center&lt;/h2&gt;
&lt;p&gt;When a multitenant organization is formed in Microsoft 365 admin center, an administrator agrees to the following multitenant organization template settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity synchronization is set to allow users to synchronize into this tenant&lt;/li&gt;
&lt;li&gt;Cross-tenant access is set to automatically redeem user invitations for both inbound and outbound&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is achieved by setting the corresponding three template property values to &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.inboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;automaticUserConsentSettings.outboundAllowed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;userSyncInbound&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;http://example.com&quot;&gt;Join or leave a multitenant organization in Microsoft 365&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access settings at time of multitenant organization disassembly&lt;/h2&gt;
&lt;p&gt;Currently, there&amp;#39;s no equivalent policy template feature supporting the disassembly of a multitenant organization. When a partner tenant leaves the multitenant organization, each tenant administrator must re-examine and amend accordingly the cross-tenant access settings for the partner tenant that left the multitenant organization.&lt;/p&gt;
&lt;p&gt;The partner tenant that left the multitenant organization must re-examine and amend accordingly the cross-tenant access settings for all former multitenant organization partner tenants as well as consider resetting the two policy templates for cross-tenant access settings.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Limitations in multitenant organizations&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes limitations to be aware of when you work with multitenant organization functionality across Microsoft Entra ID and Microsoft 365. To provide feedback about the multitenant organization functionality on UserVoice, see &lt;a href=&quot;&quot;&gt;Microsoft Entra UserVoice&lt;/a&gt;. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h3&gt;Scope&lt;/h3&gt;
&lt;p&gt;The limitations described in this article have the following scope.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;In scope&lt;/td&gt;
&lt;td&gt;- Microsoft Entra administrator limitations related to multitenant organizations to support seamless collaboration experiences in new Teams, with reciprocally provisioned B2B members&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Related scope&lt;/td&gt;
&lt;td&gt;- Microsoft 365 admin center limitations related to multitenant organizations - Microsoft 365 multitenant organization people search experiences - Cross-tenant synchronization limitations related to Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Out of scope&lt;/td&gt;
&lt;td&gt;- Cross-tenant synchronization unrelated to Microsoft 365 - End user experiences in new Teams - End user experiences in Power BI - Tenant migration or consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsupported&lt;/td&gt;
&lt;td&gt;- Seamless collaboration experience across multitenant organizations in classic Teams - Self-service for multitenant organizations larger than 100 tenants - Multitenant organizations in Azure Government or Microsoft Azure operated by 21Vianet - Cross-cloud multitenant organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Microsoft 365 admin center versus cross-tenant synchronization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Whether you use the Microsoft 365 admin center share users functionality or Microsoft Entra cross-tenant synchronization, the following items apply:&lt;ul&gt;
&lt;li&gt;In the identity platform, both methods are represented as Microsoft Entra cross-tenant synchronization jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Synchronization jobs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Synchronization jobs created with Microsoft Entra ID will not appear in the Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created your synchronization job in the Microsoft 365 admin center, do not modify the synchronization job name using Microsoft Entra ID, otherwise it will no longer appear in the admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You might adjust the attribute mappings to match your organizations&amp;#39; needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By default, new B2B users are provisioned as B2B members, while existing B2B guests remain B2B guests.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can opt to convert B2B guests into B2B members by setting &lt;a href=&quot;#&quot;&gt;Apply this mapping to Always&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you&amp;#39;re using Microsoft Entra cross-tenant synchronization to provision your users, rather than the Microsoft 365 admin center share users functionality, Microsoft 365 admin center indicates an Outbound sync status of Not configured. This is expected behavior. Currently, Microsoft 365 admin center only shows the status of Microsoft Entra cross-tenant synchronization jobs created and managed by Microsoft 365 admin center and doesn&amp;#39;t display Microsoft Entra cross-tenant synchronizations created and managed in Microsoft Entra ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you view Microsoft Entra cross-tenant synchronization in Microsoft Entra admin center, after adding tenants to or after joining a multitenant organization in Microsoft 365 admin center, you&amp;#39;ll see a cross-tenant synchronization configuration with the name MTO_Sync_&lt;TenantID&gt;. Refrain from editing or changing the name if you want Microsoft 365 admin center to recognize the configuration as created and managed by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft Entra cross-tenant synchronization doesn&amp;#39;t support establishing a cross- tenant synchronization configuration before the tenant in question allows inbound synchronization in their cross-tenant access settings for identity synchronization. Hence the usage of the cross-tenant access settings template for identity synchronization is encouraged, with userSyncInbound set to true, as facilitated by Microsoft 365 admin center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There&amp;#39;s no established or supported pattern for Microsoft 365 admin center to take control of pre-existing Microsoft Entra cross-tenant synchronization configurations and jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Join requests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;There are multiple reasons why a join request might fail. If the Microsoft 365 admin center doesn&amp;#39;t indicate why a join request isn&amp;#39;t succeeding, try examining the join request response by using the Microsoft Graph APIs or Microsoft Graph Explorer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If you followed the correct sequence to create a multitenant organization and add a tenant to the multitenant organization, and the added tenant&amp;#39;s join request keeps failing, submit a support request in the Microsoft Entra or Microsoft 365 admin center.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft apps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;In SharePoint OneDrive, the promotion of B2B guests to B2B members might not happen automatically. If faced with a user type mismatch between Microsoft Entra ID and SharePoint OneDrive, try &lt;code&gt;Set-SPUser [-SyncFromAD]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In SharePoint OneDrive user interfaces, when sharing a file with People in Fabrikam, the current user interfaces might be counterintuitive, because B2B members in Fabrikam from Contoso count towards People in Fabrikam.&lt;/li&gt;
&lt;li&gt;In Microsoft Forms, B2B member users might not be able to access forms.&lt;/li&gt;
&lt;li&gt;In Microsoft Power BI, B2B member users are not yet supported. B2B guest users can continue to access Power BI dashboards.&lt;/li&gt;
&lt;li&gt;In Microsoft Power Apps, Microsoft Dynamics 365, and related workloads, B2B member users may have restricted functionality. For more information, see Invite users with Microsoft Entra B2B collaboration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;B2B users or B2B members&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The promotion of B2B guests to B2B members represents a strategic decision by multitenant organizations to consider B2B members as trusted users of the organization. Review the &lt;a href=&quot;#&quot;&gt;default permissions&lt;/a&gt; for B2B members.&lt;/li&gt;
&lt;li&gt;To promote B2B guests to B2B members, a source tenant administrator can amend the &lt;a href=&quot;#&quot;&gt;attribute mappings&lt;/a&gt;, or a target tenant administrator can &lt;a href=&quot;#&quot;&gt;change the userType&lt;/a&gt; if the property is not recurringly synchronized.&lt;/li&gt;
&lt;li&gt;As your organization rolls out the multitenant organization functionality including provisioning of B2B users across multitenant organization tenants, you might want to provision some users as B2B guests, while provision others users as B2B members. To achieve this, you might want to establish two Microsoft Entra cross-tenant synchronization configurations in the source tenant, one with userType attribute mappings configured to B2B guest, and another with userType attribute mappings configured to B2B member, each with Apply this mapping set to&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant synchronization deprovisioning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;By default, when provisioning scope is reduced while a synchronization job is running, users fall out of scope and are soft deleted, unless &lt;a href=&quot;#&quot;&gt;Target Object Actions for Delete&lt;/a&gt; is disabled. For more information, see &lt;a href=&quot;#&quot;&gt;Deprovisioning and Define who is in scope for provisioning&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Currently, &lt;code&gt;SkipOutOfScopeDeletions&lt;/code&gt; works for application provisioning jobs, but not for Microsoft Entra cross-tenant synchronization. To avoid soft deletion of users taken out of scope of cross-tenant synchronization, set &lt;a href=&quot;#&quot;&gt;Target Object Actions for Delete&lt;/a&gt; to disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Known issues for provisioning in Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Topologies for cross-tenant collaboration&lt;/h2&gt;
&lt;p&gt;Article · 11/03/2023&lt;/p&gt;
&lt;p&gt;Organizations often find themselves managing multiple tenants due to mergers and acquisitions, regulatory requirements, or administrative boundaries. Regardless of your scenario, Microsoft Entra offers a flexible and ready-to-use solution for provisioning accounts across tenants and facilitating seamless collaboration. Microsoft Entra accommodates the following three models and can adapt to your evolving organizational needs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hub and spoke&lt;/li&gt;
&lt;li&gt;Mesh&lt;/li&gt;
&lt;li&gt;Just-in-time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hub and spoke&lt;/h3&gt;
&lt;p&gt;The hub and spoke topology presents two common patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Option 1 (application hub): In this option, you can integrate commonly used applications into a central hub tenant that users from across the organization can access.&lt;/li&gt;
&lt;li&gt;Option 2 (user hub): Alternatively, option 2 centralizes all your users in a single tenant and provisions them into spoke tenants where resources are managed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#39;s examine a few real-world scenarios and see how they align with each of these models.&lt;/p&gt;
&lt;h3&gt;Mergers and acquisitions (application hub)&lt;/h3&gt;
&lt;p&gt;During mergers and acquisitions, the ability to quickly enable collaboration is crucial, allowing businesses to function cohesively while complex IT decisions are being made. For instance, when a newly acquired company&amp;#39;s employees need immediate access to applications such as the internal help desk ticketing system or benefits application, cross-tenant synchronization proves invaluable. This synchronization process allows users from the acquired company to be provisioned into the application hub from day one, granting them access to SaaS apps, on-premises applications, and other cloud resources. Within the target tenant, admins can set up access packages to grant time limited access to additional applications such as Salesforce and Amazon Web Services.&lt;/p&gt;
&lt;h2&gt;Separate collaboration and resource tenants (user hub)&lt;/h2&gt;
&lt;p&gt;As organizations scale their usage of Azure, they often create dedicated tenants for managing critical Azure resources. Meanwhile, they rely on a central hub tenant for user provisioning. This model empowers administrators in the hub tenant to establish central security and governance policies while granting development teams greater autonomy and agility to deploy required Azure resources. Cross-tenant synchronization supports this topology by enabling administrators to provision a subset of users into the spoke tenants and manage the lifecycle of those users.&lt;/p&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Diagram of user hub model with tenants and provision of access to resources](image.png) --&gt;

&lt;h2&gt;HR&lt;/h2&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Active Directory Mesh Diagram](image URL) --&gt;

&lt;h3&gt;Mesh&lt;/h3&gt;
&lt;p&gt;While some companies centralize their users within a single tenant, others have a more decentralized structure with applications, HR systems, and Active Directory domains integrated into each tenant. Cross-tenant synchronization offers the flexibility to choose which users are provisioned into each tenant.&lt;/p&gt;
&lt;h3&gt;Collaborate within a portfolio company (partial-mesh)&lt;/h3&gt;
&lt;p&gt;In this scenario, each tenant represents a different company within the same parent organization. Administrators in each tenant choose a subset of users to provision into the target tenant. This solution provides flexibility for each tenant to operate independently, while facilitating collaboration when users need access to critical resources.&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization is one way.&lt;/h2&gt;
&lt;p&gt;An internal member user can be synchronized into multiple tenants as an external user. When the topology shows a synchronization going in both directions, it&amp;#39;s a distinct set of users in each direction and each arrow is a separate configuration.&lt;/p&gt;
&lt;h2&gt;Collaborate across business units (full-mesh)&lt;/h2&gt;
&lt;p&gt;In this scenario, the organization has designated different tenants for each business unit. The business units work closely together, in particular using Microsoft Teams. As a result, each tenant has chosen to provision all users across the four tenants in the organization. As new users join the company or leave, the provisioning service takes care of creating and deleting users. The organization has also configured a multitenant organization that includes all four tenants. Now when users need to collaborate in Teams, they&amp;#39;re able to easily find users across the company and start chats and meetings with those users.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
    Tenant1([Tenant 1]) --&amp;gt;|User sync| Tenant2([Tenant 2])
    Tenant2 --&amp;gt;|User sync| Tenant3([Tenant 3])
    Tenant3 --&amp;gt;|User sync| Tenant4([Tenant 4])
    Tenant4 --&amp;gt;|User sync| Tenant1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Note: The actual names of the tenants were replaced with &amp;quot;Tenant 1&amp;quot;, &amp;quot;Tenant 2&amp;quot;, etc., to maintain the structure without using specific logos or company names. The arrows in the Mermaid diagram represent user synchronization between different tenants.)&lt;/p&gt;
&lt;h2&gt;Just-in-time&lt;/h2&gt;
&lt;p&gt;While the scenarios discussed so far cover collaboration within an organization, there are cases where cross-organization collaboration is vital. This could be in the context of joint ventures or organizations of independent legal entities. By employing connected organizations and entitlement management, you can define policies for accessing resources across connected organizations and enable users to request access to the resources they need.&lt;/p&gt;
&lt;h2&gt;Joint ventures&lt;/h2&gt;
&lt;p&gt;Consider Contoso and Litware, separate organizations engaged in a multi-year joint venture. They need to collaborate closely. Administrators at Contoso have defined access packages containing the resources required by Litware users. When a new Litware employee needs access to Contoso&amp;#39;s resources, they can request access to the access package. Upon approval, they are provisioned with the necessary resources. Access can be time-limited and subject to periodic review to ensure compliance with Contoso&amp;#39;s governance requirements.&lt;/p&gt;
&lt;p&gt;The following diagram shows how two organizations can just-in-time collaborate by using connected organizations and entitlement management.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
  Contoso -.-&amp;gt;|connected organization| AWS
  Contoso -.-&amp;gt;|connected organization| Salesforce
  AWS -.-&amp;gt;|connected organization| Salesforce
  Salesforce -.-&amp;gt;|connected organization| Contoso
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Contoso&lt;/h2&gt;
&lt;h3&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Marketing group &lt;!-- Image reference points to missing/unhandled asset: ![Marketing group](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Sales team group &lt;!-- Image reference points to missing/unhandled asset: ![Sales team group](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Marketing app &lt;!-- Image reference points to missing/unhandled asset: ![Marketing app](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Sales app &lt;!-- Image reference points to missing/unhandled asset: ![Sales app](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Marketing site &lt;!-- Image reference points to missing/unhandled asset: ![Marketing site](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Sales site &lt;!-- Image reference points to missing/unhandled asset: ![Sales site](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;User 1 &lt;!-- Image reference points to missing/unhandled asset: ![User 1](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;User 2 &lt;!-- Image reference points to missing/unhandled asset: ![User 2](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;User 3 &lt;!-- Image reference points to missing/unhandled asset: ![User 3](image-url) --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Litware&lt;/h2&gt;
&lt;h3&gt;Connected organization&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Litware user 1 &lt;!-- Image reference points to missing/unhandled asset: ![Litware user 1](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Litware user 2 &lt;!-- Image reference points to missing/unhandled asset: ![Litware user 2](image-url) --&gt;&lt;/li&gt;
&lt;li&gt;Litware user 3 &lt;!-- Image reference points to missing/unhandled asset: ![Litware user 3](image-url) --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Marketing catalog&lt;/h3&gt;
&lt;h3&gt;Sales catalog&lt;/h3&gt;
&lt;h4&gt;Sales team group&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Sales app: contributor&lt;/li&gt;
&lt;li&gt;Sales site: member&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Salesperson access package&lt;/h4&gt;
&lt;h4&gt;Sales support access package&lt;/h4&gt;
&lt;h4&gt;Policies for access request, approval, review, lifecycle, separation of duties (SOD)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Employees can request&lt;/li&gt;
&lt;li&gt;Outside sales reps can request&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;h3&gt;Was this page helpful?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Yes&lt;/li&gt;
&lt;li&gt;No&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;url&quot;&gt;Provide product feedback&lt;/a&gt; | &lt;a href=&quot;url&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Governance and cross-tenant synchronization&lt;/h2&gt;
&lt;h3&gt;Article · 03/21/2024&lt;/h3&gt;
&lt;p&gt;Cross-tenant synchronization is a flexible and ready-to-use solution to provision accounts and facilitate seamless collaboration across tenants in an organization. Cross-tenant synchronization automatically manages user identity lifecycle across tenants. It provisions, synchronizes, and deprovisions users in the scope of synchronization from source tenants.&lt;/p&gt;
&lt;p&gt;This article describes how Microsoft Entra ID Governance customers can use cross-tenant synchronization to manage identity and access lifecycles across multitenant organizations.&lt;/p&gt;
&lt;h2&gt;Deployment example&lt;/h2&gt;
&lt;p&gt;In this example, Contoso is a multitenant organization with three production Microsoft Entra tenants. Contoso is deploying cross-tenant synchronization and Microsoft Entra ID Governance features to address the following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manage employee identity lifecycles across multiple tenants&lt;/li&gt;
&lt;li&gt;Use workflows to automate lifecycle processes for employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Assign resource access automatically to employees that originate in other tenants&lt;/li&gt;
&lt;li&gt;Allow employees to request access to resources in multiple tenants&lt;/li&gt;
&lt;li&gt;Review the access of synchronized users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a cross-tenant synchronization perspective, Contoso Europe, Middle East, and Africa (Contoso EMEA) and Contoso United States (Contoso US) are source tenants and Contoso is a target tenant. The following diagram illustrates the topology.&lt;/p&gt;
&lt;h2&gt;This supported topology for cross-tenant synchronization&lt;/h2&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Supported topology for cross-tenant synchronization diagram](image.png) --&gt;

&lt;h2&gt;Manage employee lifecycles across tenants&lt;/h2&gt;
&lt;h3&gt;Cross-tenant synchronization in Microsoft Entra ID&lt;/h3&gt;
&lt;p&gt;Cross-tenant synchronization in Microsoft Entra ID automates creating, updating, and deleting B2B collaboration users.&lt;/p&gt;
&lt;p&gt;When organizations create, or provision, a B2B collaboration user in a tenant, user access depends partly on how the organization provisioned them: Guest or Member user type. When you select user type, consider the various properties of a Microsoft Entra B2B collaboration user. The Member user type is suitable if users are part of the larger multitenant organization and need member-level access to resources in the organizational tenants. Microsoft Teams requires the Member user type in multitenant organizations.&lt;/p&gt;
&lt;p&gt;By default, cross-tenant synchronization includes commonly used attributes on the user object in Microsoft Entra ID. The following diagram illustrates this scenario.&lt;/p&gt;
&lt;!-- Image not found: image.png --&gt;
&lt;!-- ![Cross-tenant synchronization diagram](image.png) --&gt;

&lt;h2&gt;Application&lt;/h2&gt;
&lt;h3&gt;Cross-tenant provisioning&lt;/h3&gt;
&lt;h3&gt;Synchronization&lt;/h3&gt;
&lt;h3&gt;(syncs user attribute data)&lt;/h3&gt;
&lt;h3&gt;Automatic assignment policies for access packages&lt;/h3&gt;
&lt;p&gt;Organizations use the attributes to help create dynamic membership of groups and access packages in the source and target tenant. Some Microsoft Entra ID features have user attributes to target, such as lifecycle workflow user scoping.&lt;/p&gt;
&lt;p&gt;To remove, or deprovision, a B2B collaboration user from a tenant automatically stops access to resources in that tenant. This configuration is relevant when employees leave an organization.&lt;/p&gt;
&lt;h2&gt;Automate lifecycle processes with workflows&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID lifecycle workflows are an identity governance feature to manage Microsoft Entra users. Organizations can automate joiner, mover, and leaver processes.&lt;/p&gt;
&lt;p&gt;With cross-tenant synchronization, multitenant organizations can configure lifecycle workflows to run automatically for B2B collaboration users it manages. For example, configure a user onboarding workflow, triggered by the &lt;code&gt;createdDateTime&lt;/code&gt; event user attribute, to request access package assignment for new B2B collaboration users. Use attributes such as &lt;code&gt;userType&lt;/code&gt; and &lt;code&gt;userPrincipalName&lt;/code&gt; to scope lifecycle workflows for users homed in other tenants the organization owns.&lt;/p&gt;
&lt;h2&gt;Govern synchronized user access with access packages&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can ensure B2B collaboration users have access to shared resources in a target tenant. Users can request access, where needed. In the following scenarios, see how the identity governance feature, entitlement management access packages govern resource access.&lt;/p&gt;
&lt;h2&gt;Automatically assign access in target tenants to employees from source tenants&lt;/h2&gt;
&lt;h2&gt;Birthright Assignment&lt;/h2&gt;
&lt;p&gt;The term birthright assignment refers to automatically granting resource access based on one or more user properties. To configure birthright assignment, create &lt;a href=&quot;url&quot;&gt;automatic assignment policies for access packages&lt;/a&gt; in entitlement management and configure resource roles to grant shared resource access.&lt;/p&gt;
&lt;p&gt;Organizations manage cross-tenant synchronization configuration in the source tenant. Therefore, organizations can delegate resource access management to other source tenant administrators for synchronized B2B collaboration users: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the source tenant, administrators configure cross-tenant synchronization attribute mappings for the users that require cross-tenant resource access.&lt;/li&gt;
&lt;li&gt;In the target tenant, administrators use attributes in automatic assignment policies to determine access package membership for synchronized B2B collaboration users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To drive automatic assignment policies in the target tenant, synchronize default attribute mappings, such as department or map directory extensions, in the source tenant.&lt;/p&gt;
&lt;h2&gt;Enable source-tenant employees to request access to target-tenant shared resources&lt;/h2&gt;
&lt;p&gt;With identity governance &lt;a href=&quot;url&quot;&gt;access package policies&lt;/a&gt;, multitenant organizations can allow B2B collaboration users, created by cross-tenant synchronization, to request access to shared resources in a target tenant. This process is useful if employees need just-in-time (JIT) access to a resource that another tenant owns.&lt;/p&gt;
&lt;h2&gt;Review synchronized-user access&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;url&quot;&gt;Access reviews in Microsoft Entra ID&lt;/a&gt; enable organizations to manage group memberships, access to enterprise applications, and role assignments. Regularly review user access to ensure the right people have access.&lt;/p&gt;
&lt;p&gt;When resource access configuration doesn’t automatically assign access, such as with dynamic groups or access packages, configure access reviews to apply the results to resources upon completion. The following sections describe how multitenant organizations can configure access reviews for users across tenants in source and target tenants.&lt;/p&gt;
&lt;h2&gt;Review source-tenant user access&lt;/h2&gt;
&lt;p&gt;Multitenant organizations can include internal users in access reviews. This action
enables access recertification in source tenants that synchronizes users. Use this
approach for regular review of security groups assigned to cross-tenant synchronization.
Therefore, ongoing B2B collaboration access to other tenants has approval in the user
home tenant.&lt;/p&gt;
&lt;p&gt;Use access reviews of users in source tenants to avoid potential conflicts between cross-
tenant synchronization and access reviews that remove denied users upon completion.&lt;/p&gt;
&lt;h2&gt;Review target-tenant user access&lt;/h2&gt;
&lt;p&gt;Organizations can include B2B collaboration users in access reviews, including users
provisioned by cross-tenant synchronization in target tenants. This option enables
access recertification of resources in target tenants. Although organizations can target
all users in access reviews, guest users can be explicitly targeted if necessary.&lt;/p&gt;
&lt;p&gt;For organizations that synchronize B2B collaboration users, typically Microsoft doesn’t
recommend removing denied guest users automatically from access reviews. Cross-
tenant synchronization reprovisions the users if they&amp;#39;re in the synchronization scope.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multitenant organizations and Microsoft 365&lt;/li&gt;
&lt;li&gt;Multitenant organization templates&lt;/li&gt;
&lt;li&gt;Topologies for cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Govern access for security operations center (SOC) teams in a multitenant environment&lt;/h2&gt;
&lt;p&gt;Article · 05/02/2024&lt;/p&gt;
&lt;p&gt;Managing multitenant environments can add another layer of complexity when it comes to keeping up with the ever-evolving security threats facing your enterprise. Navigating across multiple tenants can be time consuming and reduce the overall efficiency of security operation center (SOC) teams. Multitenant management in Microsoft Defender XDR provides security operation teams with a single, unified view of all the tenants they manage. This view enables teams to quickly investigate incidents and perform advanced hunting across data from multiple tenants, improving their security operations.&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID Governance enables you to govern the access and lifecycle of the users who are members of the SOC teams and threat hunter teams. This document explores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The controls you can put in place for SOC teams to securely access resources across tenants.&lt;/li&gt;
&lt;li&gt;Example topologies for how you can implement your lifecycle and access controls.&lt;/li&gt;
&lt;li&gt;Deployment considerations (roles, monitoring, APIs).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage the lifecycle and access of a SOC user&lt;/h3&gt;
&lt;p&gt;Microsoft Entra provides the controls needed to govern the lifecycle of a SOC user and to securely provide access to the resources they need. In this document, the term source tenant refers to where the SOC users originate and authenticate against. Target tenant refers to the tenant that they&amp;#39;re investigating when there&amp;#39;s an incident. Organizations have multiple target tenants due to mergers and acquisitions, aligning tenants with business units, and aligning tenants with geos.&lt;/p&gt;
&lt;h3&gt;Lifecycle control&lt;/h3&gt;
&lt;p&gt;Entitlement management, through access packages and connected organizations allows the target tenant administrator to define collections of resources (ex: app roles, directory roles, and groups) that users from the source tenant can request access to. If the user is approved for the resources they need, but don&amp;#39;t yet have a B2B account, entitlement management will automatically create a B2B account for the user in the target tenant.&lt;/p&gt;
&lt;h2&gt;Cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Cross-tenant synchronization allows the source tenant to automate creating, updating, and deleting B2B users across tenants in an organization.&lt;/p&gt;
&lt;h2&gt;Comparing entitlement management and cross-tenant synchronization&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Entitlement management&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Cross-tenant synchronization&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create users in the target tenant&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;•&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update users in the target tenant when their attributes change in the source tenant&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete users&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;•&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assign users to groups, directory roles, app roles&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;•&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attributes of the user in the target tenant&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;Minimal, supplied by user themself at request time&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;Synchronized from the source tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Access control&lt;/h2&gt;
&lt;p&gt;You can use entitlement management and cross-tenant access policies to control access to resources across tenants. Entitlement management will assign the right users to the right resources, while cross-tenant access policies and conditional access together perform the necessary run-time checks to ensure the right users are accessing the right resources.&lt;/p&gt;
&lt;h3&gt;Entitlement management&lt;/h3&gt;
&lt;p&gt;Assigning Microsoft Entra roles through entitlement management access packages helps to efficiently manage role assignments at scale and improves the role assignment lifecycle. It provides a flexible request and approval process for gaining access to directory roles, app roles, and groups while also enabling automatic assignment to resources based on user attributes.&lt;/p&gt;
&lt;h2&gt;Cross-tenant access policies&lt;/h2&gt;
&lt;p&gt;External identities cross-tenant access settings manage how you collaborate with other Microsoft Entra organizations through B2B collaboration. These settings determine both the level of inbound access users in external Microsoft Entra organizations have to your resources, and the level of outbound access your users have to external organizations.&lt;/p&gt;
&lt;h2&gt;Deployment topologies&lt;/h2&gt;
&lt;p&gt;This section describes how you can use tools such as cross-tenant synchronization, entitlement management, cross-tenant access policies, and conditional access together. In both topologies, the target tenant admin has full control over access to resources in the target tenant. They differ in who initiates provisioning and deprovisioning.&lt;/p&gt;
&lt;h2&gt;Topology 1&lt;/h2&gt;
&lt;p&gt;In topology 1, the source tenant configures entitlement management and cross-tenant synchronization to provision users into the target tenant. Then, the administrator of the target tenant configures access packages to provide access to the necessary directory roles, group, and app roles in the target tenant.&lt;/p&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SoC users&amp;#39; governance&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Guest accounts provisioning&lt;/li&gt;
&lt;li&gt;Access packages assignment&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
  A[SoC users&amp;#39; governance] --&amp;gt;|1. Users are added to the SoC security groups through access packages| B[CROSS-TENANT SYNC]
  B --&amp;gt;|2. Users are provisioned automatically through cross-tenant sync.| C[Guest accounts provisioning]
  C --&amp;gt;|3. SoC users will be auto-assigned Security Reader access.| D[Access packages assignment]
  D --&amp;gt; E[Access Package 1 Security Reader]
  D --&amp;gt; F[Access Package 2 Security Operator]
  D --&amp;gt; G[Access Package 3 Security Admin]
  
  style A fill:#f9f,stroke:#333,stroke-width:4px
  style B fill:#bbf,stroke:#f66,stroke-width:2px,color:#f66
  style C fill:#4f4,stroke:#44f,stroke-width:2px,color:#44f
  style D fill:#999,stroke:#f44,stroke-width:2px,color:#f44
  style E fill:#f96,stroke:#333,stroke-width:1px
  style F fill:#f66,stroke:#333,stroke-width:1px
  style G fill:#faa,stroke:#333,stroke-width:1px
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Steps to configure topology 1&lt;/h3&gt;
&lt;p&gt;(Descriptive steps regarding the configuration of Topology 1 are not present within the visible text or the OCR data provided and therefore cannot be included in the markdown output.)&lt;/p&gt;
&lt;h2&gt;1. In the source tenant, configure cross-tenant synchronization to provision internal accounts in the source tenant as external accounts in the target tenant.&lt;/h2&gt;
&lt;p&gt;As users are assigned to the cross-tenant synchronization service principal, they&amp;#39;ll automatically be provisioned into the target tenant. As they&amp;#39;re removed from the configuration, they&amp;#39;ll automatically be deprovisioned. As part of your attribute mappings, you can add a new mapping of type constant to provision a directory extension attribute on the user to indicate that they&amp;#39;re a SOC administrator. Alternatively, if you have an attribute such as department that you can rely on for this step, you can skip creating the extension. This attribute will be used in the target tenant to provide them with access to the necessary roles.&lt;/p&gt;
&lt;h2&gt;2. In the source tenant, create an access package that includes the cross-tenant synchronization service principal as a resource.&lt;/h2&gt;
&lt;p&gt;As users are granted access to the package, they&amp;#39;ll be assigned to the cross-tenant synchronization service principal. Ensure that you set up periodic access reviews of the access package or time-limit the assignments to ensure that only the users that need access to the target tenant continue to have access.&lt;/p&gt;
&lt;h2&gt;3. In the target tenant, create access packages to provide the necessary roles for investigating an incident.&lt;/h2&gt;
&lt;p&gt;We recommend one autoassigned access package to provide the Security Reader role and one request based package for the Security Operator and Security Administrator roles.
Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary access packages in the source tenant. Once approved, they&amp;#39;ll automatically be provisioned into the target tenant(s) with the security reader role. They can then request additional access in any tenants where they need the Security Operator or Security Administrator roles. Once their access period is over or they&amp;#39;re removed as part of an access review, they&amp;#39;ll be deprovisioned from all the target tenants they don&amp;#39;t need access to anymore.&lt;/p&gt;
&lt;h2&gt;Topology 2&lt;/h2&gt;
&lt;p&gt;In topology 2 the target tenant administrator defines the access packages and resources that the source users can request access to. If the source tenant administrator would like to restrict which of their users can access the target tenant, you can use a cross-tenant access policy coupled with an access package to block all access to the target tenant, except for users that are part of a group that is included in an access package in the home tenant.&lt;/p&gt;
&lt;h2&gt;Source tenant and Target tenant&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source tenant&lt;/th&gt;
&lt;th&gt;Target tenant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;SoC users&amp;#39; governance&lt;/td&gt;
&lt;td&gt;Guest accounts provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Access packages assignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;PERMISSIONS&lt;/h3&gt;
&lt;p&gt;Connected organization&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Establish a connected organization.&lt;/li&gt;
&lt;li&gt;Define access packages for the necessary roles.&lt;/li&gt;
&lt;li&gt;Upon requesting the access package, SoC users will be auto-assigned Security Reader access.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Ensure they are accessible by the connected org.&lt;/li&gt;
&lt;li&gt;SoC users will have eligible access for Security Operator and Security Admin roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;| Access Package | Security Reader | Access Package 2 | Security Operator | Access Package 3 | Security Admin |&lt;/p&gt;
&lt;h2&gt;Steps to configure topology 2&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, add the source tenant as a connected organization.&lt;ul&gt;
&lt;li&gt;This setting allows the target tenant administrator to make access packages available to the source tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In the target tenant, create an access package that provides the Security Reader, Security Administrator, and Security Operator roles.&lt;/li&gt;
&lt;li&gt;Users from the source tenant can now request access packages in the target tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you have completed the setup, SOC users can navigate to myaccess.microsoft.com to request time-limited access to the necessary roles in each tenant.&lt;/p&gt;
&lt;h2&gt;Topologies compared&lt;/h2&gt;
&lt;p&gt;In both topologies, the target tenant can control what resources users have access to. This can be accomplished using a mix of cross-tenant access policies, conditional access, and assignment of apps and roles to users. They differ in who configures and initiates provisioning. In topology 1, the source tenant configures provisioning and pushes users into the target tenants. In topology 2, the target tenant defines which users are eligible to access their tenant.&lt;/p&gt;
&lt;p&gt;If a user needs access to several tenants at one time, topology 1 makes it easy for them to request access to an access package in one tenant and automatically get provisioned into several tenants. If the target tenant wants to ensure full control over who is&lt;/p&gt;
&lt;h2&gt;Deployment considerations&lt;/h2&gt;
&lt;h3&gt;Monitoring&lt;/h3&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Entra are audited in the Microsoft Entra tenant that they&amp;#39;re working in. Organizations can maintain an audit trail of actions performed, generate alerts when specific actions are performed, and analyze actions performed by pushing audit logs into Azure Monitor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Actions performed by a SOC analyst in Microsoft Defender are also audited.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Scaling deployment with PowerShell / APIs&lt;/h3&gt;
&lt;p&gt;Every step that is configured through the user interface in Microsoft Entra has accompanying Microsoft Graph APIs and PowerShell commandlets, enabling you to deploy your desired policies/configuration across the tenants in your organization.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Microsoft Graph API&lt;/th&gt;
&lt;th&gt;PowerShell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Cross-tenant synchronization&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entitlement management&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant access policies&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;#&quot;&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Role-based access control&lt;/h3&gt;
&lt;p&gt;Configuring the capabilities described in topology 1 and topology 2 require the following roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuring cross-tenant access settings - Security Administrator&lt;/li&gt;
&lt;li&gt;Configuring cross-tenant synchronization - Hybrid Identity Administrator&lt;/li&gt;
&lt;li&gt;Configuring entitlement management - Identity Governance Administrator&lt;/li&gt;
&lt;li&gt;Microsoft Defender supports both built-in roles such as Security Reader, Security Administrator, and Security Operator and custom roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What is cross-tenant synchronization?&lt;/li&gt;
&lt;li&gt;What is entitlement management?&lt;/li&gt;
&lt;li&gt;Multitenant management in Defender XDR&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Known issues for provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article · 02/14/2024&lt;/p&gt;
&lt;p&gt;This article discusses known issues to be aware of when you work with app provisioning or cross-tenant synchronization. To provide feedback about the application provisioning service on UserVoice, see Microsoft Entra application provision UserVoice. We watch UserVoice closely so that we can improve the service.&lt;/p&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;This article isn&amp;#39;t a comprehensive list of known issues. If you know of an issue that isn&amp;#39;t listed, provide feedback at the bottom of the page.&lt;/p&gt;
&lt;h2&gt;Authorization&lt;/h2&gt;
&lt;h3&gt;Unable to change provisioning mode back to manual&lt;/h3&gt;
&lt;p&gt;After you&amp;#39;ve configured provisioning for the first time, you&amp;#39;ll notice that the provisioning mode has switched from manual to automatic. You can&amp;#39;t change it back to manual. But you can turn off provisioning through the UI. Turning off provisioning in the UI effectively does the same as setting the dropdown to manual.&lt;/p&gt;
&lt;h2&gt;Attribute mappings&lt;/h2&gt;
&lt;h3&gt;Attribute SamAccountName or userType not available as a source attribute&lt;/h3&gt;
&lt;p&gt;The attributes SamAccountName and userType aren&amp;#39;t available as a source attribute by default. Extend your schema to add the attributes. You can add the attributes to the list of available source attributes by extending your schema. To learn more, see Missing source attribute.&lt;/p&gt;
&lt;h3&gt;Source attribute dropdown missing for schema extension&lt;/h3&gt;
&lt;p&gt;Extensions to your schema can sometimes be missing from the source attribute dropdown in the UI. Go into the advanced settings of your attribute mappings and&lt;/p&gt;
&lt;h2&gt;Null attribute can&amp;#39;t be provisioned&lt;/h2&gt;
&lt;p&gt;Microsoft Entra ID currently can&amp;#39;t provision null attributes. If an attribute is null on the user object, it will be skipped.&lt;/p&gt;
&lt;h2&gt;Maximum characters for attribute-mapping expressions&lt;/h2&gt;
&lt;p&gt;Attribute-mapping expressions can have a maximum of 10,000 characters.&lt;/p&gt;
&lt;h2&gt;Unsupported scoping filters&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;appRoleAssignments&lt;/code&gt;, &lt;code&gt;userType&lt;/code&gt;, and &lt;code&gt;accountExpires&lt;/code&gt; attributes aren&amp;#39;t supported as scoping filters.&lt;/p&gt;
&lt;h2&gt;Multivalue directory extensions&lt;/h2&gt;
&lt;p&gt;Multivalue directory extensions can&amp;#39;t be used in attribute mappings or scoping filters.&lt;/p&gt;
&lt;h2&gt;Service issues&lt;/h2&gt;
&lt;h3&gt;Unsupported scenarios&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provisioning passwords isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning nested groups isn&amp;#39;t supported.&lt;/li&gt;
&lt;li&gt;Provisioning to B2C tenants isn&amp;#39;t supported because of the size of the tenants.&lt;/li&gt;
&lt;li&gt;Not all provisioning apps are available in all clouds. For example, Atlassian isn&amp;#39;t yet available in the Government cloud. We&amp;#39;re working with app developers to onboard their apps to all clouds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Automatic provisioning isn&amp;#39;t available on my OIDC-based application&lt;/h2&gt;
&lt;p&gt;If you create an app registration, the corresponding service principal in enterprise apps won&amp;#39;t be enabled for automatic user provisioning. You&amp;#39;ll need to either request the app be added to the gallery, if intended for use by multiple organizations, or create a second non-gallery app for provisioning.&lt;/p&gt;
&lt;h2&gt;Manager isn&amp;#39;t provisioned&lt;/h2&gt;
&lt;p&gt;If a user and their manager are both in scope for provisioning, the service provisions the user and then updates the manager. If on day one the user is in scope and the manager is out of scope, we&amp;#39;ll provision the user without the manager reference. When the manager comes into scope, the manager reference won&amp;#39;t be updated until you restart provisioning and cause the service to reevaluate all the users again.&lt;/p&gt;
&lt;h2&gt;The provisioning interval is fixed&lt;/h2&gt;
&lt;p&gt;The time between provisioning cycles is currently not configurable.&lt;/p&gt;
&lt;h2&gt;Changes not moving from target app to Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;The app provisioning service isn&amp;#39;t aware of changes made in external apps. So, no action is taken to roll back. The app provisioning service relies on changes made in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Switching from Sync All to Sync Assigned not working&lt;/h2&gt;
&lt;p&gt;After you change scope from Sync All to Sync Assigned, make sure to also perform a restart to ensure that the change takes effect. You can do the restart from the UI.&lt;/p&gt;
&lt;h2&gt;Provisioning cycle continues until completion&lt;/h2&gt;
&lt;p&gt;When you set provisioning to enabled = off or select Stop, the current provisioning cycle continues running until completion. The service stops executing any future cycles until you turn provisioning on again.&lt;/p&gt;
&lt;h2&gt;Member of group not provisioned&lt;/h2&gt;
&lt;p&gt;When a group is in scope and a member is out of scope, the group will be provisioned. The out-of-scope user won&amp;#39;t be provisioned. If the member comes back into scope, the service won&amp;#39;t immediately detect the change. Restarting provisioning addresses the issue. Periodically restart the service to ensure that all users are properly provisioned.&lt;/p&gt;
&lt;h2&gt;Global Reader&lt;/h2&gt;
&lt;p&gt;The Global Reader role is unable to read the provisioning configuration. Create a custom role with the &lt;code&gt;microsoft.directory/applications/synchronization/standard/read&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Microsoft Azure Government Cloud&lt;/h2&gt;
&lt;p&gt;Credentials, including the secret token, notification email, and SSO certificate notification emails together have a 1KB limit in the Microsoft Azure Government Cloud.&lt;/p&gt;
&lt;h2&gt;On-premises application provisioning&lt;/h2&gt;
&lt;p&gt;The following information is a current list of known limitations with the Microsoft Entra ECMA Connector Host and on-premises application provisioning.&lt;/p&gt;
&lt;h3&gt;Application and directories&lt;/h3&gt;
&lt;p&gt;The following applications and directories aren&amp;#39;t yet supported.&lt;/p&gt;
&lt;h3&gt;Active Directory Domain Services (user or group writeback from Microsoft Entra ID by using the on-premises provisioning preview)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When a user is managed by Microsoft Entra Connect, the source of authority is on-premises Active Directory Domain Services. So, user attributes can&amp;#39;t be changed in Microsoft Entra ID. This preview doesn&amp;#39;t change the source of authority for users managed by Microsoft Entra Connect.&lt;/li&gt;
&lt;li&gt;Attempting to use Microsoft Entra Connect and the on-premises provisioning to provision groups or users into Active Directory Domain Services can lead to creation of a loop, where Microsoft Entra Connect can overwrite a change that was made by the provisioning service in the cloud. Microsoft is working on a dedicated capability for group or user writeback. Upvote the UserVoice feedback on &lt;a href=&quot;#&quot;&gt;this website&lt;/a&gt; to track the status of the preview. Alternatively, you can use &lt;a href=&quot;#&quot;&gt;Microsoft Identity Manager&lt;/a&gt; for user or group writeback from Microsoft Entra ID to Active Directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;By using on-premises provisioning, you can take a user already in Microsoft Entra ID and provision them into a third-party application. You can&amp;#39;t bring a user into the directory from a third-party application. Customers will need to rely on our native HR integrations, Microsoft Entra Connect, Microsoft Identity Manager, or Microsoft Graph, to bring users into the directory.&lt;/p&gt;
&lt;h2&gt;Attributes and objects&lt;/h2&gt;
&lt;p&gt;The following attributes and objects aren&amp;#39;t supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multivalued attributes.&lt;/li&gt;
&lt;li&gt;Reference attributes (for example, manager).&lt;/li&gt;
&lt;li&gt;Groups.&lt;/li&gt;
&lt;li&gt;Complex anchors (for example, ObjectTypeName+UserName).&lt;/li&gt;
&lt;li&gt;Attributes that have characters such as &amp;quot;.&amp;quot; or &amp;quot;[&amp;quot;&lt;/li&gt;
&lt;li&gt;Binary attributes.&lt;/li&gt;
&lt;li&gt;On-premises applications are sometimes not federated with Microsoft Entra ID and require local passwords. The on-premises provisioning preview doesn&amp;#39;t support password synchronization. Provisioning initial one-time passwords is supported. Ensure that you&amp;#39;re using the Redact function to redact the passwords from the logs. In the SQL and LDAP connectors, the passwords aren&amp;#39;t exported on the initial call to the application, but rather a second call with set password.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSL certificates&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently requires either an SSL certificate to be trusted by Azure or the provisioning agent to be used. The certificate subject must match the host name the Microsoft Entra ECMA Connector Host is installed on.&lt;/p&gt;
&lt;h2&gt;Anchor attributes&lt;/h2&gt;
&lt;p&gt;The Microsoft Entra ECMA Connector Host currently doesn&amp;#39;t support anchor attribute changes (renames) or target systems, which require multiple attributes to form an anchor.&lt;/p&gt;
&lt;h2&gt;Attribute discovery and mapping&lt;/h2&gt;
&lt;p&gt;The attributes that the target application supports are discovered and surfaced in the Microsoft Entra admin center in Attribute Mappings. Newly added attributes will continue to be discovered. If an attribute type has changed, for example, string to Boolean, and the attribute is part of the mappings, the type won&amp;#39;t change automatically in the Microsoft Entra admin center. Customers will need to go into advanced settings in mappings and manually update the attribute type.&lt;/p&gt;
&lt;h2&gt;Provisioning agent&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The agent doesn&amp;#39;t currently support auto update for the on-premises application provisioning scenario. We&amp;#39;re actively working to close this gap and ensure that auto update is enabled by default and required for all customers.&lt;/li&gt;
&lt;li&gt;The same provisioning agent can&amp;#39;t be used for on-premises app provisioning and cloud sync / HR- driven provisioning.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;h3&gt;How provisioning works&lt;/h3&gt;
&lt;h2&gt;Configure a multitenant organization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure a multitenant organization using Microsoft Graph PowerShell or Microsoft Graph API. This article uses an example owner tenant named Cairo and two member tenants named Berlin and Athens.&lt;/p&gt;
&lt;p&gt;If you instead want to use the Microsoft 365 admin center to configure a multitenant organization, see &lt;a href=&quot;https://example.com/setup-multitenant&quot;&gt;Set up a multitenant org in Microsoft 365&lt;/a&gt; and &lt;a href=&quot;https://example.com/join-leave-multitenant&quot;&gt;Join or leave a multitenant organization in Microsoft 365&lt;/a&gt;. To learn how to configure Microsoft Teams for your multitenant organization, see &lt;a href=&quot;https://example.com/microsoft-teams-client&quot;&gt;The new Microsoft Teams desktop client&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD;
  OwnerTenant(Cairo) --&amp;gt;|Cross-tenant access settings| MemberTenantAthens(Athens);
  OwnerTenant(Cairo) --&amp;gt;|Cross-tenant access settings| MemberTenantBerlin(Berlin);
  MemberTenantAthens(Athens) -.-&amp;gt;|Cross-tenant access settings| MemberTenantBerlin(Berlin);
  MemberTenantBerlin(Berlin) -.-&amp;gt;|Cross-tenant access settings| MemberTenantAthens(Athens);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;h4&gt;Owner tenant&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;https://example.com/license-requirements&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Member tenant&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see &lt;a href=&quot;#&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the owner tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the owner and member tenants and initialize variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$OwnerTenantId = &amp;quot;&amp;lt;OwnerTenantId&amp;gt;&amp;quot;
$MemberTenantIdB = &amp;quot;&amp;lt;MemberTenantIdB&amp;gt;&amp;quot;
$MemberTenantIdA = &amp;quot;&amp;lt;MemberTenantIdA&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;Connect-MgGraph&lt;/code&gt; command to sign in to the owner tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MultiTenantOrganization.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.ReadWrite.CrossTenantAccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Application.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Directory.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $OwnerTenantId -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Create a multitenant organization&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the Update-MgBetaTenantRelationshipMultiTenantOrganization command to create your multitenant organization. This operation can take a few minutes.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganization -DisplayName &amp;quot;Cairo&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganization command to check that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganization | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;CreatedDateTime       : 1/8/2024 7:47:45 PM
Description           :
DisplayName           : Cairo
Id                    : &amp;lt;MtoId&amp;gt;
JoinRequest           : ...
State                 : active
Tenants               : ...
AdditionalProperties  : {[@odata.context, https://graph.microsoft.com/beta/$metadata#tenantRelationships/multTenantOrganization/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 3: Add tenants&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the &lt;code&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to add tenants to your multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdB -DisplayName &amp;quot;Berlin&amp;quot; | Format-List

New-MgBetaTenantRelationshipMultiTenantOrganizationTenant -TenantID $MemberTenantIdA -DisplayName &amp;quot;Athens&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to verify that the operation has completed before proceeding.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AddedByTenantId&lt;/th&gt;
&lt;th&gt;&lt;code&gt;&amp;lt;OwnerTenantId&amp;gt;&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AddedDateTime&lt;/td&gt;
&lt;td&gt;1/8/2024 7:47:45 PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeletedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DisplayName&lt;/td&gt;
&lt;td&gt;Cairo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;MtoIdC&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JoinedDateTime&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TenantId&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;OwnerTenantId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TransitionDetails&lt;/td&gt;
&lt;td&gt;Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdditionalProperties&lt;/td&gt;
&lt;td&gt;{[multiTenantOrgLabelType, none]}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Tenant Details&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId: &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime: 1/8/2024 8:05:25 PM
DeletedDateTime:
DisplayName: Berlin
Id: &amp;lt;MtoIdB&amp;gt;
JoinedDateTime:
Role: member
State: pending
TenantId: &amp;lt;MemberTenantIdB&amp;gt;
TransitionDetails: Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties: {[multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId: &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime: 1/8/2024 8:08:47 PM
DeletedDateTime:
DisplayName: Athens
Id: &amp;lt;MtoIdA&amp;gt;
JoinedDateTime:
Role: member
State: pending
TenantId: &amp;lt;MemberTenantIdA&amp;gt;
TransitionDetails: Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties: {[multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4: (Optional) Change the role of a tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;p&gt;By default, tenants added to the multitenant organization are member tenants. Optionally, you can change them to owner tenants, which allow them to add other tenants to the multitenant organization. You can also change an owner tenant to a member tenant.&lt;/p&gt;
&lt;h4&gt;PowerShell Command&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the owner tenant, use the &lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to change a member tenant to an owner tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB -Role &amp;quot;Owner&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to verify the change.&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId $MemberTenantIdB | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId    : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime      : 1/8/2024 8:05:25 PM
DeletedDateTime    : 
DisplayName        : Berlin
Id                 : &amp;lt;MtoIdB&amp;gt;
JoinedDateTime     : 
Role               : owner
State              : pending
TenantId           : &amp;lt;MemberTenantIdB&amp;gt;
TransitionDetails  : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties: {[[@odata.context], https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/tenants/$entity], [multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: (Optional) Remove a member tenant&lt;/h2&gt;
&lt;h3&gt;Owner tenant&lt;/h3&gt;
&lt;p&gt;You can remove any member tenant, including your own. You can&amp;#39;t remove owner tenants. Also, you can&amp;#39;t remove the original creator tenant, even if it has been changed from owner to member.&lt;/p&gt;
&lt;h2&gt;1. In the owner tenant, use the &lt;code&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to remove any member tenant. This operation takes a few minutes.&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -
MultiTenantOrganizationMemberId &amp;lt;MemberTenantIdD&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. Use the &lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant&lt;/code&gt; command to verify the change.&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant -
MultiTenantOrganizationMemberId &amp;lt;MemberTenantIdD&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After the remove command completes, the output is similar to the following. This is an expected error message. It indicates that the tenant has been removed from the multitenant organization.&lt;/p&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant_Get:
Unable to read the company information from the directory.

Status: 404 (NotFound)
ErrorCode: Directory_ObjectNotFound
Date: 2024-01-08T20:35:11
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 6: Sign in to a member tenant&lt;/h2&gt;
&lt;h3&gt;Member tenant&lt;/h3&gt;
&lt;p&gt;The Cairo tenant created a multitenant organization and added the Berlin and Athens tenants. In these steps, you sign in to the Berlin tenant and join the multitenant organization created by Cairo.&lt;/p&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;Connect-MgGraph&lt;/code&gt; command to sign in to the member tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MultiTenantOrganization.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.Read.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy.ReadWrite.CrossTenantAccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Application.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Directory.ReadWrite.All&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $MemberTenantIdB -Scopes &amp;quot;MultiTenantOrganization.ReadWrite.All&amp;quot;, &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 7: Join the multitenant organization&lt;/h2&gt;
&lt;h3&gt;Member tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the member tenant, use the &lt;code&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest&lt;/code&gt; command to join the multitenant organization.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Update-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest -AddedByTenantId $OwnerTenantId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Use the &lt;code&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest&lt;/code&gt; command to verify the join.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;h3&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationJoinRequest | Format-List&lt;/h3&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId         : &amp;lt;OwnerTenantId&amp;gt;
Id                      : &amp;lt;MtoJoinRequestIdB&amp;gt;
MemberState             : active
Role                    : member
TransitionDetails       : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationJoinRequestTransitionDetails
AdditionalProperties    : {[@odata.context, https://graph.microsoft.com/beta/$metadata#tenantRelationships/multiTenantOrganization/joinRequest/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Use the Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant command to check the multitenant organization itself. It should reflect the join operation.&lt;/h3&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;h3&gt;Get-MgBetaTenantRelationshipMultiTenantOrganizationTenant | Format-List&lt;/h3&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId         : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime           : 1/8/2024 8:05:25 PM
DeletedDateTime         : 
DisplayName             : Berlin
Id                      : &amp;lt;MtoJoinRequestIdB&amp;gt;
JoinedDateTime          : 1/8/2024 9:53:55 PM
Role                    : member
State                   : active
TenantId                : &amp;lt;MemberTenantIdB&amp;gt;
TransitionDetails       : Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails
AdditionalProperties    : {[multiTenantOrgLabelType, none]}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;AddedByTenantId         : &amp;lt;OwnerTenantId&amp;gt;
AddedDateTime           : 1/8/2024 7:47:45 PM
DeletedDateTime         : 
DisplayName             : Cairo
Id                      : &amp;lt;Id&amp;gt;
JoinedDateTime          : 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;| Role          | owner |
| State         | active |
| TenantId      | `&amp;lt;OwnerTenantId&amp;gt;` |
| TransitionDetails | Microsoft.Graph.Beta.PowerShell.Models.MicrosoftGraphMultiTenantOrganizationMemberTransitionDetails |
| AdditionalProperties | { [multiTenantOrgLabelType, none] } |

4. To allow for asynchronous processing, wait up to 2 hours before joining a multitenant organization is completed.

## Step 8: (Optional) Leave the multitenant organization

### Member tenant

You can leave a multitenant organization that you have joined. The process for removing your own tenant from the multitenant organization is the same as the process for removing another tenant from the multitenant organization.

If your tenant is the only multitenant organization owner, you must designate a new tenant to be the multitenant organization owner. For steps, see [Step 4: (Optional) Change the role of a tenant](#step-4-optional-change-the-role-of-a-tenant).

#### PowerShell

- In the tenant, use the `Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant` command to remove the tenant. This operation takes a few minutes.

```PowerShell
Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -MultiTenantOrganizationMemberId &amp;lt;MemberTenantId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: (Optional) Delete the multitenant organization&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;
## Owner tenant

You delete a multitenant organization by removing all tenants. The process for removing the final owner tenant is the same as the process for removing all other member tenants.

### PowerShell

- In the final owner tenant, use the `Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant` command to remove the tenant. This operation takes a few minutes.

```PowerShell
Remove-MgBetaTenantRelationshipMultiTenantOrganizationTenant -
MultiTenantOrganizationMemberId $OwnerTenantId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Set up a multitenant org in Microsoft 365&lt;/li&gt;
&lt;li&gt;Synchronize users in multitenant organizations in Microsoft 365&lt;/li&gt;
&lt;li&gt;The new Microsoft Teams desktop client&lt;/li&gt;
&lt;li&gt;Configure multitenant organization templates using the Microsoft Graph API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure multitenant organization policy templates using the Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article · 04/24/2024&lt;/p&gt;
&lt;p&gt;This article describes how to configure a policy template for your multitenant organization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For license information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings and templates for the multitenant organization.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cross-tenant access policy partner template&lt;/h2&gt;
&lt;p&gt;The cross-tenant access partner configuration handles trust settings and automatic user consent settings between partner tenants. For example, you can use these settings to trust multifactor authentication claims for inbound users from the target partner tenant. With the template in an unconfigured state, partner configurations for partner tenants in the multitenant organization won&amp;#39;t be amended, with all trust settings passed through from default settings. However, if you configure the template, then partner configurations will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h2&gt;Configure inbound and outbound automatic redemption&lt;/h2&gt;
&lt;p&gt;To specify which trust settings and automatic user consent settings to apply to your policy template, use the Update multiTenantOrganizationPartnerConfigurationTemplate API. If you create or join a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP
PATCH
https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/
multiTenantOrganizationPartnerConfiguration
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration
{
  &amp;quot;inboundTrust&amp;quot;: {
    &amp;quot;isMfaAccepted&amp;quot;: true,
    &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
    &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
  },
  &amp;quot;automaticUserConsentSettings&amp;quot;: {
    &amp;quot;inboundAllowed&amp;quot;: true,
    &amp;quot;outboundAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the &lt;code&gt;templateApplicationLevel&lt;/code&gt; parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationPartnerConfiguration
{
  &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PATCH&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/
multiTenantOrganizationPartnerConfiguration
{
  &amp;quot;inboundTrust&amp;quot;: {
    &amp;quot;isMfaAccepted&amp;quot;: true,
    &amp;quot;isCompliantDeviceAccepted&amp;quot;: true,
    &amp;quot;isHybridAzureADJoinedDeviceAccepted&amp;quot;: true
  },
  &amp;quot;automaticUserConsentSettings&amp;quot;: {
    &amp;quot;inboundAllowed&amp;quot;: true,
    &amp;quot;outboundAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline all trust and automatic user consent), use the multiTenantOrganizationPartnerConfigurationTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST
https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/
multiTenantOrganizationPartnerConfiguration/resetToDefaultSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cross-tenant synchronization template&lt;/h2&gt;
&lt;p&gt;The identity synchronization policy governs cross-tenant synchronization, which allows you to share users and groups across tenants in your organization. You can use these settings to allow inbound user synchronization. With the template in an unconfigured state, the identity synchronization policy for partner tenants in the multitenant organization won&amp;#39;t be amended. However, if you configure the template, then the identity synchronization policy will be amended corresponding to the policy template.&lt;/p&gt;
&lt;h2&gt;Configure inbound user synchronization&lt;/h2&gt;
&lt;p&gt;To allow inbound user synchronization in the policy template, use the Update multiTenantOrganizationIdentitySyncPolicyTemplate API. If you create or join a&lt;/p&gt;
&lt;h2&gt;Multitenant Configuration&lt;/h2&gt;
&lt;p&gt;For a multitenant organization using the Microsoft 365 admin center, this configuration is handled automatically.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP
PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners, existingPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template for existing partners&lt;/h2&gt;
&lt;p&gt;To apply this template only to new multitenant organization members and exclude existing partners, set the templateApplicationLevel parameter to new partners only.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP
PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;newPartners&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Disable the template completely&lt;/h2&gt;
&lt;p&gt;To disable the template completely, set the templateApplicationLevel parameter to null.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP
PATCH https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: null
  },
  &amp;quot;templateApplicationLevel&amp;quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PATCH&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization
{
  &amp;quot;userSyncInbound&amp;quot;: {
    &amp;quot;isSyncAllowed&amp;quot;: true
  },
  &amp;quot;templateApplicationLevel&amp;quot;: &amp;quot;&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reset the template&lt;/h2&gt;
&lt;p&gt;To reset the template to its default state (decline inbound synchronization), use the multiTenantOrganizationIdentitySyncPolicyTemplate: resetToDefaultSettings API.&lt;/p&gt;
&lt;h3&gt;Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP
POST https://graph.microsoft.com/beta/policies/crossTenantAccessPolicy/templates/multiTenantOrganizationIdentitySynchronization/resetToDefaultSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article · 03/11/2024&lt;/p&gt;
&lt;p&gt;This article describes the steps to configure cross-tenant synchronization using the Microsoft Entra admin center. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For important details on what this service does, how it works, and frequently asked questions, see Automate user provisioning and deprovisioning to SaaS applications with Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;Internal&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UserS1&lt;/li&gt;
&lt;li&gt;UserS2&lt;/li&gt;
&lt;li&gt;UserS3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Outbound access settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Configuration&lt;/h4&gt;
&lt;h5&gt;Scope&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;UserS1&lt;/li&gt;
&lt;li&gt;UserS3&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Scoping filters&lt;/h5&gt;
&lt;p&gt;department EQUALS Marketing&lt;/p&gt;
&lt;h5&gt;Attribute mappings&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Attribute&lt;/th&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;td&gt;employeeld&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extensionName&lt;/td&gt;
&lt;td&gt;companyName&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;h4&gt;Internal&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UserT1&lt;/li&gt;
&lt;li&gt;UserT2&lt;/li&gt;
&lt;li&gt;UserT3&lt;/li&gt;
&lt;li&gt;GroupT1&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;External&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;UserS1&lt;/li&gt;
&lt;li&gt;UserS3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inbound access settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Learning objectives&lt;/h3&gt;
&lt;p&gt;By the end of this article, you&amp;#39;ll be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Remove B2B users in your target tenant&lt;/li&gt;
&lt;li&gt;Keep user attributes synchronized between your source and target tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h2&gt;Microsoft Entra ID P1 or P2 license.&lt;/h2&gt;
&lt;p&gt;For more information, see License requirements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Plan your provisioning deployment&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Define how you would like to structure the tenants in your organization.&lt;/li&gt;
&lt;li&gt;Learn about how the provisioning service works.&lt;/li&gt;
&lt;li&gt;Determine who will be in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Determine what data to map between tenants.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the target tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;On the Organization settings tab, select Add organization.&lt;/li&gt;
&lt;li&gt;Add the source tenant by typing the tenant ID or domain name and selecting Add.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;External Identities | Cross-tenant access settings&lt;/h2&gt;
&lt;h3&gt;Cross-tenant settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Contoso - Microsoft Entra ID for workforce&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Add an external Microsoft Entra tenant by&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tenant ID or domain name&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cross-tenant access settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Organizational settings&lt;/li&gt;
&lt;li&gt;Default settings&lt;/li&gt;
&lt;li&gt;Microsoft cloud settings&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;External collaboration settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All identity providers&lt;/li&gt;
&lt;li&gt;Self-service sign up&lt;/li&gt;
&lt;li&gt;Custom user attributes&lt;/li&gt;
&lt;li&gt;All API connectors&lt;/li&gt;
&lt;li&gt;Custom authentication extensions (Preview)&lt;/li&gt;
&lt;li&gt;User flows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Subscriptions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linked subscriptions&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Inbound access&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Discard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Under Inbound access of the added organization, select Inherited from default.&lt;/li&gt;
&lt;li&gt;Select the Cross-tenant sync tab.&lt;/li&gt;
&lt;li&gt;Check the Allow users sync into this tenant check box.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Inbound access settings - Fabrikam&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B2B collaboration&lt;/li&gt;
&lt;li&gt;B2B direct connect&lt;/li&gt;
&lt;li&gt;Trust settings&lt;/li&gt;
&lt;li&gt;Cross-tenant sync&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Enabling this will allow the admin of the specified (source) tenant to sync objects into this (target) tenant.&lt;/p&gt;
&lt;p&gt;Disabling this will block admins of the source tenant from syncing objects into the target tenant but will not remove currently synced objects. We recommend that this setting should only be used between tenants that are part of the same organization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Save&lt;/td&gt;
&lt;td&gt;Discard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see an Enable cross-tenant sync and auto-redemption dialog box asking if you want to enable auto-redemption, select Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Selecting Yes will automatically redeem invitations in the target tenant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Inbound Access Settings - Fabrikam&lt;/h2&gt;
&lt;h3&gt;B2B Collaboration&lt;/h3&gt;
&lt;h3&gt;B2B Direct Connect&lt;/h3&gt;
&lt;h3&gt;Trust Settings&lt;/h3&gt;
&lt;h3&gt;Cross-tenant Sync&lt;/h3&gt;
&lt;p&gt;Enabling this will allow the admin of the other tenant to sync and access objects in your tenant.&lt;br&gt;Disabling this will block admins of the other tenant from syncing and accessing, but will not remove currently synced objects. We recommend that this setting only be enabled for admin of the same organization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Allow users sync into this tenant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Save&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Discard&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Step 3: Automatically Redeem Invitations in the Target Tenant&lt;/h3&gt;
&lt;h4&gt;Target Tenant&lt;/h4&gt;
&lt;p&gt;In this step, you automatically redeem invitations so users from the source tenant don&amp;#39;t have to accept the consent prompt. This setting must be checked in both the source tenant (outbound) and target tenant (inbound). For more information, see &lt;a href=&quot;#&quot;&gt;Automatic redemption setting&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the target tenant, on the same Inbound access settings page, select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the &lt;strong&gt;Automatically redeem invitations with the tenant &lt;tenant&gt;&lt;/strong&gt; checkbox.&lt;/p&gt;
&lt;p&gt;This box might already be checked if you previously selected Yes in the Enable cross-tenant sync and auto-redemption dialog box.&lt;/p&gt;
&lt;h4&gt;Automatic Redemption&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 
Check this setting if you want to automatically redeem invitations. If so, users from the specified tenant won&amp;#39;t have to accept the consent prompt the first time they access this tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for outbound access as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 
Automatically redeem invitations with the tenant Fabrikam.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Save&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Discard&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 4: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;In this step, you automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant access settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Organization settings tab, select Add organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the target tenant by typing the tenant ID or domain name and selecting Add.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under Outbound access for the target organization, select Inherited from default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Trust settings tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the Automatically redeem invitations with the tenant &lt;tenant&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Outbound access settings - Contoso&lt;/h2&gt;
&lt;h3&gt;B2B collaboration&lt;/h3&gt;
&lt;h3&gt;B2B direct connect&lt;/h3&gt;
&lt;h3&gt;Trust settings&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Automatic redemption&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations with the tenant Contoso.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[Save] [Discard]&lt;/p&gt;
&lt;h3&gt;8. Select Save.&lt;/h3&gt;
&lt;h2&gt;Step 5: Create a configuration in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;At the top of the page, select New configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide a name for the configuration and select Create.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It can take up to 15 seconds for the configuration that you just created to appear in the list.&lt;/p&gt;
&lt;h2&gt;Step 6: Test the connection to the target tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, you should see your new configuration. If not, in the configuration list, select your configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabrikam to Contoso | Overview&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting + Support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Automate identity lifecycle management with Microsoft Entra&lt;br&gt;Automatically create, update, and delete accounts when users join, leave, and move within your organization. &lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Get started&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;What is provisioning?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Plan an application deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Configure automatic provisioning&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;Provisioning&lt;/h3&gt;
&lt;h4&gt;Provisioning Mode&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Automatic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use Microsoft Entra to manage the creation and synchronization of user accounts in Fabrikam to Contoso based on user and group assignment.&lt;/p&gt;
&lt;h4&gt;Admin Credentials&lt;/h4&gt;
&lt;p&gt;Admin Credentials&lt;br&gt;Microsoft Entra needs the following information to connect to Fabrikam to Contoso&amp;#39;s API and synchronize user data.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authentication Method&lt;ul&gt;
&lt;li&gt;Cross Tenant Synchronization Policy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tenant Id *&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Test Connection&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. In the Tenant Id box, enter the tenant ID of the target tenant.&lt;/h2&gt;
&lt;h2&gt;6. Select Test Connection to test the connection.&lt;/h2&gt;
&lt;p&gt;You should see a message that the supplied credentials are authorized to enable provisioning. If the test connection fails, see Troubleshooting tips later in this article.&lt;/p&gt;
&lt;h3&gt;Notifications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Testing connection to Fabrikam to Contoso&lt;br&gt;The supplied credentials are authorized to enable provisioning&lt;br&gt;a few seconds ago&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. Select Save.&lt;/h2&gt;
&lt;p&gt;Mappings and Settings sections appear.&lt;/p&gt;
&lt;h2&gt;8. Close the Provisioning page.&lt;/h2&gt;
&lt;h1&gt;Step 7: Define who is in scope for provisioning&lt;/h1&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;The Microsoft Entra provisioning service allows you to define who will be provisioned in one or both of the following ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on assignment to the configuration&lt;/li&gt;
&lt;li&gt;Based on attributes of the user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start small. Test with a small set of users before rolling out to everyone. When the scope for provisioning is set to assigned users and groups, you can control it by assigning one or two users to the configuration. You can further refine who is in scope for provisioning by creating attribute-based scoping filters, described in the next step.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning and expand the Settings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fabrikam to Contoso | Provisioning&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;li&gt;Admin Credentials&lt;/li&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;li&gt;Activity&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;li&gt;Troubleshooting + Support&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Send an email notification when a failure occurs&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Prevent accidental deletion&lt;ul&gt;
&lt;li&gt;Accidental deletion threshold *&lt;ul&gt;
&lt;li&gt;&lt;code&gt;500&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Sync only assigned users and groups&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Provisioning Status&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; On&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Off&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Configuration Steps:&lt;/h3&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Scope&lt;/strong&gt; list, select whether to synchronize all users in the source tenant or only users assigned to the configuration.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s recommended that you select &lt;strong&gt;Sync only assigned users and groups&lt;/strong&gt; instead of &lt;strong&gt;Sync all users and groups&lt;/strong&gt;. Reducing the number of users in scope improves performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you made any changes, select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the configuration page, select &lt;strong&gt;Users and groups&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Add user/group&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;Add Assignment&lt;/strong&gt; page, under &lt;strong&gt;Users and groups&lt;/strong&gt;, select &lt;strong&gt;None Selected&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;Users and groups&lt;/strong&gt; pane, search for and select one or more internal users or groups you want to assign to the configuration.&lt;/p&gt;
&lt;p&gt;If you select a group to assign to the configuration, only users that are direct members in the group will be in scope for provisioning. You can select a static group or a dynamic group. The assignment doesn&amp;#39;t cascade to nested groups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Select&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;9. Select Assign.&lt;/h2&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;h4&gt;Outbound access settings - Contoso &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h4&gt;
&lt;h3&gt;Fabrikam to Contoso | Users and groups&lt;/h3&gt;
&lt;p&gt;Fabrikam - Microsoft Entra ID&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add user/group&lt;/li&gt;
&lt;li&gt;Edit assignment&lt;/li&gt;
&lt;li&gt;Remove&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;h4&gt;Provision on demand&lt;/h4&gt;
&lt;p&gt;The application will not appear for assigned users within My Apps. Set &amp;#39;visible to users?&amp;#39; to yes in properties to enable this.&lt;/p&gt;
&lt;h3&gt;Manage&lt;/h3&gt;
&lt;h4&gt;Users and groups&lt;/h4&gt;
&lt;p&gt;Assign users and groups to app-roles for your application here. To create new app-roles for this application, use the application registration.&lt;/p&gt;
&lt;h4&gt;Provisioning&lt;/h4&gt;
&lt;p&gt;P First 200 shown, to search all users &amp;amp; gro...&lt;/p&gt;
&lt;h4&gt;Expression builder&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Display Name&lt;/th&gt;
&lt;th&gt;Object Type&lt;/th&gt;
&lt;th&gt;Role assigned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;US&lt;/td&gt;
&lt;td&gt;User3&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GR&lt;/td&gt;
&lt;td&gt;Group1&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Activity&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting + Support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see Assign users and groups to an application.&lt;/p&gt;
&lt;h2&gt;Step 8: (Optional) Define who is in scope for provisioning with scoping filters&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Regardless of the value you selected for Scope in the previous step, you can further limit which users are synchronized by creating attribute-based scoping filters.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select Provisioning and expand the Mappings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h2&gt;
&lt;h3&gt;Fabrikam to Contoso | Provisioning&lt;/h3&gt;
&lt;hr&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Discard&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Admin Credentials&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Manage&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Activity&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Troubleshooting + Support&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Provisioning&lt;/h3&gt;
&lt;p&gt;Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;h4&gt;Mappings&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Restore default mappings&lt;/li&gt;
&lt;li&gt;Provisioning Status&lt;ul&gt;
&lt;li&gt;On&lt;/li&gt;
&lt;li&gt;Off&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/li&gt;
&lt;li&gt;Under Source Object Scope, select All records.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Attribute Mapping&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Discard&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Object&lt;/th&gt;
&lt;th&gt;Source Object Scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;All records&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Object Actions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;On the Source Object Scope page, select Add scoping filter.&lt;/li&gt;
&lt;li&gt;Add any scoping filters to define which users are in scope for provisioning.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;To configure scoping filters&lt;/h2&gt;
&lt;p&gt;To configure scoping filters, refer to the instructions provided in &lt;a href=&quot;#&quot;&gt;Scoping users or groups to be provisioned with scoping filters&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Add Scoping Filter&lt;/h3&gt;
&lt;p&gt;Define which users are in scope for provisioning. Only objects that meet the criteria below will be synchronized.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Add/Remove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;Marketing&lt;/td&gt;
&lt;td&gt;Add New Scoping Clause&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Scoping Filter Title *
&lt;code&gt;Marketing department filter&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If multiple scoping clauses are present, they are evaluated using &amp;quot;AND&amp;quot; logic.&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;Select Ok and Save&lt;/strong&gt; to save any changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you added a filter, you&amp;#39;ll see a message that saving your changes will result in all assigned users and groups being resynchronized. This may take a long time depending on the size of your directory.&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;strong&gt;Select Yes&lt;/strong&gt; and close the Attribute Mapping page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 9: Review attribute mappings&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Attribute mappings allow you to define how data should flow between the source tenant and target tenant. For information on how to customize the default attribute mappings, see &lt;a href=&quot;#&quot;&gt;Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page, scroll down to review the user attributes that are synchronized between tenants in the &lt;strong&gt;Attribute Mappings&lt;/strong&gt; section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Attribute Mapping&lt;/h2&gt;
&lt;p&gt;The first attribute, &lt;code&gt;alternativeSecurityIdentifier&lt;/code&gt;, is an internal attribute used to uniquely identify the user across tenants, match users in the source tenant with existing users in the target tenant, and ensure that each user only has one account. The matching attribute cannot be changed. Attempting to change the matching attribute or adding additional matching attributes will result in a &lt;code&gt;schemaInvalid&lt;/code&gt; error.&lt;/p&gt;
&lt;h3&gt;Attribute Mappings&lt;/h3&gt;
&lt;p&gt;Attribute mappings define how attributes are synchronized between Azure Active Directory and Azure Active Directory (target tenant)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure Active Directory Attribute&lt;/th&gt;
&lt;th&gt;Azure Active Directory (target tenant) Attribute&lt;/th&gt;
&lt;th&gt;Matching precedence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;AltSecidFromNetid([netid])&lt;/td&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;streetAddress&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;city&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;state&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;postalCode&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;country&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;employeeId&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;givenName&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;p&gt;Select the Member (userType) attribute to open the &lt;strong&gt;Edit Attribute&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review the &lt;code&gt;Constant Value&lt;/code&gt; setting for the userType attribute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This setting defines the type of user that will be created in the target tenant and can be one of the values in the following table. By default, users will be created as external member (B2B collaboration users). For more information, see Properties of a Microsoft Entra B2B collaboration user.&lt;/p&gt;
&lt;h3&gt;Constant Value Settings&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constant Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Default. Users will be created as external member (B2B collaboration users) in the target tenant. Users will be able to function as any internal member of the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest&lt;/td&gt;
&lt;td&gt;Users will be created as external guests (B2B collaboration users) in the target tenant.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Note&lt;/h2&gt;
&lt;p&gt;If the B2B user already exists in the target tenant then &lt;strong&gt;Member (userType)&lt;/strong&gt; will not changed to Member, unless the &lt;strong&gt;Apply this mapping setting&lt;/strong&gt; is set to &lt;strong&gt;Always&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;User Type Limitations&lt;/h2&gt;
&lt;p&gt;The user type you choose has the following limitations for apps or services (but aren&amp;#39;t limited to):&lt;/p&gt;
&lt;h3&gt;App or Service Limitations&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App or service&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Power BI&lt;/td&gt;
&lt;td&gt;- Support for UserType Member in Power BI is currently in preview. For more information, see &lt;a href=&quot;https://link_to_info&quot;&gt;Distribute Power BI content to external guest users with Microsoft Entra B2B&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Virtual Desktop&lt;/td&gt;
&lt;td&gt;- External member and external guest aren&amp;#39;t supported in Azure Virtual Desktop.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Attribute Mapping&lt;/h2&gt;
&lt;h3&gt;Edit Attribute&lt;/h3&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g. Users) should flow to and from this application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mapping type&lt;/strong&gt;: Constant&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constant Value&lt;/strong&gt;: Member&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Target attribute&lt;/strong&gt;: userType&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Match objects using this attribute&lt;/strong&gt;: No&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Matching precedence&lt;/strong&gt;: 0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apply this mapping&lt;/strong&gt;: Only during object creation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Transformations&lt;/h3&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;If you want to define any transformations, on the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page, select the attribute you want to transform, such as &lt;strong&gt;displayName&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;7. Set the Mapping type to Expression.&lt;/h2&gt;
&lt;h2&gt;8. In the Expression box, enter the transformation expression.&lt;/h2&gt;
&lt;p&gt;For example, with the display name, you can do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flip the first name and last name and add a comma in between.&lt;/li&gt;
&lt;li&gt;Add the domain name in parentheses at the end of the display name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For examples, see &lt;a href=&quot;https://example.com/reference&quot;&gt;Reference for writing expressions for attribute mappings&lt;/a&gt; in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Edit Attribute&lt;/h3&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g., Users) should flow to and from this application.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mapping type&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[displayName]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The expression was correctly parsed.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default value if null (optional)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use the expression builder&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target attribute *&lt;/td&gt;
&lt;td&gt;&lt;code&gt;displayName&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;[Ok]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can map directory extensions by updating the schema of the cross-tenant synchronization. For more information, see &lt;a href=&quot;https://example.com/map-directory-extensions&quot;&gt;Map directory extensions in cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Step 10: Specify additional provisioning settings&lt;/h2&gt;
&lt;p&gt;Source tenant&lt;/p&gt;
&lt;h2&gt;1. In the source tenant, select Provisioning and expand the Settings section.&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;2. Check the &lt;strong&gt;Send an email notification when a failure occurs&lt;/strong&gt; check box.&lt;/h2&gt;
&lt;h2&gt;3. In the &lt;strong&gt;Notification Email&lt;/strong&gt; box, enter the email address of a person or group who should receive provisioning error notifications.&lt;/h2&gt;
&lt;p&gt;Email notifications are sent within 24 hours of the job entering quarantine state.
For custom alerts, see &lt;a href=&quot;#&quot;&gt;Understand how provisioning integrates with Azure Monitor logs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;4. To prevent accidental deletion, select &lt;strong&gt;Prevent accidental deletion&lt;/strong&gt; and specify a threshold value. By default, the threshold is set to 500.&lt;/h2&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;#&quot;&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;5. Select &lt;strong&gt;Save&lt;/strong&gt; to save any changes.&lt;/h2&gt;
&lt;h2&gt;Step 11: Test provision on demand&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h2&gt;On-Demand Provisioning Test Process&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to &lt;strong&gt;Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Provision on demand&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Select a user or group&lt;/strong&gt; box, search for and select one of your test users.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Provisioning Page Snippet&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fabrikam to Contoso | Provision on demand&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provision on-demand&lt;/strong&gt; for a subset of users or groups before rolling it out broadly to your organization. When provisioning a group you can select 5 members at a time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;No user or group will be provisioned on-demand that would not have been provisioned through the regular provisioning cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selected user&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;User1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Provision&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After a few moments, the &lt;strong&gt;Perform action&lt;/strong&gt; page appears with information about the provisioning of the test user in the target tenant.&lt;/p&gt;
&lt;h2&gt;Perform action&lt;/h2&gt;
&lt;h3&gt;Modified attributes (successful)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target attribute name&lt;/th&gt;
&lt;th&gt;Source attribute value&lt;/th&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Original target attribute value&lt;/th&gt;
&lt;th&gt;Modified target attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;IsSoftDeleted&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;[IsSoftDeleted]&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;accountEnabled&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;[accountEnabled]&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;displayName&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;[displayName]&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;td&gt;User1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mailNickname&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;[mailNickname]&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;td&gt;user1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alternativeSecurityIds&lt;/td&gt;
&lt;td&gt;AltSecidFromNetid(&amp;quot;1003...&lt;/td&gt;
&lt;td&gt;AltSecidFromNetid([netId])&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;td&gt;(1 values)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;true&amp;quot;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Member&amp;quot;&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;[preferredLanguage]&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;td&gt;en-US&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;If the user isn&amp;#39;t in scope, you&amp;#39;ll see a page with information about why the user was skipped.&lt;/h3&gt;
&lt;h3&gt;Determine if user is in scope&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute name&lt;/th&gt;
&lt;th&gt;Attribute value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;SkipReason&lt;/td&gt;
&lt;td&gt;NotEffectivelyEntitled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsActive&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assigned to the application&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IsInProvisioningScope&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;On the Provision on demand page, you can view details about the provision and have the option to retry.&lt;/h3&gt;
&lt;h2&gt;Fabrikam to Contoso | Provision on demand&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Manage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting + Support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;User&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;User1&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;mailto:user1@fabrikam.com&quot;&gt;user1@fabrikam.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1. Import user&lt;/h4&gt;
&lt;p&gt;This step shows the user retrieved from the source system and the properties of the user in the source system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Success | View details&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Determine if user is in scope&lt;/h4&gt;
&lt;p&gt;This step shows the scoping conditions that were evaluated and which ones the user passed or failed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Success | View details&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Match user between source and target system&lt;/h4&gt;
&lt;p&gt;This step shows whether the user was found in the target system as well as the properties of the user in the target system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Success | View details&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. Perform action&lt;/h4&gt;
&lt;p&gt;This step shows the action that was performed in the target application, such as creating a user or updating a user.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Success | View details&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retry&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provision another object&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. In the target tenant, verify that the test user was provisioned.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;User1&lt;ul&gt;
&lt;li&gt;user1_fabrikam.com#EXT#@[...]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Member&lt;/li&gt;
&lt;li&gt;ExternalAzureAD&lt;/li&gt;
&lt;li&gt;Invitation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. If all is working as expected, assign additional users to the configuration.&lt;/h2&gt;
&lt;p&gt;For more information, see On-demand provisioning in Microsoft Entra ID.&lt;/p&gt;
&lt;h2&gt;Step 12: Start the provisioning job&lt;/h2&gt;
&lt;h2&gt;Source tenant&lt;/h2&gt;
&lt;p&gt;The provisioning job starts the initial synchronization cycle of all users defined in Scope of the Settings section. The initial cycle takes longer to perform than subsequent cycles, which occur approximately every 40 minutes as long as the Microsoft Entra provisioning service is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Overview page, review the provisioning details.&lt;/p&gt;
&lt;!-- Image reference points to missing/unhandled asset: ![Fabrikam to Contoso | Provisioning &gt; Cross-tenant synchronization | Configurations &gt; Overview](image_link) --&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Start provisioning to start the provisioning job.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;h3&gt;Source and target tenants&lt;/h3&gt;
&lt;p&gt;Once you&amp;#39;ve started a provisioning job, you can monitor the status.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, on the Overview page, check the progress bar to see the status of the provisioning cycle and how close it&amp;#39;s to completion. For more information, see Check the status of user provisioning.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Application Provisioning in Quarantine Status&lt;/h2&gt;
&lt;p&gt;If provisioning seems to be in an unhealthy state, the configuration will go into quarantine. For more information, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;h3&gt;Fabrikam to Contoso | Overview&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start provisioning&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop provisioning&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restart provisioning&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit provisioning&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Current Cycle Status&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Initial cycle completed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100% complete&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Statistics to Date&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Users:&lt;/strong&gt; 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Provisioning Logs&lt;/h3&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; Last 24 hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; All&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; All&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Provisioning Details&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Identity Name or ID&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Source System&lt;/th&gt;
&lt;th&gt;Target System&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1/22/2024, 6:18:47 PM&lt;/td&gt;
&lt;td&gt;Display Name User3&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1/22/2024, 6:18:39 PM&lt;/td&gt;
&lt;td&gt;Display Name User1&lt;/td&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1&lt;/td&gt;
&lt;td&gt;Update&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1/22/2024, 6:07:48 PM&lt;/td&gt;
&lt;td&gt;Display Name User1&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Azure Active Directory&lt;/td&gt;
&lt;td&gt;Azure Active Directory (target tenant)&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Select Provisioning logs to determine which users have been provisioned successfully or unsuccessfully.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Audit Logs&lt;/h3&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Select Audit logs to view all logged events in Microsoft Entra ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Audit logs&lt;/h2&gt;
&lt;p&gt;You can also view audit logs in the target tenant.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;In the target tenant, select &lt;strong&gt;Users&lt;/strong&gt; &amp;gt; &lt;strong&gt;Audit logs&lt;/strong&gt; to view logged events for user management.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Step 14: Configure leave settings&lt;/h3&gt;
&lt;h4&gt;Target tenant&lt;/h4&gt;
&lt;p&gt;Even though users are being provisioned in the target tenant, they still might be able to remove themselves. If users remove themselves and they are in scope, they&amp;#39;ll be provisioned again during the next provisioning cycle. If you want to disallow the ability for users to remove themselves from your organization, you must configure the External user leave settings.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, browse to &lt;strong&gt;Identity&lt;/strong&gt; &amp;gt; &lt;strong&gt;External Identities&lt;/strong&gt; &amp;gt; &lt;strong&gt;External collaboration settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;External user leave settings&lt;/strong&gt;, choose whether to allow external users to leave your organization themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;External User Leave Settings&lt;/h2&gt;
&lt;p&gt;This setting also applies to B2B collaboration and B2B direct connect, so if you set External user leave settings to No, B2B collaboration users and B2B direct connect users can&amp;#39;t leave your organization themselves. For more information, see Leave an organization as an external user.&lt;/p&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;h3&gt;Delete a configuration&lt;/h3&gt;
&lt;p&gt;Follow these steps to delete a configuration on the Configurations page:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;On the Configurations page, add a check mark next to the configuration you want to delete.&lt;/li&gt;
&lt;li&gt;Select Delete and then OK to delete the configuration.&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Tenant Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Fabrikam3&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fabrikam4&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fabrikam5&lt;/td&gt;
&lt;td&gt;Default Directory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Symptom - Test connection fails with AzureDirectoryB2BManagementPolicyCheckFailure&lt;/h3&gt;
&lt;p&gt;When configuring cross-tenant synchronization in the source tenant and you test the connection, it fails with the following error message:&lt;/p&gt;
&lt;p&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/p&gt;
&lt;h2&gt;Error code: AzureDirectoryB2BManagementPolicyCheckFailure&lt;/h2&gt;
&lt;p&gt;Details: Policy permitting auto-redemption of invitations not configured.&lt;/p&gt;
&lt;h3&gt;Notifications&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;More events in the activity log&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dismiss all&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing connection to Fabrikam&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You appear to have entered invalid credentials. Please confirm you are using the correct information for an administrative account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the policy to automatically redeem invitations in both the source and target tenants wasn&amp;#39;t set up.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Follow the steps in Step 3: Automatically redeem invitations in the target tenant and Step 4: Automatically redeem invitations in the source tenant.&lt;/p&gt;
&lt;h2&gt;Symptom - Automatic redemption check box is disabled&lt;/h2&gt;
&lt;p&gt;When configuring cross-tenant synchronization, the Automatic redemption check box is disabled.&lt;/p&gt;
&lt;h2&gt;Outbound access settings - Contoso&lt;/h2&gt;
&lt;h3&gt;Automatic redemption&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 
Check this setting if you want to automatically redeem invitations. If so, users from this tenant don&amp;#39;t have to accept the consent prompt the first time they access the specified tenant using cross-tenant synchronization, B2B collaboration, or B2B direct connect. This setting will only suppress the consent prompt if the specified tenant checks this setting for inbound access as well. &lt;a href=&quot;#&quot;&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Automatically redeem invitations with the tenant aa5eaf5a-ecc3-49f6-aac8-e50a26e228de.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Your tenant doesn&amp;#39;t have a Microsoft Entra ID P1 or P2 license.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;You must have Microsoft Entra ID P1 or P2 to configure trust settings.&lt;/p&gt;
&lt;h3&gt;Symptom - Recently deleted user in the target tenant is not restored&lt;/h3&gt;
&lt;p&gt;After soft deleting a synchronized user in the target tenant, the user isn&amp;#39;t restored during the next synchronization cycle. If you try to soft delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/p&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Restoring a previously soft-deleted user in the target tenant isn&amp;#39;t supported.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Manually restore the soft-deleted user in the target tenant. For more information, see &lt;a href=&quot;#&quot;&gt;Restore or remove a recently deleted user using Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Symptom - Users are skipped because SMS sign-in is enabled on the user&lt;/h3&gt;
&lt;h2&gt;Users are skipped from synchronization. The scoping step includes the following filter with status false: &amp;quot;Filter external users.alternativeSecuritylds EQUALS &amp;#39;None&amp;#39;&amp;quot;&lt;/h2&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;If SMS sign-in is enabled for a user, they will be skipped by the provisioning service.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Disable SMS Sign-in for the users. The script below shows how you can disable SMS Sign-in using PowerShell.&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;h4&gt;Disable SMS Sign-in options for the users&lt;/h4&gt;
&lt;h4&gt;Import module&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-Module Microsoft.Graph.Users.Actions
Install-Module Microsoft.Graph.Identity.SignIns
Import-Module Microsoft.Graph.Users.Actions

Connect-MgGraph -Scopes &amp;quot;User.Read.All&amp;quot;, &amp;quot;Group.ReadWrite.All&amp;quot;,
&amp;quot;UserAuthenticationMethod.Read.All&amp;quot;, &amp;quot;UserAuthenticationMethod.ReadWrite&amp;quot;, &amp;quot;Us
erAuthenticationMethod.ReadWrite.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;The value for phoneAuthenticationMethodId is 3179e48a-750b-4051-897c-87b9720928f7&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$phoneAuthenticationMethodId = &amp;quot;3179e48a-750b-4051-897c-87b9720928f7&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Get the User Details&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$userId = &amp;quot;objectid_of_the_user_in_Azure_AD&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;validate the value for SmsSignInState&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$smssignin = Get-MgUserAuthenticationPhoneMethod -UserId $userId
{
if($smssignin. SmsSignInState -eq &amp;quot;ready&amp;quot;){
    #### Disable Sms Sign-In for the user is set to ready
    Disable-MgUserAuthenticationPhoneMethodSmsSignIn -UserId $userId -
    PhoneAuthenticationMethodId $phoneAuthenticationMethodId
    Write-Host &amp;quot;SMS sign-in disabled for the user&amp;quot; -ForegroundColor Green
}
else{
    Write-Host &amp;quot;SMS sign-in status not set or found for the user &amp;quot; - 
    ForegroundColor Yellow
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Symptom - Users fail to provision with error &amp;quot;AzureActiveDirectoryForbidden&amp;quot;&lt;/h2&gt;
&lt;p&gt;Users in scope fail to provision. The provisioning logs details include the following error message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Guest invitations not allowed for your company. Contact your company administrator for more details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;This error indicates the Guest invite settings in the target tenant are configured with the most restrictive setting: &amp;quot;No one in the organization can invite guest users including admins (most restrictive)&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Change the Guest invite settings in the target tenant to a less restrictive setting. For more information, see &lt;a href=&quot;#&quot;&gt;Configure external collaboration settings&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tutorial: Reporting on automatic user account provisioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Managing user account provisioning for enterprise apps in the Azure portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;What is single sign-on in Microsoft Entra ID?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Configure cross-tenant synchronization using PowerShell or Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Article · 04/23/2024&lt;/p&gt;
&lt;p&gt;This article describes the key steps to configure cross-tenant synchronization using Microsoft Graph PowerShell or Microsoft Graph API. When configured, Microsoft Entra ID automatically provisions and de-provisions B2B users in your target tenant. For detailed steps using the Microsoft Entra admin center, see &lt;a href=&quot;#&quot;&gt;Configure cross-tenant synchronization&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
  A[Source tenant] --&amp;gt;|Cross-tenant synchronization| B[Target tenant]
  subgraph A
    C[UserS1] --&amp;gt; D[Outbound access settings]
    E[UserS2]
    F[UserS3] --&amp;gt; D
    D --&amp;gt;|Automatically redeem invitations| G[Configuration]
    G --&amp;gt; H[Scope]
    H --&amp;gt;|UserS1 UserS3| I[Scoping filters]
    I --&amp;gt;|department EQUALS Marketing| J[Attribute mappings]
    J -.-&amp;gt; K[accountEnabled]
    J -.-&amp;gt; L[employeeld]
    J -.-&amp;gt; M[userPrincipalName]
    J -.-&amp;gt; N[extensionName]
  end
  subgraph B
    O[Internal UserT1 UserT2 UserT3 GroupT1]
    P[External UserS1 UserS3] --&amp;gt; Q[Inbound access settings]
    Q -.-&amp;gt;|Allow users sync into this tenant| R
    Q -.-&amp;gt;|Automatically redeem invitations| R
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see &lt;a href=&quot;#&quot;&gt;License requirements&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Roles and Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Entra ID P1 or P2 license. For more information, see License requirements.&lt;/li&gt;
&lt;li&gt;Security Administrator role to configure cross-tenant access settings.&lt;/li&gt;
&lt;li&gt;Global Administrator role to consent to required permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Sign in to the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If necessary, install the Microsoft Graph PowerShell SDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Connect-MgGraph command to sign in to the target tenant and consent to the following required permissions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $TargetTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 2: Enable user synchronization in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner&lt;/code&gt; command to create a new partner configuration in a cross-tenant access policy between the target tenant and the source tenant. Use the source tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists&lt;/code&gt;, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    TenantId = $SourceTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;AutomaticUserConsentSettings :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration
B2BCollaborationInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BCollaborationOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectInbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
B2BDirectConnectOutbound :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting
IdentitySynchronization :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentity
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SyncPolicyPartner&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;InboundTrust
  Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust
    IsServiceProvider :
    TenantId : &amp;lt;SourceTenantId&amp;gt;
TenantRestrictions
  Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions
    AdditionalProperties :
      - [@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity]
      - [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]]
      - [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Use the Invoke-MgGraphRequest command to enable user synchronization in the target tenant.&lt;/h2&gt;
&lt;p&gt;If you get an &lt;code&gt;Request_MultipleObjectsWithSameKeyValue&lt;/code&gt; error, you might already have an existing policy. For more information, see Symptom - &lt;code&gt;Request_MultipleObjectsWithSameKeyValue&lt;/code&gt; error.&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to verify &lt;code&gt;IsSyncAllowed&lt;/code&gt; is set to True.&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;h2&gt;Step 3: Automatically redeem invitations in the target tenant&lt;/h2&gt;
&lt;h3&gt;Target tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the target tenant, use the &lt;code&gt;Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/code&gt; command to automatically redeem invitations and suppress consent prompts for inbound access.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$AutomaticUserConsentSettings = @{
    &amp;quot;InboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -
    CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId
    -AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4: Sign in to the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Start an instance of PowerShell.&lt;/li&gt;
&lt;li&gt;Get the tenant ID of the source and target tenants and initialize variables.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$SourceTenantId = &amp;quot;&amp;lt;SourceTenantId&amp;gt;&amp;quot;
$TargetTenantId = &amp;quot;&amp;lt;TargetTenantId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Use the Connect-MgGraph command to sign in to the source tenant and consent to the following required permissions.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Policy.Read.All&lt;/li&gt;
&lt;li&gt;Policy.ReadWrite.CrossTenantAccess&lt;/li&gt;
&lt;li&gt;Application.ReadWrite.All&lt;/li&gt;
&lt;li&gt;Directory.ReadWrite.All&lt;/li&gt;
&lt;li&gt;AuditLog.Read.All&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-MgGraph -TenantId $SourceTenantId -Scopes &amp;quot;Policy.Read.All&amp;quot;, &amp;quot;Policy.ReadWrite.CrossTenantAccess&amp;quot;, &amp;quot;Application.ReadWrite.All&amp;quot;, &amp;quot;Directory.ReadWrite.All&amp;quot;, &amp;quot;AuditLog.Read.All&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: Automatically redeem invitations in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;In the source tenant, use the New-MgPolicyCrossTenantAccessPolicyPartner command to create a new partner configuration in a cross-tenant access policy between the source tenant and the target tenant. Use the target tenant ID in the request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you get the error &lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists&lt;/code&gt;, you might already have an existing configuration. For more information, see Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error.&lt;/p&gt;
&lt;h2&gt;PowerShell Command Usage&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    TenantId = $TargetTenantId
}
New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;h3&gt;AutomaticUserConsentSettings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B2BCollaborationInbound&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B2BCollaborationOutbound&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B2BDirectConnectInbound&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;B2BDirectConnectOutbound&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IdentitySynchronization&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;InboundTrust&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IsServiceProvider&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: Not Specified&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;TenantId&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: &lt;TargetTenantId&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;TenantRestrictions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AdditionalProperties&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[@odata.context]&lt;/strong&gt;: &lt;code&gt;https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[crossCloudMeetingConfiguration]&lt;/strong&gt;: Dictionary&amp;lt;string, object&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[protectedContentSharing]&lt;/strong&gt;: Dictionary&amp;lt;string, object&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Instructions&lt;/h2&gt;
&lt;h3&gt;Updating CrossTenantAccessPolicyPartner&lt;/h3&gt;
&lt;p&gt;Use the &lt;strong&gt;Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/strong&gt; command to automatically redeem invitations and suppress consent prompts for outbound access.&lt;/p&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$AutomaticUserConsentSettings = @{
  &amp;quot;OutboundAllowed&amp;quot;=&amp;quot;True&amp;quot;
}
Update-MgPolicyCrossTenantAccessPolicyPartner -
CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId
-AutomaticUserConsentSettings $AutomaticUserConsentSettings
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 6: Create a configuration application in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, use the &lt;code&gt;Invoke-MgInstantiateApplicationTemplate&lt;/code&gt; command to add an instance of a configuration application from the Microsoft Entra application gallery into your tenant.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId &amp;quot;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&amp;quot; -DisplayName &amp;quot;Fabrikam&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;Get-MgServicePrincipal&lt;/code&gt; command to get the service principal ID and app role ID.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Get-MgServicePrincipal -Filter &amp;quot;DisplayName eq &amp;#39;Fabrikam&amp;#39;&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;AccountEnabled     : True
AddIns             : {}
AlternativeNames   : {}
AppDescription     : 
AppDisplayName     : Fabrikam
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Properties&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;AppId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppManagementPolicies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppOwnerOrganizationId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;AppOwnerOrganizationId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppRoleAssignedTo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppRoleAssignmentRequired&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppRoleAssignments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AppRoles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{&amp;lt;AppRoleId&amp;gt;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ApplicationTemplateId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;518e5f48-1fc8-4c48-9387-9fdf28b0dfe7&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ClaimsMappingPolicies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CreatedObjects&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CustomSecurityAttributes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttributeValue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DelegatedPermissionClassifications&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DeletedDateTime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DisabledByMicrosoftStatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DisplayName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fabrikam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Endpoints&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ErrorUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FederatedIdentityCredentials&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HomeRealmDiscoveryPolicies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Homepage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`&lt;a href=&quot;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync&quot;&gt;https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;ServicePrincipalId&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;KeyCredentials&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LicenseDetails&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Commands&lt;/h2&gt;
&lt;h3&gt;Initialize a variable for the service principal ID.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$ServicePrincipalId = &amp;quot;&amp;lt;ServicePrincipalId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Initialize a variable for the app role ID.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$AppRoleId = &amp;quot;&amp;lt;AppRoleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 7: Test the connection to the target tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the source tenant, use the &lt;code&gt;Invoke-MgGraphRequest&lt;/code&gt; command to test the connection to the target tenant and validate the credentials.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    &amp;quot;useSavedCredentials&amp;quot; = $false
    &amp;quot;templateId&amp;quot; = &amp;quot;Azure2Azure&amp;quot;
    &amp;quot;credentials&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        },
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
    )
}
Invoke-MgGraphRequest -Method POST -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 8: Create a provisioning job in the source tenant&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;In the source tenant, to enable provisioning, create a provisioning job.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine the synchronization template to use, such as &lt;code&gt;Azure2Azure&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;A template has pre-configured synchronization settings.&lt;/h2&gt;
&lt;h3&gt;2. In the source tenant, use the &lt;code&gt;New-MgServicePrincipalSynchronizationJob&lt;/code&gt; command to create a provisioning job based on a template.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId &amp;quot;Azure2Azure&amp;quot; | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Output&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Id                        : &amp;lt;JobId&amp;gt;
Schedule                  :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule
Schema                    :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema
Status                    :
Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus
SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}
TemplateId                : Azure2Azure
AdditionalProperties      : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(&amp;#39;&amp;lt;ServicePrincipalId&amp;gt;&amp;#39;)/synchronization/jobs/$entity]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Initialize a variable for the job ID.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$JobId = &amp;quot;&amp;lt;JobId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 9: Save your credentials&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 1: Save credentials in the source tenant&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    &amp;quot;value&amp;quot; = @(
        @{
            &amp;quot;key&amp;quot; = &amp;quot;AuthenticationType&amp;quot;
            &amp;quot;value&amp;quot; = &amp;quot;SyncPolicy&amp;quot;
        }
        @{
            &amp;quot;key&amp;quot; = &amp;quot;CompanyId&amp;quot;
            &amp;quot;value&amp;quot; = $TargetTenantId
        }
    )
}
Invoke-MgGraphRequest -Method PUT -Uri &amp;quot;https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets&amp;quot; -Body $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 10: Assign a user to the configuration&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;For cross-tenant synchronization to work, at least one internal user must be assigned to the configuration.&lt;/p&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    PrincipalId = &amp;quot;&amp;lt;PrincipalId&amp;gt;&amp;quot;
    ResourceId = $ServicePrincipalId
    AppRoleId = $AppRoleId
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New-MgServicePrincipalAppRoleAssignedTo Command&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;| AppRoleId         | &lt;AppRoleId&gt;                 |
| CreatedDateTime   | 7/31/2023 10:27:12 PM       |
| DeletedDateTime   |                             |
| Id                | &lt;Id&gt;                        |
| PrincipalDisplayName | User1                  |
| PrincipalId       | &lt;PrincipalId&gt;               |
| PrincipalType     | User                        |
| ResourceDisplayName | Fabrikam                 |
| ResourceId        | &lt;ServicePrincipalId&gt;        |
| AdditionalProperties | {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity%5D%7D&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity]}&lt;/a&gt; |&lt;/p&gt;
&lt;h2&gt;Step 11: Test provision on demand&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;Now that you have a configuration, you can test on-demand provisioning with one of your users.&lt;/p&gt;
&lt;h3&gt;PowerShell Command&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;1. In the source tenant, use the Get-MgServicePrincipalSynchronizationJobSchema command to get the schema rule ID.
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;$SynchronizationSchema = Get-MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
$SynchronizationSchema.SynchronizationRules | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;| ContainerFilter | Microsoft.Graph.PowerShell.Models.MicrosoftGraphContainerFilter |&lt;/p&gt;
&lt;h2&gt;GroupFilter&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Editable: True
Id: &amp;lt;RuleId&amp;gt;
Metadata: {defaultSourceObjectMappings, supportsProvisionOnDemand}
Name: USER_INBOUND_USER
ObjectMappings: {Provision Azure Active Directory Users, , , ..}
Priority: 1
SourceDirectoryName: Azure Active Directory
TargetDirectoryName: Azure Active Directory (target tenant)
AdditionalProperties: {}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Initialize a variable for the rule ID.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$RuleId = &amp;quot;&amp;lt;RuleId&amp;gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Use the New-MgServicePrincipalSynchronizationJobOnDemand command to provision a test user on demand.&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerShell&quot;&gt;$Params = @{
    Parameters = @(
        @{
            Subjects = @(
                @{
                    ObjectId = &amp;quot;&amp;lt;UserObjectId&amp;gt;&amp;quot;
                    ObjectTypeName = &amp;quot;User&amp;quot;
                }
            )
            RuleId = $RuleId
        }
    )
}
New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Key: Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo
Value: [{&amp;quot;provisioningSteps&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;EntryImport&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Import&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;Success&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Retrieved User&amp;quot;}]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 12: Start the provisioning job&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is configured, in the source tenant, use the &lt;code&gt;Start-MgServicePrincipalSynchronizationJob&lt;/code&gt; command to start the provisioning job.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 13: Monitor provisioning&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;h4&gt;PowerShell&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Now that the provisioning job is running, in the source tenant, use the &lt;code&gt;Get-MgServicePrincipalSynchronizationJob&lt;/code&gt; command to monitor the progress of the current provisioning cycle as well as statistics to date such as the number of users and groups that have been created in the target system.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Id: &lt;code&gt;&amp;lt;JobId&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Schedule: Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule&lt;/li&gt;
&lt;li&gt;Schema: Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema&lt;/li&gt;
&lt;li&gt;Status: Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus&lt;/li&gt;
&lt;li&gt;SynchronizationJobSettings: {AzureIngestionAttributeOptimization, LookaheadQueryEnabled}&lt;/li&gt;
&lt;li&gt;TemplateId: Azure2Azure&lt;/li&gt;
&lt;li&gt;AdditionalProperties: {[@odata.context, &lt;a href=&quot;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&quot;&gt;https://graph.microsoft.com/v1.0/$metadata#servicePrincipals&lt;/a&gt;(&amp;#39;&lt;ServicePrincipalId&gt;&amp;#39;)/synchronization/jobs/$entity]}&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;In addition to monitoring the status of the provisioning job, use the Get-MgAuditLogProvisioning command&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ActivityDateTime: 7/31/2023 12:08:17 AM&lt;/li&gt;
&lt;li&gt;ActivityDisplayName: Export&lt;/li&gt;
&lt;li&gt;AdditionalDetails: {Details, ErrorCode, EventName, ipaddr...}&lt;/li&gt;
&lt;li&gt;Category: ProvisioningManagement&lt;/li&gt;
&lt;li&gt;CorrelationId: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;Id: Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778479&lt;/li&gt;
&lt;li&gt;InitiatedBy: Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;LoggedByService: Account Provisioning&lt;/li&gt;
&lt;li&gt;OperationType:&lt;/li&gt;
&lt;li&gt;Result: success&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Activity Log&lt;/h2&gt;
&lt;h3&gt;Export Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResultReason&lt;/strong&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was created in Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetResources&lt;/strong&gt;: { &amp;lt;ServicePrincipalId&amp;gt;, }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalProperties&lt;/strong&gt;: {}&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Details&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ActivityDateTime&lt;/strong&gt;: 7/31/2023 12:08:17 AM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActivityDisplayName&lt;/strong&gt;: Export&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalDetails&lt;/strong&gt;: { Details, ErrorCode, EventName, ipaddr... }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: ProvisioningManagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CorrelationId&lt;/strong&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id&lt;/strong&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778264&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitiatedBy&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoggedByService&lt;/strong&gt;: Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OperationType&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;: success&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Synchronization rule action&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResultReason&lt;/strong&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; was updated in Azure Active Directory (target tenant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetResources&lt;/strong&gt;: { &amp;lt;ServicePrincipalId&amp;gt;, }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalProperties&lt;/strong&gt;: {}&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Details&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ActivityDateTime&lt;/strong&gt;: 7/31/2023 12:08:14 AM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActivityDisplayName&lt;/strong&gt;: Synchronization rule action&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalDetails&lt;/strong&gt;: { Details, ErrorCode, EventName, ipaddr... }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: ProvisioningManagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CorrelationId&lt;/strong&gt;: cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id&lt;/strong&gt;: Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_L5BFV_161778395&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitiatedBy&lt;/strong&gt;: Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoggedByService&lt;/strong&gt;: Account Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OperationType&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;: success&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Pre-Provisioning Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResultReason&lt;/strong&gt;: User &amp;#39;&lt;a href=&quot;mailto:user2@fabrikam.com&quot;&gt;user2@fabrikam.com&lt;/a&gt;&amp;#39; will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant))&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetResources&lt;/strong&gt;: { &amp;lt;ServicePrincipalId&amp;gt;, }&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalProperties&lt;/strong&gt;: {}&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Details&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ActivityDateTime&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActivityDisplayName&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdditionalDetails&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CorrelationId&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Id&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InitiatedBy&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoggedByService&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OperationType&lt;/strong&gt;: &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Troubleshooting tips&lt;/h2&gt;
&lt;h3&gt;PowerShell&lt;/h3&gt;
&lt;h2&gt;Symptom - Insufficient privileges error&lt;/h2&gt;
&lt;p&gt;When you try to perform an action, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;Either the signed-in user doesn&amp;#39;t have sufficient privileges, or you need to consent to one of the required permissions.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you&amp;#39;re assigned the required roles. See Prerequisites earlier in this article.&lt;/li&gt;
&lt;li&gt;When you sign in with Connect-MgGraph, make sure you specify the required scopes. See Step 1: Sign in to the target tenant and Step 4: Sign in to the source tenant earlier in this article.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Symptom - New-MgPolicyCrossTenantAccessPolicyPartner_Create error&lt;/h2&gt;
&lt;p&gt;When you try to create a new partner configuration, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cause&lt;/h3&gt;
&lt;p&gt;You are likely trying to create a configuration or object that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartner command&lt;/h2&gt;
&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartner command to list the existing object.&lt;/p&gt;
&lt;p&gt;If you have an existing object, you might need to make an update using Update-MgPolicyCrossTenantAccessPolicyPartner&lt;/p&gt;
&lt;h2&gt;Symptom - Request_MultipleObjectsWithSameKeyValue error&lt;/h2&gt;
&lt;p&gt;When you try to enable user synchronization, you receive an error message similar to the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Invoke-MgGraphRequest: PUT https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/&amp;lt;SourceTenantId&amp;gt;/identitySynchronization HTTP/1.1 409 Conflict
...
{&amp;quot;error&amp;quot; : {&amp;quot;code&amp;quot; :&amp;quot;Request_MultipleObjectsWithSameKeyValue&amp;quot;, &amp;quot;message&amp;quot; : &amp;quot;A conflicting object with one or more of the specified property values is present in the directory. &amp;quot;, &amp;quot;details&amp;quot;: 
[{&amp;quot;code&amp;quot;:&amp;quot;ConflictingObjects&amp;quot;, &amp;quot;message&amp;quot;: &amp;quot;A conflicting object with one 
or more of the specified property values is present in the directory.&amp;quot;,
... }}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Cause&lt;/h2&gt;
&lt;p&gt;You are likely trying to create a policy that already exists, possibly from a previous configuration.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify your syntax and that you are using the correct tenant ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to list the IsSyncAllowed setting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;PowerShell
(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;If you have an existing policy, you might need to make an update using Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization command to enable user synchronization.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$Params = @{
    userSyncInbound = @{
        isSyncAllowed = $true
    }
}
Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -
CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId
-BodyParameter $Params
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Microsoft Entra synchronization API overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tutorial: Develop and plan provisioning for a SCIM endpoint in Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scoping users or groups to be provisioned with scoping filters&lt;/h2&gt;
&lt;p&gt;Article · 01/18/2024&lt;/p&gt;
&lt;p&gt;Learn how to use scoping filters in the Microsoft Entra provisioning service to define attribute based rules. The rules are used to determine which users or groups are provisioned.&lt;/p&gt;
&lt;h3&gt;Scoping filter use cases&lt;/h3&gt;
&lt;p&gt;You use scoping filters to prevent objects in applications that support automated user provisioning from being provisioned if an object doesn&amp;#39;t satisfy your business requirements. A scoping filter allows you to include or exclude any users who have an attribute that matches a specific value. For example, when provisioning users from Microsoft Entra ID to a SaaS application used by a sales team, you can specify that only users with a &amp;quot;Department&amp;quot; attribute of &amp;quot;Sales&amp;quot; should be in scope for provisioning.&lt;/p&gt;
&lt;p&gt;Scoping filters can be used differently depending on the type of provisioning connector:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outbound provisioning from Microsoft Entra ID to SaaS applications.&lt;/strong&gt; When Microsoft Entra ID is the source system, user and group assignments are the most common method for determining which users are in scope for provisioning. These assignments also are used for enabling single sign-on and provide a single method to manage access and provisioning. Scoping filters can be used optionally, in addition to assignments or instead of them, to filter users based on attribute values.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;The more users and groups in scope for provisioning, the longer the synchronization process can take. Setting the scope to sync assigned users and groups, limiting the number of groups assigned to the app, and limiting the size of the groups will reduce the time it takes to synchronize everyone that is in scope.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inbound provisioning from HCM applications to Microsoft Entra ID and Active Directory.&lt;/strong&gt; When an HCM application such as Workday is the source system, scoping filters are the primary method for determining which users should be provisioned from the HCM application to Active Directory or Microsoft Entra ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Scoping filter construction&lt;/h2&gt;
&lt;p&gt;A scoping filter consists of one or more &lt;strong&gt;clauses&lt;/strong&gt;. Clauses determine which users are allowed to pass through the scoping filter by evaluating each user&amp;#39;s attributes. For example, you might have one clause that requires that a user&amp;#39;s &amp;quot;State&amp;quot; attribute equals &amp;quot;New York&amp;quot;, so only New York users are provisioned into the application.&lt;/p&gt;
&lt;p&gt;A single clause defines a single condition for a single attribute value. If multiple clauses are created in a single scoping filter, they&amp;#39;re evaluated together using &amp;quot;AND&amp;quot; logic. The &amp;quot;AND&amp;quot; logic means all clauses must evaluate to &amp;quot;true&amp;quot; in order for a user to be provisioned.&lt;/p&gt;
&lt;p&gt;Finally, multiple scoping filters can be created for a single application. If multiple scoping filters are present, they&amp;#39;re evaluated together by using &amp;quot;OR&amp;quot; logic. The &amp;quot;OR&amp;quot; logic means that if all the clauses in any of the configured scoping filters evaluate to &amp;quot;true&amp;quot;, the user is provisioned.&lt;/p&gt;
&lt;p&gt;Each user or group processed by the Microsoft Entra provisioning service is always evaluated individually against each scoping filter.&lt;/p&gt;
&lt;p&gt;As an example, consider the following scoping filter:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
  A[Scoping Filter Group: New York Engineering] --&amp;gt;|AND| B[(city EQUALS New York)]
  A --&amp;gt;|AND| C[(department EQUALS Engineering)]
  A --&amp;gt;|AND| D[(employeeID (extension...) REGEX MATCH (1[0-9]{5})...)]
  A --&amp;gt;|AND| E[(jobTitle IS NOT NULL)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;According to this scoping filter, users must satisfy the following criteria to be provisioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;They must be in New York.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They must work in the Engineering department.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their company employee ID must be between 1,000,000 and 2,000,000.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their job title must not be null or empty.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Create scoping filters&lt;/h2&gt;
&lt;p&gt;Scoping filters are configured as part of the attribute mappings for each Microsoft Entra user provisioning connector. The following procedure assumes that you already set up automatic provisioning for one of the supported applications and are adding a scoping filter to it.&lt;/p&gt;
&lt;h3&gt;Create a scoping filter&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip&lt;/p&gt;
&lt;p&gt;Steps in this article might vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center[^2] as at least a Application Administrator.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; All applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the application for which you have configured automatic provisioning: for example, &amp;quot;ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Provisioning tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the Mappings section, select the mapping that you want to configure a scoping filter for: for example, &amp;quot;Synchronize Microsoft Entra users to ServiceNow&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Source object scope menu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Add scoping filter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define a clause by selecting a source Attribute Name, an Operator, and an Attribute Value to match against. The following operators are supported:&lt;/p&gt;
&lt;p&gt;a. &amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute exists in the input string value.&lt;/p&gt;
&lt;p&gt;b. !&amp;amp;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute does not exist in the input string value.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Clauses&lt;/h2&gt;
&lt;p&gt;c. &lt;code&gt;ENDS_WITH&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute ends with the input string value.&lt;/p&gt;
&lt;p&gt;d. &lt;code&gt;EQUALS&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches the input string value exactly (case sensitive).&lt;/p&gt;
&lt;p&gt;e. &lt;code&gt;Greater_Than&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;p&gt;f. &lt;code&gt;Greater_Than_OR_EQUALS&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is greater than or equal to the value. The value specified on the scoping filter must be an integer and the attribute on the user must be an integer [0,1,2,...].&lt;/p&gt;
&lt;p&gt;g. &lt;code&gt;Includes&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains the string value (case sensitive) as described &lt;a href=&quot;#&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;h. &lt;code&gt;IS FALSE&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of false.&lt;/p&gt;
&lt;p&gt;i. &lt;code&gt;IS NOT NULL&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute isn&amp;#39;t empty.&lt;/p&gt;
&lt;p&gt;j. &lt;code&gt;IS NULL&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute is empty.&lt;/p&gt;
&lt;p&gt;k. &lt;code&gt;IS TRUE&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute contains a Boolean value of true.&lt;/p&gt;
&lt;p&gt;l. &lt;code&gt;NOT EQUALS&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match the input string value (case sensitive).&lt;/p&gt;
&lt;p&gt;m. &lt;code&gt;NOT REGEX MATCH&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute doesn&amp;#39;t match a regular expression pattern. It returns &amp;quot;false&amp;quot; if the attribute is null / empty.&lt;/p&gt;
&lt;p&gt;n. &lt;code&gt;REGEX MATCH&lt;/code&gt;. Clause returns &amp;quot;true&amp;quot; if the evaluated attribute matches a regular expression pattern. For example: &lt;code&gt;([1-9][0-9])&lt;/code&gt; matches any number between 10 and 99 (case sensitive).&lt;/p&gt;
&lt;h3&gt;Important&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;IsMemberOf&lt;/code&gt; filter is not supported currently.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;members&lt;/code&gt; attribute on a group is not supported currently.&lt;/li&gt;
&lt;li&gt;Filtering is not supported for multi-valued attributes.&lt;/li&gt;
&lt;li&gt;Scoping filters will return &amp;quot;false&amp;quot; if the value is null / empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;9. Optionally, repeat steps 7-8 to add more scoping clauses.&lt;/h2&gt;
&lt;h2&gt;10. In Scoping Filter Title, add a name for your scoping filter.&lt;/h2&gt;
&lt;h2&gt;11. Select OK.&lt;/h2&gt;
&lt;h2&gt;12. Select OK again on the Scoping Filters screen. Optionally, repeat steps 6-11 to add another scoping filter.&lt;/h2&gt;
&lt;h2&gt;13. Select Save on the Attribute Mapping screen.&lt;/h2&gt;
&lt;h3&gt;Important&lt;/h3&gt;
&lt;p&gt;Saving a new scoping filter triggers a new full sync for the application, where all users in the source system are evaluated again against the new scoping filter. If a user in the application was previously in scope for provisioning, but falls out of scope, their account is disabled or deprovisioned in the application. To override this default behavior, refer to Skip deletion for user accounts that go out of scope.&lt;/p&gt;
&lt;h2&gt;Common scoping filters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that have the domain @domain.com are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;NOT REGEX MATCH&lt;/td&gt;
&lt;td&gt;.*@domain.com&lt;/td&gt;
&lt;td&gt;All users with userPrincipal that has the domain @domain.com are out of scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;department&lt;/td&gt;
&lt;td&gt;EQUALS&lt;/td&gt;
&lt;td&gt;sales&lt;/td&gt;
&lt;td&gt;All users from the sales department are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workerID&lt;/td&gt;
&lt;td&gt;REGEX MATCH&lt;/td&gt;
&lt;td&gt;(1[0-9]{6})&lt;/td&gt;
&lt;td&gt;All employees with workerID between 1000000 and 2000000 are in scope for provisioning.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Related articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate user provisioning and deprovisioning to SaaS applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;User Provisioning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Customize attribute mappings for user provisioning&lt;/li&gt;
&lt;li&gt;Write expressions for attribute mappings&lt;/li&gt;
&lt;li&gt;Account provisioning notifications&lt;/li&gt;
&lt;li&gt;Use SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;List of tutorials on how to integrate SaaS apps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Enable accidental deletions prevention in the Microsoft Entra provisioning service&lt;/h2&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;The Microsoft Entra provisioning service includes a feature to help avoid accidental deletions. This feature ensures that users aren&amp;#39;t disabled or deleted in an application unexpectedly.&lt;/p&gt;
&lt;p&gt;You use accidental deletions to specify a deletion threshold. Anything above the threshold that you set requires an admin to explicitly allow the processing of the deletions.&lt;/p&gt;
&lt;h3&gt;Configure accidental deletion prevention&lt;/h3&gt;
&lt;p&gt;To enable accidental deletion prevention:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and then on the provisioning page select Edit provisioning.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Under Settings, select the Prevent accidental deletions check box and specify a deletion threshold.&lt;/li&gt;
&lt;li&gt;Ensure the Notification Email address is completed. If the deletion threshold is met, an email is sent.&lt;/li&gt;
&lt;li&gt;Select Save to save the changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When the deletion threshold is met, the job goes into quarantine, and a notification email is sent. The quarantined job can then be allowed or rejected. To learn more about quarantine behavior, see Application provisioning in quarantine status.&lt;/p&gt;
&lt;h3&gt;Recovering from an accidental deletion&lt;/h3&gt;
&lt;p&gt;When you encounter an accidental deletion, you see it on the provisioning status page. It says Provisioning has been quarantined. See quarantine details for more information.&lt;/p&gt;
&lt;h2&gt;Allowing deletions&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Allow deletes&lt;/strong&gt; action deletes the objects that triggered the accidental delete threshold. Use the procedure to accept the deletions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Allow deletes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Yes&lt;/strong&gt; on the confirmation to allow the deletions.&lt;/li&gt;
&lt;li&gt;View the confirmation that the deletions were accepted. The status returns to healthy with the next cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Rejecting deletions&lt;/h2&gt;
&lt;p&gt;Investigate and reject deletions as necessary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate the source of the deletions. You can use the provisioning logs for details.&lt;/li&gt;
&lt;li&gt;Prevent the deletion by assigning the user / group to the application (or configuration) again, restoring the user / group, or updating your provisioning configuration.&lt;/li&gt;
&lt;li&gt;Once you&amp;#39;ve made the necessary changes to prevent the user / group from being deleted, restart provisioning. Don&amp;#39;t restart provisioning until you&amp;#39;ve made the necessary changes to prevent the users / groups from being deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test deletion prevention&lt;/h2&gt;
&lt;p&gt;You can test the feature by triggering disable / deletion events by setting the threshold to a low number, for example 3, and then changing scoping filters, unassigning users, and deleting users from the directory (see common scenarios in next section).&lt;/p&gt;
&lt;p&gt;Let the provisioning job run (20 - 40 mins) and navigate back to the provisioning page. Check the provisioning job in quarantine and choose to allow the deletions or review the provisioning logs to understand why the deletions occurred.&lt;/p&gt;
&lt;h2&gt;Common deprovisioning scenarios to test&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Delete a user / put them into the recycle bin.&lt;/li&gt;
&lt;li&gt;Block sign in for a user.&lt;/li&gt;
&lt;li&gt;Unassign a user or group from the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Remove a user from a group&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Remove a user from a group that&amp;#39;s provides them access to the application (or configuration).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about deprovisioning scenarios, see &lt;a href=&quot;#&quot;&gt;How Application Provisioning Works&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;h3&gt;What scenarios count toward the deletion threshold?&lt;/h3&gt;
&lt;p&gt;When a user is set for removal from the target application (or target tenant), it&amp;#39;s counted against the deletion threshold. Scenarios that could lead to a user being removed from the target application (or target tenant) could include: unassigning the user from the application (or configuration) and soft / hard deleting a user in the directory. Groups evaluated for deletion count towards the deletion threshold. In addition to deletions, the same functionality also works for disables.&lt;/p&gt;
&lt;h3&gt;What is the interval that the deletion threshold is evaluated on?&lt;/h3&gt;
&lt;p&gt;It&amp;#39;s evaluated each cycle. If the number of deletions doesn&amp;#39;t exceed the threshold during a single cycle, the &amp;quot;circuit breaker&amp;quot; isn&amp;#39;t triggered. If multiple cycles are needed to reach a steady state, the deletion threshold is evaluated per cycle.&lt;/p&gt;
&lt;h3&gt;How are these deletion events logged?&lt;/h3&gt;
&lt;p&gt;You can find users that should be disabled / deleted but haven&amp;#39;t due to the deletion threshold. Navigation to Provisioning logs and then filter Action with StagedAction or StagedDelete.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;How application provisioning works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Plan an application provisioning deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Yes&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;#&quot;&gt;No&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Provide Product Feedback&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Provide product feedback&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Get Help at Microsoft Q&amp;amp;A&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;On-demand provisioning in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article · 10/23/2023&lt;/p&gt;
&lt;p&gt;Use on-demand provisioning to provision a user or group in seconds. Among other things, you can use this capability to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshoot configuration issues quickly.&lt;/li&gt;
&lt;li&gt;Validate expressions that you&amp;#39;ve defined.&lt;/li&gt;
&lt;li&gt;Test scoping filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to use on-demand provisioning&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;
Steps in this article may vary slightly based on the portal you start from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center as at least a Application Administrator.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; Applications &amp;gt; Enterprise applications &amp;gt; select your application.&lt;/li&gt;
&lt;li&gt;Select Provisioning.&lt;/li&gt;
&lt;li&gt;Configure provisioning by providing your admin credentials.&lt;/li&gt;
&lt;li&gt;Select Provision on demand.&lt;/li&gt;
&lt;li&gt;Search for a user by first name, last name, display name, user principal name, or email address. Alternatively, you can search for a group and pick up to five users.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;
For Cloud HR provisioning app (Workday / SuccessFactors to Active Directory / Microsoft Entra ID), the input value is different. For Workday scenario, please provide &amp;quot;WorkerID&amp;quot; or &amp;quot;WID&amp;quot; of the user in Workday. For SuccessFactors scenario, please provide &amp;quot;personldExternal&amp;quot; of the user in SuccessFactors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Select Provision at the bottom of the page.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Understand the provisioning steps&lt;/h2&gt;
&lt;p&gt;The on-demand provisioning process attempts to show the steps that the provisioning service takes when provisioning a user. There are typically five steps to provision a user. One or more of those steps, explained in the following sections, are shown during the on-demand provisioning experience.&lt;/p&gt;
&lt;h3&gt;Step 1: Test connection&lt;/h3&gt;
&lt;p&gt;The provisioning service attempts to authorize access to the target system by making a request for a &amp;quot;test user&amp;quot;. The provisioning service expects a response that indicates that the service authorized to continue with the provisioning steps. This step is shown only when it fails. It&amp;#39;s not shown during the on-demand provisioning experience when the step is successful.&lt;/p&gt;
&lt;h4&gt;Troubleshooting tips&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that you&amp;#39;ve provided valid credentials, such as the secret token and tenant URL, to the target system. The required credentials vary by application. For detailed configuration tutorials, see the tutorial list.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the matching attributes defined in the Attribute mappings pane. You might need to check the API documentation provided by the application developer to understand the supported filters.&lt;/li&gt;
&lt;li&gt;For System for Cross-domain Identity Management (SCIM) applications, you can use a tool like Postman. Such tools help you ensure that the application responds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 2: Import user&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service retrieves the user from the source system. The user attributes that the service retrieves are used later to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluate whether the user is in scope for provisioning.&lt;/li&gt;
&lt;li&gt;Check the target system for an existing user.&lt;/li&gt;
&lt;li&gt;Determine what user attributes to export to the target system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details section shows the properties of the user that were imported from the source system (for example, Microsoft Entra ID).&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Importing the user can fail when the matching attribute is missing on the user object in the source system. To resolve this failure, try one of these approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update the user object with a value for the matching attribute.&lt;/li&gt;
&lt;li&gt;Change the matching attribute in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If an attribute that you expected is missing from the imported list, ensure that the attribute has a value on the user object in the source system. The provisioning service currently doesn&amp;#39;t support provisioning null attributes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that the Attribute mapping page of your provisioning configuration contains the attribute that you expect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 3: Determine if user is in scope&lt;/h2&gt;
&lt;p&gt;Next, the provisioning service determines whether the user is in scope for provisioning. The service considers aspects such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the user is assigned to the application.&lt;/li&gt;
&lt;li&gt;Whether scope is set to Sync assigned or Sync all.&lt;/li&gt;
&lt;li&gt;The scoping filters defined in your provisioning configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;h2&gt;The View details section&lt;/h2&gt;
&lt;p&gt;The View details section shows the scoping conditions that were evaluated. You might see one or more of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Active in source system&lt;/strong&gt; indicates that the user has the property IsActive set to true in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assigned to application&lt;/strong&gt; indicates that the user is assigned to the application in Microsoft Entra ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope sync all&lt;/strong&gt; indicates that the scope setting allows all users and groups in the tenant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User has required role&lt;/strong&gt; indicates that the user has the necessary roles to be provisioned into the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scoping filters&lt;/strong&gt; are also shown if you have defined scoping filters for your application. The filter is displayed with the following format: {scoping filter title} {scoping filter attribute} {scoping filter operator} {scoping filter value}.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Make sure that you&amp;#39;ve defined a valid scoping role. For example, avoid using the Greater_Than operator with a noninteger value.&lt;/li&gt;
&lt;li&gt;If the user doesn&amp;#39;t have the necessary role, review the tips for provisioning users assigned to the default access role.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 4: Match user between source and target&lt;/h2&gt;
&lt;p&gt;In this step, the service attempts to match the user that was retrieved in the import step with a user in the target system.&lt;/p&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details page shows the properties of the users that were matched in the target system. The context pane changes as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If no users are matched in the target system, no properties are shown.&lt;/li&gt;
&lt;li&gt;If one user matches in the target system, the properties of that user are shown.&lt;/li&gt;
&lt;li&gt;If multiple users match, the properties of both users are shown.&lt;/li&gt;
&lt;li&gt;If multiple matching attributes are part of your attribute mappings, each matching attribute is evaluated sequentially and the matched users for that attribute are shown.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that the matching attributes used in your attribute mappings are correctly configured for identification in the target system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Troubleshooting Tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The provisioning service might not be able to match a user in the source system uniquely with a user in the target. Resolve this problem by ensuring that the matching attribute is unique.&lt;/li&gt;
&lt;li&gt;Make sure that the target system supports filtering on the attribute that&amp;#39;s defined as the matching attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 5: Perform action&lt;/h2&gt;
&lt;p&gt;Finally, the provisioning service takes an action, such as creating, updating, deleting, or skipping the user.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s an example of what you might see after the successful on-demand provisioning of a user:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph LR
A(Import group) --&amp;gt; B[Determine if group is in scope]
B --&amp;gt; C(Match group between source and target system)
C --&amp;gt; D[Perform action]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;View details&lt;/h3&gt;
&lt;p&gt;The View details section displays the attributes that were modified in the target system. This display represents the final output of the provisioning service activity and the attributes that were exported. If this step fails, the attributes displayed represent the attributes that the provisioning service attempted to modify.&lt;/p&gt;
&lt;h3&gt;Troubleshooting tips&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Failures for exporting changes can vary greatly. Check the documentation for provisioning logs for common failures.&lt;/li&gt;
&lt;li&gt;On-demand provisioning says the group or user can&amp;#39;t be provisioned because they&amp;#39;re not assigned to the application. There&amp;#39;s a replication delay of up to a few.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3&gt;Do you need to turn provisioning off to use on-demand provisioning?&lt;/h3&gt;
&lt;p&gt;For applications that use a long-lived bearer token or a user name and password for authorization, no more steps are required. Applications that use OAuth for authorization currently require the provisioning job to be stopped before using on-demand provisioning. Applications such as G Suite, Box, Workplace by Facebook, and Slack fall into this category. Work is in progress to support on-demand provisioning for all applications without having to stop provisioning jobs.&lt;/p&gt;
&lt;h3&gt;How long does on-demand provisioning take?&lt;/h3&gt;
&lt;p&gt;On-demand provisioning typically takes less than 30 seconds.&lt;/p&gt;
&lt;h2&gt;Known limitations&lt;/h2&gt;
&lt;p&gt;There are currently a few known limitations to on-demand provisioning. Post your suggestions and feedback [2] so we can better determine what improvements to make next.&lt;/p&gt;
&lt;h3&gt;Note&lt;/h3&gt;
&lt;p&gt;The following limitations are specific to the on-demand provisioning capability. For information about whether an application supports provisioning groups, deletions, or other capabilities, check the tutorial for that application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On-demand provisioning of groups supports updating up to five members at a time. Connectors for cross-tenant synchronization, Workday, etc. do not support group provisioning and as a result do not support on-demand provisioning of groups.&lt;/li&gt;
&lt;li&gt;On-demand provisioning supports provisioning one user at a time through the Microsoft Entra admin center.&lt;/li&gt;
&lt;li&gt;Restoring a previously soft-deleted user in the target tenant with on-demand provisioning isn&amp;#39;t supported. If you try to soft-delete a user with on-demand provisioning and then restore the user, it can result in duplicate users.&lt;/li&gt;
&lt;li&gt;On-demand provisioning of roles isn&amp;#39;t supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;On-demand provisioning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning supports disabling users that have been unassigned from the application. However, it doesn&amp;#39;t support disabling or deleting users that have been disabled or deleted from Microsoft Entra ID. Those users don&amp;#39;t appear when you search for a user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On-demand provisioning doesn&amp;#39;t support nested groups that aren&amp;#39;t directly assigned to the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The on-demand provisioning request API can only accept a single group with up to 5 members at a time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Troubleshooting provisioning&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Was this page helpful?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Yes&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;No&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;#&quot;&gt;Provide product feedback&lt;/a&gt; | &lt;a href=&quot;#&quot;&gt;Get help at Microsoft Q&amp;amp;A&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What are the Microsoft Entra user provisioning logs?&lt;/h2&gt;
&lt;p&gt;Article · 01/25/2024&lt;/p&gt;
&lt;p&gt;Microsoft Entra ID integrates with several third party services to provision users into your tenant. If you need to troubleshoot an issue with a provisioned user, you can use the information captured in the Microsoft Entra provisioning logs to help find a solution.&lt;/p&gt;
&lt;p&gt;Two other activity logs are also available to help monitor the health of your tenant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sign-ins - Information about sign-ins and how your resources are used by your users.&lt;/li&gt;
&lt;li&gt;Audit - Information about changes applied to your tenant such as users and group management or updates applied to your tenant&amp;#39;s resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article gives you an overview of the user provisioning logs.&lt;/p&gt;
&lt;h2&gt;License and role requirements&lt;/h2&gt;
&lt;p&gt;The required roles and licenses might vary based on the report. Global Administrator can access all reports, but we recommend using a role with least privilege access to align with the Zero Trust guidance.&lt;/p&gt;
&lt;h3&gt;Expand table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Log / Report&lt;/th&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Audit&lt;/td&gt;
&lt;td&gt;Report Reader Security Reader Security Administrator Global Reader A custom role with &lt;code&gt;AuditLogsRead&lt;/code&gt; or &lt;code&gt;CustomSecAuditLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-ins&lt;/td&gt;
&lt;td&gt;Report Reader Security Reader Security Administrator Global Reader A custom role with &lt;code&gt;SignInLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;All editions of Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioning&lt;/td&gt;
&lt;td&gt;Same as audit and sign-ins, plus Security Operator Application Administrator Cloud App Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Log / Report&lt;/h2&gt;
&lt;h3&gt;Roles&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Roles&lt;/th&gt;
&lt;th&gt;Licenses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A custom role with &lt;code&gt;ProvisioningLogsRead&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reports Reader&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Reader&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A custom role with &lt;code&gt;IdentityRiskEventReadWrite&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Administrator&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Operator&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Reader&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Graph&lt;/td&gt;
&lt;td&gt;Microsoft Entra ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;activity logs&lt;/td&gt;
&lt;td&gt;P1/P2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A custom role with &lt;code&gt;ListKeys&lt;/code&gt; permission&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;*The level of access and capabilities for Identity Protection varies with the role and license. For more information, see the license requirements for Identity Protection.&lt;/p&gt;
&lt;h2&gt;What can you do with the provisioning logs?&lt;/h2&gt;
&lt;p&gt;You can use the provisioning logs to find answers to questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What groups were successfully created in ServiceNow?&lt;/li&gt;
&lt;li&gt;What users were successfully removed from Adobe?&lt;/li&gt;
&lt;li&gt;What users from Workday were successfully created in Active Directory?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Entries in the provisioning logs are system generated and can&amp;#39;t be changed or deleted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What do the logs show?&lt;/h2&gt;
&lt;p&gt;When you select an item in the provisioning list view, you get more details about this item, such as the steps taken to provision the user and tips for troubleshooting issues. The details are grouped into four tabs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steps&lt;/strong&gt;: This tab outlines the steps taken to provision an object. Provisioning an object can include the following steps, but not all steps are applicable to all provisioning events.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Import the object.&lt;/li&gt;
&lt;li&gt;Match the object between source and target.&lt;/li&gt;
&lt;li&gt;Determine if the object is in scope.&lt;/li&gt;
&lt;li&gt;Evaluate the object before synchronization.&lt;/li&gt;
&lt;li&gt;Provision the object (create, update, delete, or disable).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;ol&gt;
&lt;li&gt;Import User from Azure Active Directory&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Determine if User is in scope&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Match User between Azure Active Directory and Box&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; &lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Provision User in Box&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Entry/Export/Add&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;User &amp;quot;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&amp;quot; was created in Box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reportable Identifier&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;mailto:cheryl@f128.info&quot;&gt;cheryl@f128.info&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Troubleshooting &amp;amp; Recommendations&lt;/h2&gt;
&lt;p&gt;If there was an error, this tab provides the error code and reason.&lt;/p&gt;
&lt;h2&gt;Modified Properties&lt;/h2&gt;
&lt;p&gt;If there were changes, this tab shows the old value and the new value.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Provides an overview of what happened and identifiers for the object in the source and target systems.&lt;/p&gt;
&lt;h2&gt;Map directory extensions in cross-tenant synchronization&lt;/h2&gt;
&lt;p&gt;Article · 01/30/2024&lt;/p&gt;
&lt;p&gt;Directory extensions enable you to extend the schema in Microsoft Entra ID with your own attributes. You can map these directory extensions when provisioning users in cross-tenant synchronization. Custom security attributes are different and aren&amp;#39;t supported in cross-tenant synchronization.&lt;/p&gt;
&lt;p&gt;This article describes how to map directory extensions in cross-tenant synchronization.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hybrid Identity Administrator role to configure cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Cloud Application Administrator or Application Administrator role to assign users to a configuration and to delete a configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Create directory extensions&lt;/h3&gt;
&lt;p&gt;If you don&amp;#39;t already have directory extensions, you must create one or more directory extensions in the source or target tenant. You can create extensions using Microsoft Entra Connect or Microsoft Graph API. For information on how to create directory extensions, see Syncing extension attributes for Microsoft Entra Application Provisioning.&lt;/p&gt;
&lt;h3&gt;Map directory extensions&lt;/h3&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Once you have one or more directory extensions, you can use them when mapping attributes in cross-tenant synchronization.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the &lt;a href=&quot;https://example.com&quot;&gt;Microsoft Entra admin center&lt;/a&gt; of the source tenant.&lt;/li&gt;
&lt;li&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/li&gt;
&lt;li&gt;Select Configurations and then select your configuration.&lt;/li&gt;
&lt;li&gt;Select Provisioning and expand the Mappings section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Home &amp;gt; Cross-tenant synchronization | Configurations &amp;gt; Fabrikam to Contoso&lt;/h2&gt;
&lt;h3&gt;Fabrikam to Contoso | Provisioning&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fabrikam - Microsoft Entra ID&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Save&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Discard&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;h4&gt;Admin Credentials&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Provision on demand&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Manage&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Users and groups&lt;/li&gt;
&lt;li&gt;Provisioning&lt;/li&gt;
&lt;li&gt;Expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Activity&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Audit logs&lt;/li&gt;
&lt;li&gt;Provisioning logs&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Troubleshooting + Support&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;New support request&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Mappings&lt;/h5&gt;
&lt;p&gt;Mappings allow you to define how data should flow between Microsoft Entra ID and Azure Active Directory (target tenant).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Enabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Provision Microsoft Entra ID Users&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Restore default mappings&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Provisioning Status&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; On&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Off&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/li&gt;
&lt;li&gt;Scroll to the bottom of the page and select &lt;strong&gt;Add new mapping&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Attribute&lt;/th&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;preferredLanguage&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;surname&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;telephoneNumber&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Add New Mapping&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Show advanced options&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;In the &lt;strong&gt;Source attribute&lt;/strong&gt; drop-down list, select a source attribute.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you created a directory extension in the source tenant, select the directory extension.&lt;/p&gt;
&lt;h2&gt;Edit Attribute&lt;/h2&gt;
&lt;p&gt;A mapping lets you define how the attributes in one class of Microsoft Entra object (e.g., Users) should flow to and from this application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mapping type: Direct&lt;/li&gt;
&lt;li&gt;Source attribute:&lt;ul&gt;
&lt;li&gt;employeeHireDate&lt;/li&gt;
&lt;li&gt;employeeld&lt;/li&gt;
&lt;li&gt;employeeLeaveDateTime&lt;/li&gt;
&lt;li&gt;employeeOrgData.costCenter&lt;/li&gt;
&lt;li&gt;employeeOrgData.division&lt;/li&gt;
&lt;li&gt;employeeType&lt;/li&gt;
&lt;li&gt;testExtension (extension_c44d2adc1ddd43f29f29248e8de53937_testExtension)&lt;/li&gt;
&lt;li&gt;extensionAttribute1&lt;/li&gt;
&lt;li&gt;extensionAttribute10&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the directory extension isn&amp;#39;t listed, make sure that the directory extension was created successfully. You can also try to manually add the directory extension to the attribute list as described in the next section.&lt;/p&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;In the Target attribute drop-down list, select a target attribute.
If you created a directory extension in the target tenant, select the directory extension.&lt;/li&gt;
&lt;li&gt;Select Ok to save the mapping.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Manually add directory extensions to the attribute list&lt;/h2&gt;
&lt;h3&gt;Source tenant&lt;/h3&gt;
&lt;p&gt;If your directory extension wasn&amp;#39;t automatically discovered, you can try the following steps to manually add the directory extension to the attribute list.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign in to the Microsoft Entra admin center of the source tenant using the following link:&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Microsoft Entra admin center configuration&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Enter the following URL to enable the schema editor:&lt;br&gt;&lt;code&gt;https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to &lt;strong&gt;Identity&lt;/strong&gt; &amp;gt; &lt;strong&gt;External Identities&lt;/strong&gt; &amp;gt; &lt;strong&gt;Cross-tenant synchronization&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Configurations&lt;/strong&gt; and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provisioning&lt;/strong&gt; and expand the &lt;strong&gt;Mappings&lt;/strong&gt; section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Provision Microsoft Entra ID Users&lt;/strong&gt; to open the &lt;strong&gt;Attribute Mapping&lt;/strong&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll to the bottom and select the &lt;strong&gt;Show advanced settings&lt;/strong&gt; check box.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Mapping&lt;/th&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;userPrincipalName&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;showInAddressList&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;mail&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Member&lt;/td&gt;
&lt;td&gt;userType&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;[Show advanced options]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Supported Attributes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;/li&gt;
&lt;li&gt;Edit attribute list for &lt;strong&gt;Microsoft Entra ID&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Edit attribute list for &lt;strong&gt;Azure Active Directory (target tenant)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use the expression builder&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Review your schema&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. &lt;a href=&quot;#&quot;&gt;Review your schema here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tip&lt;/h3&gt;
&lt;p&gt;If you don&amp;#39;t see the &lt;strong&gt;Edit attribute list&lt;/strong&gt; links, be sure that you are signed in to the Microsoft Entra admin center using the link in Step 1.&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;p&gt;If you created a directory extension in the source tenant, select the &lt;strong&gt;Edit attribute list for Microsoft Entra ID&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you created an extension in the target tenant, select the &lt;strong&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/strong&gt; link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the directory extension and select the appropriate options.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Manually add directory extensions by editing the schema&lt;/h2&gt;
&lt;h4&gt;Source tenant&lt;/h4&gt;
&lt;p&gt;Follow these steps to manually add directory extensions to the schema by using the schema editor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign in to the Microsoft Entra admin center of the source tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to Identity &amp;gt; External Identities &amp;gt; Cross-tenant synchronization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Configurations and then select your configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provisioning and expand the Mappings section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Provision Microsoft Entra ID Users to open the Attribute Mapping page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Save.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the Attribute mappings page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;6. Scroll to the bottom and select the Show advanced settings check box.&lt;/h2&gt;
&lt;h3&gt;Attribute Mapping&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Source Attribute&lt;/th&gt;
&lt;th&gt;Target Attribute&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userPrincipalName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userPrincipalName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;showInAddressList&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Member&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;userType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Add New Mapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Show advanced options&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Supported Attributes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;View and edit the list of attributes that appear in the source and target attribute lists for this application.&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Edit attribute list for Microsoft Entra ID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Edit attribute list for Azure Active Directory (target tenant)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Use the expression builder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition to configuring your attribute mappings through the user interface, you can review, download, and edit the JSON representation of your schema. &lt;a href=&quot;#&quot;&gt;Review your schema here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;7. Select the Review your schema here link to open the Schema editor page.&lt;/h2&gt;
&lt;h3&gt;Schema editor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Save&lt;/a&gt;  &lt;a href=&quot;#&quot;&gt;Discard&lt;/a&gt;  &lt;a href=&quot;#&quot;&gt;Download&lt;/a&gt;  &lt;a href=&quot;#&quot;&gt;Got feedback?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The schema below is a JSON representation of your provisioning configuration. You can use it to define what objects you want to provision, map objects between your source and target system, and specify who should be provisioned. We recommend making these changes directly through our configuration experience. The schema below is only used for saving your configuration and making changes in it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;We recommend downloading and saving the current configuration prior to making changes. A backup copy can be used to roll back to a known good state.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;@odata.context&amp;quot;: &amp;quot;https://graph.microsoft.com/beta/$metadata#servicePrincipals&amp;quot;,
  &amp;quot;id&amp;quot;: &amp;quot;Azure2Azure.1f58d1c91f90427abd849f967e96fb42.6a0b230b-3a8d-455d-98db-6e9e679fb64f&amp;quot;,
  &amp;quot;version&amp;quot;: &amp;quot;v1.2&amp;quot;,
  &amp;quot;synchronizationRules&amp;quot;: [
    {
      &amp;quot;containerFilter&amp;quot;: null,
      &amp;quot;editable&amp;quot;: true,
      &amp;quot;groupFilter&amp;quot;: null,
      &amp;quot;id&amp;quot;: &amp;quot;df8df8d1-9e6e-40d3-b8df-09bbb402db7e&amp;quot;,
      &amp;quot;name&amp;quot;: &amp;quot;USER_INBOUND_USER&amp;quot;,
      &amp;quot;priority&amp;quot;: 1,
      &amp;quot;sourceDirectoryName&amp;quot;: &amp;quot;Microsoft Entra ID&amp;quot;,
      ...
    },
    ...
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;8. Download an original copy of the schema as a backup.&lt;/h2&gt;
&lt;h2&gt;9. Modify the schema following your required configuration.&lt;/h2&gt;
&lt;h2&gt;10. Select Save.&lt;/h2&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;p&gt;Refresh the browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the &lt;strong&gt;Attribute mappings&lt;/strong&gt; page and try to map the directory extension as described earlier in this article.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Syncing extension attributes for Microsoft Entra Application Provisioning&lt;/li&gt;
&lt;li&gt;Configure cross-tenant synchronization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reference for writing expressions for attribute mappings in Microsoft Entra ID&lt;/h2&gt;
&lt;p&gt;Article · 01/26/2024&lt;/p&gt;
&lt;p&gt;When you configure provisioning to a SaaS application, one of the types of attribute mappings that you can specify is an expression mapping. For these mappings, you must write a script-like expression that allows you to transform your users&amp;#39; data into formats that are more acceptable for the SaaS application.&lt;/p&gt;
&lt;h3&gt;Syntax overview&lt;/h3&gt;
&lt;p&gt;The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic for Applications (VBA) functions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The entire expression must be defined in terms of functions, which consist of a name followed by arguments in parentheses: &lt;code&gt;FunctionName( &amp;lt;&amp;lt;argument 1&amp;gt;&amp;gt;, &amp;lt;&amp;lt;argument N&amp;gt;&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can nest functions within each other. For example:
&lt;code&gt;FunctionOne(FunctionTwo(&amp;lt;&amp;lt;argument1&amp;gt;&amp;gt;))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can pass three different types of arguments into functions:&lt;ol&gt;
&lt;li&gt;Attributes, which must be enclosed in square brackets. For example:
&lt;code&gt;[attributeName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;String constants, which must be enclosed in double quotes. For example:
&lt;code&gt;&amp;quot;United States&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Other Functions. For example: &lt;code&gt;FunctionOne(&amp;lt;&amp;lt;argument1&amp;gt;&amp;gt;, FunctionTwo(&amp;lt;&amp;lt;argument2&amp;gt;&amp;gt;))&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;For string constants, if you need a backslash (&lt;code&gt;\&lt;/code&gt;) or quotation mark (&lt;code&gt;&amp;quot;&lt;/code&gt;) in the string, it must be escaped with the backslash (&lt;code&gt;\&lt;/code&gt;) symbol. For example: &lt;code&gt;&amp;quot;Company name: \&amp;quot;Contoso\&amp;quot;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The syntax is case-sensitive, which must be considered while typing them as strings in a function vs copy pasting them directly from here.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;List of Functions&lt;/h3&gt;
&lt;h2&gt;Append&lt;/h2&gt;
&lt;h3&gt;Function: &lt;code&gt;Append(source, suffix)&lt;/code&gt;&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Takes a source string value and appends the suffix to the end of it.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suffix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The string that you want to append to the end of the source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Append constant suffix to user name&lt;/h3&gt;
&lt;p&gt;Example: If you&amp;#39;re using a Salesforce Sandbox, you might need to append another suffix to all your user names before synchronizing them.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Append([userPrincipalName], &amp;quot;.test&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &lt;code&gt;(userPrincipalName): &amp;quot;John.Doe@contoso.com&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OUTPUT: &lt;code&gt;&amp;quot;John.Doe@contoso.com.test&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AppRoleAssignmentsComplex&lt;/h2&gt;
&lt;h3&gt;Function: &lt;code&gt;AppRoleAssignmentsComplex([appRoleAssignments])&lt;/code&gt;&lt;/h3&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;Used to configure multiple roles for a user. For detailed usage, see Tutorial - Customize user provisioning attribute-mappings for SaaS applications in Microsoft Entra ID.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;BitAnd&lt;/h2&gt;
&lt;h3&gt;Function: BitAnd(value1, value2)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;This function converts both parameters to the binary representation and sets a bit to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0 - if one or both of the corresponding bits in value1 and value2 are 0&lt;/li&gt;
&lt;li&gt;1 - if both of the corresponding bits are 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it returns 0 in all cases except when the corresponding bits of both parameters are 1.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Num&lt;/td&gt;
&lt;td&gt;Numeric value that should be AND&amp;#39;ed with value1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example: BitAnd(&amp;amp;HF, &amp;amp;HF7)&lt;/h3&gt;
&lt;p&gt;11110111 AND 00000111 = 00000111 so BitAnd returns 7, the binary value of 00000111.&lt;/p&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;h3&gt;Function: CBool(Expression)&lt;/h3&gt;
&lt;h2&gt;CBool&lt;/h2&gt;
&lt;p&gt;Description: &lt;code&gt;CBool&lt;/code&gt; returns a boolean based on the evaluated expression. If the expression evaluates to a non-zero value, then &lt;code&gt;CBool&lt;/code&gt; returns True, else it returns False.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;expression&lt;/td&gt;
&lt;td&gt;Any valid expression&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: &lt;code&gt;CBool([attribute1] = [attribute2])&lt;/code&gt;&lt;br&gt;Returns True if both attributes have the same value.&lt;/p&gt;
&lt;h2&gt;CDate&lt;/h2&gt;
&lt;p&gt;Function:&lt;br&gt;&lt;code&gt;CDate(expression)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description:&lt;br&gt;The CDate function returns a UTC DateTime from a string. DateTime isn&amp;#39;t a native attribute type but it can be used within date functions such as FormatDateTime and DateAdd.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Any valid string that represents a date/time. For supported formats, refer to .NET custom date and time format strings.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remarks:&lt;/h3&gt;
&lt;p&gt;The returned string is always in UTC and follows the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h3&gt;Example 1:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;CDate([StatusHireDate])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (StatusHireDate): &amp;quot;2020-03-16-07:00&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 2:&lt;/h2&gt;
&lt;p&gt;CDate(&amp;quot;2021-06-30+08:00&amp;quot;)
Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;2021-06-30+08:00&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;6/29/2021 4:00:00 PM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3:&lt;/h2&gt;
&lt;p&gt;CDate(&amp;quot;2009-06-15T01:45:30-07:00&amp;quot;)
Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;2009-06-15T01:45:30-07:00&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;6/15/2009 8:45:30 AM&amp;quot; &amp;lt;-- Note the UTC equivalent of the above DateTime is returned&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Coalesce&lt;/h2&gt;
&lt;h3&gt;Function: Coalesce(source1, source2, ..., defaultValue)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Returns the first source value that isn&amp;#39;t NULL. If all arguments are NULL and defaultValue is present, the defaultValue is returned. If all arguments are NULL and defaultValue isn&amp;#39;t present, Coalesce returns NULL.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source1 ... sourceN&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required, variable-number of times. Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when all source values are NULL. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Flow mail value if not NULL, otherwise flow userPrincipalName&lt;/p&gt;
&lt;h2&gt;Example:&lt;/h2&gt;
&lt;p&gt;You wish to flow the mail attribute if it is present. If it isn&amp;#39;t, you wish to flow the value of userPrincipalName instead.&lt;/p&gt;
&lt;h3&gt;Expression:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Coalesce([mail], [userPrincipalName])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): NULL&lt;/li&gt;
&lt;li&gt;INPUT (userPrincipalName): &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Doe@contoso.com&quot;&gt;John.Doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ConvertToBase64&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToBase64(source)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The ConvertToBase64 function converts a string to a Unicode base64 string.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to base 64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToBase64(&amp;quot;Hello world!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;SABIAGwAbABvACAAdwBvAHIAbABkACEA&amp;quot;&lt;/p&gt;
&lt;h2&gt;ConvertToUTF8Hex&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConvertToUTF8Hex(source)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The ConvertToUTF8Hex function converts a string to a UTF8 Hex encoded value.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be converted to UTF8 Hex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Example: ConvertToUTF8Hex(&amp;quot;Hello world!&amp;quot;)&lt;/h2&gt;
&lt;p&gt;Returns 48656C6C6F20776F726C6421&lt;/p&gt;
&lt;h2&gt;Count&lt;/h2&gt;
&lt;h3&gt;Function: Count(attribute)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Count function returns the number of elements in a multi-valued attribute &lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that will have elements counted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;CStr&lt;/h2&gt;
&lt;h3&gt;Function: CStr(value)&lt;/h3&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The CStr function converts a value to a string data type. &lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;numeric, reference, or boolean&lt;/td&gt;
&lt;td&gt;Can be a numeric value, reference attribute, or Boolean.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example: CStr([dn])&lt;/h3&gt;
&lt;p&gt;Returns &amp;quot;cn=Joe,dc=contoso,dc=com&amp;quot;&lt;/p&gt;
&lt;h2&gt;DateAdd&lt;/h2&gt;
&lt;h2&gt;Function:&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DateAdd(interval, value, dateTime)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Description:&lt;/h2&gt;
&lt;p&gt;Returns a date/time string representing a date to which a specified time interval has been added. The returned date is in the format: M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time you want to add. See accepted values below this table.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The number of units you want to add. It can be positive (to get dates in the future) or negative (to get dates in the past).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTime&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing date to which the interval is added.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yyyy&lt;/code&gt; Year&lt;/li&gt;
&lt;li&gt;&lt;code&gt;m&lt;/code&gt; Month&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt; Day&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ww&lt;/code&gt; Week&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h&lt;/code&gt; Hour&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt; Minute&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 1:&lt;/h3&gt;
&lt;p&gt;Generate a date value based on incoming StatusHireDate from Workday
&lt;code&gt;DateAdd(&amp;quot;d&amp;quot;, 7, CDate([StatusHireDate]))&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;th&gt;dateTime (value of variable StatusHireDate)&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/23/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;d&amp;quot;&lt;/td&gt;
&lt;td&gt;-10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/6/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;ww&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/30/2012 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;m&amp;quot;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;1/16/2013 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;yyyy&amp;quot;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;3/16/2014 7:00:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;DateDiff&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DateDiff(interval, date1, date2)&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;This function uses the &lt;code&gt;interval&lt;/code&gt; parameter to return a number that indicates the difference between the two input dates. It returns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a positive number if date2 &amp;gt; date1,&lt;/li&gt;
&lt;li&gt;a negative number if date2 &amp;lt; date1,&lt;/li&gt;
&lt;li&gt;0 if date2 == date1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;interval&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Interval of time to use for calculating the difference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;date2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;DateTime&lt;/td&gt;
&lt;td&gt;DateTime representing a valid date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;When passing a date string as input, use &lt;code&gt;CDate&lt;/code&gt; function to wrap the datetime string. To get system time in UTC, use the &lt;code&gt;Now&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;The interval string must have one of the following values:&lt;/p&gt;
&lt;h2&gt;Interval Legend&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;yyyy Year&lt;/li&gt;
&lt;li&gt;m Month&lt;/li&gt;
&lt;li&gt;d Day&lt;/li&gt;
&lt;li&gt;ww Week&lt;/li&gt;
&lt;li&gt;h Hour&lt;/li&gt;
&lt;li&gt;n Minute&lt;/li&gt;
&lt;li&gt;s Second&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 1: Compare current date with hire date from Workday with different intervals&lt;/h2&gt;
&lt;p&gt;DateDiff(&amp;quot;d&amp;quot;, Now(), CDate([StatusHireDate]))&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;interval&lt;/th&gt;
&lt;th&gt;date1&lt;/th&gt;
&lt;th&gt;date2&lt;/th&gt;
&lt;th&gt;output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-18+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-3449&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ww&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-493&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yyyy&lt;/td&gt;
&lt;td&gt;8/25/2021 5:41:18 PM&lt;/td&gt;
&lt;td&gt;2012-03-16-07:00&lt;/td&gt;
&lt;td&gt;-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;2021-08-31+08:00&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;1440&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;2021-08-24&lt;/td&gt;
&lt;td&gt;2021-08-25&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Example 2: Combine DateDiff with IIF function to set attribute value&lt;/h2&gt;
&lt;p&gt;If an account is Active in Workday, set the accountEnabled attribute of the user to True only if hire date is within the next five days.&lt;/p&gt;
&lt;h2&gt;DateFromNum&lt;/h2&gt;
&lt;h3&gt;Function: &lt;code&gt;DateFromNum(value)&lt;/code&gt;&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;DateFromNum&lt;/code&gt; function converts a value in AD&amp;#39;s date format to a DateTime type.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;AD Date to be converted to DateTime type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DateFromNum([lastLogonTimestamp])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DateFromNum(129699324000000000)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Returns a DateTime representing January 1, 2012 at 11:00PM.&lt;/p&gt;
&lt;h2&gt;FormatDateTime&lt;/h2&gt;
&lt;h3&gt;Function: &lt;code&gt;FormatDateTime(source, dateTimeStyles, inputFormat, outputFormat)&lt;/code&gt;&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Takes a date string from one format and converts it into a different format.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dateTimeStyles&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Use this parameter to specify the formatting options that customize string parsing for some date and time parsing methods. For supported values, see DateTimeStyles doc. If left empty, the default value used is&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Name&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DateTimeStyles.RoundtripKind&lt;/code&gt;,&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DateTimeStyles.AllowLeadingWhite&lt;/code&gt;,&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DateTimeStyles.AllowTrailingWhite&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;inputFormat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Required&lt;/li&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Expected format of the source value. For supported formats, see .NET custom date and time format strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;outputFormat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Required&lt;/li&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Format of the output date.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Output date as a string in a certain format&lt;/h3&gt;
&lt;p&gt;Example: You want to send dates to a SaaS application like ServiceNow in a certain format. You can consider using the following expression.&lt;/p&gt;
&lt;p&gt;Expression:
&lt;code&gt;FormatDateTime([extensionAttribute1], &amp;#39;yyyyMMddHHmmss.fZ&amp;#39;, &amp;#39;yyyy-MM-dd&amp;#39;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (&lt;code&gt;extensionAttribute1&lt;/code&gt;): &amp;quot;20150123105347.1Z&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;2015-01-23&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Guid&lt;/h2&gt;
&lt;p&gt;Function: &lt;code&gt;Guid()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description: The function Guid generates a new random GUID&lt;/p&gt;
&lt;p&gt;Example:
&lt;code&gt;Guid()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample output: &amp;quot;1088051a-cd4b-4288-84f8-e02042ca72bc&amp;quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;IgnoreFlowIfNullOrEmpty&lt;/h2&gt;
&lt;p&gt;Function: &lt;code&gt;IgnoreFlowIfNullOrEmpty(expression)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description: The IgnoreFlowIfNullOrEmpty function instructs the provisioning service to ignore the attribute and drop it from the flow if the enclosed function or attribute is NULL or empty.&lt;/p&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example 1: Don&amp;#39;t flow an attribute if it is null&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IgnoreFlowIfNullOrEmpty([department])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above expression will drop the department attribute from the provisioning flow if it is null or empty.&lt;/p&gt;
&lt;p&gt;Example 2: Don&amp;#39;t flow an attribute if the expression mapping evaluates to empty string or null
Let&amp;#39;s say the SuccessFactors attribute &lt;code&gt;prefix&lt;/code&gt; is mapped to the on-premises Active Directory attribute &lt;code&gt;personalTitle&lt;/code&gt; using the following expression mapping:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IgnoreFlowIfNullOrEmpty(Switch([prefix], &amp;quot;&amp;quot;, &amp;quot;3443&amp;quot;, &amp;quot;Dr. &amp;quot;, &amp;quot;3444&amp;quot;, &amp;quot;Prof.&amp;quot;, &amp;quot;3445&amp;quot;, &amp;quot;Prof. Dr.&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above expression first evaluates the &lt;code&gt;Switch&lt;/code&gt; function. If the &lt;code&gt;prefix&lt;/code&gt; attribute doesn&amp;#39;t have any of the values listed within the &lt;code&gt;Switch&lt;/code&gt; function, then &lt;code&gt;Switch&lt;/code&gt; will return an empty string and the attribute &lt;code&gt;personalTitle&lt;/code&gt; will not be included in the provisioning flow to on-premises Active Directory.&lt;/p&gt;
&lt;h2&gt;IIF&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; IIF(condition,valueIfTrue,valueIfFalse)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The IIF function returns one of a set of possible values based on a specified condition.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;condition&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or Expression&lt;/td&gt;
&lt;td&gt;Any value or expression that can be evaluated to true or false.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valueIfTrue&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;td&gt;If the condition evaluates to true, the returned value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Name&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;valueIfFalse&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Variable or String&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The following comparison operators can be used in the &lt;code&gt;condition&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Equal to &lt;code&gt;=&lt;/code&gt; and not equal to &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Greater than &lt;code&gt;&amp;gt;&lt;/code&gt; and greater than equal to &lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Less than &lt;code&gt;&amp;lt;&lt;/code&gt; and less than equal to &lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Set the target attribute value to source country attribute if country=&amp;quot;USA&amp;quot;, else set target attribute value to source department attribute.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;, [country], [department])
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Known limitations&lt;/h2&gt;
&lt;p&gt;This section includes limitations and workarounds for the IIF function. For information about troubleshooting user creation issues, see &lt;a href=&quot;#&quot;&gt;Creation fails due to null / empty values&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The IIF function currently doesn&amp;#39;t support AND and OR logical operators.&lt;/li&gt;
&lt;li&gt;To implement AND logic, use nested IIF statement chained along the &lt;code&gt;trueValue&lt;/code&gt; path. Example: If country=&amp;quot;USA&amp;quot; and state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;), &amp;quot;False&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;To implement OR logic, use nested IIF statement chained along the &lt;code&gt;falseValue&lt;/code&gt; path. Example: If country=&amp;quot;USA&amp;quot; or state=&amp;quot;CA&amp;quot;, return value &amp;quot;True&amp;quot;, else return &amp;quot;False&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;IIF([country]=&amp;quot;USA&amp;quot;, &amp;quot;True&amp;quot;, IIF([state]=&amp;quot;CA&amp;quot;, &amp;quot;True&amp;quot;, &amp;quot;False&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;If the source attribute used within the IIF function is empty or null, the condition check fails.&lt;ul&gt;
&lt;li&gt;Unsupported IIF expression examples:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;IIF([country]=&amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;, [country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF(IsNullOrEmpty([country]), &amp;quot;Other&amp;quot;, [country])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IIF(IsPresent([country]), [country], &amp;quot;Other&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Recommended workaround: Use the Switch function to check for empty/null values. Example: If country attribute is empty, set value &amp;quot;Other&amp;quot;. If it is present, pass the country attribute value to target attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Switch([country], [country], &amp;quot;&amp;quot;, &amp;quot;Other&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;InStr&lt;/h2&gt;
&lt;h2&gt;Function: InStr(value1, value2, start, compareType)&lt;/h2&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The InStr function finds the first occurrence of a substring in a string&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value1&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value2&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String to be found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Starting position to find the substring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compareType&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;Can be vbTextCompare or vbBinaryCompare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;InStr(&amp;quot;The quick brown fox&amp;quot;, &amp;quot;quick&amp;quot;)&lt;/code&gt;&lt;br&gt;Evaluates to 5&lt;/p&gt;
&lt;p&gt;&lt;code&gt;InStr(&amp;quot;repeated&amp;quot;, &amp;quot;e&amp;quot;, 3, vbBinaryCompare)&lt;/code&gt;&lt;br&gt;Evaluates to 7&lt;/p&gt;
&lt;h2&gt;IsNull&lt;/h2&gt;
&lt;h3&gt;Function: IsNull(Expression)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;If the expression evaluates to Null, then the IsNull function returns true. For an attribute, a Null is expressed by the absence of the attribute.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;IsNull([displayName])&lt;/code&gt;&lt;br&gt;Returns True if the attribute isn&amp;#39;t present.&lt;/p&gt;
&lt;h2&gt;IsNullOrEmpty&lt;/h2&gt;
&lt;h2&gt;Function: IsNullOrEmpty(Expression)&lt;/h2&gt;
&lt;p&gt;Description: If the expression is null or an empty string, then the IsNullOrEmpty function returns true. For an attribute, this would evaluate to True if the attribute is absent or is present but is an empty string. The inverse of this function is named IsPresent.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: IsNullOrEmpty( [displayName])&lt;/p&gt;
&lt;p&gt;Returns True if the attribute isn&amp;#39;t present or is an empty string.&lt;/p&gt;
&lt;h2&gt;IsPresent&lt;/h2&gt;
&lt;p&gt;Function: IsPresent(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression evaluates to a string that isn&amp;#39;t Null and isn&amp;#39;t empty, then the IsPresent function returns true. The inverse of this function is named IsNullOrEmpty.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Example: Switch(IsPresent([directManager]), [directManager], IsPresent([skiplevelManager]), [skiplevelManager], IsPresent([director]), [director])&lt;/p&gt;
&lt;h2&gt;IsString&lt;/h2&gt;
&lt;p&gt;Function: IsString(Expression)&lt;/p&gt;
&lt;p&gt;Description: If the expression can be evaluated to a string type, then the IsString function evaluates to True.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;h2&gt;Expression&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Expression to be evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Item&lt;/h2&gt;
&lt;h3&gt;Function: Item(attribute, index)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The Item function returns one item from a multi-valued string/attribute.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute to be searched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;index&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index to an item in the multi-valued string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Example:&lt;/h3&gt;
&lt;p&gt;Item( [proxyAddresses ], 1) returns the first item in the multi-valued attribute. Index 0 shouldn&amp;#39;t be used.&lt;/p&gt;
&lt;h2&gt;Join&lt;/h2&gt;
&lt;h3&gt;Function: Join(separator, source1, source2, ...)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Join() is similar to Append(), except that it can combine multiple source string values into a single string, and each value will be separated by a separator string.&lt;/p&gt;
&lt;p&gt;If one of the source values is a multi-value attribute, then every value in that attribute will be joined together, separated by the separator value.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;separator&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;String used to separate source values when they are concatenated into one string. Can be &amp;quot;&amp;quot; if no separator is required.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Left&lt;/h2&gt;
&lt;h3&gt;Function: Left(String, NumChars)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The Left function returns a specified number of characters from the left of a string. If numChars = 0, return empty string. If numChars &amp;lt; 0, return input string. If string is null, return empty string. If string contains fewer characters than the number specified in numChars, a string identical to string (that is, containing all characters in parameter 1) is returned.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Attribute&lt;/td&gt;
&lt;td&gt;The string to return characters from&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumChars&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;A number identifying the number of characters to return from the beginning (left) of string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Left(&amp;quot;John Doe&amp;quot;, 3)&lt;/p&gt;
&lt;p&gt;Returns &amp;quot;Joh&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Mid&lt;/h2&gt;
&lt;h3&gt;Function: Mid(source, start, length)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Returns a substring of the source value. A substring is a string that contains only some of the characters from the source string.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[Expand table]&lt;/p&gt;
&lt;h2&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Index in the source string where substring should start. First character in the string has an index of 1, second character has an index 2, and so on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Length of the substring. If length ends outside the source string, function returns substring from start index until end of source string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;NormalizeDiacritics&lt;/h2&gt;
&lt;h3&gt;Function: NormalizeDiacritics(source)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Requires one string argument. Returns the string, but with any diacritical characters replaced with equivalent nondiacritical characters. Typically used to convert first names and last names containing diacritical characters (accent marks) into legal values that can be used in various user identifiers such as user principal names, SAM account names, and email addresses.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually a first name or last name attribute.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Character with Diacritic and Normalized Characters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ä, à, â, ã, å, á, ą, ā, ă, ắ, ằ, ẳ, ẵ, ặ&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Ä, À, Â, Ã, Å, Á, Ą, Ā, Ă, Ắ, Ằ, Ẳ, Ẵ, Ặ&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;æ, ǽ&lt;/td&gt;
&lt;td&gt;ae&lt;/td&gt;
&lt;td&gt;Æ, Ǽ&lt;/td&gt;
&lt;td&gt;AE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ç, ĉ, ċ, č, ć&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Ç, Ĉ, Ċ, Č, Ć&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;đ, ď, d&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Đ, Ď, D&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ë, è, é, ê, ę, ě, ē, ẻ, ẽ, ẹ, ệ, e&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;Ë, È, É, Ê, Ę, Ě, Ē, Ẻ, Ẽ, Ẹ, Ệ, E&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Character with Diacritic and Normalized Character&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;th&gt;Character with Diacritic&lt;/th&gt;
&lt;th&gt;Normalized character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ğ, ğ, ğ&lt;/td&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;Ğ, Ğ, Ğ&lt;/td&gt;
&lt;td&gt;G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ï, î, ì, í, í&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;İ, İ, İ, İ, İ, İ&lt;/td&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ł, Ł, Ł&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Ł, Ł, Ł, Ł&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ñ, ń, ň, n̄&lt;/td&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Ñ, Ń, Ň, Ǹ, N&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ö, ö, ö, ő, õ, ô, ó, ō&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;Ö, Ò, Ő, Õ, Ô, Ó, Ō, Ó&lt;/td&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ø, œ&lt;/td&gt;
&lt;td&gt;oe&lt;/td&gt;
&lt;td&gt;Ø, Œ&lt;/td&gt;
&lt;td&gt;OE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ř, ř, ř&lt;/td&gt;
&lt;td&gt;r&lt;/td&gt;
&lt;td&gt;Ř, Ř, Ř&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ß&lt;/td&gt;
&lt;td&gt;ss&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ś, š, ś, ş&lt;/td&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Ś, Š, Ś, Ş&lt;/td&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ť, ť, ť&lt;/td&gt;
&lt;td&gt;t&lt;/td&gt;
&lt;td&gt;Ť, Ť, Ť&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ü, ù, û, ú, ů, ű, ū&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Ü, Ù, Û, Ú, Ů, Ű, Ū&lt;/td&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ÿ, ý, ý, ỳ&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Y, Ý, Ý, Ỳ&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ź, ž, ż&lt;/td&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;Ź, Ž, Ż&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Remove diacritics from a string&lt;/h2&gt;
&lt;p&gt;Example: Replace characters containing accent marks with equivalent characters that don&amp;#39;t contain accent marks.&lt;/p&gt;
&lt;h3&gt;Expression:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;NormalizeDiacritics([givenName])&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;Zoë&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Zoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Not&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Not(source)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;Flips the boolean value of the source. If source value is True, returns False. Otherwise, returns True.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Boolean String&lt;/td&gt;
&lt;td&gt;Expected source values are &amp;quot;True&amp;quot; or &amp;quot;False&amp;quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Now&lt;/h2&gt;
&lt;h3&gt;Function: Now()&lt;/h3&gt;
&lt;h4&gt;Description&lt;/h4&gt;
&lt;p&gt;The Now function returns a string representing the current UTC DateTime in the format M/d/yyyy h:mm:ss tt.&lt;/p&gt;
&lt;h5&gt;Example: Now ()&lt;/h5&gt;
&lt;p&gt;Example value returned 7/2/2021 3:33:38 PM&lt;/p&gt;
&lt;h2&gt;NumFromDate&lt;/h2&gt;
&lt;h3&gt;Function: NumFromDate(value)&lt;/h3&gt;
&lt;h4&gt;Description&lt;/h4&gt;
&lt;p&gt;The NumFromDate function converts a DateTime value to Active Directory format that is required to set attributes like accountExpires. Use this function to convert DateTime values received from cloud HR apps like Workday and SuccessFactors to their equivalent AD representation.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Date time string in ISO 8601 format. If the date variable is in a different format, use FormatDateTime function to convert the date to ISO 8601 format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h5&gt;Example:&lt;/h5&gt;
&lt;h2&gt;Workday example&lt;/h2&gt;
&lt;p&gt;Assuming you want to map the attribute &lt;code&gt;ContractEndDate&lt;/code&gt; from Workday, which is in the format &lt;code&gt;2020-12-31-08:00&lt;/code&gt; to &lt;code&gt;accountExpires&lt;/code&gt; field in AD, here&amp;#39;s how you can use this function and change the timezone offset to match your locale.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([ContractEndDate], &amp;quot;yyyy-MM-ddzzz&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SuccessFactors example&lt;/h2&gt;
&lt;p&gt;Assuming you want to map the attribute &lt;code&gt;endDate&lt;/code&gt; from SuccessFactors, which is in the format &lt;code&gt;M/d/yyyy hh:mm:ss tt&lt;/code&gt; to &lt;code&gt;accountExpires&lt;/code&gt; field in AD, here&amp;#39;s how you can use this function and change the time zone offset to match your locale.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NumFromDate(Join(&amp;quot;&amp;quot;, FormatDateTime([endDate], &amp;quot;M/d/yyyy hh:mm:ss tt&amp;quot;, &amp;quot;yyyy-MM-dd&amp;quot;), &amp;quot; 23:59:59-08:00&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PCase&lt;/h2&gt;
&lt;h3&gt;Function: PCase(source, wordSeparators)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;The PCase function converts the first character of each word in a string to upper case, and all other characters are converted to lower case.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Optional&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to convert to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wordSeparators&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify a set of characters that is used as word separators (example: &amp;quot; ,-&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remarks:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If the &lt;code&gt;wordSeparators&lt;/code&gt; parameter isn&amp;#39;t specified, then PCase internally invokes the .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; to convert the &lt;code&gt;source&lt;/code&gt; string to proper case. The .NET function &lt;code&gt;ToTitleCase&lt;/code&gt; supports a comprehensive set of the Unicode character categories as word separators.&lt;ul&gt;
&lt;li&gt;Space character&lt;/li&gt;
&lt;li&gt;New line character&lt;/li&gt;
&lt;li&gt;Control characters like CRLF&lt;/li&gt;
&lt;li&gt;Format control characters&lt;/li&gt;
&lt;li&gt;ConnectorPunctuation characters like underscore&lt;/li&gt;
&lt;li&gt;DashPunctuation characters like dash and hyphen (including characters such En Dash, Em Dash, double hyphen, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Punctuation and Symbols&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OpenPunctuation and ClosePunctuation characters that occur in pairs like parenthesis, curly bracket, angle bracket, etc.&lt;/li&gt;
&lt;li&gt;InitialQuotePunctuation and FinalQuotePunctuation characters like single quotes, double quotes and angular quotes.&lt;/li&gt;
&lt;li&gt;OtherPunctuation characters like exclamation mark, number sign, percent sign, ampersand, asterisk, comma, full stop, colon, semi-colon, etc.&lt;/li&gt;
&lt;li&gt;MathSymbol characters like plus sign, less-than and greater-than sign, vertical line, tilde, equals sign, etc.&lt;/li&gt;
&lt;li&gt;CurrencySymbol characters like dollar sign, cent sign, pound sign, euro sign, etc.&lt;/li&gt;
&lt;li&gt;ModifierSymbol characters like macron, accents, arrow heads, etc.&lt;/li&gt;
&lt;li&gt;OtherSymbol characters like copyright sign, degree sign, registered sign, etc.&lt;/li&gt;
&lt;li&gt;If the wordSeparators parameter is specified, then PCase only uses the characters specified as word separators.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example:&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s say you&amp;#39;re sourcing the attributes firstName and lastName from SAP SuccessFactors and in HR both these attributes are in upper-case. Using the PCase function, you can convert the name to proper case as shown below.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expression&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase([firstName])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;PABLO GONSALVES (SECOND)&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pablo Gonsalves (Second)&amp;quot;&lt;/td&gt;
&lt;td&gt;As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase([lastName],&amp;quot; &amp;#39; -&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;lastName = &amp;quot;PINTO-DE&amp;#39;SILVA&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Pinto-De&amp;#39;Silva&amp;quot;&lt;/td&gt;
&lt;td&gt;The PCase function uses characters in the wordSeparators parameter to identify words and transform them to proper case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PCase(Join(&amp;quot; &amp;quot;, [firstName], [lastName]))&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;firstName = &amp;quot;GREGORY, lastName = &amp;quot;JAMES&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Gregory James&amp;quot;&lt;/td&gt;
&lt;td&gt;You can nest the Join function within PCase. As the wordSeparators parameter isn&amp;#39;t specified, the PCase function uses the default word separators character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;RandomString&lt;/h2&gt;
&lt;p&gt;Function: RandomString(Length, MinimumNumbers, MinimumSpecialCharacters, MinimumCapital, MinimumLowerCase, CharactersToAvoid)&lt;/p&gt;
&lt;h2&gt;The RandomString function generates a random string based on the conditions specified. Characters allowed can be identified here.&lt;/h2&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Total length of the random string. This should be greater than or equal to the sum of MinimumNumbers, MinimumSpecialCharacters, and MinimumCapital. 256 characters max.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumNumbers&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum numbers in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumSpecialCharacters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of special characters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumCapital&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of capital letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinimumLowerCase&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Minimum number of lower case letters in the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CharactersToAvoid&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Characters to be excluded when generating the random string.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;Example 1:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Generate a random string without special character restrictions:
&lt;code&gt;RandomString(6,3,0,0,3)&lt;/code&gt; Generates a random string with 6 characters. The string contains 3 numbers and 3 lower case characters (1a73qt).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Example 2:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Generate a random string with special character restrictions:
&lt;code&gt;RandomString(10,2,2,2,1,&amp;quot; ?,&amp;quot;)&lt;/code&gt; Generates a random string with 10 characters. The string contains at least 2 numbers, 2 special characters, 2 capital letters, 1 lower case letter and excludes the characters &amp;quot;?&amp;quot; and &amp;quot;,&amp;quot; (1@!2BaRg53).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Redact&lt;/h2&gt;
&lt;h3&gt;Function: Redact()&lt;/h3&gt;
&lt;h4&gt;Description:&lt;/h4&gt;
&lt;p&gt;The Redact function replaces the attribute value with the string literal &amp;quot;[Redact]&amp;quot; in the provisioning logs.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;p&gt;(No parameters listed for the Redact function)&lt;/p&gt;
&lt;h2&gt;Table Content&lt;/h2&gt;
&lt;h3&gt;Redact&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; &lt;code&gt;Redact(attribute/value)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Specify the attribute or constant/string to redact from the logs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute/value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specify the attribute or constant / string to redact from the logs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Redact an attribute: &lt;code&gt;Redact([userPrincipalName])&lt;/code&gt; Removes the userPrincipalName from the provisioning logs.&lt;/li&gt;
&lt;li&gt;Redact a string: &lt;code&gt;Redact(&amp;quot;StringToBeRedacted&amp;quot;)&lt;/code&gt; Removes a constant string from the provisioning logs.&lt;/li&gt;
&lt;li&gt;Redact a random string: &lt;code&gt;Redact(RandomString(6,3,0,0,3))&lt;/code&gt; Removes the random string from the provisioning logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;RemoveDuplicates&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; &lt;code&gt;RemoveDuplicates(attribute)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The RemoveDuplicates function takes a multi-valued string and make sure each value is unique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parameters:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;attribute&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;Multi-valued attribute that has duplicates removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RemoveDuplicates([proxyAddresses])&lt;/code&gt; Returns a sanitized proxyAddress attribute where all duplicate values are removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Replace&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Function:&lt;/strong&gt; &lt;code&gt;Replace(source, oldValue, regexPattern, regexGroupName, replacementValue, replacementAttributeName, template)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Replaces values within a string in a case-sensitive manner. The function behaves differently depending on the parameters provided.&lt;/p&gt;
&lt;h2&gt;When oldValue and replacementValue are provided:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of oldValue in the source with replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When oldValue and template are provided:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Replaces all occurrences of the oldValue in the template with the source value&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When regexPattern and replacementValue are provided:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The function applies the regexPattern to the source string and you can use the regex group names to construct the string for replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note
To learn more about regex grouping constructs and named sub-expressions, see Grouping Constructs in Regular Expressions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;When regexPattern, regexGroupName, replacementValue are provided:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The function applies the regexPattern to the source string and replaces all values matching regexGroupName with replacementValue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When regexPattern, regexGroupName, replacementAttributeName are provided:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If source has a value, source is returned&lt;/li&gt;
&lt;li&gt;If source has no value, the function applies the regexPattern to the replacementAttributeName and returns the value matching regexGroupName&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Parameters:&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oldValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Value to be replaced in source or template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexPattern&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Regex pattern for the value to be replaced in source. When replacementAttributeName is used, the regexPattern is applied to extract a value from replacementAttributeName.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regexGroupName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the group inside regexPattern. When named replacementAttributeName is used, we&amp;#39;ll extract the value of the named regex group from the&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Attributes&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;replacementValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;New value to replace old one with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacementAttributeName&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Name of the attribute to be used for replacement value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;template&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;When template value is provided, we&amp;#39;ll look for oldValue inside the template and replace it with source value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace characters using a regular expression&lt;/h2&gt;
&lt;h3&gt;Example 1: Using oldValue and replacementValue to replace the entire source string with another string.&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s say your HR system has an attribute &lt;code&gt;BusinessTitle&lt;/code&gt;. As part of recent job title changes, your company wants to update anyone with the business title &amp;quot;Product Developer&amp;quot; to &amp;quot;Software Engineer&amp;quot;. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([BusinessTitle],&amp;quot;Product Developer&amp;quot;,,, &amp;quot;Software Engineer&amp;quot;,,)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [BusinessTitle]&lt;/li&gt;
&lt;li&gt;oldValue: &amp;quot;Product Developer&amp;quot;&lt;/li&gt;
&lt;li&gt;replacementValue: &amp;quot;Software Engineer&amp;quot;&lt;/li&gt;
&lt;li&gt;Expression output: Software Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example 2: Using oldValue and template to insert the source string into another templatized string.&lt;/h3&gt;
&lt;p&gt;The parameter oldValue is a misnomer in this scenario. It&amp;#39;s actually the value that gets replaced.
Let&amp;#39;s say you want to always generate login ID in the format &lt;username&gt;@contoso.com. There is a source attribute called UserID and you want that value to be used for the &lt;username&gt; portion of the login ID. Then in this case, you can use the following expression in your attribute mapping.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Replace([UserID],&amp;quot;&amp;lt;username&amp;gt;&amp;quot;,,,,&amp;quot;&amp;lt;username&amp;gt;@contoso.com&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;source: [UserID] = &amp;quot;jsmith&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 3: Using regexPattern and replacementValue to extract a portion of the source string and replace it with an empty string or a custom value built using regex patterns or regex group names.&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s say you have a source attribute &lt;code&gt;telephoneNumber&lt;/code&gt; that has components country code and phone number separated by a space character. For example, &lt;code&gt;+91 9998887777&lt;/code&gt;. Then in this case, you can use the following expression in your attribute mapping to extract the 10 digit phone number.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: &lt;code&gt;[telephoneNumber] = &amp;quot;+91 9998887777&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;regexPattern: &lt;code&gt;&amp;quot;\\+(?&amp;lt;isdCode&amp;gt;\\d*) (?&amp;lt;phoneNumber&amp;gt;\\d{10})&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;replacementValue: &lt;code&gt;&amp;quot;${phoneNumber}&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Expression output: &lt;code&gt;9998887777&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also use this pattern to remove characters and collapse a string. For example, the expression below removes parenthesis, dashes and space characters in the mobile number string and returns only digits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: &lt;code&gt;[mobile] = &amp;quot;+1 (999) 888-7777&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;regexPattern: &lt;code&gt;&amp;quot;[()\\s-]+&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;replacementValue: &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; (empty string)&lt;/li&gt;
&lt;li&gt;Expression output: &lt;code&gt;19998887777&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example 4: Using regexPattern, regexGroupName and replacementValue to extract a portion of the source string and replace it with another literal value or empty string.&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s say your source system has an attribute AddressLineData with two components street number and street name. As part of a recent move, let&amp;#39;s say the street number of the address changed, and you want to update only the street number portion of the address line. Then in this case, you can use the following expression in your attribute mapping to extract the street number.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;source: &lt;code&gt;[AddressLineData] = &amp;quot;545 Tremont Street&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Regex Examples&lt;/h2&gt;
&lt;h3&gt;Example 4: Replace street number with a specific value.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;regexPattern: &amp;quot;^(?&amp;lt;streetNumber&amp;gt;\d*)&amp;quot;
regexGroupName: &amp;quot;streetNumber&amp;quot;
replacementValue: &amp;quot;888&amp;quot;
Expression output: 888 Tremont Street
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example 5: Remove domain suffix from UPN.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Replace([userPrincipalName], &amp;quot;(?&amp;lt;Suffix&amp;gt;@(.*)*)&amp;quot;, &amp;quot;Suffix&amp;quot;, &amp;quot;&amp;quot;, )
source: [userPrincipalName] = &amp;quot;jsmith@contoso.com&amp;quot;
regexPattern: &amp;quot;(?&amp;lt;Suffix&amp;gt;@(.*)*)&amp;quot;
regexGroupName: &amp;quot;Suffix&amp;quot;
replacementValue: &amp;quot;&amp;quot;
Expression output: jsmith
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example 6: Handle empty source attribute.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Replace([telephoneNumber], &amp;quot;\+(?&amp;lt;isdCode&amp;gt;\d*) (?&amp;lt;phoneNumber&amp;gt;\d{10})&amp;quot;, &amp;quot;phoneNumber&amp;quot;, , [mobile], )
source: [telephoneNumber] = &amp;quot;&amp;quot;
regexPattern: &amp;quot;\+(?&amp;lt;isdCode&amp;gt;\d*) (?&amp;lt;phoneNumber&amp;gt;\d{10})&amp;quot;
regexGroupName: &amp;quot;phoneNumber&amp;quot;
replacementAttributeName: [mobile] = &amp;quot;+91 8887779999&amp;quot;
Expression output: 8887779999
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example 7: Remove regex-matched characters.&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Replace([mailNickname], &amp;quot;[a-zA-Z_]*&amp;quot;, , &amp;quot;&amp;quot;, )
source [mailNickname]
oldValue: &amp;quot;john_doe72&amp;quot;
replaceValue: &amp;quot;&amp;quot;
Expression output: 72
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SelectUniqueValue&lt;/h2&gt;
&lt;h3&gt;Function&lt;/h3&gt;
&lt;p&gt;SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, ...)&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed, and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This function must be at the top-level and cannot be nested.&lt;/li&gt;
&lt;li&gt;This function cannot be applied to attributes that have a matching precedence.&lt;/li&gt;
&lt;li&gt;This function is only meant to be used for entry creations. When using it with an attribute, set the Apply Mapping property to Only during object creation.&lt;/li&gt;
&lt;li&gt;This function is currently only supported for &amp;quot;Workday to Active Directory User Provisioning&amp;quot; and &amp;quot;SuccessFactors to Active Directory User Provisioning&amp;quot;. It cannot be used with other provisioning applications.&lt;/li&gt;
&lt;li&gt;The LDAP search that SelectUniqueValue function performs in on-premises Active Directory doesn&amp;#39;t escape special characters like diacritics. If you pass a string like &amp;quot;Jéssica Smith&amp;quot; that contains a special character, you will encounter processing errors. Nest the NormalizeDiacritics function as shown in the example below to normalize special characters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;uniqueValueRule1 ... uniqueValueRuleN&lt;/td&gt;
&lt;td&gt;At least 2 are required, no upper bound&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;List of unique value generation rules to evaluate.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Generate unique value for userPrincipalName (UPN) attribute&lt;/h3&gt;
&lt;p&gt;Example: Based on the user&amp;#39;s first name, middle name and last name, you need to generate a value for the UPN attribute and check for its uniqueness in the target AD directory before assigning the value to the UPN attribute.&lt;/p&gt;
&lt;h3&gt;Expression&lt;/h3&gt;
&lt;p&gt;ad-attr-mapping-expr&lt;/p&gt;
&lt;h2&gt;SelectUniqueValue Function&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;SelectUniqueValue(
  Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
  Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    Mid([PreferredFirstName], 1, 1), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;),
  Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;,
    Mid([PreferredFirstName], 1, 2), [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;)
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; doesn&amp;#39;t already exist in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:J.Smith@contoso.com&quot;&gt;J.Smith@contoso.com&lt;/a&gt;&amp;quot; if UPN value of &lt;a href=&quot;mailto:John.Smith@contoso.com&quot;&gt;John.Smith@contoso.com&lt;/a&gt; already exists in the directory&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:Jo.Smith@contoso.com&quot;&gt;Jo.Smith@contoso.com&lt;/a&gt;&amp;quot; if the above two UPN values already exist in the directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SingleAppRoleAssignment&lt;/h2&gt;
&lt;h3&gt;Function: SingleAppRoleAssignment([appRoleAssignments])&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Returns a single appRoleAssignment from the list of all appRoleAssignments assigned to a user for a given application. This function is required to convert the appRoleAssignments object into a single role name string. The best practice is to ensure only one appRoleAssignment is assigned to one user at a time. This function isn&amp;#39;t supported in scenarios where users have multiple app role assignments.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;[appRoleAssignments]&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;[appRoleAssignments] object.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Split&lt;/h2&gt;
&lt;h3&gt;Function: Split(source, delimiter)&lt;/h3&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;Splits a string into a multi-valued array, using the specified delimiter character.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiter&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Specifies the character that will be used to split the string (example: &amp;quot;,&amp;quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Split a string into a multi-valued array&lt;/h3&gt;
&lt;p&gt;Example: You need to take a comma-delimited list of strings, and split them into an array that can be plugged into a multi-value attribute like Salesforce&amp;#39;s PermissionSets attribute. In this example, a list of permission sets has been populated in extensionAttribute5 in Microsoft Entra ID.&lt;/p&gt;
&lt;p&gt;Expression: Split([extensionAttribute5], &amp;quot;,&amp;quot;)&lt;/p&gt;
&lt;h4&gt;Sample input/output&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (extensionAttribute5): &amp;quot;PermissionSetOne, PermissionSetTwo&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: [&amp;quot;PermissionSetOne&amp;quot;, &amp;quot;PermissionSetTwo&amp;quot;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;StripSpaces&lt;/h2&gt;
&lt;p&gt;Function: StripSpaces(source)&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Removes all space (&amp;quot; &amp;quot;) characters from the source string.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Switch&lt;/h2&gt;
&lt;h3&gt;Function:&lt;/h3&gt;
&lt;p&gt;Switch(source, defaultValue, key1, value1, key2, value2, ... )&lt;/p&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;When source value matches a key, returns value for that key. If source value doesn&amp;#39;t match any keys, returns defaultValue. Key and value parameters must always come in pairs. The function always expects an even number of parameters. The function shouldn&amp;#39;t be used for referential attributes such as manager.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;p&gt;Switch function performs a case-sensitive string comparison of the source and key values. If you&amp;#39;d like to perform a case-insensitive comparison, normalize the source string before comparison using a nested ToLower function and ensure that all key strings use lowercase. Example: &lt;code&gt;Switch(ToLower([statusFlag]), &amp;quot;0&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, the source attribute statusFlag may have values (&amp;quot;True&amp;quot; / &amp;quot;true&amp;quot; / &amp;quot;TRUE&amp;quot;). However, the Switch function will always convert it to lowercase string &amp;quot;true&amp;quot; before comparison with key parameters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Caution&lt;/p&gt;
&lt;p&gt;For the source parameter, do not use the nested functions IsPresent, IsNull or IsNullOrEmpty. Instead use a literal empty string as one of the key values. 
Example: &lt;code&gt;Switch([statusFlag], &amp;quot;Default Value&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;0&amp;quot;)&lt;/code&gt;. In this example, if the source attribute statusFlag is empty, the Switch function will return the value 0.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Source value to update.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defaultValue&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Default value to be used when source doesn&amp;#39;t match any keys. Can be empty string (&amp;quot;&amp;quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;key&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Key to compare source value with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;value&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Replacement value for the source matching the key.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Replace a value based on predefined set of options&lt;/h2&gt;
&lt;p&gt;Example: Define the time zone of the user based on the state code stored in Microsoft Entra ID. If the state code doesn&amp;#39;t match any of the predefined options, use default value of &amp;quot;Australia/Sydney&amp;quot;.&lt;/p&gt;
&lt;p&gt;Expression: &lt;code&gt;Switch([state], &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;NSW&amp;quot;, &amp;quot;Australia/Sydney&amp;quot;, &amp;quot;QLD&amp;quot;, &amp;quot;Australia/Brisbane&amp;quot;, &amp;quot;SA&amp;quot;, &amp;quot;Australia/Adelaide&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sample input/output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (state): &amp;quot;QLD&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Australia/Brisbane&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ToLower&lt;/h2&gt;
&lt;p&gt;Function: &lt;code&gt;ToLower(source, culture)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Description: Takes a source string value and converts it to lower case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to lower case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;p&gt;Parameters:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/ Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Convert generated userPrincipalName (UPN) value to lower case&lt;/p&gt;
&lt;h2&gt;Example: Generating UPN Value&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ToLower(Join(&amp;quot;@&amp;quot;, NormalizeDiacritics(StripSpaces(Join(&amp;quot;.&amp;quot;, [PreferredFirstName], [PreferredLastName]))), &amp;quot;contoso.com&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (PreferredFirstName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (PreferredLastName): &amp;quot;Smith&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;&lt;a href=&quot;mailto:john.smith@contoso.com&quot;&gt;john.smith@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ToUpper&lt;/h2&gt;
&lt;h3&gt;Function: ToUpper(source, culture)&lt;/h3&gt;
&lt;h3&gt;Description:&lt;/h3&gt;
&lt;p&gt;Takes a source string value and converts it to upper case using the culture rules that are specified. If there is no culture info specified, then it will use Invariant culture.&lt;/p&gt;
&lt;p&gt;If you would like to set existing values in the target system to upper case, update the schema for your target application and set the property caseExact to &amp;#39;true&amp;#39; for the attribute that you&amp;#39;re interested in.&lt;/p&gt;
&lt;h3&gt;Parameters:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;source&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Usually name of the attribute from the source object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;culture&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The format for the culture name based on RFC 4646 is languagecode2-country/regioncode2, where languagecode2 is the two-letter language code and country/regioncode2 is the two-letter subculture code. Examples include ja-JP for Japanese (Japan) and en-US for English (United States). In cases where a two-letter language code isn&amp;#39;t available, a three-letter code derived from ISO 639-2 is used.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Word&lt;/h2&gt;
&lt;h2&gt;Function: Word(String,WordNumber,Delimiters)&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;The Word function returns a word contained within a string, based on parameters describing the delimiters to use and the word number to return. Each string of characters in string separated by the one of the characters in delimiters are identified as words:&lt;/p&gt;
&lt;p&gt;If number &amp;lt; 1, returns empty string. If string is null, returns empty string. If string contains less than number words, or string doesn&amp;#39;t contain any words identified by delimiters, an empty string is returned.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required/Repeating&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Multi-valued Attribute&lt;/td&gt;
&lt;td&gt;String to return a word from.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordNumber&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;Number identifying which word number should return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delimiters&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;A string representing the delimiter(s) that should be used to identify words&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Word(&amp;quot;The quick brown fox&amp;quot;, 3, &amp;quot; &amp;quot;)&lt;/code&gt;&lt;br&gt;Returns &amp;quot;brown&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Word(&amp;quot;This, string! has&amp;amp;many separators&amp;quot;, 3, &amp;quot;, ! &amp;amp;&amp;quot;)&lt;/code&gt;&lt;br&gt;Returns &amp;quot;has&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;This section provides more expression function usage examples.&lt;/p&gt;
&lt;h3&gt;Strip known domain name&lt;/h3&gt;
&lt;p&gt;Strip a known domain name from a user&amp;#39;s email to obtain a user name. For example, if the domain is &amp;quot;contoso.com&amp;quot;, then you could use the following expression:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Expression: Replace([mail], &amp;quot;@contoso.com&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Sample input / output&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (mail): &amp;quot;&lt;a href=&quot;mailto:john.doe@contoso.com&quot;&gt;john.doe@contoso.com&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;john.doe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate user alias by concatenating parts of first and last name&lt;/h2&gt;
&lt;p&gt;Generate a user alias by taking first three letters of user&amp;#39;s first name and first five letters of user&amp;#39;s last name.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Expression: Append(Mid([givenName], 1, 3), Mid([surname], 1, 5))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;JohDoe&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Add a comma between last name and first name&lt;/h2&gt;
&lt;p&gt;Add a comma between last name and first name.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Expression: Join(&amp;quot;, &amp;quot;, &amp;quot;&amp;quot;, [surname], [givenName])
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT (givenName): &amp;quot;John&amp;quot;&lt;/li&gt;
&lt;li&gt;INPUT (surname): &amp;quot;Doe&amp;quot;&lt;/li&gt;
&lt;li&gt;OUTPUT: &amp;quot;Doe, John&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generate an ID for a user based on their Microsoft Entra ID object ID. Remove any letters from the ID and add 1000 at the beginning&lt;/h2&gt;
&lt;p&gt;This expression allows you to generate an identifier for a user that starts with 1000 and is likely to be unique.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Expression: Join(&amp;quot;&amp;quot;, 1000, Replace(ConvertToUTF8Hex([objectId]), &amp;quot;[a-zA-Z_]*&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, ))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sample input/output&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;INPUT: &amp;quot;d05e47b1-3909-445a-ba5e-ca60cbc0e4b4&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;OUTPUT:&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;100064303565343762312333930392343435612626135652636136306362633065346234&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Related Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automate User Provisioning/Deprovisioning to SaaS Apps&lt;/li&gt;
&lt;li&gt;Customizing Attribute Mappings for User Provisioning&lt;/li&gt;
&lt;li&gt;Scoping Filters for User Provisioning&lt;/li&gt;
&lt;li&gt;Using SCIM to enable automatic provisioning of users and groups from Microsoft Entra ID to applications&lt;/li&gt;
&lt;li&gt;Account Provisioning Notifications&lt;/li&gt;
&lt;li&gt;List of Tutorials on How to Integrate SaaS Apps&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>CopilotStudioThoughts</title><link>https://www.elumenotion.com/journal/copilotstudiothoughts/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/copilotstudiothoughts/</guid><pubDate>Sat, 02 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;Building Good Chatbots Part One, No-Code with Microsoft Copilot Studio and Azure AI Studio&lt;/h1&gt;
&lt;hr&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;November 2023 was a big month for changes in the generative AI space with new products from OpenAI and Microsoft making it easier than ever for regular people to make useful AI solutions without traditional software development. Among these is &lt;strong&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/copilot/microsoft-copilot-studio&quot;&gt;Microsoft Copilot Studio&lt;/a&gt;&lt;/strong&gt; which (unlike many other branded Copilot products that are only available to large accounts until sometime in 2024) is &lt;strong&gt;now available for most M365 subscribers&lt;/strong&gt;.  I’ve had clients and associates use it already and this post began as tips on using Copilot Studio most effectively, pitfalls, and how to deal with them. &lt;br/&gt;&lt;br&gt;I expect Microsoft Copilot Studio to open the floodgates for AI in companies that use M365 even if they never buy the $30/month licenses. I also think that many will choose Copilot Studio as a &lt;strong&gt;component of larger enterprise systems&lt;/strong&gt; that marry the best of no-code with traditional software systems both legacy and new. A key word here is &lt;em&gt;component&lt;/em&gt; because, in my opinion, &lt;strong&gt;you can’t build a great chatbot with it all by itself&lt;/strong&gt; just yet. If you use it by itself, you will find you get a ‘sort of good but not really’ result most of the time. This article will clearly demonstrate why this is so and things you can do to get the best possible quality today.&lt;br/&gt;&lt;br&gt;Today is December 1, 2023. I fully expect Microsoft to improve on the current state. This is not intended to be an enduring opinion piece about Copilot Studio and it isn’t any kind tutorial. There are no step-by-step instructions because, as I finished making examples for the first draft, I realized that what I was really doing was explaining how to make a good chatbot that works with your documents generally using a no-code approach with Copilot Studio, but I was also comparing it to another no-code option, &lt;strong&gt;Azure AI Studio&lt;/strong&gt;, and also using traditional code and services to illustrate the details the Copilot Studio hides from you by default. And so, &lt;strong&gt;this post is the first in a multi-part mélange of general advice that applies equally to cloud-based systems using the biggest and most expensive models to private systems using models you can run yourself such as Llama-2 in user interfaces far from Microsoft land.&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;This part covers the subject of chatbots generally starting with important background information and terminology about &lt;em&gt;models&lt;/em&gt;, &lt;em&gt;chatbots&lt;/em&gt;, &lt;em&gt;prompts&lt;/em&gt;, &lt;em&gt;hallucinations&lt;/em&gt;, &lt;em&gt;fine-tuning&lt;/em&gt;, &lt;em&gt;retrieval augmented generation&lt;/em&gt; and &lt;em&gt;context windows&lt;/em&gt; before jumping into Copilot Studio. From there it explains what you can do in Copilot Studio, where and why it falls short in its current state with some tips for getting the best results, and some alternative options available in Azure and elsewhere which (at the moment) I generally recommend instead. Along the way you will learn about a some of the options Copilot Studio offers for retrieval, different types of search including &lt;em&gt;keyword queries&lt;/em&gt;, &lt;em&gt;sematic search&lt;/em&gt;, and &lt;em&gt;vector search&lt;/em&gt;. &lt;br/&gt;&lt;br&gt;The next part will cover complementary and alternative code-based technologies including &lt;em&gt;embeddings&lt;/em&gt;, &lt;em&gt;Azure AI Search&lt;/em&gt;, &lt;em&gt;Qdrant vector database&lt;/em&gt;, &lt;em&gt;Semantic Kernel&lt;/em&gt;, and &lt;em&gt;Kernel Memory&lt;/em&gt;. Subsequent parts will cover GPTs, the assistants API, and plugins before I wrap up the series by leaving the Open AI and Microsoft behind and get into private AI with alternative language and embeddings models.&lt;br/&gt;&lt;br&gt;This one is intended for a general audience but has some juicy details. I am doing my best to keep it from being too technical, but there is some technical content interspersed throughout. If you find it confusing, don’t worry about it, please just skip it and keep reading!  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Part One - Important concepts&lt;/h2&gt;
&lt;p&gt;If you already understand retrieval augmented generation (RAG), this section won’t be that interesting and you can skip it. Otherwise, keep reading!  &lt;/p&gt;
&lt;h3&gt;Models versus copilots and chatbots&lt;/h3&gt;
&lt;p&gt;The terms model and chatbot are sometimes used interchangeably, but they aren’t the same thing. A chatbot is a system that usually includes one or models to do its work. Aside from models, a typical chatbot system contains a user interface, services and databases. Considering this, Copilot Studio is an appealing option for people who aren’t developers or data scientists to unlock the power of large language models for useful applications.  In the rest of this article &lt;em&gt;copilot&lt;/em&gt; and &lt;em&gt;chatbot&lt;/em&gt; are synonymous but &lt;em&gt;model&lt;/em&gt; specifically and only means model.&lt;br/&gt;&lt;br&gt;Examples of chatbots include:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT&lt;/li&gt;
&lt;li&gt;Microsoft Copilot&lt;/li&gt;
&lt;li&gt;Google Bard&lt;/li&gt;
&lt;li&gt;Things you make with Microsoft Copilot Studio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples of models include:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPT-35-Turbo&lt;/li&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Meta Llama 2&lt;/li&gt;
&lt;li&gt;Falcon-180b&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an important distinction which will become clearer as we go.  &lt;/p&gt;
&lt;h3&gt;Chatting with your data&lt;/h3&gt;
&lt;p&gt;You may recall that people were very impressed when OpenAI released ChatGPT on November 30, 2023 . Collectively we spent the next several months trying to understand its use, dangers, and limitations. One of these limitations is the tendency to tell convincing falsehoods or what we call &lt;em&gt;hallucinations&lt;/em&gt;. &lt;br/&gt;&lt;br&gt;A hallucination is when a chatbots generates incorrect, irrelevant, or nonsensical responses. This phenomenon can be attributed to various factors:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Training Data Limitations: Language models are trained on large datasets, but these datasets might not cover all possible scenarios or questions. When faced with unfamiliar topics, the chatbot may generate irrelevant or incorrect responses.&lt;/li&gt;
&lt;li&gt;Model Constraints: The design and complexity of the underlying model also play a role. Some models might not be sophisticated enough to handle complex or nuanced queries effectively.&lt;/li&gt;
&lt;li&gt;Contextual Misinterpretation: Chatbots might misunderstand or lose track of the conversation context, leading to responses that don&amp;#39;t align with the current discussion.&lt;/li&gt;
&lt;li&gt;Overgeneralization: AI models can sometimes make broad generalizations based on their training, leading to responses that are technically correct but contextually inappropriate.&lt;/li&gt;
&lt;li&gt;Bias in Training Data: If the training data contains biases, the chatbot might replicate these biases in its responses, leading to inaccurate or inappropriate content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note that some of these causes are related to the model which is trained on a dataset and others are blamed on the chatbot which keeps track of the conversation&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;Simply put &lt;strong&gt;a model hallucinates when it doesn’t know the answer&lt;/strong&gt;. We can improve things by including instructions in the prompt such as: “If you don’t know the answer to my question, say I don’t know instead of inventing an answer.”   &lt;/p&gt;
&lt;h3&gt;Solving hallucinations with fine-tuning&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Fine-tuning&lt;/em&gt; is a process where you take an existing model and train it on new data to make a new model. There is a large ecosystem around fine-tuning, especially for private AI applications using models like Meta Llama 2. People fine-tune models to add specialized knowledge or skills, but also to change a model’s personality and style. For some, the ultimate goal is to make models that are ever smaller and more capable to enable good AI on commodity and even local hardware.&lt;br/&gt;&lt;br&gt;To get an idea of the scale of these efforts &lt;a href=&quot;https://huggingface.co/TheBloke&quot;&gt;check out the page of Tom Jobbins, TheBloke, on Hugging Face&lt;/a&gt;. He provides a great service to the community by shrinking, &lt;em&gt;quantizing&lt;/em&gt;, models to work on less expensive hardware. Currently there are over 2,500 language models on his page alone. They were created by large organizations and individual researchers and collectively have a few million downloads.&lt;br&gt;Fine-tuning is a powerful approach to many problems, but it isn’t necessarily a good approach to “chat with your data” problems insofar as it is time consuming, expensive, and the result is a static model. If the facts or data change, you must repeat the process. An alternative and more common approach to solving hallucinations is with &lt;em&gt;prompt engineering&lt;/em&gt; and &lt;em&gt;retrieval augmented generation&lt;/em&gt;.  &lt;/p&gt;
&lt;h3&gt;Prompt engineering&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;prompt&lt;/strong&gt; is a message sent to the model to generate a response which completes the prompt. Models are static, unchanging and have no memory of previous questions, answers or conversations. If you’ve heard the term &lt;em&gt;prompt engineering&lt;/em&gt; in context of ChatGPT it refers to writing a good prompt in the ChatGPT UI, but in context of chatbot systems it refers to all the things the chatbot system is doing to build the &lt;strong&gt;real&lt;/strong&gt; prompt sent to the model. When you enter your message and hit send, the chatbot system makes a new prompt that consists of your message, instructions to the system, the previous messages in the conversation, and &lt;strong&gt;whatever other facts or instructions the creator of the chatbot thinks is necessary to get a good response&lt;/strong&gt;. In fact, the chatbot might even use the model to completely rewrite your question before sending the prompt to the model. Generally, all this work is hidden from you and all you see is the answer… which might be a hallucination. &lt;br/&gt;&lt;br&gt;In this context, prompt engineering also involves managing the size of the prompts to fit the model’s &lt;em&gt;context window&lt;/em&gt;.  &lt;/p&gt;
&lt;h3&gt;Solving hallucinations with Retrieval augmented generation (RAG)&lt;/h3&gt;
&lt;p&gt;A RAG system is a type of chatbot that combines search, prompt engineering, and a model to &lt;em&gt;ground&lt;/em&gt; the response in a set of facts provided on the fly. Simply put &lt;strong&gt;RAG works by putting the facts required to answer the question into the prompt along with the question&lt;/strong&gt;. Here is an example prompt from the &lt;a href=&quot;https://learn.microsoft.com/en-us/semantic-kernel/overview/&quot;&gt;most excellent Semantic Kernel project&lt;/a&gt;!  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Answer questions only when you know the facts or the information is provided.  
When you don&amp;#39;t have sufficient information you reply with a list of commands to find the information needed.  
When answering multiple questions, use a bullet point list.  
Note: make sure single and double quotes are escaped using a backslash char.  
[COMMANDS AVAILABLE]  
- bing.search  
[INFORMATION PROVIDED]  
{{ $externalInformation }}  
[EXAMPLE 1]  
Question: what&amp;#39;s the biggest lake in Italy?  
Answer: Lake Garda, also known as Lago di Garda.  
[EXAMPLE 2]  
Question: what&amp;#39;s the biggest lake in Italy? What&amp;#39;s the smallest positive number?  
Answer:  
* Lake Garda, also known as Lago di Garda.  
* The smallest positive number is 1.  
[EXAMPLE 3]  
Question: what&amp;#39;s Ferrari stock price? Who is the current number one female tennis player in the world?  
Answer:  
{{ &amp;#39;{{&amp;#39; }} bing.search &amp;quot;&amp;quot;what\\&amp;#39;s Ferrari stock price?&amp;quot;&amp;quot; {{ &amp;#39;}}&amp;#39; }}.  
{{ &amp;#39;{{&amp;#39; }} bing.search &amp;quot;&amp;quot;Who is the current number one female tennis player in the world?&amp;quot;&amp;quot; {{ &amp;#39;}}&amp;#39; }}.  
[END OF EXAMPLES]  
[TASK]  
Question: {{ $input }}.  
Answer:   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The prompt has several placeholders which the chatbot replaces with appropriate content to try to answer the question. This one…  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{ $externalInformation }}  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…is replaced with whatever &lt;strong&gt;content&lt;/strong&gt; is &lt;strong&gt;retrieved&lt;/strong&gt; from search to &lt;strong&gt;augment&lt;/strong&gt; the &lt;strong&gt;generation&lt;/strong&gt; of the answer. &lt;br/&gt;&lt;br&gt;This part…  &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Answer questions only when you know the facts or the information is provided.  
When you don&amp;#39;t have sufficient information you reply with a list of commands to find the information needed.  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…ensures that the answer is &lt;strong&gt;grounded&lt;/strong&gt; in the things the chatbot knows and the information provided and (hopefully) prevents hallucinations.   &lt;/p&gt;
&lt;p&gt;Grounding the answer in the retrieved data can almost completely remove some kinds of hallucinations from a chatbot because you can easily respond with “I don’t know” or “Information not found” if the retrieval doesn’t find any matches for the request when it does the search. This is an equally effective way to censor the chatbot because, as the chatbot creator, you can use this to prevent the chatbot from talking about any subject that isn’t in the search index.&lt;br&gt;On the other hand, even with RAG hallucinations can still occur due various reasons including:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incorrect Retrieval: Retrieving incorrect or irrelevant information from external sources.&lt;/li&gt;
&lt;li&gt;Context Mismatch: Retrieved information may not align well with the specific query context.&lt;/li&gt;
&lt;li&gt;Integration Challenges: Difficulties in seamlessly combining retrieved information with the generative model&amp;#39;s output.&lt;/li&gt;
&lt;li&gt;Outdated or Limited Knowledge Sources: Using external sources that are not current or comprehensive.&lt;/li&gt;
&lt;li&gt;Model Limitations: Similar limitations as standard generative models in understanding and context management.&lt;/li&gt;
&lt;li&gt;Biases in Data Sources: External sources might contain biases, which can influence the responses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Simply put &lt;strong&gt;a chatbot using RAG hallucinates when it doesn’t know the answer&lt;/strong&gt;. The difference here is that the reason the &lt;strong&gt;model doesn’t know the answer&lt;/strong&gt; is because the &lt;strong&gt;the information provided by the chatbot wasn’t good enough&lt;/strong&gt; instead of the information on which the model was trained. &lt;br/&gt;&lt;br&gt;&lt;strong&gt;The retrieval component of the chatbot is independent of the model and equally important!&lt;/strong&gt;&lt;br&gt;Congratulations for reading this far. We are almost ready to talk about Copilot Studio, but first a note on &lt;em&gt;context management&lt;/em&gt; and the &lt;em&gt;context window&lt;/em&gt;.  &lt;/p&gt;
&lt;h3&gt;Context window&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;context window&lt;/em&gt; is the length of text a model can process, i.e. the prompt, and respond to in a single request, i.e. the response measured in &lt;em&gt;tokens&lt;/em&gt;. When the limit is exceeded, you get errors. The context window size is perhaps the single most important constraint we face when building generative AI systems and is a key differentiator between models driving both capability and cost. Consider the following from &lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/&quot;&gt;Microsoft&lt;/a&gt;  &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Models&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Prompt (Per 1,000 tokens)&lt;/th&gt;
&lt;th&gt;Completion (Per 1,000 tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;GPT-3.5-Turbo&lt;/td&gt;
&lt;td&gt;4K&lt;/td&gt;
&lt;td&gt;$0.0015&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-3.5-Turbo&lt;/td&gt;
&lt;td&gt;16K&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;$0.06&lt;/td&gt;
&lt;td&gt;$0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;For comparison purposes, the base GPT-3.5-Turbo model has a 4k context window which can hold around six pages of text (question + answer). GPT-4 offers a version with a 32k context window which can hold around forty-eight pages of text. Sounds great except that the &lt;strong&gt;32k context size costs forty times as much&lt;/strong&gt;. What’s more, if one requires capacity to run that model at scale, you must commit to spending five-figures per month - &lt;strong&gt;it is possible to spend over $1 per query with GPT-4 32k!&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;At the opposite end of the spectrum are small models you can run yourself. There has been great progress in expanding the context window in this area, but there are many models with 2k context windows! Often, to get acceptable results from these small models, people will use a combination of fine-tuning and RAG.  &lt;/p&gt;
&lt;h3&gt;Copilot Studio models&lt;/h3&gt;
&lt;p&gt;One way Copilot Studio provides value is by providing a model that it uses internally by default at no extra charge to end-users. What is the specific model, how big is its context window, and what are its limits? &lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-ai-features#ai-models-in-microsoft-copilot-studio---background&quot;&gt;The answer appears to be that it’s a secret!&lt;/a&gt; &lt;br/&gt;&lt;br&gt;As we get into the meat of this post, I am going to start with this mystery model before connecting it to a GPT-35-Turbo-16k deployment so that I can show apples-to-apples comparisons between Copilot-style chatbots and alternatives.  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Part Two - Examples: House of straw, House of sticks, House of bricks, Castle on a hill&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;Wise King Solomon&lt;/h3&gt;
&lt;p&gt;The example I will use throughout the remainder of the article is a chatbot grounded in &lt;a href=&quot;https://en.wikipedia.org/wiki/Book_of_Proverbs&quot;&gt;The Book of Proverbs&lt;/a&gt;, the text of which I got from &lt;a href=&quot;https://biblehub.com/proverbs/&quot;&gt;BibleHub.com&lt;/a&gt;. I like using this as an example for several reasons:  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The text is long. At around fifteen-thousand words and over seventeen-thousand tokens, it is too long to fit into most context windows.   &lt;/li&gt;
&lt;li&gt;The language is stylized and formal, just like many business and technical documents.  &lt;/li&gt;
&lt;li&gt;Unlike many business and technical documents, it is widely recognizable which makes it easier for many people to evaluate the quality of the responses.  &lt;/li&gt;
&lt;li&gt;Many models were trained on data sets that contain the text which makes certain demonstrations of grounding possible&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The tests&lt;/h3&gt;
&lt;p&gt;Remember that the purpose of the Solomon chatbot is to give advice grounded in Proverbs, not to answer questions specifically about the text of the book. You will notice that some of the questions do mention Proverbs or Solomon. They should be easier for a chatbot using keyword queries to answer.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How do I become wise?  &lt;/li&gt;
&lt;li&gt;I am going to have a meeting with my boss. I want to tell him about the amazing work I have done. Did Solomon have any advice?  &lt;/li&gt;
&lt;li&gt;I think the mayor of our town is a liar and a fool. I told my friend and she said it isn&amp;#39;t a good idea to say things like that. Which of us is right? What does proverbs say?  &lt;/li&gt;
&lt;li&gt;I have a lot of money and I am very proud of that. In fact, I am sure I am better than most people. What do you think about that?  &lt;/li&gt;
&lt;li&gt;How do I do the right things and avoid doing the wrong things?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;House of straw: the system prompt&lt;/h3&gt;
&lt;p&gt;Recall from Part One that we can provide guidance to the model via the prompt to encourage behavior and reduce hallucinations. Also recall that we don’t know what model chatbots made in Copilot Studio use by default. I don’t know if what I am about to show you is a bug, but the result I got from trying to set the system prompt in Copilot Studio were very unsatisfactory. &lt;br/&gt;&lt;br&gt;Step one is to create a new Copilot with no additional configuration as a baseline and ask it a question.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Unsurprisingly, I get no answer. The generative AI capabilities in Copilot Studio are new and a bolt-on to the earlier Power Virtual Agents system that required you to define all of the topics and things the bot could say and do. Generative AI makes using the tool much easier, but you must turn it on.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;I also set the content moderation to ‘Low’ in hopes of getting an answer. Finally, I set the &lt;strong&gt;Custom instructions&lt;/strong&gt; according to the &lt;a href=&quot;https://learn.microsoft.com/en-us/microsoft-copilot-studio/nlu-generative-answers-prompt-modification&quot;&gt;documentation&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;I was very surprised when it failed to answer the first test question. As this is all a black-box, it is possible this behavior (which as you will recall is a type of hallucination) is a failure of the model or the chatbot.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image6.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;As you can see below, I could build a chatbot using &lt;strong&gt;Azure AI Studio&lt;/strong&gt; instead and get acceptable results.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Furthermore, because you can start in the Azure AI Studio playground and deploy a Power Virtual Agent to Copilot Studio it is reasonable to ask ‘why would I chose to start in Copilot Studio instead of  Azure AI Studio?’ &lt;br/&gt;&lt;br&gt;The only answers I have are:&lt;br&gt;A Copilot connected to Azure Open AI costs more because you pay for the service separately.&lt;br&gt;You have access to Microsoft 365, but not to Azure Open AI  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;-1 for Copilot Studio&lt;/strong&gt;&lt;br/&gt;&lt;br&gt;On the other hand, this will make the ‘House of sticks’ section much easier to understand as we introduce retrieval augmented generation into the mix.   &lt;/p&gt;
&lt;h3&gt;House of sticks: keyword queries against documents and websites&lt;/h3&gt;
&lt;p&gt;Once Generative AI is enabled in the Copilot, you can connect it to data for retrieval within limits for no additional charge and without needing to set anything else up. Two options are websites and document upload.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image8.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Let’s start with &lt;strong&gt;Upload a document&lt;/strong&gt;. For this and most of the other scenarios I created a text file with the text.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image9.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Test 1 - How do I become wise?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image10.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;You might be surprised that it didn’t have an answer for this considering the open lines of the book. The third line includes the word &lt;em&gt;wisdom&lt;/em&gt; but the keyword query created for this expression doesn’t have enough words that match the text and &lt;em&gt;wisdom&lt;/em&gt; is not the same word as &lt;em&gt;wise&lt;/em&gt;. And so, it fails to answer correctly given the grounding. &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Test 2 - I am going to have a meeting with my boss. I want to tell him about the amazing work I have done. Did Solomon have any advice?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image11.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This time it gives an answer, and a pretty good one at that! If we have a look at the citation text, we can see that it contains the literal text &lt;strong&gt;Solomon&lt;/strong&gt; which satisfies the keyword query.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image12.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Notice that the citation consists of a snippet of text and that it is only a few hundred words long. The chatbot chose a snippet from the file to add to the prompt. As I told you before, the text is too long to fit into the context window so it can only use a &lt;strong&gt;chunk&lt;/strong&gt; of the document. &lt;br/&gt;&lt;br&gt;The text file contains the word, &lt;em&gt;Solomon&lt;/em&gt; in several places. Was this the best chunk? Maybe, maybe not. The keyword query is only matching on the text and it may have chosen this particular chunk simply because the word is repeated and appears twice.  &lt;/p&gt;
&lt;h4&gt;Test 3 - I think the mayor of our town is a liar and a fool. I told my friend and she said it isn&amp;#39;t a good idea to say things like that. Which of us is right? What does proverbs say?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image13.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Again we get a good answer! Maybe this Solomon bot isn’t too bad! Notice that the chatbot offered multiple citations from the single document I uploaded for this and the previous answers. When I uploaded the document into Dataverse via Copilot Studio, it helpfully split the long document into individual chunks that are small enough to fit into the context window. If you were building this system from scratch, you’d need to do that yourself!&lt;br/&gt;&lt;br&gt;A downside to this and to the Azure AI Studio services we will look at later is that there are no good end user options at the moment for maintaining and updating this content! &lt;br/&gt;  &lt;/p&gt;
&lt;h4&gt;Test 4 - I have a lot of money and I am very proud of that. In fact, I am sure I am better than most people. What do you think about that?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image14.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Ok! We’re on a roll now. This Solomon Copilot is looking good. Drumroll please!  &lt;/p&gt;
&lt;h4&gt;Test 5 - How do I do the right things and avoid doing the wrong things?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image15.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;…sad trombone. Maybe it isn’t ready to share!&lt;br&gt;The final tally is three answers and two hallucinations. You might be surprised by the two that failed because they should have been the easiest ones to provide some answer for given the document. You shouldn’t be surprised because this is a simple demonstration of the weaknesses of RAG based on keyword query searches. It only works well when the users of the chatbot use the right vocabulary and the right words.&lt;br/&gt;&lt;br&gt;It could be that this is acceptable. In a workgroup where everyone speaks the same language or in a domain that is formal, the chatbot will usually be able to find some information if the questions are phrased properly. On the other hand, if the words are common in the documents and phrases often repeat, the more documents you add, the less likely it is to pick sections which are relevant.&lt;br/&gt;&lt;br&gt;Furthermore, the resulting system will work the best for people who have the best understanding of the subject matter because they use the right language. If you are among the experts (perhaps a product owner) and you evaluate the chatbot, you might think it works well but be very surprised when non-experts (perhaps confused customers looking for support) tell you it doesn’t.   &lt;/p&gt;
&lt;h4&gt;Documents versus websites, SharePoint and others&lt;/h4&gt;
&lt;p&gt;Each of the other Copilot Studio no-additional-cost options uses keyword search. The size of the snippet or chunk retrieved varies. I have not done serious testing, but it appears that the web search has the smallest snippet size and provides one snippet for each page found. This can directly lead to another cause of hallucinations in your grounding which happens when a low quality or short result is passed to the model which then imagines other convincing details to make up an answer.&lt;br/&gt;&lt;br&gt;I reconfigured the connection to use the Bible Hub website. This gives the chatbot access to much more than the single book I uploaded previously, including summaries. However, the snippets returned by the Bing Search API are very short at a few hundred characters (as opposed to words) long. Consider this result:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image16.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;That isn’t necessarily bad advice, but it isn’t grounded in the source content and almost none of it is supported by the specific citation. It’s a hallucination in context of the failed attempt to ground the chatbot in specific content.&lt;br/&gt;&lt;br&gt;You should be aware of this behavior with the Bing Web API. It hallucinates badly because of this when used for complex questions that can’t be answered from a short snippet of text from a long web page! Understanding this, the flaw becomes easy to demonstrate. In fact, I’d argue that if you get a long answer from it about a complicated question, you should assume the answer is wrong and read the pages which contain the alleged ‘information’.  &lt;/p&gt;
&lt;h3&gt;House of bricks: semantic search with Azure Open AI&lt;/h3&gt;
&lt;p&gt;At this point, Copilot Studio can’t do any better than what you’ve seen in ‘House of sticks’ without adding in some other services which are not free. In this next scenario I am using Azure Open AI and Azure AI Search using &lt;strong&gt;Azure AI Studio&lt;/strong&gt;.  You can connect your Copilot to it as a data source instead of using the free model. &lt;br/&gt;&lt;br&gt;Azure Open AI Studio is also a no-code tool, but instead of being surfaced through M365, it is surfaced through Azure. I assume that far more people have access to Copilot Studio and Azure Open AI studio, but if you have both and need the capabilities demonstrated in this section, it gets harder to see Copilot Studio as a good value unless you have additional requirements that justify it independently of the need for a good chatbot experience.  &lt;/p&gt;
&lt;p&gt;Once you have your chatbot working in Azure AI Studio you can deploy it to (and pay for as an additional charge) either a new web app in Azure which is based on Python and React or as a Copilot (previously known as a Power Virtual Agent bot).  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image17.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;This was not the option I would have recommended in many case prior to all of their announcements made on November 15, 2023 at the Ignite conference. The same day they revealed Copilot Studio they also significantly lowered the cost of the semantic search features in Azure Cognitive Search, renaming it to &lt;a href=&quot;https://azure.microsoft.com/en-us/products/ai-services/ai-search&quot;&gt;Azure AI Search&lt;/a&gt;. Things change fast in the AI space, and this is a now good option for many scenarios. &lt;br/&gt;&lt;br&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Semantic_search&quot;&gt;Semantic search&lt;/a&gt; denotes search with meaning, as distinguished from lexical search where the search engine looks for literal matches of the query words or variants of them, without understanding the overall meaning of the query. If you made it this far, you should immediately grasp why this is a better approach for RAG than keyword query searches. &lt;br/&gt;&lt;br&gt;I will write about vector databases and vector search in a subsequent article. Here I will tell you that this is a specific type of semantic search and that Microsoft’s semantic search uses it under the covers and hides the complexity from you in exchange for money. For now, check out this article about &lt;a href=&quot;https://learn.microsoft.com/en-us/MicrosoftSearch/semantic-index-for-copilot&quot;&gt;Semantic Index for Copilot&lt;/a&gt;. I’ll be speaking on this topic &lt;em&gt;Getting Started Making Copilots for MS Teams with Graph and the Semantic Index&lt;/em&gt; in April at the &lt;a href=&quot;https://www.collabsummit.org/&quot;&gt;North American Cloud &amp;amp; Collaboration Summit&lt;/a&gt; along with my friend Fabian Williams from Microsoft.&lt;br/&gt;&lt;br&gt;This time I am using the system prompt from the ‘house of straw test’ along with the same content, but with semantic search via Azure AI Search instead of keyword search along with GPT-3.5-turbo-16k. Let’s see the results!  &lt;/p&gt;
&lt;h4&gt;Test 1 - How do I become wise?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image18.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Test 2 - I am going to have a meeting with my boss. I want to tell him about the amazing work I have done. Did Solomon have any advice?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image19.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Test 3 - I think the mayor of our town is a liar and a fool. I told my friend and she said it isn&amp;#39;t a good idea to say things like that. Which of us is right? What does proverbs say?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image20.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Test 4 - I have a lot of money and I am very proud of that. In fact, I am sure I am better than most people. What do you think about that?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image21.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Test 5 - How do I do the right things and avoid doing the wrong things?&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;/images/CopilotStudioThoughts/image22.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;Results!&lt;/h4&gt;
&lt;p&gt;The bot based on GPT-3.5-turbo-16k is the clear winner. It gave a good answer for each of the questions. If you are looking for a no-code solution and you have access to Azure, Azure AI Studio with Azure AI Search is clearly superior to Microsoft Copilot Studio in terms of ease of use and the quality of the result. But remember, you can start in Azure AI Studio, publish to Copilot Studio and extend from there which opens the door to a wide range of options with Power Platform. Alternatively, or in addition to deploying to Power Platform, you can deploy to an app service in Azure and extend from there.&lt;br/&gt;&lt;br&gt;Because of the many recent changes, not the least of which is the aggressive new pricing in Azure AI Search, I expect the advice I give clients in December to be very different from the advice I gave in early November. &lt;br/&gt;&lt;br&gt;Shameless pitch: you need an adviser in this insanely fast changing space!  &lt;/p&gt;
&lt;h3&gt;Castle on a hill&lt;/h3&gt;
&lt;p&gt;The next part will take us into much deeper territory technically and will go into  solutions using embeddings, vector databases, and the Semantic Kernel and Kernel Memory libraries before bringing us back to Copilot Studio with AI Plugins that work with ChatGPT, Microsoft Copilot, and more. I had no idea when I started to write this article that I was writing a book chapter!&lt;br/&gt;&lt;br&gt;Stay tuned for more next week! &lt;br/&gt;&lt;br&gt;P.S. If you need help with AI, give me a shout!&lt;br&gt;--Doug Ware&lt;br&gt;December 1, 2023&lt;br&gt;&lt;a href=&quot;mailto:dougware@elumenotion.ai&quot;&gt;DougWare@Elumenotion.AI&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>ChatGPTCodeInterpreter</title><link>https://www.elumenotion.com/journal/chatgptcodeinterpreter/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/chatgptcodeinterpreter/</guid><pubDate>Sun, 09 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Understanding OpenAI Code Interpreter&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/ChatGPTCodeInterpreter/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;div style=&quot;font-size: x-small;color: #333;font-weight:bolder;padding-bottom:12px;margin-top: -16px;&quot;&gt;Image: Divination Magic - Stable Diffusion, multiple steps&lt;br/&gt;Divination is the attempt to gain insight into a question or situation by way of an occultic, standardized process or ritual. Used in various forms throughout history, diviners ascertain their interpretations of how a querent should proceed by reading signs, events, or omens, or through alleged contact or interaction with a supernatural agency. &lt;a href= &quot;https://en.wikipedia.org/wiki/Divination&quot;&gt;Wikipedia&lt;/a&gt;&lt;/div&gt;  
&lt;br/&gt;  

&lt;p&gt;A couple days ago OpenAI &lt;a href=&quot;https://openai.com/blog/gpt-4-api-general-availability?utm_content=buffer31609&amp;utm_medium=social&amp;utm_source=linkedin.com&amp;utm_campaign=buffer&quot;&gt;opened access to the GPT-4 API&lt;/a&gt; for all paying OpenAI API customers and &lt;a href=&quot;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&quot;&gt;began rolling out&lt;/a&gt; the &lt;a href=&quot;https://openai.com/blog/chatgpt-plugins#code-interpreter&quot;&gt;Code Interpreter plug-in&lt;/a&gt;, saying: &lt;br/&gt;  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“We provide our models with a working Python interpreter in a sandboxed, firewalled execution environment, along with some ephemeral disk space. Code run by our interpreter plugin is evaluated in a persistent session that is alive for the duration of a chat conversation (with an upper-bound timeout) and subsequent calls can build on top of each other. We support uploading files to the current conversation workspace and downloading the results of your work.”&lt;/em&gt;  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Simply Put with a Demo&lt;/h2&gt;
&lt;p&gt;You can now share a file by uploading it and ask the chat bot to answer questions about the file’s contents and manipulate it using &lt;strong&gt;python code the chat bot writes for you and the plug-in runs to to follow your instructions&lt;/strong&gt;. You can see the python code if you want as well as copy it. On the other hand, if you understand the task and can engineer prompts effectively, &lt;strong&gt;you don’t have to think about or interact with the python code at all&lt;/strong&gt;. &lt;br/&gt;  &lt;/p&gt;
&lt;hr&gt;  
This feature is not free and requires a ChatGPT Plus subscription.   
&lt;hr&gt;   

&lt;h3&gt;Upload the file with some instructions&lt;/h3&gt;
&lt;p&gt;This isn’t a detailed tutorial and there are some steps required to turn everything on which I’m leaving out of this post because I assume it will all change as the service gets more polished.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step One - Make sure you have selected GPT-4 and enable the Code Interpreter plugin&lt;/li&gt;
&lt;li&gt;Step Two - Upload a file along with instructions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/ChatGPTCodeInterpreter/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;In this example, I gave the chat bot very little to go on, and so it analyzed the file to understand its contents and then asked me if it understood my desired result. The file comes from the &lt;a href=&quot;https://www.elumenotion.com/Projects/WeightRandoms.html&quot;&gt;Weighted Randoms sample project&lt;/a&gt; and the chat bot’s suggestion was exactly right! &lt;br/&gt;&lt;br&gt;The chat bot used the popular &lt;a href=&quot;https://pandas.pydata.org/&quot;&gt;pandas library&lt;/a&gt; and you can see the code it ran as well as the result by clicking the &lt;strong&gt;Show work&lt;/strong&gt; button.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ChatGPTCodeInterpreter/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;Ask questions and do work using the file&lt;/h3&gt;
&lt;p&gt;My &lt;a href=&quot;https://www.elumenotion.com/Projects/WeightRandoms.html&quot;&gt;Weighted Randoms sample project&lt;/a&gt; contains a &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/WeightedRandoms/visualizer.ipynb&quot;&gt;Jupyter notebook&lt;/a&gt; for visualization of the data in the various csv files. Code Interpreter can do the same.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Step 3: Ask it to do more with the file such as “create a line graph”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/ChatGPTCodeInterpreter/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;In my Jupyter notebook, I used matplotlib. As you can see, so did Code Interpreter.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ChatGPTCodeInterpreter/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Thoughts and Observations&lt;/h2&gt;
&lt;p&gt;First off, once again I am astounded by how useful this is. It wasn’t 24 hours when I saw this breathless headline: &lt;a href=&quot;https://www.msn.com/en-us/money/careersandeducation/code-interpreter-might-be-most-useful-application-of-ai-so-far-says-wharton-professor/ar-AA1dBePi&quot;&gt;Code Interpreter might be most useful application of A.I. so far, says Wharton professor&lt;/a&gt;. &lt;br/&gt;&lt;br&gt;&lt;strong&gt;He might be right, but this pattern, which I will be writing about often, is easily extended. So, we ain’t seen nothing yet!&lt;/strong&gt; &lt;br/&gt;&lt;br&gt;On the other hand, it is important to understand the limitations. This example was trivial, but it did require me to ask questions and direct the assistant. So, the first limitation is that it isn’t autonomous, it does make mistakes, and you have to know enough to be able to direct it. The second is the size of the context window. This second limitation is very subtle and can lead to all sorts of problems because **exceeding it causes hallucinations and it isn’t at all obvious when you cross the line! &lt;br/&gt;&lt;br&gt;In fact, this context window size is always a challenge, but here I speculate it will be extra challenging because the python sandbox can hold way more information in its memory as compared to the number of tokens which the chat bot can keep track of. The potential for hilarious mistakes is real so keep your data scientists close by and don’t think this tool can safely replace them. &lt;br/&gt;&lt;br&gt;I think of this tool as a fantastic supplement to the idea of citizen data scientists in the same way traditional productivity tools have enabled people who are not developers to create basic solutions for themselves, and as always, there is a line, above which, deeper expertise is still required.   &lt;/p&gt;
&lt;p&gt;It seems like every week I post something along the lines of &lt;strong&gt;”this is an important thing you should know about!”&lt;/strong&gt; but that is where we are my friends.&lt;br&gt;-- Doug Ware. July 9, 2023&lt;/p&gt;
</content:encoded></item><item><title>ProjectedUserExperiencesWithAI</title><link>https://www.elumenotion.com/journal/projecteduserexperienceswithai/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/projecteduserexperienceswithai/</guid><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Projected User Experiences via Generative AI&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/ProjectedUserExperiencesWithAI/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;div style=&quot;font-size: x-small;color: #333;font-weight:bolder;padding-bottom:12px;margin-top: -16px;&quot;&gt;Image: Stable Diffusion - multiple prompts, [blue (theme):gold (theme):0.25], conceptual projection of sound to thought, abstraction, face, ear, mind&lt;/div&gt;  

&lt;p&gt;This site is about my personal exploration of all sorts of applied AI. I am not a data scientist or mathematician, and I have never been a computer scientist. I design and build systems that bring all sorts of technology and people together. I take joy in learning new things and applying my knowledge to help others.&lt;br/&gt;&lt;br&gt;If you look through what I’ve written on this site so far, you’ll see speech recognition (text from speech), image generation (images from text), and text generation (text from text) topics all mixed together with ways of using them in the cloud and locally. A common subtext is the topic of user experience (UX) where I am the user, but I am really interested in learning from these experiences to make new user experiences for other people as part of my art.&lt;br/&gt;  &lt;/p&gt;
&lt;h2&gt;Interesting Perspectives from Respectable Experts&lt;/h2&gt;
&lt;p&gt;I recently saw a post from &lt;a href=&quot;https://www.linkedin.com/in/resing/&quot;&gt;Tom Resing on LinkedIn&lt;/a&gt; titled &lt;strong&gt;Prompt-Driven AI UX Hurts Usability&lt;/strong&gt;:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ProjectedUserExperiencesWithAI/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Jakob_Nielsen_%28usability_consultant%29&quot;&gt;Jakob Nielsen&lt;/a&gt; is an undeniable authority on usability and so I eagerly read &lt;a href=&quot;https://www.linkedin.com/pulse/prompt-driven-ai-ux-hurts-usability-jakob-nielsen/&quot;&gt;the article&lt;/a&gt; Tom shared and you should too! I learned a few things and it otherwise re-enforced one thing I already believed text only experiences are &lt;strong&gt;not good fit for a significant percentage of people&lt;/strong&gt;. &lt;br/&gt;&lt;br&gt;In this respect, text only experiences are similar to most of the software ever produced. In fact, it is similar in this respect to almost every experience (text only or otherwise) ever conceived. Software is hard for you to use because you aren’t a strong reader and writer? Well,  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some people can’t read the menu at the local restaurant because they can’t see&lt;/li&gt;
&lt;li&gt;Some people can’t read the menu at the local restaurant because they can’t read&lt;/li&gt;
&lt;li&gt;Some people can’t learn from lectures because they don’t hear&lt;/li&gt;
&lt;li&gt;Some people can’t learn from lectures because they can’t understand what is being said&lt;/li&gt;
&lt;li&gt;Some people have mobility issues and can’t participate in activities in locations with lack of access&lt;/li&gt;
&lt;li&gt;Etc…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these are a good things and good people do what they can to help others. I try to be a good person.  &lt;/p&gt;
&lt;h2&gt;Dreaming of a Better Future&lt;/h2&gt;
&lt;p&gt;I think the world would be a better place if media and experiences adapted to people instead of requiring people to do things that they as individuals can’t do for whatever reason. We do our best today. For example, we have braille to help the blind “see” words on a page and RTT/TTY to help the deaf “talk” on the phone. However, what we have today barely scratches the surface when it comes to all the accessibility barriers that exist today. &lt;br/&gt;  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;half of the population in rich countries like the United States and Germany are classified as low-literacy users&lt;br&gt;This doesn’t mean that half of the population is unintelligent, it means they aren’t good at reading and writing. It should be expected that they won’t find AI based chat to be very helpful for doing complicated things.  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Styles of Learning and Thinking&lt;/h1&gt;
&lt;p&gt;When I was a boy, I often wondered what it is like to be different people. At some point I came to understand that individuals can be very different from each other and that our basic perception varies considerably. We don’t all think or perceive the same way.   &lt;/p&gt;
&lt;h2&gt;Learning Styles and the VARK Model&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/24823519/&quot;&gt;VARK model&lt;/a&gt; is a learning style theory that categorizes individuals into four main learning styles: Visual, Aural, Reading/Writing, and Kinesthetic. The theory resonates with me. Like many people, my learning styles are Aural and Reading/Writing and according to all the testing they gave me as a child, I’m very good at each. Where visual and kinesthetic learning is concerned, I don’t win any prizes. In fact, I am terrible at remembering people’s faces.   &lt;/p&gt;
&lt;h2&gt;Aphantasia and Anauralia&lt;/h2&gt;
&lt;p&gt;Aphantasia and anauralia describe modes of thought or rather, the lack thereof. Aphantasia, or mental blindness, is the lack of a &lt;em&gt;mind’s eye&lt;/em&gt;. I can relate to the concept of aphantasia because generally, the only time I ever &lt;em&gt;see&lt;/em&gt; things in my mind is when I dream. Conversely, anauralia is the lack of an inner-dialog. I can’t imagine what that would be like. I don’t only have an inner-dialog, I have an inner-radio station.  &lt;/p&gt;
&lt;h2&gt;AI for the Betterment of Everyone&lt;/h2&gt;
&lt;p&gt;Multi-modal AI has the potential to make it possible for system builders to tailor experiences to our individual learning and thinking styles with devices appropriate to the user’s physical abilities. Today, the process of UX design is almost always focused on specific devices and form-factors. We make phone apps, web apps, desktop apps and so on. Accessibility concerns are almost always some sort of bolt-on and are usually an afterthought that many people skip if they can get away with it. &lt;br/&gt;&lt;br&gt;Making big generalizations about software is usually foolish and someone will read this and say ‘&lt;em&gt;well, actually&lt;/em&gt;’, but most modern software is intentionally split between a user interface and back-end services. This is true even if the &lt;em&gt;back-end services&lt;/em&gt; are one the same device instead of on the internet and the division between the two layers is purely logical. We do this because:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It makes our software easier to build&lt;/li&gt;
&lt;li&gt;It makes our software easier to maintain&lt;/li&gt;
&lt;li&gt;It makes it easier to reuse components and connect systems to each other&lt;/li&gt;
&lt;li&gt;It makes it easier to build different user experiences for the same system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In fact, big complicated systems often have more than one way to deliver the same experience in different modalities. What I am envisioning here is, conceptually, more of the same and a variation of an old theme, but now we can think about describing the experience in terms of structured prompts and let specialized generative AI create a UX tailored to the individual. &lt;br/&gt;&lt;br&gt;This could translate to:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestures for the kinesthetic&lt;/li&gt;
&lt;li&gt;Speech for the aural&lt;/li&gt;
&lt;li&gt;Structured experiences for the visual&lt;/li&gt;
&lt;li&gt;And so on..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We could project a directed conversational, step by step experienced based on spoken questions and answers for one set of users, a traditional form-based UI for others, and other new modalities for people like Jakob Nielsen to invent. &lt;strong&gt;Don’t be confused, the AI is not creative.&lt;/strong&gt;  &lt;/p&gt;
&lt;h2&gt;Personal AI Assistants, Teachers, and Counselors&lt;/h2&gt;
&lt;p&gt;Among the oldest and deepest of human fantasies is the idea of an personal counselor that helps the protagonist in ways that the people around them cannot. Whether as a guardian angel, a fairy godmother, or a wise and animated cricket, we love the idea! A recent favorite of mine is the character Dross from &lt;a href=&quot;https://www.willwight.com/&quot;&gt;Will White’s recently concluded series, Cradle&lt;/a&gt;. &lt;br/&gt;&lt;br&gt;It’s fun summer reading if you happen to be that kind of person who thinks that way.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ProjectedUserExperiencesWithAI/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;div style=&quot;font-size: x-small;color: #333;font-weight:bolder;padding-bottom:12px;margin-top: -16px;&quot;&gt;Image: Stable Diffusion - Lindon and Dross from Will White’s Cradle series, multiple prompts, checkpoints, and LORAs&lt;/div&gt;  

&lt;h2&gt;The Friend we Need&lt;/h2&gt;
&lt;p&gt;What we have today is very far from an assistant who can stop time so we can work through how to survive a fantasy story’s combat scenarios to say the least, and it is a mistake to anthropomorphize it too much (it is a handy analogy at best). What I am talking about are fancy and specialized AI code generators that work against descriptions of experiences - descriptions designed for interpretation so that the generative AI can project the UX in the appropriate modality for the user.&lt;br/&gt;&lt;br&gt;This vision is becoming attainable now and I am incredibly excited and grateful to be here to see it.&lt;br&gt;--Doug Ware, July 1, 2023&lt;/p&gt;
</content:encoded></item><item><title>DetectingAIGeneratedContent</title><link>https://www.elumenotion.com/journal/detectingaigeneratedcontent/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/detectingaigeneratedcontent/</guid><pubDate>Wed, 28 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Is it Possible to Reliably Detect AI Generated Content?&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The answer is &lt;strong&gt;no!&lt;/strong&gt; &lt;br/&gt;&lt;br&gt;Thanks for reading.  &lt;/p&gt;
&lt;p&gt;Part of the panic/hype cycle around generative AI is the simple fact that it can do work that was previously the exclusive domain of people. For example, the illustration at the top of this post comes from Stable Diffusion with a simple prompt: “Lithograph of man in court on trial standing before an angry judge in the style of Hugo Gellert”. I generated a couple dozen images and picked the one I liked the best to convey my idea.&lt;br/&gt;&lt;br&gt;Just imagine being judged for something you worked very hard on because a person used some software that says you are a cheater and they put you on trial for it! Honestly, the idea that something like this could happen to a student at a vulnerable time in their development makes me feel sick to my stomach.   &lt;/p&gt;
&lt;h1&gt;I Understand the Desire&lt;/h1&gt;
&lt;p&gt;The first time I saw good AI in action, I felt happy, excited, afraid, and angry - all at the same time.    &lt;/p&gt;
&lt;h2&gt;Nobody Likes a Cheater&lt;/h2&gt;
&lt;p&gt;Most people, at a fundamental level, get angry at the idea someone might get something for free that they worked hrad to get for themselves. In the Christian Bible, there is a parable, &lt;a href=&quot;https://en.wikipedia.org/wiki/Parable_of_the_Workers_in_the_Vineyard&quot;&gt;The Parable of the Workers in the Vineyard&lt;/a&gt;, which illustrates this perfectly.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;That generative AI gives power to people who lack skills which previously required years of practice and dedication is deeply troubling. The people who put in the work feel anger for the same reason as the workers in the vineyard who arrived in the morning - the whole situation just doesn’t &lt;strong&gt;feel&lt;/strong&gt; fair! (And maybe it isn’t. I seem to recall my Daddy telling me that life isn’t fair once or twice)  &lt;/p&gt;
&lt;h2&gt;Generative AI has the Potential to Cause a lot of Harm&lt;/h2&gt;
&lt;p&gt;Aside from the way it feels, there are very valid reasons why being able to detect AI generated content would be great were it possible. &lt;a href=&quot;https://openai.com/blog/new-ai-classifier-for-indicating-ai-written-text&quot;&gt;OpenAI is working on it&lt;/a&gt; and they explain why:  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unfortunately, the same article makes the following disclaimer:&lt;/strong&gt; &lt;br/&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;We Should not Accuse People Based on a Coin Toss&lt;/h2&gt;
&lt;p&gt;Being correct on a positive ID only &lt;strong&gt;twenty-six percent&lt;/strong&gt; of the time and being wrong &lt;strong&gt;nine percent&lt;/strong&gt; of the time? That’s far too much reasonable doubt!   &lt;/p&gt;
&lt;h1&gt;OpenAI Might Admit it Doesn’t Work - Hucksters Just want that Money&lt;/h1&gt;
&lt;p&gt;There are a lot of products out there and many possibly well-intentioned but certainly gullible members of the technical press hoping to sell you on this idea. A quick search proves what I am saying is true.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;There are Many Reports of False Accusations Already&lt;/h1&gt;
&lt;p&gt;For example:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In January, the moderators of /r/art started a conversation by &lt;a href=&quot;https://www.vice.com/en/article/y3p9yg/artist-banned-from-art-reddit&quot;&gt;banning an artist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In May, a professor at Texas A&amp;amp;M &lt;a href=&quot;https://www.rollingstone.com/culture/culture-features/texas-am-chatgpt-ai-professor-flunks-students-false-claims-1234736601/&quot;&gt;helped raise awareness by failing a bunch of students who were set to graduate on the word of an AI detector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image6.jpeg&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;StackExchange Got it Right&lt;/h1&gt;
&lt;p&gt;Last month, &lt;a href=&quot;https://meta.stackexchange.com/questions/389582/what-is-the-network-policy-regarding-ai-generated-content&quot;&gt;StackExchange updated their policies on content moderation and AI&lt;/a&gt;. Specifically, they said &lt;em&gt;“AI-generated content is not being properly identified across the network, and that the potential for false-positives is very high. Through no fault of moderators&amp;#39; own, we also suspect that there have been biases for or against residents of specific countries as a potential result of the heuristics being applied to these posts. Finally, internal evidence strongly suggests that the overapplication of suspensions for AI-generated content may be turning away a large number of legitimate contributors to the site.”&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Their moderators are not happy!&lt;/strong&gt; and now, for this and other reasons, they are &lt;a href=&quot;https://meta.stackexchange.com/questions/390106/moderation-strike-update-data-dumps-choosing-representatives-gpt-data-and-wh&quot;&gt;on strike!&lt;/a&gt; &lt;br/&gt;&lt;br&gt;I am not involved with StackExchange in any way, but my opinion is that people who go there with questions are looking for answers and don’t really care and that they have a moderation system to remove low quality answers. Were I to join and post an answer only to be banned, I think I would remember the experience and stay away.  &lt;/p&gt;
&lt;h1&gt;First, do no harm!&lt;/h1&gt;
&lt;p&gt;I’m not talking about medicine, but we should take guidance from Hippocrates here. I understand that there are important issues at stake, but the entire point of generative AI is to simulate human reasoning &lt;strong&gt;for the benefit of people&lt;/strong&gt;. Some people are malevolent, and the tragedy of the commons is a real thing, but people deserve the benefit of the doubt at all times. Anything less is unjust.  &lt;/p&gt;
&lt;h1&gt;What then shall we do?&lt;/h1&gt;
&lt;p&gt;I have a couple different friends who are teachers who have seen my posts and asked about AI. My advice is:   &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deal with it as an opportunity to enhance all forms of education&lt;/li&gt;
&lt;li&gt;Adjust to the world as it is today&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Undeniably, our world has evolved and there is no going back. The metaphorical genie has been released from its bottle and Pandora&amp;#39;s box has been irrevocably opened. The proliferation of generative AI has incited diverse calls for regulatory measures, and it&amp;#39;s vital to discern the intent behind these voices. Some echo sincere concerns about the implications of this technology, while others appear to be motivated by corporate interest, seeking to leverage government intervention as a strategy to outmaneuver competitors. &lt;br/&gt;&lt;br&gt;In the United States, such regulation will face significant legal obstacles, considering the strong protection granted to freedom of speech under the First Amendment. However, the situation is more unpredictable in other jurisdictions where privacy laws, legislative interventions, and anti-trust actions play a more prominent role and are already in motion. &lt;br/&gt;&lt;br&gt;Although the future trajectory of this issue remains uncertain, one thing appears clear: generative AI has established its place in our society and is likely here to stay.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/DetectingAIGeneratedContent/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Some Practical Suggestions&lt;/h2&gt;
&lt;p&gt;First, when evaluating stories in the media and products for sale around AI, think critically and look for advice. It is a confusing, complicated, and important topic. &lt;br/&gt;&lt;br&gt;Second, look for simple low-tech solutions. For example, do writing assignments and assessments in the classroom. Use discussions. Keep homework and other unsupervised learning activities limited to things AI can’t do for the student. &lt;br/&gt;&lt;br&gt;Third, look for opportunities now to use generative AI as an educational assistant. One of the main things for which I use ChatGPT Plus, Bing, and Bard for is as a superior learning tool. I expect we will see many products aimed at the education marketplace soon that are helpful instead of harmful like the AI detector that delayed the graduation of the poor young people at Texas A&amp;amp;M.  &lt;/p&gt;
&lt;h1&gt;A Note on the Images in this Post&lt;/h1&gt;
&lt;p&gt;The pictures were all generated using Stable Diffusion on my local desktop - except for one. Can you tell which one I took from an image search? &lt;br/&gt;&lt;br&gt;--Doug Ware, June 28, 2023&lt;/p&gt;
</content:encoded></item><item><title>BuildingDomainSpecificLLMBots</title><link>https://www.elumenotion.com/journal/buildingdomainspecificllmbots/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/buildingdomainspecificllmbots/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Building Domain Specific LLM Bots&lt;/h1&gt;
&lt;p&gt;I’m taking on a lot of new responsibilities at work as I move into a role directing the architecture of a huge platform. Over the next years, AI is going to get baked into everything to some degree. Today we are very early in the process, but to me it seems obvious that the first step for everyone is to create a knowledge base of whatever it is they do. And, like I said, in my case what I do is wrangle software architecture for a huge system.&lt;br/&gt;&lt;br&gt;I intend to try to capture that knowledge so we can use the power of a large language model to reason against it, answer questions, and project different architectural views. So, this week, I wasn’t working on work during the day and my game at night. I was focused fully on work. &lt;br/&gt;  &lt;/p&gt;
&lt;h2&gt;The Power of the Untrained Model&lt;/h2&gt;
&lt;p&gt;Consider the following infographic from &lt;a href=&quot;https://www.visualcapitalist.com/how-smart-is-chatgpt&quot;&gt;visualcapitalist.com&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/BuildingDomainSpecificLLMBots/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Notice that the subjects at the bottom of the list are ones where there are many elements with complex relationships to each other. The transformative power of the LLMs is the ability to package and project ideas. It&amp;#39;s ability to do &amp;quot;Evidenced-based Reading and Writing&amp;quot; proves that using it in any domain well will be an exercise in feeding it the right evidence in context of questions. &lt;br/&gt;&lt;br&gt;This is why Bing Chat is so compelling as a general-purpose example. Even a relatively unsophisticated add-in like &lt;a href=&quot;https://github.com/qunash/chatgpt-advanced&quot;&gt;WebChatGPT&lt;/a&gt; demonstrates the power by gathering the info for the prompt. &amp;quot;Vector Databases&amp;quot; for memory work the same way by injecting the context into the prompt.  &lt;/p&gt;
&lt;p&gt;WebChatGPT is a browser extension that searches the web and creates prompts for ChatGPT  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/BuildingDomainSpecificLLMBots/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;The Application Sweet Spot&lt;/h2&gt;
&lt;p&gt;The maximum value of today’s AI is in its sweet spot - encapsulating ideas to produce a good output given good input. Its strength is not reasoning against information to add information through perceptive and novel insights. This is why GPT3 and 4 do very well on “Evidence-based Reading and Writing” and why they do equally poorly on “Codeforces Rating”. The former test comes with the evidence needed to write a good response and the later requires complex reasoning and insight to solve challenges that test the ability to perform complex reasoning creatively. &lt;br/&gt;&lt;br&gt;It is notable that in both cases the difference between GPT3 and GPT4 is small enough to describe their performance as similar. GPT3 is very good at “Evidence-based Reading and Writing” (87%) and is fit for a wide range of applications where we require answers based on the evidence of the text. In the case of LLMs, the text is the prompt and the conversation context.  &lt;/p&gt;
&lt;h2&gt;Using this Perspective to ‘Win’ at AI&lt;/h2&gt;
&lt;p&gt;In the software industry, tools aimed at making development easier such as Copilot are getting a lot of press. Businesspeople have dreamed of a world without expensive developers for years, and this technology has many of them believing that the day they’ve been dreaming of is almost here. I think they will be waiting for some time to come. These tools are useful in many aspects of software development and make it faster and easier, but the reasons &amp;gt;95% of the human Codeforces competitors beat GPT3 and GPT4 are extant and there is little evidence this will change suddenly in the near future.   &lt;/p&gt;
&lt;p&gt;I think most experienced people recognize the critical importance of the idea of ‘using the right tool for the job’. Being innovative when a new tool emerges requires one to find the jobs that match the tool, trying things, and scaling up the things that work based on the experience.&lt;br&gt;What seems obvious to me at this point is:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLMs today produce great output when the model and the request contain the evidence required for a good response&lt;/li&gt;
&lt;li&gt;LLMs today can’t produce acceptable output when the model and the request do not contain the evidence required for a good response&lt;/li&gt;
&lt;li&gt;To apply this technology well, one must focus on ensuring the model and the requests contain the evidence required for a good response in the context of your application&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;GPT3.5 versus GPT4&lt;/h2&gt;
&lt;p&gt;GPT-4 has two variants with different limits: one with &lt;strong&gt;8,000 tokens&lt;/strong&gt; and another with &lt;strong&gt;32,000 tokens&lt;/strong&gt;. This means that GPT-4 can handle larger amounts of text and keep conversations going for longer compared to its predecessor GPT-3.5 which had a max request value of 4,096 tokens.&lt;br/&gt;&lt;br&gt;What this means in the context of this article, is that, whether you are gathering information with search and injecting it into the prompt, or summarizing previous aspects of the conversation and injecting it into the prompt, the prompt length limit is one of the most important factors that limit what is possible.  &lt;/p&gt;
&lt;h2&gt;For many applications using Chat-GPT is not a great option on its face&lt;/h2&gt;
&lt;p&gt;Today, for chat, there is simply no question that GPT4 is king of the hill. For my game (which is fundamentally a learning exercise) I am sticking with it. On the other hand, for the sort of proprietary and confidential information I am dealing with at work, maybe sharing valuable information with a third-party cloud service is a bad idea. &lt;br/&gt;&lt;br&gt;It is public knowledge that my employer is partnering with Microsoft for certain ChatGPT powered products, so it is possible that, in the end, that is what we will use it to power my architecture bot. In the meantime, we will need to feed it the right context to get the right answers. So, step one is to compile our knowledge in a format that we can use with an LLM.  &lt;/p&gt;
&lt;h2&gt;What about Microsoft Copilot * and M365?&lt;/h2&gt;
&lt;p&gt;This week (May 1, 2023) I expect to see many announcements from Microsoft at the &lt;a href=&quot;https://m365conf.com/&quot;&gt;M365 Conference&lt;/a&gt; about many AI doodads in Office and M365 products. It is possible that what they announce will reset my current operating theories, but I doubt anything they offer will meet my expectations because ours is a very complex domain.  &lt;/p&gt;
&lt;h2&gt;ChatGPT Alternatives&lt;/h2&gt;
&lt;p&gt;Fundamentally what I care about is getting our architecture and design knowledge into a vastly more usable form as an AI agent. It is possible that one of the Microsoft solutions will be the winner, but what if it takes a long time? What if I can’t ever use those for some important compliance reason?&lt;br/&gt;&lt;br&gt;I need something that is licensed for commercial use that can be fully isolated in the cloud or in one of our datacenters. Fortunately, because I am focusing on the ‘sweet-spot’ it appears that there are many workable alternatives to ChatGPT and more emerge every week!  &lt;/p&gt;
&lt;h2&gt;Hello Dolly, v2!&lt;/h2&gt;
&lt;p&gt;We’ll soon start a POC with Dolly v2 running on Databricks. You can read the Dolly v2 release post &lt;a href=&quot;https://www.databricks.com/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm&quot;&gt;here: &lt;/a&gt;. I’ve been running Dolly v2 locally on a desktop with an RTX 4090 GPU with 24GB of VRAM, a current generation i7 CPU, and 64GB of normal RAM and it works shockingly well with little prompting and no fine-tuning.   &lt;/p&gt;
&lt;p&gt;Here is a simple chat I had with it using the excellent &lt;a href=&quot;https://github.com/oobabooga/text-generation-webui&quot;&gt;oobabooga/text-generation-webui project&lt;/a&gt;    &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/BuildingDomainSpecificLLMBots/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Dolly versus GPT 3.5 and 4&lt;/h2&gt;
&lt;p&gt;There is no question that out of the box GPT4 is more powerful. However, you can fine-tune Dolly (and many others) using a variety of techniques. One that looks most promising for my POC is LoRA.&lt;br/&gt;&lt;br&gt;LoRA stands for &lt;strong&gt;Low-Rank Adaptation of Large Language Models&lt;/strong&gt;. It is a method that freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. This vastly reduces the storage requirement for large language models adapted to specific tasks and enables efficient task-switching during deployment all without introducing inference latency. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency.  &lt;/p&gt;
&lt;h2&gt;First steps, for me and for you&lt;/h2&gt;
&lt;p&gt;In this post I touched on a few approaches to create a good domain-specific chatbot. All of them have one thing in common, and that is that they require domain specific data in some form. Options include any combination of search, runtime augmentation of the context via the prompt, and language fine tuning. You won’t get very far trying to build one that is an expert on something you and your organization don’t understand.&lt;br/&gt;&lt;br&gt;What I will do, and what I think is the necessary first step for anyone, is begin by building the knowledge base that will provide the evidence the bot requires to produce a good written response!&lt;br&gt;&lt;br/&gt;&lt;br&gt;--Doug Ware, May 5, 2023&lt;/p&gt;
</content:encoded></item><item><title>CurrentOpinions</title><link>https://www.elumenotion.com/journal/currentopinions/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/currentopinions/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Current Opinions&lt;/h1&gt;
&lt;p&gt;I made this site to share what I am learning but I am doing the work to help myself understand the brave new world by experiencing the tools first-hand and experimenting. What I think about it all keeps changing. So, I am putting today’s opinions down on paper to see how well they hold up over time. These are my current opinions, in no particular order: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can’t use generative AI to make systems in domains you don’t understand without being or having access to human subject matter experts or becoming a subject matter expert. If you try to use it to build anything but the most trivial software but don’t already know how to build software, you are going to have a bad time. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Systems based on generative AI should be subject to much more stringent liability standards compared to traditional software. This would be a sensible policy change that would let the markets control how fast it changes society by disincentivizing aggressive rollouts by CEOs (who publicly admit that their products might be dangerous). &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Based on my observations so far, the biggest opportunities to improve software development using LLMs/Chat AI (better/faster/cheaper) are in the front (product design and specification) and back (operations) of the process, not in the actual construction (coding). In other words, they are great for knowledge management of all kinds. The tools make it easy to capture, transform, and analyze information. The transformation ability is especially valuable for ensuring quality because different views help identify misunderstandings and errors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/CurrentOpinions/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I believe Sam Altman (CEO of OpenAI) is right when he says that major increases in parameter counts won’t make as big a difference going forward. I think major advances going forward will come from distributed models (a mix of traditional application services, LLMs, and specialized ML) acting in concert. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The emerging computer vision AI models and the ability to create three-dimensional objects and scenes easily will have as big or bigger impact on society as chat AI. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The professionals most easily replaced by these tools are people in support roles who are not subject matter experts. Business Analysts in Agile shops who go to meetings, take notes, and make user stories have essentially no purpose, and the AI can already do a better job. Those who connect the dots and are good at extracting information from people and who actively add to the conversation can’t be replaced by today’s AI. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The most useful and most accessible chat AI tool at the moment is Bing. At $20 a month, the GPT Plus subscription is a good value. At $10 a month, GitHub Copilot is not too expensive, but I don&amp;#39;t recommend it if price is no object. Tools such as Jetbrains Resharper do a much better job, and I spend more time using Bing or ChatGPT than I do directly interacting with the Copilot tools. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chat assistants are very good for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extracting information from meetings and conversations&lt;/li&gt;
&lt;li&gt;Reformatting content. For example, I often use the AI to create JSON, which is a format easily read by programs, from Markdown, which is a format easily read by people.&lt;/li&gt;
&lt;li&gt;Creating and validating user stories in Gherkin format&lt;/li&gt;
&lt;li&gt;Explaining code and writing documentation&lt;/li&gt;
&lt;li&gt;Writing unit tests&lt;/li&gt;
&lt;li&gt;Validating that code and unit tests are in accordance with user stories&lt;/li&gt;
&lt;li&gt;Comparing alternative implementations&lt;/li&gt;
&lt;li&gt;Writing small routines such as Python scripts for cells in Jupyter notebooks and algorithms that do not require complex APIs. Other examples include data model objects in C# and other languages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chat assistants are not very good for:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Refactoring and restructuring code. It can’t take a moderately complicated top-to-bottom routine and break it into smaller pieces reliably, and although it does a good job explaining how the code could be improved and decomposed, attempts at applying these suggestions using the chat bot were frustrating. &lt;/li&gt;
&lt;li&gt;Building complete systems by themselves beyond the most trivial scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;--Doug Ware, April 21, 2023&lt;/p&gt;
</content:encoded></item><item><title>April14To162023</title><link>https://www.elumenotion.com/journal/april14to162023/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/april14to162023/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;A Smooth Ride in Game Development with AI Assistance&lt;/h1&gt;
&lt;p&gt;I&amp;#39;m currently working on a game inspired by tabletop adventure games, filled with twists, turns, and surprises. Random events play a key role in the gameplay, making weighted random numbers crucial for game mechanics. The algorithm needs to handle various scenarios for different game objects, such as controlling the probability of encountering monsters or items based on a character&amp;#39;s level or location.&lt;/p&gt;
&lt;p&gt;I started by using Bing to develop an algorithm that would generate weighted random numbers based on the position of items within a list. Surprisingly, Bing came up with a decent implementation on the first try. However, as with any code, it&amp;#39;s essential to validate it, so I asked Bing to write some unit tests.&lt;/p&gt;
&lt;p&gt;The unit tests revealed some issues in the algorithm, and through a series of iterations with Bing, we managed to resolve these problems. But as the code structure became more complex, Bing&amp;#39;s ability to reason about it began to degrade. Interestingly, Bing repeatedly forgot to write comments throughout the code, even when asked multiple times, making it resemble a real-life software developer!&lt;/p&gt;
&lt;p&gt;I then turned to ChatGPT using the GPT-4 model and found it slightly better than Bing at understanding the complex algorithm. However, both AI assistants still struggled to provide deep insights as the code structure grew more intricate.&lt;/p&gt;
&lt;p&gt;Despite these challenges, I managed to produce a solid weighted random number routine, which I&amp;#39;ve made available as a NuGet package.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/April14To162023/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;DocFX Struggles: A Stark Contrast to Game Development&lt;/h1&gt;
&lt;p&gt;While AI was helpful in game development, it wasn&amp;#39;t as effective when working with DocFX, a tool I&amp;#39;ve been using for years to build static websites for my open-source projects.&lt;/p&gt;
&lt;p&gt;One persistent issue in DocFX has been the homepage displaying the same content in both the top and left navigation. Although this problem has come up numerous times on StackOverflow and the DocFX repo, neither ChatGPT nor Bing could offer any help.&lt;/p&gt;
&lt;p&gt;Surprisingly, I spent far more time dealing with this small DocFX behavior than building the complex algorithm with unit tests for my game. Ultimately, it was my human ability to debug software and understand large, complicated systems that allowed me to resolve the issue. This experience taught me that if AI assistants don&amp;#39;t have a clear understanding of the problem or domain, their help may be limited.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/April14To162023/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;Is it Still a Good Idea to Share Work Publicly?&lt;/h1&gt;
&lt;p&gt;Considering the power of AI assistants in parsing publicly available information, there may be concerns that their presence will have a chilling effect on discourse, especially for specialized domains. I thinks it is completely sensible to wonder, “will my code and thought leadership be used against me by a robot and put me out of a job?”  &lt;/p&gt;
&lt;p&gt;While AI assistants can be incredibly helpful in boosting productivity, they struggled with the proprietary knowledge around DocFx which is very well documented with lots of samples. That work might have been faster if I had just rolled up my sleaves and thoroughly examined all the options myself!  &lt;/p&gt;
&lt;p&gt;The next post will cover an experiment I did with the OpenXml SDK - a nasty bit of software indeed with a huge amount of material online going back over a decade.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/April14To162023/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;Final Thoughts&lt;/h1&gt;
&lt;p&gt;AI assistants, like ChatGPT and Bing, can be fantastic tools for boosting productivity and guiding developers through complex tasks. However, they still have limitations, especially when it comes to specific domains or understanding intricate code structures. Developers need to have a strong foundation in their domain and problem-solving abilities to effectively utilize AI assistance. AI may not replace your job anytime soon, but it can certainly enhance your productivity if used correctly. The stark contrast between the ease of developing a complex algorithm for my game and the struggle with a minor issue in DocFX serves as a prime example of AI&amp;#39;s potential and limitations. As AI technology continues to evolve, it&amp;#39;s crucial for developers to understand how to effectively leverage these tools in their work while recognizing their constraints.  &lt;/p&gt;
&lt;p&gt;The next day I gave it a much harder challenge…&lt;br&gt;&lt;br/&gt;&lt;br&gt;--Doug Ware, April 17, 2023&lt;/p&gt;
</content:encoded></item><item><title>OpenSourceVersusOpenAI</title><link>https://www.elumenotion.com/journal/opensourceversusopenai/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/opensourceversusopenai/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Motes and Leaping LLaMas&lt;/h1&gt;
&lt;p&gt;Things are changing fast in AI land. You may not realize it, but a war is on between a few giants and everyone else to see who gets to win the future of humanity.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;About a month ago, a memo allegedly leaked from Google was posted here - &lt;a href=&quot;https://www.semianalysis.com/p/google-we-have-no-moat-and-neither&quot;&gt;Google &amp;quot;We Have No Moat, And Neither Does OpenAI&amp;quot;&lt;/a&gt;. If you follow the AI space, you might have seen it. If not, you should have a look. I won’t regurgitate it here, but here is a screenshot of its opening statements.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;I (along with lots of other people) began to suspect what the leaked memo says a few weeks before it was published when, seemingly suddenly overnight, it became possible to run impressively decent LLMs for yourself locally with a good GPU or (comparatively) inexpensive cloud compute.   &lt;/p&gt;
&lt;p&gt;The Google Trends chart is interesting. For a brief time “ChatGPT” was practically synonymous with “AI” but recently a gap began opening as the events the anonymous author notes began piling up quickly.     &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;br/&gt;  
People in the US are more interested in AI than Taylor Swift (on Monday through Friday), which is to say, they are very interested.   
&lt;br/&gt;  

  
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;The Open Source AI Community is on Fire&lt;/h1&gt;
&lt;p&gt;Today it is impossible for me to keep up with the rapid developments coming from the open source AI communities on GitHub and &lt;a href=&quot;https://huggingface.co/about&quot;&gt;Hugging Face&lt;/a&gt;.   &lt;/p&gt;
&lt;h2&gt;Hugging Face&lt;/h2&gt;
&lt;p&gt;Hugging Face is a privately owned company that is not nearly as well known as OpenAI, but in spite of the silly name, might be the more interesting of the two. Hugging Face Transformers are a foundational element that makes using any of the 200,000+ machine learning models on they store easy to use.   &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/index&quot;&gt;Transformers&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://github.com/oobabooga/text-generation-webui&quot;&gt;Oobabooga Text Generation Web UI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image6.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Text Generation Web UI is an outstanding project that makes it easy to use models from Hugging Face. It comes with a simple batch file setup that worked perfectly for me. There are a variety of extensions, including an API extension. The API extension makes it easy to use various models as backends to processes from any language that can talk to a web service. For my own benefit, I made a C# library to make using the API extension easy with .NET. You can find it here: &lt;a href=&quot;https://www.nuget.org/packages/DougWare.OobaboogaAPIHelper/&quot;&gt;DougWare.OobaboogaAPIHelper 1.0.0&lt;/a&gt;. I will write more about this future another posts.  &lt;/p&gt;
&lt;p&gt;In the meantime, the source code is here: &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/OobaboogaAPIHelper&quot;&gt;ElumenotionSite/Projects/OobaboogaAPIHelper GitHub&lt;/a&gt;, and there is a console app that demos its use.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image7.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;Run Locally or in the Cloud&lt;/h2&gt;
&lt;p&gt;It makes my office warm as the NVIDIA RTX 4090 does its work, but I am getting very useful results right here at home. My friend pointed out that I don’t have to heat my house. There are many cloud VM hosting options that will give you the power you need for a month of dedicated time for less than the price of my desktop and power bill. A cloud VM with an NVIDIA A100 card is roughly twice as powerful as my desktop.&lt;br&gt;My next several posts will be all about this subject. There is no question that ChatGPT 3.5 and 4 are more powerful, but does that matter even now?  &lt;/p&gt;
&lt;h2&gt;Reddit and Discord Communities&lt;/h2&gt;
&lt;p&gt;There are many and one I especially enjoy at the moment is &lt;a href=&quot;https://www.reddit.com/r/LocalLLaMA/&quot;&gt;/r/LocalLLaMA&lt;/a&gt;. They aren’t all convinced open source has the upper hand. I however finding myself in agreement with /u/StriveForMediocrity.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OpenSourceVersusOpenAI/image8.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Having tested several models over the last few weeks I think it is at least plausible that open source AI is a better choice for many applications than the ironically named, but closed source, OpenAI.  &lt;/p&gt;
&lt;h1&gt;On the Other Hand…&lt;/h1&gt;
&lt;p&gt;It simply cannot be denied that the current best large language model at the moment is ChatGPT4. It is also one thing for me to use an entire GPU exclusively for myself and a completely different thing to build a system that can respond to a large user population at scale. &lt;br/&gt;&lt;br&gt;It’s an exciting time!&lt;br&gt;&lt;br/&gt;&lt;br&gt;--Doug Ware, June 5, 2023  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A moat is a defense against invaders, a mote is a tiny piece of substance such as this post&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>WritingByTalking</title><link>https://www.elumenotion.com/journal/writingbytalking/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/writingbytalking/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Speech to Text and Chat-GPT for Writing Authentic Content Quickly&lt;/h1&gt;
&lt;h2&gt;Reevaluating Speech-to-Text for Software Development and Writing&lt;/h2&gt;
&lt;p&gt;As someone who&amp;#39;s passionate about software and technology, I always strive to stay updated on new developments and adopt tools that can help me improve. A long time ago, I tried using Dragon Dictation and later, Windows&amp;#39; speech-to-text capabilities. Both were fascinating AI applications, but they required extensive training to yield good results and struggled with punctuation. These issues led to a less than ideal experience and caused me to overlook speech-to-text for many years.  &lt;/p&gt;
&lt;p&gt;Recently, I decided to reevaluate everything about my approach to software development, software architecture, and the surrounding processes. This includes reexamining fundamental tools like my keyboard and word processor. I&amp;#39;m writing this post using the Dictate button in Microsoft Word, a feature that&amp;#39;s been available in the Office suite for some time, but which I hadn&amp;#39;t used until today.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WritingByTalking/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;The Dictate button leverages the same software as Windows Speech in Windows 10 and 11, which can also be accessed through Voice Typing. While I&amp;#39;ve used Voice Typing before, I hadn&amp;#39;t tried it in Microsoft Word, nor had I used the auto-punctuation feature. I was pleasantly surprised to find that the initial output is quite accurate in terms of capitalization, albeit with a few stop words and my own somewhat disorganized thoughts.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WritingByTalking/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Instead of worrying about the rough draft, I plan to give this text to ChatGPT and ask it to clean it up for me, while dividing it into sections and preserving as much of the original text and voice as possible. Rather than having ChatGPT write an article for me, I&amp;#39;m asking it to help me write using my own words. I&amp;#39;ll then use the results in my workflow for formatting and adding images through PowerShell tools available in an associated GitHub repository.   &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WritingByTalking/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;In just 5 minutes of dictation, I was able to create a one-page draft using Microsoft Word&amp;#39;s Dictate button. I&amp;#39;m eager to see how ChatGPT cleans up the text, and I&amp;#39;ll provide links to the original file, the ChatGPT output, and the final product so you can see the progression. If you&amp;#39;re reading this article, you&amp;#39;ll know firsthand how it all turned out in the end.  &lt;/p&gt;
&lt;h1&gt;Evaluating the Results&lt;/h1&gt;
&lt;p&gt;Remember, my goal here was to write an article with my thoughts in my voice, not to ask ChatGPT a question and get an answer. Below you can see what I said and compare it to the ChatGPT output.   &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I think you’ll agree that the ideas are the same, the voice is the same, and the content came from me. I personally think this is the acid test. I am not passing off the creations of others and things as my own thoughts.&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WritingByTalking/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;What I Dictated&lt;/h2&gt;
&lt;p&gt;As someone who&amp;#39;s very interested in software and technology in general I do my best to stay abreast of new developments in technology and to adopt new tools that can help me whenever I can I&amp;#39;m always trying to get better a very long time ago I tried to use a product called dragon dictation which you may remember later on windows introduced speech to text capabilities in windows. Both of these were interesting uses of artificial intelligence but they both required a considerable amount of training in order to get good results and one thing they&amp;#39;ve always been bad at is punctuation&lt;/p&gt;
&lt;p&gt;These problems made it not a very good experience for me. And so I have to confess, I took my eyes off of Speech to text as a possible option for general computing. At least for me personally. And I did that for many, many years. &lt;/p&gt;
&lt;p&gt;When I say that, I&amp;#39;m reevaluating everything about how I do software development, software architecture, all of the things around the process. I mean everything. And that includes fundamental tools like. My keyboard. And my word processor. &lt;/p&gt;
&lt;p&gt;I&amp;#39;m writing this post by using the Dictate button in Microsoft Word, which you have available to you if you have Microsoft Office. And like I said at the top, I&amp;#39;ve taken my eyes off of this space. Years ago and not come back. And so I&amp;#39;m embarrassed to admit that even though this feature has been in Microsoft Office and all of the Office applications for a long time. I don&amp;#39;t really use them. Well, that&amp;#39;s not really quite honest. What I should say is I never really used it until today. When I sat down to write this post. &lt;/p&gt;
&lt;p&gt;I&amp;#39;m using the auto punctuation feature of the UH Office. Dictate, which is essentially the same software known as Windows Speech in Windows 10 and Windows 11, and in Windows 11 you can access it through a feature called Voice typing. So I&amp;#39;ve used voice typing before. But not in Microsoft Word and not with auto punctuation. &lt;/p&gt;
&lt;p&gt;I have to say that the first cut of the. What I&amp;#39;m saying to Microsoft Word is is showing up in this document pretty well. It&amp;#39;s fairly well capitalized, but it has some of my stop words in it and. It&amp;#39;s, you know, a little haphazard in terms of my thinking. Um, So what? I&amp;#39;m. Trying to tell you is that I don&amp;#39;t. Really worry about that. And I don&amp;#39;t need to really worry about that because I&amp;#39;m gonna take this. Intermediate product which is pretty rough. And I&amp;#39;m going to give it to ChatGPT and ask it to clean it up for me. Divided up into sections. And then? Add the text back into the sections, but I&amp;#39;m going to explicitly tell it that I want to preserve as much of the original text and voice as possible. Because I&amp;#39;m not asking ChatGPT to write an article for me. I&amp;#39;m asking you to help me write an article. I&amp;#39;m not asking ChatGPT to put words in my mouth. I&amp;#39;m asking ChatGPT to use my words. I&amp;#39;ll take the results of that and pass it through the rest of my workflow, which will let me do some formatting and add images using some PowerShell tools that are in this associated GitHub repository. And I&amp;#39;m going to write an article about those specifically soon and how to use them. Um, but in the meantime? This is the point in my article where I&amp;#39;m going to stop using, uh, the Dictate button in Microsoft Word, and I&amp;#39;m going to let ChatGPT clean it up. In the final post I&amp;#39;ll put links to this original file so you can see what it looks like, as well as what ChatGPT produced and of course. If you&amp;#39;re reading this article, you know what the final product actually looked like, how it turned out the other end. OK, so. I now have one page of text in Word. And I spent. Maybe 5 minutes. Dictating the words to create the first draft.  &lt;/p&gt;
&lt;h2&gt;My Prompt&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/WritingByTalking/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h2&gt;The Reply&lt;/h2&gt;
&lt;p&gt;Title: Reevaluating Speech-to-Text for Software Development and Writing&lt;/p&gt;
&lt;p&gt;Introduction: As someone who&amp;#39;s passionate about software and technology, I always strive to stay updated on new developments and adopt tools that can help me improve. A long time ago, I tried using Dragon Dictation and later, Windows&amp;#39; speech-to-text capabilities. Both were fascinating AI applications, but they required extensive training to yield good results and struggled with punctuation. These issues led to a less than ideal experience and caused me to overlook speech-to-text for many years. &lt;/p&gt;
&lt;p&gt;Reevaluating Speech-to-Text: Recently, I decided to reevaluate everything about my approach to software development, software architecture, and the surrounding processes. This includes reexamining fundamental tools like my keyboard and word processor. I&amp;#39;m writing this post using the Dictate button in Microsoft Word, a feature that&amp;#39;s been  available in the Office suite for some time, but which I hadn&amp;#39;t used until today. &lt;/p&gt;
&lt;p&gt;Using Dictate in Microsoft Word: The Dictate button leverages the same software as Windows Speech in Windows 10 and 11, which can also be accessed through Voice Typing. While I&amp;#39;ve used Voice Typing before, I hadn&amp;#39;t tried it in Microsoft Word, nor had I used the auto-punctuation feature. I was pleasantly surprised to find that the initial output is quite accurate in terms of capitalization, albeit with a few stop words and somewhat disorganized thoughts. &lt;/p&gt;
&lt;p&gt;Leveraging ChatGPT to Refine the Text: Instead of worrying about the rough draft, I plan to give this text to ChatGPT and ask it to clean it up for me, while dividing it into sections and preserving as much of the original text and voice as possible. Rather than having ChatGPT write an article for me, I&amp;#39;m asking it to help me write using my own words. I&amp;#39;ll then use the results in my workflow for formatting and adding images through PowerShell tools available in an associated GitHub repository. Soon, I&amp;#39;ll write a dedicated article on how to use these tools. &lt;/p&gt;
&lt;p&gt;Conclusion: In just 5 minutes of dictation, I was able to create a one-page draft using Microsoft Word&amp;#39;s Dictate button. I&amp;#39;m eager to see how ChatGPT cleans up the text, and I&amp;#39;ll provide links to the original file, the ChatGPT output, and the final product so you can see the progression. If you&amp;#39;re reading this article, you&amp;#39;ll know firsthand how it all turned out in the end.&lt;br&gt;&lt;br/&gt;&lt;br&gt;--Doug Ware, April 18, 2023&lt;/p&gt;
</content:encoded></item><item><title>OobaboogaAPIHelper</title><link>https://www.elumenotion.com/projects/oobaboogaapihelper/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/oobaboogaapihelper/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;OobaboogaAPIHelper&lt;/h1&gt;
&lt;p&gt;OobaboogaAPIHelper is a .NET library available on &lt;a href=&quot;https://www.nuget.org/packages/DougWare.OobaboogaAPIHelper&quot;&gt;nuget.org&lt;/a&gt;. This class library makes it easy to consume the &lt;a href=&quot;https://github.com/oobabooga/text-generation-webui&quot;&gt;Oobabooga Text Generation Web UI’s&lt;/a&gt; &lt;a href=&quot;https://github.com/oobabooga/text-generation-webui/tree/60bfd0b7223ea5c150fec075464e2a689d6b29c6/extensions/api&quot;&gt;API extension&lt;/a&gt;. Key features include: prompt templates for Vicuna 1,0, 1.1, Dolly v2, and basic LLama with a base class that is easy to extend, converstaion helpers to easily convert saved converstaions created with one model and/or prompt template for use with other models, model parameters and presets, and token counting to make it easy to fit your model&amp;#39;s context size limits.  &lt;/p&gt;
&lt;h1&gt;Why?&lt;/h1&gt;
&lt;p&gt;Converting the python in Oobabooga Text Generation Web UI to C# was a good way for me to learn what happens in the Web UI Gradio app under the covers. The library contains:   &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each of the Web UI presets (at the time of this writing)&lt;/li&gt;
&lt;li&gt;Models for generating requests with documentation of each property&lt;/li&gt;
&lt;li&gt;Methods for &lt;strong&gt;/api/v1/generate&lt;/strong&gt; and &lt;strong&gt;/api/v1/token-count&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Prompt templates for Vicuna, Dolly, and Llama models and a base class that is easy to use and extend for your own prompt templates&lt;/li&gt;
&lt;li&gt;Conversation helpers that make it easy to save and reuse conversations including token counts with different prompt templates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Source, sample console app and unit tests are in &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/OobaboogaAPIHelper&quot;&gt;github&lt;/a&gt;&lt;br&gt;Classes and methods are &lt;a href=&quot;https://www.elumenotion.com/api/OobaboogaAPIHelper.html&quot;&gt;documented here&lt;/a&gt;  &lt;/p&gt;
&lt;h1&gt;Console Sample&lt;/h1&gt;
&lt;p&gt;First start Text Generation Web UI and enable the &lt;strong&gt;api&lt;/strong&gt; extension.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OobaboogaAPIHelper/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Make sure you can chat in the browser and that the api extension is loaded. The console sample will work with minimal effort.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/OobaboogaAPIHelper/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;br/&gt;  
But, you do need to make sure you **set the promptTemplate to match the model you have loaded in Web UI**!  

  
&lt;p&gt;&lt;img src=&quot;/images/OobaboogaAPIHelper/image3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded></item><item><title>WeightRandoms</title><link>https://www.elumenotion.com/projects/weightrandoms/</link><guid isPermaLink="true">https://www.elumenotion.com/projects/weightrandoms/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Weight Randoms&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/WeightRandoms/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;Background and Summary&lt;/h1&gt;
&lt;h2&gt;Building a Solution Using AI Tools&lt;/h2&gt;
&lt;p&gt;The purpose of this site and my own experiments is to give myself and any others who honor me by reading this a conceptual basis for using AI in software development. My first experimental scenario is for a random number algorithm I will be using in a game I am developing.  &lt;/p&gt;
&lt;p&gt;I chose this scenario because it is conceptually simple, and it uses concepts from basic statistics. The algorithm and the tests can be implemented in any language using the prompts in the &lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/WeightedRandoms/PromptsAndResults&quot;&gt;github repo&lt;/a&gt;. The prompts themselves are a useful baseline for comparing different AI agents. I think it’s too early to call them benchmarks but I can’t be the only one doing this. So, perhaps the thinking will feed into something more formal.  &lt;/p&gt;
&lt;h2&gt;About this Article&lt;/h2&gt;
&lt;p&gt;This article is to introduce the project and its elements. I am resisting the temptation to start commenting on the details of the process or my conclusions because this is a chapter, not the book. This is the first of several articles about the Weighted Randoms project. I hope you enjoy the series.  &lt;/p&gt;
&lt;h2&gt;Project Elements&lt;/h2&gt;
&lt;p&gt;I made everything in this project with AI assistance. The assistants were:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bing AI&lt;/li&gt;
&lt;li&gt;ChatGPT (3.5 and 4)&lt;/li&gt;
&lt;li&gt;Github Copilot in Visual Studio Code and Visual Studio 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It demonstrates:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conceptual prototyping&lt;/li&gt;
&lt;li&gt;Generating user stories using AI&lt;/li&gt;
&lt;li&gt;Generating unit tests&lt;/li&gt;
&lt;li&gt;Improving the code quality with comments, exception handling, input validation and logging&lt;/li&gt;
&lt;li&gt;Visualizing output using Jupyter notebooks and Python&lt;/li&gt;
&lt;li&gt;Refactoring the results into a larger solution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My current plan is to write individual articles on each of these topics.  &lt;/p&gt;
&lt;h2&gt;Weighted Random Selection for Games&lt;/h2&gt;
&lt;p&gt;The WeightedRandomSelection class provides a powerful method for selecting an item from a list based on a weighted random selection algorithm. It utilizes a normal distribution to assign weights to each item, which can be customized by adjusting the peak position, center height, and standard deviation scaling factor of the curve.&lt;br&gt;This algorithm is particularly useful in the context of game engines, where it can be used to select opponents, power-ups, or other game elements based on their difficulty or rarity. The user can adjust the parameters to create a more challenging or exciting gameplay experience, while the input validation ensures that the algorithm functions correctly.&lt;br&gt;In addition, the algorithm includes an efficient weight calculation method to handle lists of any type, as well as a random number generator for item selection. The user can also adjust the parameters to create a &amp;quot;sliding&amp;quot; list, skewing the curve to select items based on their position within the list.  &lt;/p&gt;
&lt;h1&gt;Understanding the Algorithm&lt;/h1&gt;
&lt;h2&gt;Visual Examples&lt;/h2&gt;
&lt;p&gt;The following picture illustrates the basic capability of the algorithm. I made it by plotting test results in a Jupyter notebook with Python and I wrote the code with the assistance of ChatGPT.  &lt;/p&gt;
&lt;p&gt;One way to use the algorithm is to change the peak of the curve. The first series (red) shows a curve where all items have similar weights and are equally likely. The last series (yellow) shows a curve where items in the center are much more likely to be selected.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WeightRandoms/image2.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Another way to use the algorithm is to change the standard deviation by applying a scale factor. The first series (red) shows a curve where the scale is very small, 0.1. This has the effect of flattening the curve even when the height is set to the maximum. The last series (yellow) shows a curve where items in the center are the only items with any chance of being selected.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WeightRandoms/image3.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;A third way to use the algorithm is to change the center of the curve. In this example, items at the beginning of the list are most likely to be selected.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WeightRandoms/image4.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;p&gt;Finally, you can combine these options to tune the effects. This example shows how you might make a list where only the first couple items are ever selected, and you could slide the selection window by changing the center based on circumstances such as a player’s level.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/WeightRandoms/image5.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;Project Inventory&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/WeightedRandoms/PromptsAndResults&quot;&gt;Prompts and user stories&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/WeightedRandoms/WeightedRandoms&quot;&gt;Main Solution&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/WeightedRandoms/Tests&quot;&gt;Unit Tests&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/tree/master/Projects/WeightedRandoms/Weights&quot;&gt;CSV Export for Visualization&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/douglasware/ElumenotionSite/blob/master/Projects/WeightedRandoms/visualizer.ipynb&quot;&gt;Jupyter Notebook&lt;/a&gt;  &lt;/p&gt;
&lt;h1&gt;Additional Notes&lt;/h1&gt;
&lt;p&gt;You can use either Visual Studio Code or Visual Studio depending on your preferences&lt;br&gt;You will also need Python and the associated packages if you want to work with the notebook interactively. You can get started &lt;a href=&quot;https://code.visualstudio.com/docs/datascience/jupyter-notebooks&quot;&gt;here&lt;/a&gt;&lt;br&gt;The easiest way to follow changes to this project is via the ‘Watch’ feature in github&lt;/p&gt;
</content:encoded></item><item><title>AboutMe</title><link>https://www.elumenotion.com/featured/aboutme/</link><guid isPermaLink="true">https://www.elumenotion.com/featured/aboutme/</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;About Me&lt;/h1&gt;
&lt;p&gt;Hello, I&amp;#39;m Doug Ware, and welcome to the &amp;quot;About Me&amp;quot; page of Elumenotion. As a passionate software developer and cloud solutions architect, I&amp;#39;ve built my career around technology and innovation. Working with various companies, from startups to multinational corporations, I currently lead the architecture function for global systems, managing large teams and specialized architects.  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/AboutMe/image1.png&quot; alt=&quot;&quot;&gt;  &lt;/p&gt;
&lt;h1&gt;My Background&lt;/h1&gt;
&lt;p&gt;With over a decade of experience in the software industry, I&amp;#39;ve actively participated in numerous aspects of the business, including management and sales. My expertise centers on delivering cloud-native production systems on Microsoft Azure and Office 365, and I&amp;#39;ve had the opportunity to collaborate with major clients such as McKesson, Microsoft, PwC, and EY.&lt;/p&gt;
&lt;p&gt;In addition to my professional experience, I engage with the tech community. For over ten years, I ran the Atlanta .NET User Group, and I played a core role in organizing Atlanta Code Camp and Atlanta SharePoint Saturday for many years. Microsoft has recognized my contributions as a Microsoft Most Valuable Professional for Office Servers and Services from 2011 to 2019.  &lt;/p&gt;
&lt;h1&gt;My Interests&lt;/h1&gt;
&lt;p&gt;My interests stretch beyond software development. I&amp;#39;m an advocate for AI as a medium for better communication and knowledge management, and I am actively using AI tools, such as Chat-GPT, in my work outside of my day job and look forward to being able to use them to build the kind of massive systems we make at EY. Some of my other passions include hydroponic gardening, photography, drones, 3D printing, virtual reality, and VR fitness. In fact, I&amp;#39;m an avid Beat Saber player and have lost over 40 pounds to date!&lt;/p&gt;
&lt;p&gt;As we journey together through Elumenotion, I look forward to sharing my thoughts, experiences, and knowledge with you. Together, we can explore the rapidly changing world of technology and learn how to harness these changes for a brighter future.&lt;/p&gt;
&lt;p&gt;Thank you for taking the time to learn more about me, and I hope you enjoy your time here at Elumenotion.&lt;/p&gt;
&lt;p&gt;--Doug  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/AboutMe/image2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded></item><item><title>SpeechDictation2</title><link>https://www.elumenotion.com/journal/speechdictation2/</link><guid isPermaLink="true">https://www.elumenotion.com/journal/speechdictation2/</guid><pubDate>Sun, 16 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Exploring Out of the Box AI Tools in Windows 11 for Writing and Dictation&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/images/FromDallE/voicedictation.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Windows Speech Recognition&lt;/h2&gt;
&lt;p&gt;I began my journey by exploring Windows Speech Recognition, one of the oldest AI tools available. After going through multiple rounds of training the system, I found that its dictation capabilities had improved significantly. However, its performance out of the box was considerably worse than expected, which led me to search for alternatives.&lt;/p&gt;
&lt;h2&gt;Voice Typing: A Better Alternative&lt;/h2&gt;
&lt;p&gt;I eventually switched to Voice Typing, a newer feature that performed much better with minimal training. Although it lacks some functionality compared to Windows Speech Recognition, it perfectly suited my needs and automatically added punctuation. Voice Typing allowed me to easily interact with ChatGPT, which kept up with my conversation history effectively.&lt;/p&gt;
&lt;h2&gt;Bing, Copilot, and ChatGPT: Comparing AI Tools&lt;/h2&gt;
&lt;p&gt;To thoroughly evaluate AI tools, I used ChatGPT alongside Bing and Copilot, comparing their pros and cons against each other. This comprehensive evaluation was not limited to just these three tools, as I aimed to explore various AI solutions to find the best fit for my needs.&lt;/p&gt;
&lt;h2&gt;Potential Office Application Integration&lt;/h2&gt;
&lt;p&gt;As someone familiar with building Office applications, I considered creating an add-in that would allow me to select content in a Word document and send it directly to ChatGPT as a prompt. While this could be a fun hobby project for the future, I&amp;#39;m currently focused on several other exciting endeavors, including the creation of a new website to host my content and future articles.&lt;/p&gt;
&lt;h2&gt;The Future of AI-Assisted Writing and Conclusion&lt;/h2&gt;
&lt;p&gt;I anticipate that Microsoft&amp;#39;s Copilot offerings will soon bridge many of the gaps between AI tools, allowing for more seamless integration and faster document creation. By combining Voice Typing and AI assistants, users will be able to dictate rough drafts without worrying about errors and rely on AI to produce polished, professional content.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s worth noting that the text you are reading was created and formatted into markdown by ChatGPT-4 from a rough transcript that I generated using Voice Typing in Microsoft Word. All of the ideas are mine and a few of the sentences match the transcript exactly. This demonstrates the potential of combining AI tools to streamline workflows and produce high-quality content with ease.&lt;/p&gt;
</content:encoded></item><item><title>Welcome</title><link>https://www.elumenotion.com/featured/welcome/</link><guid isPermaLink="true">https://www.elumenotion.com/featured/welcome/</guid><pubDate>Sun, 16 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Welcome to Elumenotion&lt;/h1&gt;
&lt;p&gt;Hello, I&amp;#39;m Doug Ware. Welcome to Elumenotion. Here, I&amp;#39;ll share my thoughts and experiences on a wide range of topics that interest me. As someone who leads the architecture function for global systems with large teams and specialized architects, I make a habit of staying active in software development outside of work. I believe that AI tools will fundamentally change &lt;strong&gt;everything&lt;/strong&gt; about how software is conceived, designed, built, tested, deployed, and managed. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EVERYTHING!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#39;s why I&amp;#39;m actively using AI in my processes and incorporating it into a game I&amp;#39;m building. You&amp;#39;ll find frequent updates on the game and its construction right here on Elumenotion.&lt;/p&gt;
&lt;p&gt;But, my interests go beyond AI in software development. I&amp;#39;m also passionate about AI as a medium for better communication and knowledge management. 
In fact, I&amp;#39;m using Chat-GPT to help write the content for this website based on my instructions. 
My other interests include hydroponic gardening, photography, drones, 3D printing, and especially virtual reality and VR fitness. As an avid Beat Saber player, I&amp;#39;ve lost over 40 pounds to date!&lt;/p&gt;
&lt;p&gt;The name &lt;strong&gt;Elumenotion&lt;/strong&gt; has been with me for many years. It was the name of my company and blog, and it&amp;#39;s a play on &amp;quot;Bright Ideas.&amp;quot; 
I think the name is especially appropriate given how much I expect technologies like AI, VR, and computer vision to usher in a bright new world. 
At the same time, everything is very scary because the amount of change will be very disruptive. 
I&amp;#39;m creating this site to talk about real work and examples to help people navigate these changes successfully and to thrive as human beings!&lt;/p&gt;
&lt;p&gt;Join me as we explore the exciting and often challenging world of emerging technologies, and together, let&amp;#39;s discover how we can embrace these changes and create a brighter future.&lt;/p&gt;
&lt;p&gt;Thank you for visiting Elumenotion, and I look forward to sharing my journey with you.&lt;/p&gt;
</content:encoded></item></channel></rss>