<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>MyUCLab</title>
		<description>Info about Exchange, Office 365, Lync and Skype for Business.</description>
		<link>/</link>
		<atom:link href="/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>Automating Teams allowed domains - part 2</title>
				<description>&lt;p&gt;This is the second part of te article how to create a provisioning system for allowed domains. In the first part we started with creating a SharePoint List to store all the requests. After we created the list we started creating the approval flow.&lt;/p&gt;

&lt;p&gt;In this part we will finish the flow and will create the Azure Runbook to configure the allowed domains in our tenant.&lt;/p&gt;

&lt;p&gt;Before we continue with our Microsoft Flow we first need to jump to Azure and configure our Azure Runbook.&lt;/p&gt;

&lt;p&gt;The steps required can be divided in 4 sections:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create an Azure Automation Account&lt;/li&gt;
  &lt;li&gt;Adding credentials which can be used within the runbooks&lt;/li&gt;
  &lt;li&gt;Upload the Skype for Business PowerShell module&lt;/li&gt;
  &lt;li&gt;Create the script which needs to be executed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;create-an-azure-automation-account&quot;&gt;&lt;strong&gt;Create an Azure Automation Account&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;To perform this task we first need to create an &lt;strong&gt;Azure Automation Account&lt;/strong&gt; this can be done by following the steps below:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Browse to https://portal.azure.com&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Search&lt;/strong&gt; field enter &lt;strong&gt;Automation Accounts&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;Automation Accounts&lt;/strong&gt; from the &lt;strong&gt;Services&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;Add&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Provide a &lt;strong&gt;Name&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the correct &lt;strong&gt;Subscription&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;Resource group&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;Location&lt;/strong&gt; (select the region closest to your O365 tenant)&lt;/li&gt;
  &lt;li&gt;CLick &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The creation of the account might take several minutes.&lt;/p&gt;

&lt;h3 id=&quot;adding-credentials&quot;&gt;&lt;strong&gt;Adding credentials&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Once the task has been created we can continue with adding the &lt;strong&gt;credentials&lt;/strong&gt; which will be used by the automation account to connect to our Teams tenant. 
An important thing is that the account you want to use for this should NOT be enabled for MFA and has been assigned the Teams Service Administrator permissions.&lt;/p&gt;

&lt;p&gt;To do this perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Select the automation account created&lt;/li&gt;
  &lt;li&gt;In the left menu browse to the &lt;strong&gt;Shared Resources&lt;/strong&gt; and select &lt;strong&gt;Credentials&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;Add a credential&lt;/strong&gt; and provide a username and password which can be used to connect to the Teams tenant&lt;/li&gt;
  &lt;li&gt;Provide the &lt;strong&gt;username&lt;/strong&gt; and &lt;strong&gt;password&lt;/strong&gt; and select &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Remark: Since it does not have MFA it is a good idea to monitor &amp;gt; the usage of this account to ensure it is not abused. &amp;gt; Guidance how to do this can be found here:&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-emergency-access#monitor-sign-in-and-audit-logs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the credentials are added the next step is to add the &lt;strong&gt;Skype for Business Online PowerShell module&lt;/strong&gt; to our automation account. By default several PowerShell modules are included such AzureRM modules. To make the Skype for Business Online Module available we first need to install it on a local machine. If you don’t have it installed you you can download the latest version of the module from the linke below:&lt;/p&gt;

&lt;p&gt;https://www.microsoft.com/en-us/download/details.aspx?id=39366&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Remark: If you already had the module installed make sure it is the latest version available. During the preparation of writing this blog I also hit an issue where uploading the PowerShell module failed with different errors. Upon further investigation I found out that I did not had the latest version of the module installed. Once the most recent version of the module was installed the PowerShell module could be uploaded without an issue.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the Skype for Business Online PowerShell module is installed we need to zip the module so we can upload it to Azure. Perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Browse to &lt;strong&gt;C:\Program Files\Common Files\Skype for Business Online\Modules&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Zip the &lt;strong&gt;SkypeOnlineConnector&lt;/strong&gt; directory&lt;/li&gt;
  &lt;li&gt;Ensure the zip is named &lt;strong&gt;SkypeOnlineConnector.zip&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we zipped the PowerShell module the next step is to upload it to Azure so we can use it in our Azure Runbook.  To do this perform the steps below:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Go back to  Azure Automation Accounts**&lt;/li&gt;
  &lt;li&gt;Select the automation accounts created earlier&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Shared resources&lt;/strong&gt; section select &lt;strong&gt;Modules&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;From the main pane select &lt;strong&gt;Add module&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Add a module&lt;/strong&gt; window select the zip file and press &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Importing the module might take several minutes. Once the module is imported it is time to create the Runbook.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Add_Module_SfBO_Importing.jpg&quot; alt=&quot;Skype for Business Online PowerShell module: importing&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now the module has been important we can provide the script which needs to be executed everytime the runbook is executed. To create the runbook perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;Process Automation&lt;/strong&gt; section select &lt;strong&gt;Runbooks&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;Create a runbook&lt;/strong&gt; from the main pane&lt;/li&gt;
  &lt;li&gt;Provide a &lt;strong&gt;Name&lt;/strong&gt; and make sure &lt;strong&gt;Runbook type&lt;/strong&gt; is set to &lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;In the main pane add the script below:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;param(
    [string] $domainName
)
# Get stored credentials
$credential = Get-AutomationPSCredential -Name &apos;svc_sfb_automation&apos;
# Connect to tenant 
$session = New-CsOnlineSession -Credential $credential
import-pssession $session -AllowClobber|Out-Null

# Initialize variables
[bool] $dnsValidation = $false
[string] $proxyFqdn = &quot;&quot;
[string] $result = &quot;&quot;
[string] $fedrecordresult = &quot;&quot;
$fedrecord = &quot;_sipfederationtls._tcp.&quot; + $domainName

# Retrieve current allowed domain list
$tenantConfig = Get-CsTenantFederationConfiguration
$domain = $tenantConfig.AllowedDomains.AllowedDomain | ?{$_.Domain -eq $domainName}

if($domain -ne $null)
{
    Write-Warning &quot;Domain is already part of allow list, skip processing&quot;
}
else
{
    # Validate if sipfederation record exists
    $uri = &quot;https://dns.google.com/resolve?name={0}&amp;amp;type=srv&quot; -f $fedrecord
    $dnsresolve = Invoke-RestMethod -uri $uri

    if($dnsresolve -ne $null)
    {
    $proxyFqdn = $dnsresolve.answer.data.split(&quot; &quot;)[3].trimend(&quot;.&quot;)
    $dnsValidation = $true
    }

    # If the domain is not in the list and the dns record exists add the domain to the allow list
    if ($domain -eq $null -and $proxyFqdn -ne $null)
    {
        $allowedDomain = New-CsEdgeDomainPattern -Domain $domainName
        $tenantConfig.AllowedDomains.AllowedDomain.Add($allowedDomain)|Out-Null
        Set-CsTenantFederationConfiguration -Tenant $tenant.tenantID  -AllowedDomains $tenantConfig.AllowedDomains

        $tenantConfig = Get-CsTenantFederationConfiguration
        $domainresult = $tenantConfig.AllowedDomains.AllowedDomain | ?{$_.Domain -eq $domainName}

        if($domainresult -ne $null)
        {
            $result = &quot;succeeded&quot;
        }
        else
        {
            $result = &quot;failed&quot;
        }
    }
    else
    {
        $result = &quot;failed&quot;
    }

    # Create result object
    $Results = New-Object -Type PSObject
    $Results | Add-Member -Type NoteProperty -Name &quot;domainName&quot; -Value $domainName
    $Results | Add-Member -Type NoteProperty -Name &quot;dnsValidation&quot; -Value $dnsValidation
    $Results | Add-Member -Type NoteProperty -Name &quot;proxyFqdn&quot; -Value $proxyFqdn
    $Results | Add-Member -Type NoteProperty -Name &quot;Result&quot; -Value $result
}

