<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>BradHugh's WebLog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/brad_hughes/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/brad_hughes/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 20 Feb 2018 21:22:04 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Understanding Migration Concurrency</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/understanding-migration-concurrency</link>
      <pubDate>Tue, 03 Oct 2017 14:48:48 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/?p=305</guid>
      <description><![CDATA[A common source of confusion for customers using MRS and Migration Service to perform migrations...]]></description>
      <content:encoded><![CDATA[A common source of confusion for customers using MRS and Migration Service to perform migrations into Exchange Online is migration concurrency.  The most basic definition of migration concurrency is the number of moves that are allowed to run at the same time against a particular migration endpoint.

It makes sense that all on-premises environments are different and so the tenant admin needs to configure the number of moves to run at the same time that his particular on-premises environment can support.  This value is not intended to be a throttle that keeps customers from being able to migrate to the service; instead it is a configuration setting that allows the tenant admin to tune the amount of migrations (and thus load) specific to his environment.

<strong>The configuration:</strong>

Migration Endpoints are a representation in Office 365 of on-premises MRS Proxy endpoints. For many customers, a single migration endpoint will be sufficient, but others will have multiple migration endpoints when they are migrating from multiple geographic locations.  For example, there may be a US endpoint, a France endpoint, and a Japan endpoint.

Migration concurrency is controlled per-endpoint.  There are two relevant values here: MaxConcurrentMigrations and MaxConcurrentIncrementalSyncs.

<strong>MaxConcurrentMigrations</strong>: Controls the approximate number of concurrent moves that will run against this endpoint during the initial data copy phase (Initial Sync).

<strong>MaxConcurrentIncrementalSyncs</strong>: Controls the approximate number of concurrent moves that will run against this endpoint during phases after the initial data copy including incremental sync and finalization.

These are independent buckets and one does not take away from another.  If a move has not yet completed initial sync, it uses a slot from MaxConcurrentMigrations, otherwise it uses a slot from MaxConcurrentIncrementalSyncs.

<strong>Tenant-level maximums:</strong>

There is also a value called MaxConcurrentMigrations that is visible in Get-MigrationConfig in Office365.  <strong>This value does not impact migrations directly</strong>.  Instead, it simply controls what values you can set on your individual migration endpoints using the Exchange Admin Center or Set-MigrationEndpoint.  By default, this value is 300 which is sufficient for the vast majority of customer migrations, but it can be raised by support up to 1000. However, be warned <strong><em>higher concurrency does not guarantee better migration throughput; there will be a "sweet spot" for each environment and it will require some experimentation.</em></strong><em></em>  Remember also, this value has no effect by itself; it simply allows you to configure higher values on your migration endpoints.  For instance, the default value of 300 would allow you to set MaxConcurrentMigrations to 100 on 3 migration endpoints (total 300), etc.

<strong>FAQ:</strong>

Q: What are the recommended settings for MaxConcurrentMigrations for my environment?
A: Each environment is different. You'll need to experiment to find the right value with the best throughput for your source environment.

Q: Won't increasing the tenant-level MaxConcurrentMigrations make my migrations faster?
A: No. The tenant-level MaxConcurrentMigrations setting has no direct impact on migrations.  It only influences the values you are allowed to configure on the individual migration endpoints. The migration endpoint values are what control concurrency during migration.

Q: Why do I see all these moves with the StatusDetail of moves with StalledDueToSource_EndpointCapacityExceeded?
A: This isn't actually a problem. This is a status that you may see on moves when they are simply waiting for their turn to run (a migration endpoint concurrency slot).  You can think of it as "queued".

Q: Is there a tenant-level MaxConcurrentIncrementalSyncs value too?
A: No, only MaxConcurrentMigrations. MaxConcurrentIncrementalSyncs is limited by the cmdlet to be less than or equal to the MaxConcurrentMigrations value on that same endpoint.

Q: When attempting to "complete" moves, they stick in the state StalledDueToSource_EndpointCapacityExceeded more than when doing normal migrations.  Any idea why?
A: Your MaxConcurrentIncrementalSyncs value is probably set too low on the endpoint.  Remember, completing (or finalizing) moves uses a slot from MaxConcurrentIncrementalSyncs (not from MaxConcurrentMigrations).

I hope this helps provide some understanding around migration concurrency as it seems to be a very confusing topic for many customers.

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>It's always the Load Balancer</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/its-always-the-load-balancer</link>
      <pubDate>Tue, 21 Feb 2017 16:44:07 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/?p=285</guid>
      <description><![CDATA[Ok, this is probably an (intentionally) inflammatory title, but in this case, it's absolutely...]]></description>
      <content:encoded><![CDATA[Ok, this is probably an (intentionally) inflammatory title, but in this case, it's absolutely true.

A common Exchange Online migration issue we see is the SourceMailboxAlreadyBeingMovedTransientException which <a href="https://blogs.msdn.microsoft.com/brad_hughes/2016/12/16/source-mailbox-already-being-moved-errors-while-moving-mailboxes/">I previously blogged about</a>.  One of the most common reasons we see for this error is a communications error (found using the command in the previous blog) that looks like this:
<pre>CommunicationErrorTransientException: The call to 'https://MRSPROXYHOST/EWS/mrsproxy.svc SERVER.domain.com (14.3.178.0 caps:05FFFF)' failed.
Error details: The remote endpoint no longer recognizes this sequence. This is most likely due to an abort on the remote endpoint. The value of wsrm:Identifier is not a known Sequence identifier. The reliable session was faulted.</pre>
The reason you see this is because MRS Proxy uses WCF's implementation of reliable sessions.  In this scenario each request is sequenced (numbered) and the current (expected) sequence number is held in memory in MRS Proxy (In 2010 on the Client Access Server).  The reason for the error is that the request was sent to a different CAS than was previously being used (and thus the new CAS didn't know about the previous sequence).  In Exchange 2010, we require HTTP(s) sessions for MRS Proxy to be sticky to a particular CAS (also referred to as persistence or affinity).  It also needed to be client IP-based persistence because the MRS Proxy client component doesn't actually store and persist cookies, rendering all forms cookie-based affinity useless.  Additionally, since MRS Proxy connections use NTLM authentication, you can't do persistence on the Authorization HTTP header.  If you see this error, it's almost certainly the load balancer not maintaining persistence.  You'll see this primarily when migrating from Exchange 2010 because Exchange 2013 and later doesn't require load balancer persistence.

Hope this helps.]]></content:encoded>
    </item>
    <item>
      <title>Source mailbox already being moved errors while moving mailboxes</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/source-mailbox-already-being-moved-errors-while-moving-mailboxes</link>
      <pubDate>Fri, 16 Dec 2016 18:12:32 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/?p=265</guid>
      <description><![CDATA[It's been a long time since I wrote a blog post, but this one comes up a lot so I figured I'd do a...]]></description>
      <content:encoded><![CDATA[It's been a long time since I wrote a blog post, but this one comes up a lot so I figured I'd do a write-up on it.

When moving mailboxes using to Exchange 2010, Exchange 2013, Exchange 2016, or Exchange Online (Office 365), a common error you can hit is SourceMailboxAlreadyBeingMovedTransientException.  What this appears to means is that the source mailbox is currently locked for another move and you can't start another one.  In reality, it's a bit simpler and more complex at the same time.

When moving a mailbox, the Mailbox Replication Service (MRS) sets a "InTransitStatus" flag in the source mailbox to make sure other moves don't try to act on this source mailbox at the same time.  This flag is really just held in memory in the source Information Store (Store) process (Store.exe for 2010 and Microsoft.Exchange.Store.Worker.exe for 2013 and 2016).  This way, if a different MRS instance attempts to move the mailbox it will receive an error until this "lock" is released.  This flag doesn't have to be reset explicitly, but will be released when the Exchange RPC session between the on-premises MRS Proxy and the source mailbox Store is closed.

MRS Proxy (for those who aren't familiar) is a Windows Communication Foundation (WCF) web service exposed for moving mailboxes in Exchange 2010 and later.  It runs on-premises and is hosted at /EWS/MRSProxy.svc however it's actually not part of Exchange Web Services (EWS) at all.  In Exchange 2010, it is a WCF web service hosted in IIS by the ServiceAppPool w3wp.exe instance on Client Access Servers in the environment.  In Exchange 2013 and 2016, it is a WCF web service hosted inside the Mailbox Replication Service (MSExchangeReplication.exe) on the Mailbox servers in the environment.  The 2013/2016 CAS servers simply proxy the HTTP traffic to this back-end web service.  This is why MRSProxy config settings for 2010 are in the web.config for EWS on the CAS but in 2016 they are in the MRS Service configuration file (MSExchangeMailboxReplication.exe.config) on the mailbox servers.

This session-based locking scheme all works fine until you hit an error.  Networks are full of traffic, and hitting transient errors is inevitable. When the cloud MRS service hits a communication error with the on-premises MRS proxy, it has to recreate the WCF reliable session it had previously established; however, the associated RPC session is left behind.  Since the source on-premises MRS proxy may not even know that the cloud MRS encountered this error, the session sticks around and so does the InTransitStatus flag in the source Store.  The cloud MRS has retry logic for transient errors, so within a short period it will try to resume the move on a new WCF reliable session.  Since the old session hasn't expired on the source Store, you get a SourceMailboxAlreadyBeingMovedTransientException. You can see this if you were to look in the move report.  And since that flag is tied to the RPC session between on-premises MRS Proxy and the Store, it is intimately tied to the normal keep-alive behavior of Windows TCP sessions (specifically <a href="https://technet.microsoft.com/en-us/library/cc957549.aspx">KeepAliveTime</a>).  By default in Windows, this KeepAliveTime is set to 2 hours, but the cloud MRS is going to retry the move every few minutes.  This can accumulate a ton of SourceMailboxAlreadyBeingMovedTransientException errors before the move can resume and can slow down your move tremendously.

To recover from these errors faster, we recommend setting the KeepAliveTime on the server hosting the source mailbox to 5 minutes (instead of 2 hours).  This can be <a href="https://technet.microsoft.com/en-us/library/cc957549.aspx">done in the registry</a> of the source mailbox server but requires a reboot to take effect.

<strong>Important:</strong> If you're getting these errors frequently it probably means you're hitting other transient exceptions right before these errors start.  This error is never the actual problem, just a symptom of another problem that already happened.  A good way to see the cause for a string of these errors is to look at the failure right before it.  You could do something like this in Exchange Management Shell:
<p class="code">$stats = Get-MoveRequestStatistics &lt;user&gt; -IncludeReport
$firstMailboxLockedError = $stats.Report.Failures | where { $_.FailureType -eq 'SourceMailboxAlreadyBeingMovedTransientException' } | Select -First 1
$stats.Report.Failures | sort Timestamp -Descending | where { $_.Timestamp -lt $firstMailboxLockedError.Timestamp } | Select -First 1 | fl</p>
Hope this helps understanding this error.

Update 2/21/2017: Created a new post for a common root cause of this error: <a href="https://blogs.msdn.microsoft.com/brad_hughes/2017/02/21/its-always-the-load-balancer/">It's always the Load Balancer</a>]]></content:encoded>
    </item>
    <item>
      <title>Internet Explorer 8 impacts OWA Load Balancing Scenarios</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/internet-explorer-8-impacts-owa-load-balancing-scenarios</link>
      <pubDate>Thu, 15 Oct 2009 10:09:21 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2009/10/15/internet-explorer-8-impacts-owa-load-balancing-scenarios/</guid>
      <description><![CDATA[Recently we’ve had several issues reported regarding Internet Explorer 8 and Outlook Web Access load...]]></description>
      <content:encoded><![CDATA[<p>Recently we’ve had several issues reported regarding Internet Explorer 8 and Outlook Web Access load balancing scenarios.</p>  <p>Here are the scenarios we’ve identified so far:</p>  <ul>   <li>DNS Round robin load balancing when DNS TTL expires </li>    <li>DNS Round robin load balancing when outbound HTTP Proxy servers are used </li>    <li>SSL Session-ID persistence with a hardware load balancer </li> </ul>  <p>The reason that each one of these scenarios occur is because of the new “LCIE” or “Tab Process” model in Internet Explorer 8.&#160; Essentially Internet Explorer 8 can create new “tab processes” for new browser tabs or browser windows that are opened.&#160; It doesn’t do this for every tab or window but uses an internal algorithm to determine whether or not it should spin up a new process.&#160; </p>  <p>For a detailed description of the new architecture, see the following two posts:    <br /><a href="https://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx">IE8 and Loosely-Coupled IE (LCIE)</a>     <br /><a href="https://blogs.msdn.com/askie/archive/2009/03/09/opening-a-new-tab-may-launch-a-new-process-with-internet-explorer-8-0.aspx">Opening a New Tab may launch a New Process with Internet Explorer 8.0</a></p>  <p>Due to the new architecture certain things such as kept-alive connections and SSL sessions are not shared between Tab Processes.&#160; This plays an important role in the scenarios we have found.&#160; </p>  <p>In advance: Yes, I know it’s not called an “OWA Server” – I’m calling it that to make this work for Exchange 2003 or Exchange 2007.</p>  <p>The design of Forms Based Authentication in Outlook Web Access is another contributing factor.&#160; Forms based authentication works by the OWA server storing a cookie in the client browser for authentication.&#160; This cookie contains the encrypted credentials of the user that the OWA server can translate into basic authentication credentials for IIS with each new request.&#160; However this cookie is encrypted by a key that is maintained (and rotated) in memory only on the OWA server that set the cookie.&#160; For instance if a client logs into Server A and receives a cookie from Server A, it cannot use that same cookie to authenticate to Server B because Server B does not have they key to decrypt the credentials.&#160; If you do try to present a cookie from Server A to Server B, your browser will be redirected to the login page on Server B to provide valid authentication.</p>  <p>That explanation given, here is a brief explanation of the behavior you may see in each scenario.</p>  <p><strong>DNS Round robin load balancing when DNS TTL expires</strong></p>  <p>If you use DNS round robin load balancing for Outlook Web Access, you may experience confusing client behavior when the DNS time to live values expires on the record.&#160; The scenario usually manifests itself like this:</p>  <p>You are logged into OWA (with forms authentication) when the DNS TTL expires.&#160; If you continue to work within the main OWA window, you should be able to continue to work within the main OWA window, you should be able to continue to work and not be logged out.&#160; This is because IE uses it’s kept-alive connections that are already established to the original OWA server.&#160; However if you open a number of email messages in new windows (double-click mail messages), a new tab process for iexplore.exe will be created.&#160; This new tab process will have to create a new TCP session that, when resolved by Winsock, returns the IP address of a different OWA server in the DNS round robin.&#160; When this new window opens, you will be redirected to the forms authentication login page.&#160; If you provide your credentials to the “new” server, you will in-turn get logged out of the “main” OWA window that still has a persistent connection to the “old” server. And the next time you spin up a new tab process, the experience starts over again.&#160; </p>  <p>So needless to say, it’s a confusing user experience and the only way to recover is to close all browser windows, restart IE and log back in to OWA.</p>  <p><strong>DNS Round robin load balancing when outbound HTTP Proxy servers are used</strong></p>  <p>If you use DNS round robin load balancing for Outlook Web Access, you may experience being logged out randomly with Outlook Web Access.&#160; This is really due to the same behavior as above except instead of the name resolution happening on the client, it happens on the proxy server.&#160; Since proxy sessions are not maintained across tab processes, new outbound connections will also be established from the proxy server.&#160; Since many users may be accessing the same DNS name through the same proxy server, the TTL expiration may seem completely random.</p>  <p><strong>SSL Session-ID persistence with a hardware load balancer</strong></p>  <p>If you are using SSL session-id based persistence on your hardware load balancer, you may experience the same behavior as above except in a more severe form.&#160; In this situation the new connections that are established by the new tab process are routed to a different OWA server by the load balancer.&#160; This will happen <em>every</em> time a new tab process is spawned, not just at some arbitrary interval making this by far the worst of the experiences.</p>  <p><strong>Workarounds and Solutions</strong></p>  <p>We’ll start with the easy one: <em>SSL Session-ID persistence</em>.&#160; Because of issues (just like this) where the SSL session-id changes, SSL session-id based persistence is not (and has never been) a supported persistence method for load balancing Outlook Web Access.&#160; In fact, there aren’t really any Exchange Services for which we support or recommend SSL session-id based persistence (<strong>Edit</strong>: <em>Obviously for services that don’t require persistence at all such as ActiveSync and certain Outlook Anywhere configurations, you can use SSL-ID based persistence to keep the SSL handshakes to a minimum</em>).&#160; The supported persistence methods for Outlook Web Access are Client-IP based or Cookie-based persistence.&#160; In certain situations where many clients are coming from the same IP (maybe a proxy server), cookie-based persistence is a much better solution than client-ip based persistence to get the load spread evenly.&#160; Be aware that Outlook Web Access is the only Exchange web service that can use cookie-based persistence.</p>  <p>For <em>DNS round-robin</em> the answer is a bit more complicated.&#160; We’ve never really <em>recommended</em> DNS round robin for load balancing, but it technically <em>is</em> supported.&#160; Typically we just outline the caveats like the reliance on the client-side DNS resolver cache and the fact that it gives you zero redundancy in the case of a service failure.&#160; However with all this guidance, many folks still see this as the poor man’s load balancer and implement it anyway.&#160; If you are experiencing this issue, I strongly recommend you move to a real load balancing solution whether this is Windows NLB, the load balancing built-in to ISA Server 2006+, or a hardware-based load balancer.&#160; If you can’t or won’t, this is something you’ll have to live with for now.&#160; You can work around this issue by setting the TabProcGrowth registry value for the IE browser to 1 (It’s mentioned in the second of the earlier linked IE blogs).&#160; However, this isn’t feasible in most situations because you have little control over the client-base.</p>  <p>We are currently pursuing a design change request with the Internet Explorer team to see if we can make any of these experiences more consistent with the IE7 behavior.&#160; However, since changes in this area can be very risky, we may have to live with this new behavior.&#160; After all, it’s not a bug, it’s just an effect of the change in design for IE8.</p>  <p>Thanks to everyone for reading, and special thanks to John Towler for reporting this.</p>]]></content:encoded>
    </item>
    <item>
      <title>Autodiscover and Client-only Sites (Revisited)</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/autodiscover-and-client-only-sites-revisited</link>
      <pubDate>Tue, 20 May 2008 07:39:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2008/05/20/autodiscover-and-client-only-sites-revisited/</guid>
      <description><![CDATA[Previously I had posted a problem regarding Autodiscover site-scoping and client-only sites.&nbsp;...]]></description>
      <content:encoded><![CDATA[<p>Previously I had posted a problem regarding <a href="https://blogs.msdn.com/brad_hughes/archive/2007/09/11/autodiscoversitescope-and-client-only-sites.aspx" target="_blank">Autodiscover site-scoping and client-only sites</a>.&nbsp; For sites that do not have Exchange Servers in them, the corresponding client sites must be added to the SCP object so that Outlook clients will discover the closest Client Access Servers for Autodiscover.</p>
<p>I want to call out one issue I was informed about that one customer had run into (but most folks likely won't).&nbsp; There actually is an upper-limit to the maximum number of values (or actually overall size) of a multi-valued attribute in Active Directory.&nbsp; For these site values that limit typically exists somewhere between 800-900 entries.&nbsp;</p>
<p>The error returned is:</p>
<p><span style="color: #ff0000;">Set-ClientAccessServer : Active Directory operation failed on MICROSOF-D1CEB0.contoso.com. This error is not retriable. Additional information: The administrative limit for this request was exceeded. Active directory response: 00002024: SvcErr: DSID-02080490, problem 5008 (ADMIN_LIMIT_EXCEEDED)</span></p>
<p>In this case, the customer had multiple load-balanced CAS's in any given site.&nbsp; He simply split up the assignment and put 400 Sites in one SCP and 400 Sites in the other.&nbsp; It seems that this is likely the best workaround if you were to run into this.</p>
<p>&nbsp;</p>
<p>On another note, I found out something really cool you could do with Powershell today and wanted to update my previous script post so that it is 100% Powershell.&nbsp; I was under the impression that you could not call Win32 API's from Powershell; while that is technically accurate, you can call Win32 API's from C# and you can call C# from Powershell so guess what you get?&nbsp; Dynamically compiled C# code to call the Win32 API embedded in and invoked from a Powershell script!</p>
<p>This is adapted from the following blog post: <a href="https://blogs.msdn.com/powershell/archive/2006/04/25/583236.aspx" target="_blank">Powershell - PINVOKE or accessing WIN32 APIs</a></p>
<p>The main script is identical to the script I previously posted.&nbsp; However, this time instead of calling the command-line EXE, I call my .NET static method that I defined previously.</p>
<p>&nbsp;</p>
<p>First: A Compile-CSharp function to do the on-the-fly compilation of my C# source code</p>
<p>We create a new instance of the CSharp code provider to do the compilation.</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: purple; line-height: 115%;">$cp</span><span style="font-size: 10pt; color: red; line-height: 115%;">=</span><strong><span style="font-size: 10pt; color: cadetblue; line-height: 115%;">new-object</span></strong><span style="font-size: 10pt; color: maroon; line-height: 115%;">Microsoft.CSharp.CSharpCodeProvider</span></p>
<p>We then set our parameters for the compilation operation.</p>
<p><span style="font-size: 10pt; color: purple;">$cpar</span><span style="font-size: 10pt; color: red;">=</span><strong><span style="font-size: 10pt; color: cadetblue;">New-Object</span></strong><span style="font-size: 10pt; color: maroon;">System.CodeDom.Compiler.CompilerParameters</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: purple;">$cpar</span><span style="font-size: 10pt; color: black;">.GenerateInMemory </span><span style="font-size: 10pt; color: red;">=</span><span style="font-size: 10pt; color: blue;">$true</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: purple;">$cpar</span><span style="font-size: 10pt; color: black;">.GenerateExecutable </span><span style="font-size: 10pt; color: red;">=</span><span style="font-size: 10pt; color: blue;">$false</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: purple; line-height: 115%;">$cpar</span><span style="font-size: 10pt; color: black; line-height: 115%;">.OutputAssembly </span><span style="font-size: 10pt; color: red; line-height: 115%;">=</span><span style="font-size: 10pt; color: maroon; line-height: 115%;">"custom"</span></p>
<p class="MsoNormal">Then we compile the source.</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: purple; line-height: 115%;">$cr</span><span style="font-size: 10pt; color: red; line-height: 115%;">=</span><span style="font-size: 10pt; color: purple; line-height: 115%;">$cp</span><span style="font-size: 10pt; color: black; line-height: 115%;">.CompileAssemblyFromSource(</span><span style="font-size: 10pt; color: purple; line-height: 115%;">$cpar</span><span style="font-size: 10pt; color: black; line-height: 115%;">, </span><span style="font-size: 10pt; color: purple; line-height: 115%;">$code</span><span style="font-size: 10pt; color: black; line-height: 115%;">)</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: black; line-height: 115%;"><span style="font-family: Trebuchet MS;">Second: Defining the C# code and calling the compilation function</span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: purple; line-height: 115%;">$siteCostCode</span><span style="font-size: 10pt; color: red; line-height: 115%;">=</span><span style="font-size: 10pt; color: maroon; line-height: 115%;">@'</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: maroon; line-height: 115%;">&lt;C# code here&gt;</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: maroon; line-height: 115%;">@'</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: green;"># Compile our C# code for doing the site cost calculations</span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: cadetblue; line-height: 115%;">Compile-CSharp</span><span style="font-size: 10pt; color: purple; line-height: 115%;">$siteCostCode</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt; color: black; line-height: 115%; font-family: 'Courier New';"><span style="font-family: Trebuchet MS;">Finally: Calling the managed static method defined in our C# Code</span></span></p>
<p><span style="font-size: 10pt; color: black;">[</span><span style="font-size: 10pt; color: teal;">int</span><span style="font-size: 10pt; color: black;">[]] </span><span style="font-size: 10pt; color: purple;">$costArray</span><span style="font-size: 10pt; color: red;">=</span><span style="font-size: 10pt; color: purple;">$null</span><span style="font-size: 10pt; color: black;">;</span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: purple; line-height: 115%;">$siteCostStatus</span><span style="font-size: 10pt; color: red; line-height: 115%;">=</span><span style="font-size: 10pt; color: black; line-height: 115%;"> [SiteCost.SiteCostLib]::QuerySitesByCost(</span><span style="font-size: 10pt; color: purple; line-height: 115%;">$clientsite</span><span style="font-size: 10pt; color: black; line-height: 115%;">.Name, </span><span style="font-size: 10pt; color: purple; line-height: 115%;">$exchangeSites</span><span style="font-size: 10pt; color: black; line-height: 115%;">, [</span><span style="font-size: 10pt; color: teal; line-height: 115%;">ref</span><span style="font-size: 10pt; color: black; line-height: 115%;">]</span><span style="font-size: 10pt; color: purple; line-height: 115%;">$costArray</span><span style="font-size: 10pt; color: black; line-height: 115%;">);</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">NOTE: At this time the download is not available.&nbsp; I am trying to locate the script and will repost it if/when I can find it.</p>
<p class="MsoNormal">&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How NOT to Deploy Client Access Servers</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/how-not-to-deploy-client-access-servers</link>
      <pubDate>Mon, 05 May 2008 17:29:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2008/05/05/how-not-to-deploy-client-access-servers/</guid>
      <description><![CDATA[I have obviously been really busy since December since that is the last time I posted a blog...]]></description>
      <content:encoded><![CDATA[<P>I have obviously been really busy since December since that is the last time I posted a blog entry.&nbsp; It's rather embarrassing, but I've been devoting a lot of my time to an Exchange Troubleshooting tool hopefully to be unveiled in the Exchange 14 timeframe - more to come later on this.</P>
<P>In these 5 months, I've had plenty of time to see customers do some "interesting" things with the Client Access Server deployments.&nbsp; Since many customers still&nbsp;ignore our prescriptive guidance, I'm just going to give you the gun to shoot yourself in the foot.&nbsp; </P>
<P>Here are some things you can do so you can ensure you have fun-filled days, every day of the week, on the phone with Microsoft Exchange Support. </P>
<H2>Deploy multiple Client Access Servers in the same AD Site with different configurations</H2>
<P>Here are some common things that lead customers to do this:</P>
<OL>
<LI>Want different functions for Client Access Servers.&nbsp; I.E. "This is my OWA / ActiveSync CAS, and this is my Autodiscover / EWS CAS", or "This is my Internal CAS, and this is my External CAS." </LI>
<LI>Want the Client Access role on the mailbox server as a "backup" in case the CAS goes down. </LI>
<LI>Have their "Test" or pre-production environment in the same AD-Site/Same Exchange Org as their Production environment. </LI></OL>Exchange <EM>cannot</EM> read your mind! 
<P>Don't assume that just because you have deemed CAS A as Internal and CAS B as External that Exchange will know the difference.&nbsp; I will admit there are (most times) certain configurations changes that can make configurations like this work, but they are extremely complicated and prone to error.&nbsp; All Client Access Servers in the same site should be configured the same way.&nbsp; I make mention of this on my previous blog post, <A href="https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx" target=_blank mce_href="https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx">CAS Load-Balancing Best Practices (Part 1)</A>.&nbsp; You will run into problems if you try this. There is no reason to try and split services as mentioned in reason 1 above. This was never tested and is not recommended. In general CAS Services scale well together and you should not try to isolate any particular service.&nbsp; For #2 and #3 above, just remember, that Exchange and Outlook can't read your mind. As soon as a server is deemed a CAS (in AD), it is fair game for Outlook clients, proxy targets from other sites, etc, etc.&nbsp; It is very difficult to understand and implement all the different factors that are considered when a client or a CAS in another site is choosing a CAS to connect to.&nbsp; This will cause you issues; so just don't do it.</P>
<H2>Deploy your Client Access Servers in a DMZ or Perimeter network, but "pretend" it's not a DMZ</H2>
<P>We've seen customers again and again try and skirt our support stance on this.&nbsp; Just in case you didn't know:</P>
<P>Planning for Client Access Servers: <A title=https://technet.microsoft.com/en-us/library/bb232184(EXCHG.80).aspx href="https://technet.microsoft.com/en-us/library/bb232184(EXCHG.80).aspx" mce_href="https://technet.microsoft.com/en-us/library/bb232184(EXCHG.80).aspx">https://technet.microsoft.com/en-us/library/bb232184(EXCHG.80).aspx</A></P>
<P><EM>Installation of a Client Access server in a perimeter network is not supported. The Client Access server must be a member of an Active Directory directory service domain, and the Client Access server machine account must be a member of the Exchange Servers Active Directory security group. This security group has read and write access to all Exchange servers within your organization. Communications between the Client Access server and the Mailbox servers within the organization occurs over RPC. It is because of these requirements that installing a Client Access server in a perimeter network is not supported. </EM></P>
<H3>Don't pretend your DMZ/Perimeter network isn't a DMZ/Perimeter network</H3>
<P>We've had numerous customers who want to argue about what is and is not a Perimeter network.&nbsp; What was meant in the original documentation by "perimeter network" is any network that does not have unrestricted access to every Domain Controller and Exchange Server in the Organization.&nbsp; We've had customer who have called it a "pocket-DMZ" meaning that it's not their main DMZ where there web servers are.&nbsp; This DMZ sits off their internal network in a separate "pocket" where access to and from the internal network is restricted.&nbsp; This is still a Perimeter network and falls into the above support policy.&nbsp; If your CAS is NOT on your internal network, it's probably safe to assume that it's in a DMZ and likely not supported. </P>
<H3>Not supported, means <EM>not</EM> supported</H3>
<P>If you call into PSS and the support engineer you are working with finds that your Client Access Server is in a restricted or perimeter network, you are deemed unsupported.&nbsp; This does not mean that the PSS engineer hangs up the phone and says "too bad" right off the bat.&nbsp; What this does mean is that the Engineer will gather logs and attempt to better understand your issue.&nbsp; If at any point during troubleshooting, the PSS Engineer feels your issue may be caused by, or complicated by, the Client Access Server being in the perimeter, the engineer may request that troubleshooting be suspended until the Client Access Server in question be moved into the internal network.&nbsp; If the customer is not willing to do this, then the customer is at that point unsupported by Microsoft PSS.</P>
<H3>It's not even a good idea...</H3>
<P>Our guidance recommends that an ISA Server or another reverse proxy server be placed in the DMZ to handle requests for Internet Exchange Services such as OWA and ActiveSync.&nbsp; ISA 2004 and later allows ISA to operate in a Workgroup (non-domain) configuration and still pre-authenticate requests to Active Directory.&nbsp; This ensures that no unauthenticated traffic is ever passed to the Client Access Servers and also ensures that every URL and request is processed and scanned by ISA URL Filtering/Scanning/and IDS feature-set.&nbsp; This allows for a single port to be opened up (443) to each Client Access Server in the internal network (to allow ISA Web publishing) and is the most secure configuration by far.</P>
<P>If an Exchange 2007 Client Access Server is deployed in the perimeter, a plethora of ports must be opened (both random and static) to Exchange mailbox servers, Domain Controllers, and other infrastructure roles such as DNS.&nbsp; For an Exchange Mailbox Server, you must open Dynamic RPC ports 1024 and above, in addition to 135, 139, and 445 (standard Windows RPC and File sharing ports).&nbsp; These ports essentially make your back firewall in the perimeter scenario into swiss cheese and is counter-productive to a secure environment.</P>
<H2>All of the Above</H2>
<P>A picture is worth a thousand words.&nbsp; Names have been changed to protect the guilty.</P>
<P><IMG style="WIDTH: 479px; HEIGHT: 258px" src="https://brad_hughes.members.winisp.net/hownottodeploycas/dontdothis.jpg" width=479 height=258 mce_src="https://brad_hughes.members.winisp.net/hownottodeploycas/dontdothis.jpg"> </P>
<P>This customer was doing all of the above.&nbsp; The CAS was in a DMZ, though according to the customer "It's not <EM>really</EM> a DMZ...Look, we even labeled it something&nbsp;different on the visio!"&nbsp; Additionally, they had Client Access Servers "designated" as "internal" or "external" in the same AD site.&nbsp; </P>
<P>Guess what?&nbsp; They ended up on the phone with us! (shocking I know).&nbsp; </P>
<P>And guess what the problem was? ActiveSync was attempting to proxy from the CAS in Data Center A's DMZ to the CAS in Data Center B's DMZ, but this traffic was not allowed.&nbsp; The customer intended for the proxy traffic to only go the the HUB/CAS combo servers in the Internal Network in data center B.&nbsp; But it didn't (obviously) and the firewall/routing caused the request to be blocked and fail.</P>
<P>This is an illustration of the simplest of all crazy issues you can and will hit if you deploy this way, but hey - maybe you're weird and just love problems or perhaps you just love calling into PSS.&nbsp; Either way - happy deployments!</P>
<P>I'm sure I'll be adding to this list as time goes on (or as I think about more things).&nbsp; Please spread the word, help our customers, and don't let them get into this situation.&nbsp; This goes out to the field, partners, MVP's, etc - It's your job to help our customers make the right call; together we can make a difference.</P>]]></content:encoded>
    </item>
    <item>
      <title>Autodiscover HTTP Redirect Method using ISA instead of a second web site</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/autodiscover-http-redirect-method-using-isa-instead-of-a-second-web-site</link>
      <pubDate>Tue, 18 Dec 2007 15:12:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2007/12/18/autodiscover-http-redirect-method-using-isa-instead-of-a-second-web-site/</guid>
      <description><![CDATA[Many customers that are hosting multiple SMTP domains need to use one of our Autodiscover "redirect"...]]></description>
      <content:encoded><![CDATA[<P>Many customers that are hosting multiple SMTP domains need to use one of our Autodiscover "redirect" methods to deploy autodiscover instead of the pre-defined URL approach.&nbsp; When customers choose a "redirect" method they have two options.&nbsp; Below is a chart with both options and some Pro's and Con's of each.</P>
<TABLE class="" border=1>
<TBODY>
<TR>
<TD class="">Method</TD>
<TD class="">Pros</TD>
<TD class="">Cons</TD></TR>
<TR>
<TD class="">HTTP Redirect</TD>
<TD class="">
<UL>Works in all scenarios</UL>
<UL>Works with all Outlook 2007 Client versions</UL></TD>
<TD class="">
<UL>Complex to implement</UL>
<UL>Complex to maintain</UL>
<UL>Requires 2 public IP's</UL></TD></TR>
<TR>
<TD class="">DNS SRV Record</TD>
<TD class="">
<UL>Very easy to implement</UL>
<UL></UL>
<UL>Requires only 1 Public IP Address</UL></TD>
<TD class="">
<UL>Some DNS Providers don't support DNS SRV records</UL>
<UL>Doesn't work in&nbsp;100% of&nbsp;client scenarios (explained later)</UL>
<UL>Requires Outlook 2007 SP1 (or Post RTM hotfix)</UL></TD></TR></TBODY></TABLE>
<P mce_keep="true">&nbsp;</P>
<P>The DNS SRV Record method was introduced by an Outlook 2007 Post-RTM hotfix and is also included in Outlook 2007 SP1.:<BR>940881&nbsp;A new feature is available that enables Outlook 2007 to use DNS Service Location (SRV) records to locate the Exchange Autodiscover service<BR><A href="https://support.microsoft.com/default.aspx?scid=kb;EN-US;940881" mce_href="https://support.microsoft.com/default.aspx?scid=kb;EN-US;940881">https://support.microsoft.com/default.aspx?scid=kb;EN-US;940881</A></P>
<P>This method is great except for its few drawbacks.&nbsp; First, you have to make sure all of your clients have this fix or SP1. In some environments, control of the client is not possible so this may&nbsp;discount this option immediately.&nbsp; Another consideration with the SRV record method is whether or not *client* environments support the DNS SRV records.&nbsp; For instance, if your only internet access and/or name resolution is through a proxy (or ISA Firewall Client), you have no way of resolving SRV records.</P>
<P>&nbsp;With these drawbacks in mind, I wanted to bring light to the original method of redirecting autodiscover clients, the HTTP redirect method.&nbsp; The implementation of this method via IIS is discussed in&nbsp;by Jason Mayans at <A href="https://blogs.technet.com/jmayans/archive/2006/09/07/454716.aspx" mce_href="https://blogs.technet.com/jmayans/archive/2006/09/07/454716.aspx">https://blogs.technet.com/jmayans/archive/2006/09/07/454716.aspx</A>.</P>
<P>After reading that, you should have a good idea that load balancing and hosting this extra redirect IIS site&nbsp;can be&nbsp;a nightmare.&nbsp; Luckily, you can do it ALL at ISA!&nbsp; Well 04 and 06 at least, I don't care if ISA 2000 can do it or not.&nbsp; You still need an extra public IP, but the ISA redirection works great and if you have an array of ISA servers, it's automatically load balanced!</P>
<P>First, bind that new public IP to ISA.&nbsp; Then start by creating a new Web Publishing Rule.</P>
<P>The Rule action will actually be set to Deny (We'll configure the redirect later)</P>
<P>The rest of this stuff is mostly irrelevant since it's a Deny Rule.&nbsp; I chose:</P>
<P>"Publish a single Web site or load balancer"<BR>"Use non-secured connections to connect to the published Web server or server farm"<BR>"this.does.not.matter" for the "Internal Site Name"</P>
<P>Set the path to the actual Autodiscover.xml file: /autodiscover/autodiscover.xml</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/2.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/2.jpg"></P>
<P>For the public name, you can set it to either the first of your hosted SMTP domains or just set the "Accept Requests for:" to "Any".</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/3.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/3.jpg"></P>
<P>You'll want to create a new HTTP web listener, call it something like Autodiscover Redirect Listener.</P>
<P>Choose "Do not require SSL secured connections with clients" (very important as this redirect must be HTTP).</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/4.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/4.jpg"></P>
<P>Select the new IP you bound to ISA for the Autodiscover Redirect listener.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/5.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/5.jpg"></P>
<P>Choose "No Authentication" as these requests will always be anonymous.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/6.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/6.jpg"></P>
<P>Ensure your new listener is selected in the wizard.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/7.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/7.jpg"></P>
<P>For the Auth delegation, you can choose "No delegation, and client cannot authenticate directly"</P>
<P mce_keep="true"><IMG style="WIDTH: 502px; HEIGHT: 483px" height=483 src="https://brad_hughes.members.winisp.net/autodiscoverisa/8.jpg" width=502 mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/8.jpg"></P>
<P>The rule cannot require authentication, so ensure "All Users" is selected.</P>
<P>Complete the rule.</P>
<P>You'll need to bring up properties on the rule and proceed to the "Action" tab.&nbsp; It should be set to deny.&nbsp; Put a check in the "Redirect HTTP requests to this Web Page" and enter the full HTTPS URL (matching your certificate),&nbsp;a which you have autodiscover published.&nbsp; Mine was https://mail.wingtiptoys.com/autodiscover/autodiscover.xml.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/9.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/9.jpg">&nbsp;</P>
<P>On the "Public Name" tab, you will need to add autodiscover.&lt;each hosted smtp domain&gt;</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/10.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/10.jpg"></P>
<P>Finally in each hosted SMTP domain's public DNS zone, create an A record for Autodiscover and point it to this new IP on the redirect site.</P>
<P>You can test this by browsing to https://autodiscover.hosteddomain.com/autodiscover/autodiscover.xml in your browser.&nbsp; </P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/11.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/11.jpg"></P>
<P>It should redirect you to the URL you specified in the rule.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/12.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/12.jpg"></P>
<P mce_keep="true">On launch of Outlook 2007, you should end up with a one-time dialog asking the user to allow this URL to configure their Outlook profile if you've done this right.</P>
<P><IMG src="https://brad_hughes.members.winisp.net/autodiscoverisa/13.jpg" mce_src="https://brad_hughes.members.winisp.net/autodiscoverisa/13.jpg"><BR></P>]]></content:encoded>
    </item>
    <item>
      <title>Handy way to restart downed Exchange Services (and only the ones you need)</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/handy-way-to-restart-downed-exchange-services-and-only-the-ones-you-need</link>
      <pubDate>Tue, 20 Nov 2007 17:02:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2007/11/20/handy-way-to-restart-downed-exchange-services-and-only-the-ones-you-need/</guid>
      <description><![CDATA[Here's a quick Powershell one-liner to start up all the necessary Exchange Services for any given...]]></description>
      <content:encoded><![CDATA[<P>Here's a quick Powershell one-liner to start up all the necessary Exchange Services for any given role.</P>
<P>Test-ServiceHealth | Select-Object -Expand ServicesNotRunning | Start-Service</P>
<P>There is also the old standby:<BR>Get-Service *Exchange* | Start-Service</P>
<P>But that one can start unnecessary services (set to manual) like the Exchange Pop3 and Imap4 service.</P>
<P>Just thought it'd make and interesting post because not too many people know about the Test-ServiceHealth cmdlet.</P>]]></content:encoded>
    </item>
    <item>
      <title>CAS Load-Balancing Best Practices (Part 2)</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/cas-load-balancing-best-practices-part-2</link>
      <pubDate>Mon, 29 Oct 2007 05:57:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2007/10/29/cas-load-balancing-best-practices-part-2/</guid>
      <description><![CDATA[CAS Load Balancing Best Practices (Part 2: Load balancing Intranet aka &quot;Non-Internet...]]></description>
      <content:encoded><![CDATA[<p><strong>CAS Load Balancing Best Practices (Part 2: Load balancing Intranet aka &quot;Non-Internet facing&quot; sites): </strong></p>  <p>For Part 1 of this post, go here: <a class="class" title="CAS Load-Balancing Best Practices (Part 1)" href="https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx" mce_href="https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx">CAS Load-Balancing Best Practices (Part 1)</a></p>  <p>You need to understand CAS-&gt;CAS Proxying before you try to understand load-balancing proxy CAS's.&#160; Please read the following technet documentation if you don't understand CAS-&gt;CAS Proxy before proceeding:</p>  <p><a class="class" href="https://technet.microsoft.com/en-us/library/bb310763.aspx" target="_blank" mce_href="https://technet.microsoft.com/en-us/library/bb310763.aspx">Understanding Proxying and Redirection</a></p>  <p>The first big question is whether or not load balancing is required in the second site. Originally it was thought that the CAS in the first site would do load balancing and redundancy for the individual CAS's at an application layer.&#160; We later found out that this is 100% true for OWA and Exchange Web Services Proxy but untrue for Activesync and Unified messaging proxy.</p>  <p mce_keep="true">So, to get full load-balancing and redundancy for all services, you must deploy load balancing in the proxy sites as well as pictured below:</p>  <p mce_keep="true"><img style="width: 358px; height: 260px" title="CAS Proxy with NLB" alt="CAS Proxy with NLB" src="https://technet.microsoft.com/en-us/library/Bb310763.868570df-7ee5-4fbc-9521-0a19c3d8983f(en-us,TechNet.10).gif" width="358" height="260" mce_src="https://technet.microsoft.com/en-us/library/Bb310763.868570df-7ee5-4fbc-9521-0a19c3d8983f(en-us,TechNet.10).gif" /></p>  <p mce_keep="true">The trickiest part to this is not conifguring the NLB, it is knowing how to configure all of the URL parameters for the destination CAS.</p>  <p mce_keep="true">Our documentation topic on technet <a class="class" title="Understanding Proxy and Redirection" href="https://technet.microsoft.com/en-us/library/bb310763.aspx" target="_blank" mce_href="https://technet.microsoft.com/en-us/library/bb310763.aspx">&quot;Understanding Proxying and Redirection&quot;</a> covers this in some detail.&#160; I'm leveraging our chart below for reference on how to set the individual parameters for the Virtual Directories.</p> <strong>Virtual directory settings for non-Internet-facing Client Access servers in an organization that uses NLB</strong>   <p mce_keep="true">   <table style="background-color: #ffffff" class="class" border="1" width="100%"><tbody>       <tr>         <th class="class">Virtual directory </th>          <th class="class">InternalURL setting </th>       </tr>        <tr>         <td class="class">           <p>/OWA</p>         </td>          <td class="class">           <p>https://<i>computername</i>/OWA</p>         </td>       </tr>        <tr>         <td class="class">           <p>/OAB</p>         </td>          <td class="class">           <p>https://NLBname/OAB</p>         </td>       </tr>        <tr>         <td class="class">           <p>/UnifiedMessaging</p>         </td>          <td class="class">           <p>https://NLBname/UnifiedMessaging</p>         </td>       </tr>        <tr>         <td class="class">           <p>/Microsoft-Server-ActiveSync*</p>         </td>          <td class="class">           <p>https://NLBname/Microsoft-Server-ActiveSync</p>         </td>       </tr>        <tr>         <td class="class">           <p>/EWS**</p>         </td>          <td class="class">           <p>https://<i>NLBname</i>/EWS</p>         </td>       </tr>     </tbody></table> </p>  <p><strong>* NOTE:</strong> <em>This does <strong>NOT</strong> work in RTM for ActiveSync due to some Keberos issues.&#160; You must set the InternalUrl to </em><em>https://computername/Microsoft-Server-Activesync</em><em> and you get no fault tolerance if a CAS in the seond site goes down.&#160; We corrected these Kerberos issues in SP1 so you should be able to set the InternalUrl to the NLBname at that time.</em></p>  <p><strong>** NOTE:</strong><em> EWS does not use the InternalUrl for proxying core EWS traffic and instead uses the InternalNLBBypassUrl configured on the Virtual Directory (this should always be configured to the machine FQDN).&#160; Proxying for the Availability service will use the InternalUrl but affinity is not required.</em></p>  <p><strong>&#160;</strong><strong>Note in regard to Affinity settings     <br /></strong>OWA and EWS are &quot;stateful&quot; applications.&#160; Because of this, they must maintain the connection with the same CAS throughout a users session.&#160; However, because OWA and EWS use application-level load-balancing and failover and do not route through your load-balancer in the remote site, Affinity on the load balancer should not be an issue.&#160; EAS and UnifiedMessaging are stateless and can be handled by any CAS on subsequent requests so for them, the load balancing affinity can be set to &quot;None&quot; in the proxy site to ensure even distribution of requests.</p>  <p>Have fun deploying your CAS Proxy + NLB Solutions!</p>]]></content:encoded>
    </item>
    <item>
      <title>New Updates to Autodiscover Whitepaper available</title>
      <link>https://docs.microsoft.com/archive/blogs/brad_hughes/new-updates-to-autodiscover-whitepaper-available</link>
      <pubDate>Mon, 15 Oct 2007 08:54:00 GMT</pubDate>
      <dc:creator><![CDATA[Brad Hughes [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/brad_hughes/2007/10/15/new-updates-to-autodiscover-whitepaper-available/</guid>
      <description><![CDATA[Just wanted to let folks know that a new update to the Autodiscover Whitepaper is now...]]></description>
      <content:encoded><![CDATA[<P>Just wanted to let folks know that a new update to the Autodiscover Whitepaper is now available.&nbsp; This now contains tons more information regarding certificates, web service URL's, best practices, etc.&nbsp; </P>
<P>You can find&nbsp;the whitepaper&nbsp;here:<BR><A href="https://technet.microsoft.com/en-us/library/bb332063.aspx">https://technet.microsoft.com/en-us/library/bb332063.aspx</A></P>
<P>You can find the Exchange team blog announcment here:<BR><A href="https://msexchangeteam.com/archive/2007/10/03/447176.aspx">https://msexchangeteam.com/archive/2007/10/03/447176.aspx</A></P>
<P>The only thing it doesn't really cover right now is load-balancing, for that you can see my series on CAS load-balancing here: <A href="https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx">https://blogs.msdn.com/brad_hughes/archive/2007/09/10/cas-load-balancing-certificates-autodiscover-and-webservices.aspx</A></P>]]></content:encoded>
    </item>
  </channel>
</rss>