# Return results
Write-Output $Results|ConvertTo-Json
Remove-pssession $session
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;Once the script has been added select &lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Optionally you can select &lt;strong&gt;Test Pane&lt;/strong&gt; and test the runbook. Keep in mind that this adds the domain to the allowed domain list.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Once your happy with the results select &lt;strong&gt;Publish&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;updating-flow&quot;&gt;&lt;strong&gt;Updating Flow&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Now we have created the runbook let’s make sure that once the item is approved the item in the SharePoint list will be updated. To do this we need to add an &lt;strong&gt;update item&lt;/strong&gt; block in the &lt;strong&gt;If yes&lt;/strong&gt; tree from the workflow.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/If_yes.jpg&quot; alt=&quot;Condition block: if yes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once the &lt;strong&gt;update item&lt;/strong&gt; block has been added update perform the following tasks&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;Site Address&lt;/strong&gt; select the SharePoint site which contains SharePoints list used to be stored the allowed domains&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;List Name&lt;/strong&gt; select the list containing the allowed domains&lt;/li&gt;
  &lt;li&gt;in the &lt;strong&gt;Id&lt;/strong&gt; select the &lt;strong&gt;Id&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;DomainName&lt;/strong&gt; select the &lt;strong&gt;DomainName&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;DateApproved&lt;/strong&gt; select &lt;strong&gt;Expression&lt;/strong&gt; and enter &lt;strong&gt;Utcnow()&lt;/strong&gt; as the value of the expression and press &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Expression_utcnow.jpg&quot; alt=&quot;Expression: if now&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Update the value of the &lt;strong&gt;status&lt;/strong&gt; field to &lt;strong&gt;processing&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the flow add a &lt;strong&gt;Create Job&lt;/strong&gt; block. This block is not part of the default set and requires an additional license which support the &lt;strong&gt;Premium&lt;/strong&gt; features.&lt;/p&gt;

&lt;p&gt;Once you have inserted the block perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Make sure the correct &lt;strong&gt;Subscription&lt;/strong&gt; is selected&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;resource group&lt;/strong&gt; the drop down list and make sure it is the same as the automation account created earlier&lt;/li&gt;
  &lt;li&gt;Create the earlier created &lt;strong&gt;Automation Account&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the earlier created Azure Runbook from the drop down menu in the  &lt;strong&gt;RunBook Name&lt;/strong&gt; field&lt;/li&gt;
  &lt;li&gt;Set &lt;strong&gt;Wait for Job&lt;/strong&gt; to &lt;strong&gt;Yes&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select the SharePoint field value &lt;strong&gt;DomainName&lt;/strong&gt; as the value for the &lt;strong&gt;Runbook Parameter DomainName&lt;/strong&gt; field&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Create_Job.jpg&quot; alt=&quot;Create job block&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now we have added the job we need to retrieve the results from the job. Reason for this is that we need the results from the job to populate the &lt;strong&gt;Result&lt;/strong&gt; field in our SharePoint list.&lt;/p&gt;

&lt;p&gt;To get the results from the Azure Runbook add a &lt;strong&gt;Get job output&lt;/strong&gt; block and configure it as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Select the correct Azure Subscription in the &lt;strong&gt;Subscription&lt;/strong&gt; field&lt;/li&gt;
  &lt;li&gt;Add the same &lt;strong&gt;Resource Group&lt;/strong&gt; as in the &lt;strong&gt;Create Job&lt;/strong&gt; block&lt;/li&gt;
  &lt;li&gt;Select the same automation account as used earlier&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;Job ID&lt;/strong&gt; as value from the &lt;strong&gt;Job ID&lt;/strong&gt; field. This can be done by clicking in the field and select &lt;strong&gt;Job ID&lt;/strong&gt; from the list of available parameters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since we generated a JSON output using our script we need to use a &lt;strong&gt;Parse JSON&lt;/strong&gt; block to parse the results from the Azure Runbook.&lt;/p&gt;

&lt;p&gt;Before adding the block make sure you have an example of the JSON output which can be used to generate the schema. You can get this by running the Azure Runbook once manually.&lt;/p&gt;

&lt;p&gt;If you want to take the easy route add the following content to the &lt;strong&gt;Schema&lt;/strong&gt; field of the &lt;strong&gt;Parse JSON&lt;/strong&gt; block.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
        &quot;domainName&quot;: {
            &quot;type&quot;: &quot;string&quot;
        },
        &quot;dnsValidation&quot;: {
            &quot;type&quot;: &quot;boolean&quot;
        },
        &quot;proxyFqdn&quot;: {
            &quot;type&quot;: &quot;string&quot;
        },
        &quot;Result&quot;: {
            &quot;type&quot;: &quot;string&quot;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In both scenarios select the &lt;strong&gt;Content&lt;/strong&gt; parameter from the &lt;strong&gt;Get job output&lt;/strong&gt; section by clicking somewhere in the &lt;strong&gt;Content&lt;/strong&gt; field from the &lt;strong&gt;Parse JSON&lt;/strong&gt; block.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Parse_JSON.jpg&quot; alt=&quot;Parse JSON block&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now we have the result of the runbook stored in an object we can access the properties of the object and use them in the workflow.&lt;/p&gt;

&lt;p&gt;We are going to check the value of the &lt;strong&gt;Result&lt;/strong&gt; property. If it is set to succeeded we know the allowed domain has been succesfully added to the allowed domain list, if it has a different value it has failed.&lt;/p&gt;

&lt;p&gt;Based on this condition we can update the SharePoint list and send an e-mail to the requestor that the request has been completed either successfully or has failed.&lt;/p&gt;

&lt;p&gt;Add a &lt;strong&gt;Condition&lt;/strong&gt; block to the workflow below the &lt;strong&gt;Parse JSON&lt;/strong&gt; block.&lt;/p&gt;

&lt;p&gt;Click in the &lt;strong&gt;Choose a value&lt;/strong&gt; field and in the &lt;strong&gt;Search dynamic content&lt;/strong&gt; field enter &lt;strong&gt;Result&lt;/strong&gt;. This will return the &lt;strong&gt;Result&lt;/strong&gt; property from the &lt;strong&gt;Parse JSON&lt;/strong&gt; object. Leave the &lt;strong&gt;is equal to&lt;/strong&gt; value as is and set the value to &lt;strong&gt;succeeded&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Condition_block.jpg&quot; alt=&quot;Condition block&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;If yes&lt;/strong&gt; tree add two blocks:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;update item&lt;/li&gt;
  &lt;li&gt;send an email (V2) 2&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;update-item&quot;&gt;Update item&lt;/h4&gt;
&lt;p&gt;This &lt;strong&gt;update item&lt;/strong&gt; block will be used to update the item in the SharePoint list. Make the following changes once you added the block:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;Site Address&lt;/strong&gt; select the SharePoint site which contains SharePoints list used to be stored the allowed domains&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;List Name&lt;/strong&gt; select the list containing the allowed domains&lt;/li&gt;
  &lt;li&gt;in the &lt;strong&gt;Id&lt;/strong&gt; select the &lt;strong&gt;Id&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;DomainName&lt;/strong&gt; select the &lt;strong&gt;DomainName&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Requestor&lt;/strong&gt; field add the &lt;strong&gt;Requestor&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Set the &lt;strong&gt;DomainValidated&lt;/strong&gt; to &lt;strong&gt;No&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;The value for the &lt;strong&gt;DomainDNSRecordValidated&lt;/strong&gt; field will be set by using a function. Select &lt;strong&gt;Expression&lt;/strong&gt; and specify the expression as follows:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;if(equals(body(&apos;Parse_JSON&apos;)?[&apos;dnsValidation&apos;],bool(&apos;true&apos;)),bool(&apos;true&apos;),bool(&apos;false&apos;))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;proxyFQDN&lt;/strong&gt; field add the &lt;strong&gt;proxyFQDN&lt;/strong&gt; property from the &lt;strong&gt;Parse JSON&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;Set the &lt;strong&gt;Status&lt;/strong&gt; field to &lt;strong&gt;completed&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Domain_Added.jpg&quot; alt=&quot;Update status to: completed&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;send-an-email&quot;&gt;Send an email&lt;/h4&gt;
&lt;p&gt;The last step is to update the fields of the &lt;strong&gt;Send an email(V2) 2&lt;/strong&gt; block.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;To&lt;/strong&gt; field add the &lt;strong&gt;Created by Email&lt;/strong&gt; from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Subject&lt;/strong&gt; field add the &lt;strong&gt;DomainName&lt;/strong&gt; from the &lt;strong&gt;variables&lt;/strong&gt; section and add some additional text, for example &lt;strong&gt;successfully added to allow list&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Body&lt;/strong&gt; field enter text which you want to send to the requestor&lt;/li&gt;
  &lt;li&gt;Optionally you can change the &lt;strong&gt;from&lt;/strong&gt; address by selecting &lt;strong&gt;Show advanced options&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Send_Mail_Completed.jpg&quot; alt=&quot;Send an email block&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;If no&lt;/strong&gt; tree we will do exactly the same as in the &lt;strong&gt;If yes&lt;/strong&gt; tree.&lt;/p&gt;

&lt;h4 id=&quot;update-item-1&quot;&gt;Update item&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;Site Address&lt;/strong&gt; select the SharePoint site which contains SharePoints list used to be stored the allowed domains&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;List Name&lt;/strong&gt; select the list containing the allowed domains&lt;/li&gt;
  &lt;li&gt;in the &lt;strong&gt;Id&lt;/strong&gt; select the &lt;strong&gt;Id&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;DomainName&lt;/strong&gt; select the &lt;strong&gt;DomainName&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Requestor&lt;/strong&gt; field add the &lt;strong&gt;Requestor&lt;/strong&gt; parameter from the &lt;strong&gt;When a new item is created&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Set the &lt;strong&gt;DomainValidated&lt;/strong&gt; to &lt;strong&gt;No&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;The value for the &lt;strong&gt;DomainDNSRecordValidated&lt;/strong&gt; field to &lt;strong&gt;No&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Set the &lt;strong&gt;Status&lt;/strong&gt; field to &lt;strong&gt;failed&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;send-an-email-1&quot;&gt;Send an email&lt;/h4&gt;

&lt;p&gt;The last step is to update the fields of the &lt;strong&gt;Send an email(V2) 2&lt;/strong&gt; block.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;To&lt;/strong&gt; field add the &lt;strong&gt;Created by Email&lt;/strong&gt; from the &lt;strong&gt;When a new item is created&lt;/strong&gt; section&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Subject&lt;/strong&gt; field add the &lt;strong&gt;DomainName&lt;/strong&gt; from the &lt;strong&gt;variables&lt;/strong&gt; section and add some additional text, for example &lt;strong&gt;was not added to the allowed domain list&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Body&lt;/strong&gt; field enter text which you want to send to the requestor&lt;/li&gt;
  &lt;li&gt;Optionally you can change the &lt;strong&gt;from&lt;/strong&gt; address by selecting &lt;strong&gt;Show advanced options&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here end the second part of the multi-part article on how to create a provisioning system for allowed domains in Teams. In this part we started with configuring the Azure piece of the provisioning system. Once that was completed we updated our flow to execute the Azure Runbook, update the SharePoint List and sending an e-mail to the requestor.&lt;/p&gt;

&lt;p&gt;In the next part we will look at how to build a more user friendly way to add a domain to the allowed domain list. How we are going to do that remains a surprise ;-)&lt;/p&gt;
</description>
				<pubDate>Sun, 05 Apr 2020 14:35:00 +0000</pubDate>
				<link>/teams-allowed-domains-part-2/</link>
				<guid isPermaLink="true">/teams-allowed-domains-part-2/</guid>
			</item>
		
			<item>
				<title>Automating Teams allowed domains - part 1</title>
				<description>&lt;p&gt;This is a multi-part article which describes how to build a provisioning system for allowed domains. In the first part we will start building our provisioning system by building the fundamentals first.&lt;/p&gt;

&lt;p&gt;Within Teams it is possible to communicate with external companies, this is also known as federation. Federation can be either configured as open or closed federation. In case of open federation your users are able to to communicate with all external users (assuming those companies also allow federation). When using closed federation users can only communicate with users from domains which are part of the allowed domain list.&lt;/p&gt;

&lt;p&gt;In most cases this requires some kind of approval either from a manager or sometimes even the legal department. This due to the fact that when allowing federation users are able to exchange information with other companies which might not be allowed in some scenarios.&lt;/p&gt;

&lt;p&gt;So what will the provisioning do:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;allow users to submit a new allowed domain&lt;/li&gt;
  &lt;li&gt;contain an approval process to allow someone within your organization to approve or reject a request&lt;/li&gt;
  &lt;li&gt;add the domain to the allowed domain list in Teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we know what we want to build let’s have a look which tools we are going to use to build the solution. To allow users to submit a new request we will build a PowerApp which stores requests in a SharePoint list.&lt;/p&gt;

&lt;p&gt;Once entries are created we use Microsoft Flow to pickup those entries and start the approval process. If a request is approved the Flow will continue and will start an Azure Runbook to perform some validation tests and add the domain to the allowed domain list.&lt;/p&gt;

&lt;p&gt;Our journey starts on SharePoint Online. To store the results we are going to use a list. You can either create a complete site from scratch and add a list to it or use an existing site and add a list.&lt;/p&gt;

&lt;p&gt;In our case we are going to use an existing SharePoint site and add a List.
To do this perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Browse to the SharePoint site&lt;/li&gt;
  &lt;li&gt;Select &lt;strong&gt;New&lt;/strong&gt; and from the menu select &lt;strong&gt;List&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/New_List.jpg&quot; alt=&quot;New menu&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Provide a name for the SharePoint list, for example &lt;strong&gt;FederationAllowedDomains&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;From the left menu select &lt;strong&gt;Site contents&lt;/strong&gt; and locate the list created earlier&lt;/li&gt;
  &lt;li&gt;Select the &lt;strong&gt;dots&lt;/strong&gt; next to the list and select &lt;strong&gt;Settings&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;This will bring us to a new page which allows us to add additional columns&lt;/li&gt;
  &lt;li&gt;Browse to the &lt;strong&gt;Columns&lt;/strong&gt; part and click on the &lt;strong&gt;Title&lt;/strong&gt; column&lt;/li&gt;
  &lt;li&gt;Rename the column to &lt;strong&gt;DomainName&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;On the bottom part of the &lt;strong&gt;Columns&lt;/strong&gt; section locate the &lt;strong&gt;Create column&lt;/strong&gt; option&lt;/li&gt;
  &lt;li&gt;Add the following columns:&lt;/li&gt;
&lt;/ol&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Columname&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Requestor&lt;/td&gt;
      &lt;td&gt;single line of text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DateApproved&lt;/td&gt;
      &lt;td&gt;date and time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BusinessJustification&lt;/td&gt;
      &lt;td&gt;multipe lines of text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DomainValidated&lt;/td&gt;
      &lt;td&gt;Yes/No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;DomainDNSRecordValidated&lt;/td&gt;
      &lt;td&gt;Yes/No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;proxyfqdn&lt;/td&gt;
      &lt;td&gt;single line of text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Status&lt;/td&gt;
      &lt;td&gt;single line of text&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ol&gt;
  &lt;li&gt;Once all columns have been added select &lt;strong&gt;Site contents&lt;/strong&gt; from the left menu. Once the content site content has been loaded open the list just created&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we’ve created the list the next step is to create create the &lt;strong&gt;Flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To start this task select the &lt;strong&gt;Flow&lt;/strong&gt; button from the menu followed by &lt;strong&gt;Create a flow&lt;/strong&gt;.
Once pressed this will open a new menu on the right side of the screen which contains templates which can be used as a good startpoint.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Create_Flow_Select_Template.jpg&quot; alt=&quot;Microsoft Flow templates&quot; /&gt;
As described already we want to create an approval flow. One of the templates available is the &lt;strong&gt;Start approval when a new item is added&lt;/strong&gt;. Select this option from the menu and wait till the Microsoft Flow website has loaded.&lt;/p&gt;

&lt;p&gt;Continue with the steps below to complete the creation of the flow:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;This flow will connect to&lt;/strong&gt; section make sure a green checkmark is listed behind each item. If not select the &lt;strong&gt;+&lt;/strong&gt; sign.&lt;/li&gt;
  &lt;li&gt;Repeat this step for item until all lines have a green checkmark and click &lt;strong&gt;continue&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Remark: this account will also be displayed as the from address of the approval mail&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/teamsalloweddomains/Create_Flow_Connect.jpg&quot; alt=&quot;Provide flow permissions to use your account&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If we want all approvals to be send to a one or more users in the environment perform the following step:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In the &lt;strong&gt;Start an approval&lt;/strong&gt; block add a user who will be responsible for approving every request to the &lt;strong&gt;Assigned To&lt;/strong&gt;. If you want the approval request to be send to more users simply add an additional user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In case you want to send the approval to the manager of the requestor perform the following steps instead of the previous step:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Insert a &lt;strong&gt;Get Manager (v2)&lt;/strong&gt; block after the &lt;strong&gt;When a new item is created&lt;/strong&gt; block&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Get Manager (v2)&lt;/strong&gt; block add the &lt;strong&gt;Created By Email&lt;/strong&gt; from the list&lt;/li&gt;
  &lt;li&gt;In the &lt;strong&gt;Start an approval&lt;/strong&gt; add the &lt;strong&gt;Mail&lt;/strong&gt; item to the &lt;strong&gt;Assigned To&lt;/strong&gt; field&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here end the first part of the multi-part article on how to create a provisioning system for allowed domains in Teams. In this part we started with creating a SharePoint list which will be used to store the requests and made a start creating the approval flow.&lt;/p&gt;

&lt;p&gt;In the next part we will continue our work on the flow and will implement the Azure Runbook to configure the allowed domain in Teams.&lt;/p&gt;
</description>
				<pubDate>Thu, 19 Mar 2020 20:49:00 +0000</pubDate>
				<link>/teams-allowed-domains-part-1/</link>
				<guid isPermaLink="true">/teams-allowed-domains-part-1/</guid>
			</item>
		
			<item>
				<title>Skype for Business Location Information Services (LIS) - part 1</title>
				<description>&lt;p&gt;This is a multi-part article. In the first part we will have a look what Location Information Services (LIS) is and how to configure. In the second part we will look at how it works and how you can troubleshoot Location Information Services.&lt;/p&gt;

&lt;p&gt;Location Information Services is a functionality build-in Skype for Business Server. The initial version of LIS was introduced in Lync Server 2010 and changes were made in the newer versions of the product.&lt;/p&gt;

&lt;p&gt;In most cases you will see that LIS is implemented due to the requirement to have E9-1-1 functionality.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Enhanced 9-1-1 (E9-1-1) is an emergency notification feature that associates the calling party’s telephone number with a civic or a street address. Using this information, the Public Safety Answering Point (PSAP) can immediately dispatch emergency services to the caller in distress.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;source: &lt;a href=&quot;https://docs.microsoft.com/en-us/skypeforbusiness/deploy/deploy-enterprise-voice/deploy-emergency-services?toc=/SkypeForBusiness/toc.json&amp;amp;bc=/SkypeForBusiness/breadcrumb/toc.json&quot;&gt;Deploy emergency services&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Deploying LIS requires you to perform the following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Configure the telephony part&lt;/li&gt;
  &lt;li&gt;Create location policies&lt;/li&gt;
  &lt;li&gt;Configure the LIS database&lt;/li&gt;
  &lt;li&gt;(Optional) configure advanced features&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The configuration can be partially done via the Skype for Business Control Panel but most work needs to be done via PowerShell.&lt;/p&gt;

&lt;p&gt;As mentioned in the numbered list the first thing you have to do is setup the telephony part&lt;/p&gt;
&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#Configure PSTN usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsPstnUsage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;EmergencyUsage&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Create a new voice route for E-9-1-1 and add the earlier previously created PSTN usage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New-CsVoiceRoute&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;EmergencyRoute&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-NumberPattern&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;^\+911$&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PstnUsages&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;EmergencyUsage&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PstnGatewayList&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;e911-trunk&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Once those steps have been performed you need to decide if you want to configure the E9-1-1 settings for all users in the organization or only for a subset of the users. If you need to configure it for all users you can modify the &lt;strong&gt;Global&lt;/strong&gt; location policy else you will need to create a policy which can be assigned on a per user level.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#Modify global location policy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLocationPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Identity&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Global&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EnhancedEmergencyServicesEnabled&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-LocationRequired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;disclaimer&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EnhancedEmergencyServiceDisclaimer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Your company policy requires you to set a location. If you do not set a location emergency services will not be able to locate you in an emergency. Please set a location.&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PstnUsage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;emergencyUsage&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EmergencyDialString&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;911&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ConferenceMode&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;twoway&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ConferenceUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sip:+31201234567@myuclab.nl&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EmergencyDialMask&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;112&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;NotificationUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sip:security@myuclab.nl&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-UseLocationForE911Only&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-LocationRefreshInterval&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Per user policy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New-CsLocationPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Identity&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Tag:Amsterdam&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EnhancedEmergencyServicesEnabled&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-LocationRequired&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;disclaimer&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EnhancedEmergencyServiceDisclaimer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Your company policy requires you to set a location. If you do not set a location emergency services will not be able to locate you in an emergency. Please set a location.&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-UseLocationForE911Only&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$false&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PstnUsage&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;EmergencyUsage&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EmergencyDialString&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;911&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-EmergencyDialMask&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;112&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-NotificationUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sip:security@myuclab.nl&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ConferenceUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sip:+31201234567@myuclab.nl&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ConferenceMode&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;twoway&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-LocationRefreshInterval&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Assign the policy to a user&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-CsUser&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-match&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Johan&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Grant-CsLocationPolicy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PolicyName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Amsterdam&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the location policy has been configured and assigned (in case you did not use the global one). It is time to populate the LIS database.&lt;/p&gt;

&lt;p&gt;The LIS database is part of the backend databases of Skype for Business and is named &lt;strong&gt;LIS&lt;/strong&gt;. The database contains the following tables which contain the location, physical location and network related data:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Tablename&lt;/th&gt;
      &lt;th&gt;Data&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.CivicAddress&lt;/td&gt;
      &lt;td&gt;Contains the civic address details and mapping to the location id&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.Location&lt;/td&gt;
      &lt;td&gt;Contains the location info&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.Port&lt;/td&gt;
      &lt;td&gt;Contains the switchport info and mapping to the location&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.Subnet&lt;/td&gt;
      &lt;td&gt;Contains the subnet info and mapping to the location&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.Switch&lt;/td&gt;
      &lt;td&gt;Contains the switch info and mapping to the location&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;dbo.WirelessAccessPoint&lt;/td&gt;
      &lt;td&gt;Contains the access point info and mapping to the location&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Data can be added to the database by using the following PowerShell cmdlets:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#Add a subnet&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisSubnet&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Add a wireless access point&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisWirelessAccessPoint&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Add a switch&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisSwitch&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Add a switch port&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisPort&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#Example of adding a subnet to a civic location&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisSubnet&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Subnet&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;157.56.66.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Description&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Subnet 1&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Location&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Location1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-CompanyName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;MyUCLab&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-HouseNumber&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;1234&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-HouseNumberSuffix&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PreDirectional&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-StreetName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;163rd&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-StreetSuffix&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Ave&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PostDirectional&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;NE&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-City&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Redmond&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-State&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;WA&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-PostalCode&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;99123&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Country&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;US&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once all network related data has been added it is time to configure the external LIS provider. This requires both a password and a valid certificate:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$pwd&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Read-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-AsSecureString&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-CsLisServiceProvider&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ServiceProviderName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Identity&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ValidationServiceUrl&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provided&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-CertFileName&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;certificate&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provided&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;provider&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Password&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$pwd&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now the LIS provider has been configured we can validate the civic addresses which are configured as part of the network configuration.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#Validate all civic addresses configured&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-CsLisCivicAddress&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Test-CsLisCivicAddress&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-UpdateValidationStatus&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now everything has been configured the last step is to publish the configuration to the LIS database.&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Publish-CsLisConfiguration&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now the LIS data has been published it is time for some testing. But for that you will have to wait for part 2 of this article.&lt;/p&gt;
</description>
				<pubDate>Fri, 01 Nov 2019 20:49:00 +0000</pubDate>
				<link>/sfb-lis-part-1/</link>
				<guid isPermaLink="true">/sfb-lis-part-1/</guid>
			</item>
		
			<item>
				<title>Hit refresh</title>
				<description>&lt;p&gt;It has been a very long time ago since I have wrote my last blog. Multiple things happened in my life which resulted in no time to write blogs anymore: finished my study, work, family etc. This weekend I decided to pickup blogging again.&lt;/p&gt;

&lt;p&gt;As you might already have seen a few things have changed: moved away from Wordpress, changed website layout and last change was completed this week changing my domain from johanveldhuis.nl to myuclab.nl.&lt;/p&gt;

&lt;p&gt;In the coming weeks I will write several blogs. Focus of the blogs will remain the same although it will probably be more Lync/Skype and Teams related since I have changed focus.&lt;/p&gt;
</description>
				<pubDate>Mon, 28 Oct 2019 22:02:22 +0000</pubDate>
				<link>/hit-refresh/</link>
				<guid isPermaLink="true">/hit-refresh/</guid>
			</item>
		
			<item>
				<title>SefaUtil Gui v2.1</title>
				<description>&lt;p&gt;SefaUtil Gui v2.1 is a new minor version is published of the SefaUtil GUI script. It contains some small improvements to fix some issues some users experienced. Issues fixed in this release are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;searching for delegates doesn’t work correctly&lt;/li&gt;
  &lt;li&gt;time before forwarding to a team could not be configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find new issues please let me know.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/JohanVeldhuis/SefaUtilGUI&quot;&gt;Download SefaUtil GUI v2.1&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 15 Nov 2015 15:22:22 +0000</pubDate>
				<link>/sefautil-gui-v2-1/</link>
				<guid isPermaLink="true">/sefautil-gui-v2-1/</guid>
			</item>
		
			<item>
				<title>SefaUtil GUI v2</title>
				<description>&lt;p&gt;With pleasure I present you SefaUtil GUI v2. First thanks to all the beta tester which provided a lot of good feedback which has been incorporated in the tool.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-3369&quot; src=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2-300x161.png?resize=300%2C161&quot; alt=&quot;SefaUtil v2&quot; width=&quot;300&quot; height=&quot;161&quot; srcset=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png?resize=300%2C161&amp;amp;ssl=1 300w, https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png?resize=1024%2C550&amp;amp;ssl=1 1024w, https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png?resize=900%2C483&amp;amp;ssl=1 900w, https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png?w=1525&amp;amp;ssl=1 1525w, https://i2.wp.com/myuclab.nl/wp-content/uploads/2015/09/SefaUtil_v2.png?w=1254&amp;amp;ssl=1 1254w&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So know you probably want to know what has improved?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL querying&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well several things have been improved but most improved piece is retrieving the current settings. As you may know Sefautil signs in for every action which you executie: both query and change. Greig Sheridan (@greiginsydney) pointer me to the script of James Cussen which contained soms SQL to query certain databases for Lync. Based on that script I started the research on how I could user those scripts in SefaUtil GUI. It took soms time but in this version querying the setting for a user is performed by using SQL queries. This speeds up the process amazingly. Changing settings is still performed by invoking SefaUtil.exe&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pool switching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The GUI now contains an option to switch from pools. So if you have multiple pools you can now easily switch by using the GUI. This will safe you time because you now don’t have to reload the tool. In addition to this the user list now only contains the users homed on that pool. The delegates list still is the long list which contains all Enterprise Voice enabled users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backup and recovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An option has been introduced to backup &amp;amp; recovery your SefaUtil settings.  Please test this functionality yourself before using it in production. As far as I have tested I it worked good for me but I strongly encourage you to test it in a lab environment prior to restoring settings in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skype for Business support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skype for Business is available for a while so I added support for this also. Keep in mind this will user a different version of SefaUtil.exe compared to the one for Lync 2013.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Additional parameters have been added most on request:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SfB2015: Could be used to overwrite the default location of SefaUtil for Skype for Business Server 2015&lt;/li&gt;
  &lt;li&gt;Groupiddigits: Could be used to overwrite amount of digits used for team calls incl. # if used, default value is 3&lt;/li&gt;
  &lt;li&gt;Loaddata: Can be used to prevent to automatically load data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Besides this a lot of code optimization has been performed and several bugs have been fixed.&lt;/p&gt;

&lt;p&gt;As with all software despite the heavy testing you might find an issue. If so please let me know so I can assist you with troubleshooting the issue and make code changes if necessary so other people can benefit from it.&lt;/p&gt;

&lt;p&gt;SefaUtil GUI V2 van be downloaded via the link below:&lt;/p&gt;

&lt;div class=&quot;w3eden&quot;&gt;
  &lt;!-- WPDM Link Template: Default Template --&gt;
  
  &lt;div class=&quot;wpdm-link-tpl link-btn [color]&quot; data-durl=&quot;https://myuclab.nl/?post_type=wpdmpro&amp;amp;p=3372&amp;amp;wpdmdl=3372&quot;&gt;
    &lt;div class=&quot;media&quot;&gt;
      &lt;div class=&quot;pull-left&quot;&gt;
        &lt;img class=&quot;wpdm_icon&quot; alt=&quot;Icon&quot; src=&quot;https://myuclab.nl/wp-content/plugins/download-manager/assets/file-type-icons/ps1.svg&quot; onerror=&quot;this.src=&amp;quot;https://myuclab.nl/wp-content/plugins/download-manager/assets/file-type-icons/unknown.svg&amp;quot;;&quot; /&gt;
      &lt;/div&gt;
      
      &lt;div class=&quot;media-body&quot;&gt;
        &lt;strong class=&quot;ptitle&quot;&gt;&lt;!--:en--&gt;SefaUtil GUI V2
        
        &lt;!--:--&gt;
        
        &lt;!--:nl--&gt;SefaUtil GUI V2
        
        &lt;!--:--&gt;
        
        &lt;span class=&quot;label label-default&quot; style=&quot;font-weight: 400;&quot;&gt;106.88 KB&lt;/span&gt;&lt;/strong&gt; 
        
        &lt;div&gt;
          &lt;strong&gt;&lt;a class=&quot;wpdm-download-link btn btn-primary &quot; rel=&quot;nofollow&quot; href=&quot;#&quot; onclick=&quot;location.href=&apos;https://myuclab.nl/?post_type=wpdmpro&amp;amp;p=3372&amp;amp;wpdmdl=3372&apos;;return false;&quot;&gt;Download&lt;/a&gt;&lt;/strong&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  
  &lt;div style=&quot;clear: both&quot;&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
				<pubDate>Mon, 07 Sep 2015 21:26:48 +0000</pubDate>
				<link>/sefautil-gui-v2/</link>
				<guid isPermaLink="true">/sefautil-gui-v2/</guid>
			</item>
		
			<item>
				<title>An error occurred when processing the security tokens in the message</title>
				<description>&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Federation always fun as you may have read in one of my previous blogs. Starting this week we had some issues at a customer where the Free/busy lookups across environments stopped working. Not only to other Exchange environments but also Office 365.&lt;/p&gt;

&lt;p&gt;Both the Outlook logging and event logs on the CAS provided the same error. The complete error message is displayed below:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Process Microsoft.Exchange.InfoWorker.Common.Delayed`1[System.String]: &amp;lt;&lt;a href=&quot;mailto:johan.veldhuis@domain.com%3ESMTP:johan.veldhuis@domain.com&quot;&gt;johan.veldhuis@domain.com&amp;gt;SMTP:johan.veldhuis@domain.com&lt;/a&gt; failed. Exception returned is Microsoft.Exchange.InfoWorker.Common.Availability.AutoDiscoverFailedException: Autodiscover failed for e-mail address &amp;lt;&lt;a href=&quot;mailto:johan.veldhuis@domain.com%3ESMTP:johan.veldhuis@domain.com&quot;&gt;johan.veldhuis@domain.com&amp;gt;SMTP:johan.veldhuis@domain.com&lt;/a&gt; with exception System.Web.Services.Protocols.SoapHeaderException: &lt;strong&gt;An error occurred when processing the security tokens in the message&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.SoapWebClient.AutoDiscover.DefaultBinding_Autodiscover.EndGetUserSettings(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.UserSoapAutoDiscoverRequest.EndGetSettings(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;_   at Microsoft.Exchange.InfoWorker.Common.Availability.SoapAutoDiscoverRequest.&amp;lt;&amp;gt;c__DisplayClass4.&lt;EndInvoke&gt;b\_\_3()_&lt;/EndInvoke&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.SoapAutoDiscoverRequest.ExecuteAndHandleException(ExecuteAndHandleExceptionDelegate operation). —&amp;gt; System.Web.Services.Protocols.SoapHeaderException: An error occurred when processing the security tokens in the message.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;   at Microsoft.Exchange.SoapWebClient.AutoDiscover.DefaultBinding_Autodiscover.EndGetUserSettings(IAsyncResult asyncResult)&lt;/p&gt;

&lt;p&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.UserSoapAutoDiscoverRequest.EndGetSettings(IAsyncResult asyncResult)&lt;/p&gt;

&lt;p&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.SoapAutoDiscoverRequest.&amp;lt;&amp;gt;c__DisplayClass4.&lt;EndInvoke&gt;b\_\_3()&lt;/EndInvoke&gt;&lt;/p&gt;

&lt;p&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.SoapAutoDiscoverRequest.ExecuteAndHandleException(ExecuteAndHandleExceptionDelegate operation)&lt;/p&gt;

&lt;p&gt;   — End of inner exception stack trace —&lt;/p&gt;

&lt;p&gt;. &lt;em&gt;Name of the server where exception originated: EXC01. This event may occur when Availability Service cannot discover an Availability Service in the remote forest.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The bold part marks the error in this case &lt;em&gt;An error occurred when processing the security tokens in the message.&lt;/em&gt; This error tells you there is an issue with the security token which your server has received from the Microsoft Federation Gateway. So probably this customer is not the only customer facing this issue.&lt;/p&gt;

&lt;p&gt;Microsoft has acknowledged there were some issues earlier this week which not only affected this functionality but also some Office 365 services.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Office 365 status&quot; src=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2014/01/O365_status-300x45.png?resize=300%2C45&quot; width=&quot;300&quot; height=&quot;45&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Currently a work around is available to fix this issue. To fix the issue you will need to refresh the federation trust metadata. This can be done by using the following Powershell cmdlets:&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;_Get-Federationtrust&lt;/td&gt;
      &lt;td&gt;Set-Federationtrust -Refreshmetadata_&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;It is important to know that this cmdlet will need to be run on both sides else it may not fix the issues. Once the cmdlet have been executed it may take some time before the free/busy lookups start to work again.&lt;/p&gt;
</description>
				<pubDate>Thu, 09 Jan 2014 22:43:21 +0000</pubDate>
				<link>/error-occurred-processing-security-tokens-message/</link>
				<guid isPermaLink="true">/error-occurred-processing-security-tokens-message/</guid>
			</item>
		
			<item>
				<title>Relinquishing job because the mailbox is locked</title>
				<description>&lt;p&gt;During a migration to Office 365 I had this issue. The migration of a mailbox was stalled several times with the following entry logged in the migration log &lt;em&gt;Relinquishing job because the mailbox is locked&lt;/em&gt;. Sometimes this occurs only once but I have seen times that the mailbox will get stuck in this phase.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;12/20/2013 9:24:08 AM [DB4PR04MB459] The Microsoft Exchange Mailbox Replication service ‘DB4PR04MB459.eurprd04.prod.outlook.com’ (15.0.842.8 caps:01FF) is examining the request.&lt;/em&gt; &lt;em&gt;12/20/2013 9:24:09 AM [DB4PR04MB459] Connected to target mailbox ‘Primary (4ca8eac9-f378-4e82-8d07-f984c64176e8)’, database ‘EURPR04DG029-db041’, Mailbox server ‘DB4PR04MB459.eurprd04.prod.outlook.com’ Version 15.0 (Build 842.0).&lt;/em&gt; &lt;em&gt;12/20/2013 9:24:09 AM [DB4PR04MB459] Connected to target mailbox ‘Archive (07121074-d871-4db9-9f4e-153010131a50)’, database ‘EURPR04DG029-db041’, Mailbox server ‘DB4PR04MB459.eurprd04.prod.outlook.com’ Version 15.0 (Build 842.0).&lt;/em&gt; &lt;em&gt;12/20/2013 9:24:14 AM [DB4PR04MB459] Connected to source mailbox ‘Primary (4ca8eac9-f378-4e82-8d07-f984c64176e8)’, database ‘MB_Others’, Mailbox server ‘CAS02.corp.local’ Version 14.3 (Build 158.0), proxy server ‘CAS01.corp.local’ 14.3.151.0 caps:05FFFF.&lt;/em&gt; &lt;em&gt;12/20/2013 9:24:15 AM [DB4PR04MB459] Connected to source mailbox ‘Archive (07121074-d871-4db9-9f4e-153010131a50)’, database ‘MB_Archives_Large’, Mailbox server ‘CAS02.corp.local’ Version 14.3 (Build 158.0), proxy server ‘CAS01.corp.local’ 14.3.151.0 caps:05FFFF.&lt;/em&gt; &lt;em&gt;12/20/2013 9:24:15 AM [DB4PR04MB459] Relinquishing job because the mailbox is locked. The job will attempt to continue again after 12/20/2013 9:29:15 AM.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When searching in Googl you will see several tips but most of them will point to TMG or a Firewall which will block the large amount of requests Office 365 sends because it thinks it’s unsafe. Microsoft has published a Knowledge Base article about this which you can find &lt;a href=&quot;http://support.microsoft.com/kb/2654376&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The solution Microsoft offers is raising the value of the &lt;em&gt;Custom Limit in the&lt;/em&gt; &lt;em&gt;Flood Mitigation Settings.&lt;/em&gt; Microsoft will tell you to raise this number to a higher value but it depends on the amount of mailboxes how high you will configure this value.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2013/12/2654412.jpg&quot;&gt;&lt;img alt=&quot;TMG Flood Migration settings&quot; src=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2013/12/2654412-294x300.jpg?resize=294%2C300&quot; width=&quot;294&quot; height=&quot;300&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course this is a nice solution but it might require the modification of the value multiple times. Despite this value will be applied to all IP addresses including those from evil users. There must be a nicer solution. A more suitable solution is to not apply the Flood mitigation settings to the IP addresses of Office 365.&lt;/p&gt;

&lt;p&gt;To configure this it is recommended to create a computer group which contains the separate IP addresses and subnets which are being used by Office 365. In the image below you can see an example.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2013/12/Floot-Mitigation-IP-Exceptions.png&quot;&gt;&lt;img alt=&quot;Floot Mitigation - IP Exceptions&quot; src=&quot;https://i1.wp.com/myuclab.nl/wp-content/uploads/2013/12/Floot-Mitigation-IP-Exceptions-300x150.png?resize=300%2C150&quot; width=&quot;300&quot; height=&quot;150&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a complete overview of the IP addresses used by Office 365 you van visit the following pages:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/dn163583(v=exchg.150).aspx&quot;&gt;Exchange Online Protection IP addresses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://onlinehelp.microsoft.com/en-us/office365-enterprises/hh373144.aspx&quot;&gt;Office 365 URLs and IP address ranges&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is recommended to visit both pages and add the IP’s and subnets to the computer group. Once the group is created add the group to the &lt;em&gt;IP Exceptions&lt;/em&gt; tab. Once the configuration has been activated in TMG you wille see that the migrations will continue and will not stop anymore. This last benefit has another benefit the migration of a mailbox will be completed faster.&lt;/p&gt;
</description>
				<pubDate>Fri, 20 Dec 2013 20:46:32 +0000</pubDate>
				<link>/relinquishing-job-mailbox-locked/</link>
				<guid isPermaLink="true">/relinquishing-job-mailbox-locked/</guid>
			</item>
		
			<item>
				<title>Troubleshooting federated sharing – part III</title>
				<description>&lt;p&gt;In the first two parts of the blog series about troubleshooting federated sharing we had a look at the infrastructure and configuration which is required. Besides this we did some basic troubleshooting on the components involved during federated sharing. In this part we will look at some examples which I gathered during troubleshooting a federated sharing issue.&lt;/p&gt;

&lt;p&gt;Below you will see an example of an error which was received when trying to retrieve the free/busy information from a user hosted on another Exchange environment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Process 1212: ProxyWebRequest FederatedCrossForest from S-1-5-21-1671710892-3805255249-3875359145-102309 to https://mail.domain.com/ews/exchange.asmx/WSSecurity failed. Caller SIDs: WSSecurity. The exception returned is Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequestProcessingException: System.Net.WebException: &lt;strong&gt;The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. —&amp;gt; System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object&amp;amp; internalAsyncState, Stream&amp;amp; responseStream)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.Proxy.Service.EndGetUserAvailability(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.FreeBusyApplication.EndProxyWebRequest(ProxyWebRequest proxyWebRequest, QueryList queryList, Service service, IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequest.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.AsyncWebRequest.EndInvokeWithErrorHandling():. The request information is ProxyWebRequest type = FederatedCrossForest, url = https://mail.domain.com/ews/exchange.asmx/WSSecurity&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mailbox list = &lt;a href=&quot;mailto:Johan@domain.com&quot;&gt;Johan@domain.com&lt;/a&gt;SMTP:Johan@domain.com, Parameters: windowStart = 10/1/2013 10:00:00 AM, windowEnd = 10/31/2013 10:00:00 AM, MergedFBInterval = 30, RequestedView = Detailed&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;. —&amp;gt; System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. —&amp;gt; System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object&amp;amp; internalAsyncState, Stream&amp;amp; responseStream)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.Proxy.Service.EndGetUserAvailability(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.FreeBusyApplication.EndProxyWebRequest(ProxyWebRequest proxyWebRequest, QueryList queryList, Service service, IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequest.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.AsyncWebRequest.EndInvokeWithErrorHandling()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;. Name of the server where exception originated:CAS01. Make sure that the Active Directory site/forest that contain the user’s mailbox has at least one local Exchange 2010 server running the Availability service. Turn up logging for the Availability service and test basic network connectivity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When looking at the marked text you will see the actual cause, a certificate issue. So how to deal in this case? The first step you can take is try to access the Exchange Web Services of the other Exchange environment. In this case we can do it by browsing to &lt;em&gt;https://mail.domain/com/ews/exchange.asmx/WSSecurity&lt;/em&gt; what will probably happen is that you receive a certificate warning. And that is exactly why the lookup fails. The certificate from the remote Exchange environment is not valid according to the validation procedure. However when you open it in a browser you will see the reason why the certificate is not trusted. This can be caused by several things among them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Certificates is signed by a root CA which is not trusted&lt;/li&gt;
  &lt;li&gt;Name on the certificate is incorrect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case the root CA was not trusted by the Exchange environment. By importing the root CA in the Enterprise Trusted Root folder of the CAS the problem was solved.&lt;/p&gt;

&lt;p&gt;The second one was pretty hard to troubleshoot but the solution to solve it was pretty easy. Again the error is marked in the text below. The error tells you that the other side did close the connection. OK nice and now what? In this case you will need to search in the IIS logs on the CAS of the target Exchange environment to see what happens when traffic from your Exchange environment arrives at the CAS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Process 1212: ProxyWebRequest FederatedCrossForest from S-1-5-21-1671710892-3805255249-3875359145-102309 to https://mail.domain.com/ews/exchange.asmx/WSSecurity failed. Caller SIDs: WSSecurity. The exception returned is Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequestProcessingException: System.Net.WebException: &lt;strong&gt;The underlying connection was closed: An unexpected error occurred on a receive. —&amp;gt; System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. —&amp;gt; System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Security._SslStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.TlsStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.PooledStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Connection.ReadCallback(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object&amp;amp; internalAsyncState, Stream&amp;amp; responseStream)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.Proxy.Service.EndGetUserAvailability(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.FreeBusyApplication.EndProxyWebRequest(ProxyWebRequest proxyWebRequest, QueryList queryList, Service service, IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequest.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.AsyncWebRequest.EndInvokeWithErrorHandling():. The request information is ProxyWebRequest type = FederatedCrossForest, url = https://mail.domain.com/ews/exchange.asmx/WSSecurity&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mailbox list = &lt;a href=&quot;mailto:Johan@domain.com&quot;&gt;Johan@domain.com&lt;/a&gt;SMTP:Johan@domain.com, Parameters: windowStart = 9/29/2013 12:00:00 AM, windowEnd = 11/10/2013 12:00:00 AM, MergedFBInterval = 30, RequestedView = MergedOnly&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;. —&amp;gt; System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. —&amp;gt; System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. —&amp;gt; System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Security._SslStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.TlsStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.PooledStream.EndRead(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Net.Connection.ReadCallback(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object&amp;amp; internalAsyncState, Stream&amp;amp; responseStream)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at System.Web.Services.Protocols.SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.Proxy.Service.EndGetUserAvailability(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.FreeBusyApplication.EndProxyWebRequest(ProxyWebRequest proxyWebRequest, QueryList queryList, Service service, IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.ProxyWebRequest.EndInvoke(IAsyncResult asyncResult)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   at Microsoft.Exchange.InfoWorker.Common.Availability.AsyncWebRequest.EndInvokeWithErrorHandling()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;   — End of inner exception stack trace —&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;. Name of the server where exception originated: CAS01. Make sure that the Active Directory site/forest that contain the user’s mailbox has at least one local Exchange 2010 server running the Availability service. Turn up logging for the Availability service and test basic network connectivity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Search for traffic destined to &lt;em&gt;/ews/exchange.asmx/WSSecurity&lt;/em&gt; and you will probably find the error that did occur. Normally when everything works a &lt;em&gt;200&lt;/em&gt; will be displayed. If you do receive a &lt;em&gt;4XX&lt;/em&gt; error then verify that the federation with the Microsoft Federation Gateway works correctly as explained in the first part. Besides this verify that WSSecurity is enabled on the Autodiscover and EWS directory.&lt;/p&gt;

&lt;p&gt;However you might get other errors, in this case it was a &lt;em&gt;500&lt;/em&gt; error. What this means and that it doesn’t know how to deal with the traffic which arrives and will close the connection. If this happens make sure &lt;em&gt;WSSecurity&lt;/em&gt; is enabled on the virtual directories for Autodiscover and EWS. When this is confirmed verify that the &lt;em&gt;svc-integrated handler&lt;/em&gt; is assigned to both the Autodiscover and EWS. If this is both configured correctly everything should be OK but why doesn’t it work?&lt;/p&gt;

&lt;p&gt;In some occasions it may happen that &lt;em&gt;EWSSecurity&lt;/em&gt; is correctly enabled but for some reason IIS doesn’t pick this up. If this happens an &lt;em&gt;iisreset&lt;/em&gt; will fix your issue and you will be able to retrieve the free/busy information from the other Exchange organization.&lt;/p&gt;

&lt;p&gt;Here ends the series of troubleshooting federated sharing. I am aware there might be other solution for the issues you might find during the implementation but these were just two examples of issues I found.&lt;/p&gt;

&lt;p&gt;I hope you liked this series and if you have any questions use the contact form on the site to send me a message or ask your question by posting a comment.&lt;/p&gt;
</description>
				<pubDate>Fri, 29 Nov 2013 21:29:54 +0000</pubDate>
				<link>/troubleshooting-federated-sharing-deel-iii/</link>
				<guid isPermaLink="true">/troubleshooting-federated-sharing-deel-iii/</guid>
			</item>
		
			<item>
				<title>Review: Microsoft Exchange Server 2013 Inside Out: Mailbox and High Availability</title>
				<description>&lt;p&gt;&lt;a href=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2013/11/cat.gif&quot;&gt;&lt;img alt=&quot;Cover&quot; src=&quot;https://i2.wp.com/myuclab.nl/wp-content/uploads/2013/11/cat.gif?resize=180%2C221&quot; width=&quot;180&quot; height=&quot;221&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has been a while ago since I received this book for review, initially I started reading it on my way to Exchange Connections in Las Vegas on my iPad mini. And the last few weeks I finished reading the book. So what do I think of the book? The book is a must have resource for everyone who is working with Exchange 2013. Tony Redmond is amazing good in describing the several parts of Exchange related to mailbox and high availability. Yes you are reading it correct this book only describes the mailbox an high availability of Exchange 2013. For the Client Access ,Connectivity and UM part of Exchange 2013 you will have to read the book from Paul Robichaux.&lt;/p&gt;

&lt;p&gt;Tony starts with describing some important things you will have to consider when implementing Exchange 2013. This starts with a discussion about the architecture and continuous with several decisions you have to make before implementing Exchange 2013. Then he continuous to describe which preparations you have to make before you can implement Exchange 2013. After these topics have been described Tony describes how to install it and the basic management tools you will need to use to manage your Exchange 2013 and in more detail how to manage your mailboxes.&lt;/p&gt;

&lt;p&gt;Starting from chapter 8 the book makes a very deep dive. For those who are already familiar with Exchange 2013 and want to skip the basic things this is were you should start reading the book. In very deep detail Tony describes several topics among them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;how does the store work&lt;/li&gt;
  &lt;li&gt;the database availability group&lt;/li&gt;
  &lt;li&gt;migrating mailboxes&lt;/li&gt;
  &lt;li&gt;compliance management&lt;/li&gt;
  &lt;li&gt;public folders and site mailboxes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example in the _how does the store work _chapter will describe what is under the hood of the store. When you have read this chapter you will probably have a better understanding of the store process and how complex the product Exchange is under the hood. After the store is described the book continuous with the database availability group. In this chapter Tony describes several topics related to the DAG including: design considerations, daily administration tasks and several important components of the DAG among them the active manager.&lt;/p&gt;

&lt;p&gt;Once the mailbox and high availability part have been discussed the book continues with the mailbox migration process. In this chapter the components are discussed which are key components of the migration process and of course how to perform the migration. This is not limited to only the cmdlets but also contains several practical tips from Tony about planning.&lt;/p&gt;

&lt;p&gt;Some people are already working with the compliance part but some haven’t probably touched it. Both groups will benefit from this chapter as it describes some basic things but contains enough detail so people with experience will also learn a lot from this chapter. Compliance is a topic which becomes more important now-a-days since more and more companies will start implementing it either due to company regulations or government regulations.&lt;/p&gt;

&lt;p&gt;In the last chapter Tony describes one of the probably most discussed topics of Exchange. Will it be there in the next release? How long will Microsoft Public Folders? These are just a few questions you will hear every time during the development phase of the next version of Exchange. In Exchange 2013 the Public Folders have changed a lot since the public folders can now be part of a normal mailbox database so no separate public folder database anymore. But how to get from the “legacy” Public Folder to the “new” Public Folder. Read Tony’s book and you have some good info on how to do this.&lt;/p&gt;

&lt;p&gt;So what’s the conclusion of this review? The book is a must read for everybody who works with Exchange. It does not contain the basic information which most books do but describes several things in very deep detail. Besides this Tony also provides some additional information which really adds value to the book.&lt;/p&gt;

&lt;p&gt;So if you got curious about the book just press the link below to buy the book:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://shop.oreilly.com/product/0790145378309.do&quot; target=&quot;_blank&quot;&gt;Buy Microsoft Exchange Server 2013 Inside Out: Mailbox and High Availability&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 08 Nov 2013 20:30:41 +0000</pubDate>
				<link>/review-microsoft-exchange-server-2013-inside-mailbox-high-availability/</link>
				<guid isPermaLink="true">/review-microsoft-exchange-server-2013-inside-mailbox-high-availability/</guid>
			</item>
		
	</channel>
</rss>
