<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>CANITPRO</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/canitpro/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/canitpro/feed.xml</link>
    <description>Connecting IT Professionals to the latest Microsoft technology via conversation, collaboration and online resources.</description>
    <lastBuildDate>Thu, 14 Feb 2019 18:32:49 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>PowerShell Basics: Connecting to Exchange Online Using Multi-Factor Authentication</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/powershell-basics-connecting-to-exchange-online-using-multi-factor-authentication</link>
      <pubDate>Wed, 23 Aug 2017 07:00:45 GMT</pubDate>
      <dc:creator><![CDATA[MVP Thomas Rayner]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=23155</guid>
      <description><![CDATA[Using PowerShell to manage your Microsoft cloud services like Exchange Online and using multi-factor...]]></description>
      <content:encoded><![CDATA[Using PowerShell to manage your Microsoft cloud services like Exchange Online and using multi-factor authentication (MFA) separately is awesome. Using the two together however, not so much. Microsoft documentation on this topic seems to suggest that all the required administrative tasks needed are to be performed from a shell that launched separately from the PowerShell console. I would rather be able to connect to Exchange Online using MFA via PowerShell through a normal console, or as part of another tool. The following is how this can be accomplished.
<div class="hfeed site" id="page">
<div class="site-main" id="main">
<div class="content-area" id="primary">
<div class="site-content" id="content" role="main"><article class="post-536 post type-post status-publish format-standard hentry category-exchange category-powershell tag-exchange-2 tag-mfa tag-multi-factor-authentication tag-powershell-2" id="post-536">
<div class="post-mainpart animated fadeInUp">
<div class="entry-content">

The first thing you'll need to do is <a target="_blank" href="https://technet.microsoft.com/en-us/library/mt775114(v=exchg.160).aspx?WT.mc_id=CANITPRO-blog-abartolo" rel="noopener">install the tool at this page</a>. This will give you all the tools and libraries you need to install to connect to Exchange Online using MFA via PowerShell, including that special, magic console. Now that you have the tools installed, you can use this snippet to connect from a normal PowerShell console or from within another PowerShell-based tool.

&nbsp;
<pre class="brush: powershell;">$modules = @(Get-ChildItem -Path "$($env:LOCALAPPDATA)\Apps\2.0" -Filter "Microsoft.Exchange.Management.ExoPowershellModule.manifest" -Recurse )
$moduleName =  Join-Path $modules[0].Directory.FullName "Microsoft.Exchange.Management.ExoPowershellModule.dll"
Import-Module -FullyQualifiedName $moduleName -Force
$scriptName =  Join-Path $modules[0].Directory.FullName "CreateExoPSSession.ps1"
. $scriptName
$null = Connect-EXOPSSession
$exchangeOnlineSession = (Get-PSSession | Where-Object { ($_.ConfigurationName -eq 'Microsoft.Exchange') -and ($_.State -eq 'Opened') })[0]
</pre>
Lines 1 and 2 detail the location of the different tools and libraries installed earlier. Once I find the ExoPowerShellModule.dll, I can import it like any other module, except I’m specifying the full path, on line 3.

Lines 4 and 5 are where I find and dot source CreateExoPSSession.ps1 which is the script that contains the Connect-EXOPSSession cmdlet (which I’d be remiss if I didn’t mention violates the PowerShell naming standards created by the community and advertised by Microsoft). That cmdlet will trigger a login process that includes MFA, similar to how Login-AzureRmAccount works.

Finally on lines 6 and 7, I’m creating a new session and then assigning it to a variable called $exchangeOnlineSession. Then I can import that session and I’ll be away to the races.

It’s not as convenient or straightforward as connecting without MFA, but it’s definitely safer.

</div>
<img width="439" height="354" class="alignnone wp-image-19935" alt="" src="https://msdnshared.blob.core.windows.net/media/2016/09/PowerShell_Tips_Tricks_thumb.png" />

</div>
</article></div>
</div>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>PowerShell Basics: Azure AD Management Commands</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/powershell-basics-azure-ad-management-commands</link>
      <pubDate>Wed, 16 Aug 2017 07:00:25 GMT</pubDate>
      <dc:creator><![CDATA[MVP Dishan Francis]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=23137</guid>
      <description><![CDATA[Now that we’ve covered the basics in my previous post, Step-By-Step: Intro to Managing Azure AD via...]]></description>
      <content:encoded><![CDATA[Now that we’ve covered the basics in my previous post, <a href="https://blogs.technet.microsoft.com/canitpro/2017/08/09/step-by-step-intro-to-managing-azure-ad-via-powershell/">Step-By-Step: Intro to Managing Azure AD via PowerShell</a>, we’ll take a look at the commands available to further manage you Azure AD deployment. Some of the commands currently used for on-premises Active Directory Management will also work for Azure Active Directory or differ very little. For example, in an on-premises AD deployment, <b>New-ADUser </b>is used to add user, in Azure AD it becomes <b>New-​Msol​User</b>. The following are a list of commands available to manage Azure AD in PowerShell.

&nbsp;

More information about a command can view using,

<b>Get-Help New-​Msol​User –Detailed</b>

<strong> </strong>

Technical Information about thecommand can view using,

<b>Get-Help New-​Msol​User –Full </b>

<strong> </strong>

Online information about the command can view using,

<b>Get-Help New-Msol​User –Online</b>

<strong> </strong>

We also can view some example for the command using,

<b>Get-Help New-Msol​User –Example</b>

<strong> </strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power1.png"><img width="838" height="299" alt="power1" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power1.png" /></a>

&nbsp;

We can simply create new user using,

<b>New-MsolUser -UserPrincipalName "jeffm@therebeladmin.com" -DisplayName "Jeff Mak" -FirstName "Jeff" -LastName "Mak" -PasswordNeverExpires $true</b>

<strong> </strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power2.png"><img width="840" height="88" alt="power2" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power2.png" /></a>

&nbsp;

In order to create a user, you need to connect to Azure AD with a user who has “Global Admin” role.

In above command <b>UserPrincipalName</b> specify the UPN and user password s set not to expire.

It is obvious sometime we need to change password of an existing account.

&nbsp;

<b>Set-MsolUserPassword -UserPrincipalName "jeffm@therebeladmin.com" -NewPassword "pa$$word"</b>

The above command will reset the password for the <a>jeffm@therebeladmin.com</a> in to new password.

&nbsp;

Instead of specifying password, following command will generate random password and force user to reset it on next login.

<b>Set-MsolUserPassword -UserPrincipalName "jeffm@therebeladmin.com" -ForceChangePassword $true</b>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power3.png"><img width="838" height="36" alt="power3" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power3.png" /></a>

&nbsp;

Azure Active Directory does have predefined administrative roles with different capabilities. This allows administrators to assign permissions to users to do only certain tasks.

More details about these administrative roles and their capabilities can found on <a href="https://docs.microsoft.com/en-us/azure/active-directory/active-directory-assign-admin-roles">https://docs.microsoft.com/en-us/azure/active-directory/active-directory-assign-admin-roles</a>

We can list down these administrative roles using

<b>Get-MsolRole</b>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power4.png"><img width="840" height="468" alt="power4" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power4.png" /></a>

&nbsp;

According to requirements, we can add users to these administrative roles.

<b>Add-MsolRoleMember -RoleName "User Account Administrator" -RoleMemberObjectId "e74c79ec-250f-4a47-80dd-78022455e383"</b>

<strong> </strong>

Above command will add user with object id e74c79ec-250f-4a47-80dd-78022455e383 to the role.

In order to view existing members of different administrator roles, we can use command similar to below.

<b>$RoleMembers = Get-MsolRole -RoleName "User Account Administrator"</b>

<b>Get-MsolRoleMember -RoleObjectId $RoleMembers.ObjectId</b>

<strong> </strong>

This will list down the users with <b>User Account Administrator</b> role assigned.

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power5.png"><img width="839" height="99" alt="power5" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power5.png" /></a>

&nbsp;

Apart from the roles, AD also have security groups.

<b>New-MsolGroup -DisplayName "HelpDesk" -Description "Help Desk Users"</b>

Above command creates a group called <b>HelpDesk</b>

<strong> </strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power6.png"><img width="838" height="98" alt="power6" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power6.png" /></a>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power7.png"><img width="944" height="449" alt="power7" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power7.png" /></a>

A group contains members. We can add members to group using commands similar to below.

<b>Add-MsolGroupMember -GroupObjectId a53cc08c-6ffa-4bd6-8b03-807740e100f1 -GroupMemberType User -GroupMemberObjectId e74c79ec-250f-4a47-80dd-78022455e383</b>

<strong> </strong>

This will add user with object id e74c79ec-250f-4a47-80dd-78022455e383 to group with object id a53cc08c-6ffa-4bd6-8b03-807740e100f1.

We can list down the users of the group using

<b>Get-MsolGroupMember -GroupObjectId a53cc08c-6ffa-4bd6-8b03-807740e100f1</b>

<strong> </strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power8.png"><img width="841" height="76" alt="power8" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power8.png" /></a>

&nbsp;

We can view all the groups and their group ids using

<b>Get-MsolGroup</b>

<strong> </strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/05/power9.png"><img width="835" height="170" alt="power9" src="http://www.rebeladmin.com/wp-content/uploads/2017/05/power9.png" /></a>

In order to remove member from the security group we can use <b>Remove-MsoLGroupMember </b>cmdlet.

<b>Remove-MsoLGroupMember -GroupObjectId a53cc08c-6ffa-4bd6-8b03-807740e100f1 -GroupMemberType User -GroupmemberObjectId e74c79ec-250f-4a47-80dd-78022455e383</b>

<strong> </strong>

In order to remove a user from administrator role we can use <b>Remove-MsolRoleMember </b>cmdlet.

<b>Remove-MsolRoleMember -RoleName "User Account Administrator" -RoleMemberType User -RoleMemberObjectId "e74c79ec-250f-4a47-80dd-78022455e383"</b>

<strong> </strong>

Above command will remove user with object id e74c79ec-250f-4a47-80dd-78022455e383 from the group <b>User Account Administrator</b>]]></content:encoded>
    </item>
    <item>
      <title>Step-By-Step: Intro to Managing Azure AD via PowerShell</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/step-by-step-intro-to-managing-azure-ad-via-powershell</link>
      <pubDate>Wed, 09 Aug 2017 07:00:22 GMT</pubDate>
      <dc:creator><![CDATA[MVP Dishan Francis]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=23125</guid>
      <description><![CDATA[As IT Professionals know, time is never on our side.  Hence the reason PowerShell is so important....]]></description>
      <content:encoded><![CDATA[As IT Professionals know, time is never on our side.  Hence the reason PowerShell is so important.  It provides a quicker way of completing tasks and can even provide some automation if harnessed correctly.  This Step-By-Step will detail how to get started in harnessing PowerShell to manage an Azure Active Directory instance and detail day to day operation related commands to get you started.

In order to use PowerShell with Azure AD, first we need to install Azure Active Directory Module in local computer. there is two version of Azure active directory PowerShell module. One was made for the Public Preview and the latest one released after announces Azure AD GA. You can download module from <a href="http://connect.microsoft.com/site1164/Downloads/DownloadDetails.aspx?DownloadID=59185">http://connect.microsoft.com/site1164/Downloads/DownloadDetails.aspx</a>

It is highly recommended to replace it with the new version should you have already installed an older version.

Once installed let’s check its status.

<strong>Get-Module MSOnline</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson1.png"><img width="1362" height="83" alt="mson1" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson1.png" /></a>

In order to list down all the commands associate cmdlets with the module we can use

<strong>Get-Command -Module MSOnline</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson2.png"><img width="1205" height="1007" alt="mson2" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson2.png" /></a>

Next step is to connect to Azure AD Instance. In order to do that we can use,

<strong>Connect-MsolService</strong>

It will prompt for the login details. Please use your Azure DC Admin account details. Please note login via Microsoft account not supported.

First, we can list down all the domain under the given subscription. To do that we can use,

<strong>Get-MsolDomain</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson3.png"><img width="691" height="238" alt="mson3" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson3.png" /></a>

As next steps I like to list down all the users in Azure AD Setup.

<strong>Get-MsolUser</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson4.png"><img width="836" height="151" alt="mson4" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson4.png" /></a>

It will list down all the Users in the Azure AD.

I also can search for a specific user based on text patterns. In below example I am searching users with Name which match text “Dishan”

<strong>Get-MsolUser -SearchString "Dishan"</strong>

Idea of my search is to find some object values for this user. I can combine above command to return all the object value.

<strong>Get-MsolUser -SearchString "Dishan" | Select-Object *</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson5.png"><img width="839" height="687" alt="mson5" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson5.png" /></a>

Now we know what are the objects been use and I can make more unique search.

<strong>Get-MsolUser | Select-Object DisplayName,whenCreated,LastPasswordChangeTimestamp</strong>

Above command will list me all the users with Display Name, Date and Time It was created, and Date and Time of Last Password Change Action.

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson6.png"><img width="930" height="276" alt="mson6" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson6.png" /></a>

<strong>Get-MsolUserRole</strong> another handy cmdlet. It can use to check the role of a user account.

<strong>Get-MsolUserRole -UserPrincipalName "dcadmin@REBELADMIN.onmicrosoft.com" | fl</strong>

The above command will find the role for the given user account.

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson7.png"><img width="977" height="156" alt="mson7" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson7.png" /></a>

<strong>Get-MsolGroup</strong> cmdlet can use to list, filter Groups in the Azure AD.

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson8.png"><img width="1004" height="182" alt="mson8" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson8.png" /></a>

Using <strong>searchstring</strong> can search for the groups based on text patterns.

<strong>Get-MsolGroup -SearchString "AAD"</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson9.png"><img width="995" height="88" alt="mson9" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson9.png" /></a>

<strong>Get-MsolGroupMember </strong>can use to list down the members in the group.

<strong>Get-MsolGroupMember -GroupObjectId "77a76005-02df-48d5-af63-91a19ed55a82"</strong>

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson10.png"><img width="976" height="92" alt="mson10" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson10.png" /></a>

<strong>Remove-MsolUser</strong> cmdlet can use to remove the user object from the Azure AD. This can combine with <strong>searchstring</strong> to search for user and then remove the object same time.

<strong>Get-MsolUser -SearchString "user2" | Remove-MsolUser</strong>

Above command will search for the user object which have display name similar to user2 and then delete it.

<a href="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson11.png"><img width="826" height="92" alt="mson11" src="http://www.rebeladmin.com/wp-content/uploads/2017/02/mson11.png" /></a>]]></content:encoded>
    </item>
    <item>
      <title>Step-by-Step: First steps with Azure Container Instances</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/step-by-step-first-steps-with-azure-container-services</link>
      <pubDate>Wed, 02 Aug 2017 05:18:45 GMT</pubDate>
      <dc:creator><![CDATA[Pierre Roman]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=23006</guid>
      <description><![CDATA[Hello Folks,

It’s been a while since I last posted but it’s not because there has not been...]]></description>
      <content:encoded><![CDATA[Hello Folks,

It’s been a while since I last posted but it’s not because there has not been developments in the Microsoft Azure world. One in particular I wanted to talk about is Azure Container Instances or ACI for short. That capability was announced on July 26, 2017.

An Azure Container Instance is a single container is extremely quick to deploy and start. And it’s also billed by the second. These ACI allow you to specify sizing allowing you to match the requirements of your application perfectly.

There is no VM management you need to think about or cluster orchestration to setup. As Corey Sanders put it….

“It is simply your code, in a container, running in the cloud.”

In this post to show you how easy it is to get started, I will create a container in Azure and expose it to the internet with a public IP address in only two commands without any dependencies needed to be installed. All I need is a browser and an Azure Subscription.
<h4>Step 1 – Access the Cloud Shell Interface</h4>
The Cloud Shell enables access to a browser-based Bash command-line experience built-in the Azure portal. The Cloud Shell comes pre-installed with popular command-line tools and language support so you you can get right to it and not worry about installing/updating packages.

<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0022.jpg"><img width="855" height="550" title="clip_image002" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image002_thumb2.jpg" border="0" /></a>
<h4>Step 2 - Create a resource group</h4>
Azure Container Instances are Azure resources and therefore must reside in an Azure resource group, so our next step is to create a resource group with the az group create command.
<pre class="brush: powershell;">az group create --name ACI-test --location eastus
</pre>
<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0044.jpg"><img width="855" height="444" title="clip_image004" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image004_thumb3.jpg" border="0" /></a>
<h4>Step 3 – Create a container</h4>
Now that we have the Resource Group, we will create a container by providing a name, a Docker image, and the Azure resource group we created in the last step.

You can optionally expose the container to the internet with a public IP address.
<pre class="brush: powershell;">az container create --name myfirstaci --image microsoft/aci-helloworld --resource-group ACI-test --ip-address public
</pre>
<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0061.jpg"><img width="855" height="550" title="clip_image006" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image006_thumb1.jpg" border="0" /></a>

Within a few seconds, you will get a response to your request. Initially, the container will be in a <strong>Creating </strong>state,

<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0081.jpg"><img width="855" height="320" title="clip_image008" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image008_thumb1.jpg" border="0" /></a>

but it should start within a few seconds. You can check the status using the following command.
<pre class="brush: powershell;">az container show --name myfirstaci --resource-group ACI-test
</pre>
and you will get the new provisioning state which should change to “Succeeded”. You will also notice the public IP address of the conatainer.

<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0101.jpg"><img width="855" height="469" title="clip_image010" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image010_thumb1.jpg" border="0" /></a>
<h4>Step 4 – Test Access to the Container</h4>
To test the instance I opened a web browser and navigated to the IP address found above.

<a href="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0121.jpg"><img width="855" height="561" title="clip_image012" alt="clip_image012" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image012_thumb1.jpg" border="0" /></a>

That’s it! Our container is up and running. When you are done testing you can delete the container with the following command.
<pre class="brush: powershell;">az container delete --name myfirstaci --resource-group ACI-test&lt;
</pre>
There you go!

Cheers!

Pierre Roman

<a href="https://msdnshared.blob.core.windows.net/media/2017/03/clip_image0202.jpg"><img width="240" height="83" title="clip_image013" style="border: 0px currentcolor" alt="clip_image013" src="https://msdnshared.blob.core.windows.net/media/2017/08/clip_image0131.jpg" border="0" /></a>

<b>Pierre Roman
</b><u>@pierreroman</u>]]></content:encoded>
    </item>
    <item>
      <title>PowerShell Basics: Retrieving Azure Key Vault Certificate</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/powershell-basics-retrieving-azure-key-vault-certificate</link>
      <pubDate>Wed, 26 Jul 2017 07:01:16 GMT</pubDate>
      <dc:creator><![CDATA[MVP Thomas Rayner]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22896</guid>
      <description><![CDATA[Microsoft's Azure Key Vault manages cryptographic keys and certificates used by cloud applications...]]></description>
      <content:encoded><![CDATA[Microsoft's Azure Key Vault manages cryptographic keys and certificates used by cloud applications and services.
Some instances may require the use of said certificate stored in Azure Key Vault on a computer, or some hosted service. Use of PowerShell is the quickest way to accomplish this via the following steps:

With the Azure PowerShell tools installed and logged into Azure enter the following:
<pre class="brush: powershell;">Install-Module -Name AzureRm -Repository PSGallery -Scope CurrentUser -Force
Import-Module AzureRm
Login-AzureRmAccount
</pre>
Next step is to download the certificate. Enter the following:
<pre class="brush: powershell;">$cert = Get-AzureKeyVaultSecret -VaultName 'My-Vault' -Name 'My-Cert'
</pre>
Once downloaded, the SecretValueText property needs to be converted into a certificate. Enter the following to complete this:
<pre class="brush: powershell;">$certBytes = [System.Convert]::FromBase64String($cert.SecretValueText)
$certCollection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$certCollection.Import($certBytes,$null,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
</pre>
The SecretValueText can be converted into bytes and can utilize the X509Certificate2Collection class to convert those bytes to a certificate.
Next, we want to write the certificate to a pfx file on a disk somewhere (preferably to a temp location you can clean up later in the script).
<pre class="brush: powershell;">$protectedCertificateBytes = $certCollection.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
$pfxPath = "D:\a\1\temp\ThomasRayner-export.pfx"
[System.IO.File]::WriteAllBytes($pfxPath, $protectedCertificateBytes)
</pre>
The first line here exports the certificate and protects it with a password. Then it writes the protected bytes to a path on the file system.
So where did that password come from? I’m actually storing that in the Azure Key Vault.
<pre class="brush: powershell;">$password = (Get-AzureKeyVaultSecret -VaultName 'My-Vault' -Name 'My-PW').SecretValueText
$secure = ConvertTo-SecureString -String $password -AsPlainText -Force
</pre>
Now, I can either refer to that pfx file, or I can import it like this.
<pre class="brush: powershell;">Import-PfxCertificate -FilePath "D:\a\1\temp\ThomasRayner-export.pfx" Cert:\CurrentUser\My -Password $secure
</pre>
Be sure to clean up your certificates when completed.

<img width="430" height="347" class="alignnone wp-image-19935" alt="" src="https://msdnshared.blob.core.windows.net/media/2016/09/PowerShell_Tips_Tricks_thumb.png" />]]></content:encoded>
    </item>
    <item>
      <title>Build Intelligent Robots with EZ-Robot and Microsoft Cognitive Services</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/build-intelligent-robots-with-ez-robot-and-microsoft-cognitive-services</link>
      <pubDate>Wed, 12 Jul 2017 07:00:35 GMT</pubDate>
      <dc:creator><![CDATA[Sergiy Baydachnyy]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22475</guid>
      <description><![CDATA[What if a robot could tell how you are feeling?
Microsoft Cognitive Services is a set of APIs and...]]></description>
      <content:encoded><![CDATA[<p align="justify">What if a robot could tell how you are feeling?</p>
<p align="justify">Microsoft Cognitive Services is a set of APIs and SDK services that can enable developers to easily add features that can detect emotion, identify objects and understand language understanding into their applications. Imagine utilizing that same set of features in a robot.</p>
<p align="justify">Enter Calgary based <a href="http://www.ez-robot.com/">EZ-Robot</a> who has created a solution to allow those interested in building robots to create applications for their robots using different SDKs. Their core product called EZ-Builder allows anybody, regardless of programming knowledge, to bring robots to life. The software is available from <a href="http://www.microsoft.com/en-ca/store/p/ez-builder/9nblggh52555">Windows Store</a> and is able to incorporate Microsoft Cognitive Services to allow for further depth to the EZ-Robot's capabilities..</p>
<p align="justify">This post will cover is the use of three plugins compatible with EZ-Builder that are based on Microsoft Cognitive Services. The following are a list of these plugins:</p>

<ul>
 	<li><a href="https://www.ez-robot.com/EZ-Builder/Plugins/view/179">Bing Speech Recognition</a>: based on <a href="https://azure.microsoft.com/en-us/services/cognitive-services/speech/">Bing Speech API</a> and allows your robots to understand voice commands;</li>
 	<li><a href="https://www.ez-robot.com/EZ-Builder/Plugins/view/181">Microsoft Cognitive Emotion</a>: uses <a href="https://azure.microsoft.com/en-us/services/cognitive-services/emotion/">Emotion API</a> to understand your primary (with the most confidence) emotion and it’s confidence. Thanks to that you can program different behavior for your robots depends on your emotions;</li>
 	<li><a href="https://www.ez-robot.com/EZ-Builder/Plugins/view/180">Microsoft Cognitive Vision</a>: based on <a href="https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/">Computer Vision API</a> and allows you to grab image frames from input video stream to describe them and find some tags that are associated with the frames;</li>
</ul>
<p align="justify">To setup any of these plugins you simple need to install them on your computer and add to your EZ-Builder project. Once you have these plugins in your project, it’s easy to setup each of them. For example, if you want to use voice commands in your project, you need to provide some parameters using Config window below:</p>
<a href="https://www.ez-robot.com/uploads/user/DB763BE15E695777689418BE7364E0A3/Capture-636243243509365711.png"><img width="475" height="493" title="clip_image002" style="border: 0px currentcolor;padding-top: 0px;padding-right: 0px;padding-left: 0px" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/2017/05/clip_image00212.png" border="0" /></a>
<p align="justify">Working with the configuration for the plugin you will be able to invoke Script Editor to define robot actions based on input. Access to recognized text based on input voice command will be stored in BingSpeech variable, but you can rename it any time. Finally, you have to provide API Key to get access to Microsoft service. It’s just one place where you need to deal with the service directly. Just visit <a href="https://azure.microsoft.com/en-us/services/cognitive-services/">https://azure.microsoft.com/en-us/services/cognitive-services/</a> and create a free account to generate a key. The plugin will do all other things for you automatically and you can program robot’s behavior just imagine that the robots is getting text commands rather than voice commands.</p>
<p align="justify">The same situation for Cognitive Emotion and Cognitive Vision plugins. You need to provide API Key and after that you will be able to go ahead and start using the plugins just working with some predefined variables. In the case of the Emotion plugin, you can use EmotionDescription and EmotionConfidence variables. In the case of the Vision plugin, you can get access to image description and tags using VisionDescription, VisionConfidence and VisionReadText variable.</p>
<p align="justify">Therefore, it’s really easy to start using cognitive services in your EZ-Robot applications and I can promise some fun.</p>
<p align="justify">If you want to know more and watch some videos, EZ-Robot has begun publishing their lessons on YouTube and videos about <a href="https://www.youtube.com/watch?v=P0iDTKE0UF8">Emotion</a> and <a href="https://www.youtube.com/watch?v=ZACscARYIXw">Vision</a> services are already published.</p>
<p align="justify">Start using these plugins now and add some intelligence to your robots!</p>]]></content:encoded>
    </item>
    <item>
      <title>Step-By-Step: Configuring a site-to-site VPN Gateway between Azure and On-Premise</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/step-by-step-configuring-a-site-to-site-vpn-gateway-between-azure-and-on-premise</link>
      <pubDate>Wed, 28 Jun 2017 11:13:54 GMT</pubDate>
      <dc:creator><![CDATA[MVP Dishan Francis]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22855</guid>
      <description><![CDATA[Using site-to-site VPN gateway can provide better continuity for your workloads in hybrid cloud...]]></description>
      <content:encoded><![CDATA[Using site-to-site VPN gateway can provide better continuity for your workloads in hybrid cloud setup with Azure. This post will demonstrate how to set up site-to-site VPN Gateway to enable this.

<strong>Requirements </strong>

Before start make sure you have following in place.

1) <strong>VPN device: </strong>A VPN device is needed on-premise to create the VPN connection with Azure. A list of supported list of devices can found <a href="https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-about-vpn-devices">here</a>.

2) <strong>Static Public IP address: </strong>The VPN device should have external public IP address and it shouldn't be NAT.

3) <strong>Valid Azure Subscription</strong>

&nbsp;

<strong><u>Create Virtual Network </u></strong>

&nbsp;

If you already have virtual network setup in your azure subscription, you will not need to do this step but make sure the settings are correct.

&nbsp;

1) Log in to the azure portal.

2) Go to <strong>New &gt; Networking &gt; Virtual Network </strong>
<div class="hfeed site" id="page">
<div class="site-main" id="main">
<div class="content-area" id="primary">
<div class="site-content" id="content" role="main"><article class="post-2230 post type-post status-publish format-standard hentry category-azure category-microsoft tag-azure tag-azure-vpn tag-azure-vpn-gateway tag-site-to-site-vpn tag-vpn-gateway" id="post-2230">
<div class="entry-content">
<div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn1.png"><img width="379" height="320" class="alignnone wp-image-2231" alt="vpn1" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn1.png" /></a></div>
</div>
<div>

3)<span class="Apple-tab-span"> </span>Then click on <strong>create</strong>
<div class="hfeed site" id="page">
<div class="site-main" id="main">
<div class="content-area" id="primary">
<div class="site-content" id="content" role="main"><article class="post-2230 post type-post status-publish format-standard hentry category-azure category-microsoft tag-azure tag-azure-vpn tag-azure-vpn-gateway tag-site-to-site-vpn tag-vpn-gateway" id="post-2230">
<div class="entry-content">
<div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn2.png"><img width="583" height="893" class="alignnone size-full wp-image-2232" alt="vpn2" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn2.png" /></a></div>
<div></div>
<div>4)<span class="Apple-tab-span"> </span>In next page, it will open up the wizard with the VNet information. In their fill the information to match with your configuration.</div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn3.png"><img width="311" height="897" class="alignnone size-full wp-image-2233" alt="vpn3" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn3.png" /></a></div>
<div></div>
<div><strong>Name: </strong>Name for the VNet</div>
<div><strong>Address Space: </strong>IP range for the VNet. If you have multiple Address ranges, it can add later</div>
<div><strong>Subnet name: </strong>Name for the subnet you like to add</div>
<div><strong>Subnet Address range:</strong> Subnet IP range (it must be within the Address Space listed before)</div>
<div><strong>Resource Group:</strong> Can create new group or select existing group</div>
<div><strong>Location:</strong> location of the VNet</div>
<div></div>
<div>After that click on <strong>create</strong> to continue</div>
<div></div>
<div>5)<span class="Apple-tab-span"> </span>Once VNet created, can modify the address ranges and subnets</div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn4.png"><img width="1433" height="871" class="alignnone size-full wp-image-2234" alt="vpn4" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn4.png" /></a></div>
<div>
<div></div>
<div><u><strong>Create Gateway Subnet </strong></u></div>
<div></div>
<div>Next step is to create gateway subnet for the VNet. It is recommended to use /28 or /27 for gateway subnet. This need to be done before connecting VNet to the gateway.</div>
<div></div>
<div>1)<span class="Apple-tab-span"> </span>Log in to the Azure Portal</div>
<div>

2)<span class="Apple-tab-span"> </span>Then go to <strong>More Services &gt; Virtual Networks</strong>

&nbsp;

</div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn5.png"><img width="621" height="758" class="alignnone size-full wp-image-2235" alt="vpn5" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn5.png" /></a></div>
<div></div>
<div>3)<span class="Apple-tab-span"> </span>Then click on the<strong> VNet</strong>, created on previous step and click on <strong>subnets</strong>. Then click on <strong>gateway subnet </strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn6.png"><img width="845" height="821" class="alignnone size-full wp-image-2236" alt="vpn6" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn6.png" /></a></div>
<div></div>
<div>4)<span class="Apple-tab-span"> </span>In the next window define the subnet for the gateway and click <strong>OK</strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn7.png"><img width="577" height="908" class="alignnone size-full wp-image-2237" alt="vpn7" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn7.png" /></a></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn8.png"><img width="578" height="638" class="alignnone size-full wp-image-2238" alt="vpn8" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn8.png" /></a></div>
<div>
<div><u><strong>Create Virtual Network Gateway</strong></u></div>
<div></div>
<div>Next step is to create virtual network gateway.</div>
<div></div>
<div>1)<span class="Apple-tab-span"> </span>Log in to azure portal</div>
<div></div>
<div>2)<span class="Apple-tab-span"> </span>Go to <strong>New &gt; Networking &gt; Virtual Network Gateway </strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn9.png"><img width="690" height="850" class="alignnone size-full wp-image-2239" alt="vpn9" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn9.png" /></a></div>
<div></div>
<div>3)<span class="Apple-tab-span"> </span>In next window fill the relevant information and click on <strong>Create</strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn10.png"><img width="311" height="913" class="alignnone size-full wp-image-2240" alt="vpn10" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn10.png" /></a></div>
<div></div>
<div><strong>Name: </strong> Name for the virtual network gateway</div>
<div><strong>Gateway Type: </strong> For our VPN it will be VPN</div>
<div><strong>VPN Type: </strong> Type of the VPN and regular VPN will be route-based</div>
<div><strong>SKU: </strong>SKU for the VPN type</div>
<div><strong>Virtual Network: </strong>Select the VNet you have created following previous step</div>
<div><strong>Public IP Address: </strong>VPN need to have public IP address. Select public IP from here or if you don't have, once you click on the option it will allow you to add new one</div>
<div><strong>Location: </strong>Select the correct region to match with VNet region</div>
<div></div>
<div>4)<span class="Apple-tab-span"> </span>It can take up to 45 minutes to complete the task. Once it's done can see the public IP address details. You need this to configure the VPN device in yours on premises device</div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn11.png"><img width="1436" height="780" class="alignnone size-full wp-image-2241" alt="vpn11" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn11.png" /></a></div>
<div>
<div></div>
<div><u><strong>Create Local Network Gateway</strong></u></div>
<div></div>
<div>The next step is to create local gateway which represent your local network. To create it,</div>
<div></div>
<div>1)<span class="Apple-tab-span"> </span>Log in to azure portal</div>
<div></div>
<div>2)<span class="Apple-tab-span"> </span>Go to <strong>New &gt; Networking &gt; Local network gateway</strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn12.png"><img width="810" height="822" class="alignnone size-full wp-image-2242" alt="vpn12" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn12.png" /></a></div>
<div></div>
<div>3)<span class="Apple-tab-span"> </span>Then it will open new wizard and fill the relevant information. After that click on <strong>create</strong> to proceed</div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn13.png"><img width="312" height="910" class="alignnone size-full wp-image-2243" alt="vpn13" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn13.png" /></a></div>
<div><strong> </strong></div>
<div><strong>Name: </strong>Name for the local gateway</div>
<div><strong>IP Address: </strong>Public IP address to represent your VPN device. It should not behind NAT</div>
<div><strong>Address Space: </strong>This is yours on premises address ranges. You can add multiple ranges.</div>
<div><strong>Resource Group: </strong>Create new resource group or use the same one you were using</div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn14.png"><img width="1164" height="657" class="alignnone size-full wp-image-2244" alt="vpn14" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn14.png" /></a></div>
<div></div>
<div>
<div><strong><u>Create Site-to-Site VPN</u></strong></div>
<div></div>
<div>Then next step is to create Site-to-Site VPN connection between your VPN device and the virtual network gateway. To create it,</div>
<div></div>
<div>1)<span class="Apple-tab-span"> </span>Log in to azure portal</div>
<div></div>
<div>2)<span class="Apple-tab-span"> </span>Go to <strong>More Services &gt; Virtual network gateways </strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn15.png"><img width="622" height="923" class="alignnone size-full wp-image-2245" alt="vpn15" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn15.png" /></a></div>
<div></div>
<div>3)<span class="Apple-tab-span"> </span>Then click on the<strong> virtual network gateway</strong> you created and, under the <strong>settings</strong> tab, click on <strong>connection</strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn16.png"><img width="584" height="675" class="alignnone size-full wp-image-2246" alt="vpn16" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn16.png" /></a></div>
<div></div>
<div>4)<span class="Apple-tab-span"> </span>Then click on <strong>add</strong></div>
<div></div>
<div><img width="847" height="765" class="alignnone size-full wp-image-2247" alt="vpn17" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn17.png" /></div>
<div></div>
<div>5)<span class="Apple-tab-span"> </span>In the wizard fill the relevant information and click <strong>ok</strong>.</div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn18.png"><img width="312" height="909" class="alignnone size-full wp-image-2248" alt="vpn18" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn18.png" /></a></div>
<div><strong> </strong></div>
<div><strong>Name:</strong> Name of the connection</div>
<div><strong>Connection Type:</strong> Type of the VPN. Most of the time its site-to-site</div>
<div><strong>Virtual Network Gateway: </strong>Select the relevant virtual network gateway</div>
<div><strong>Local Network Gateway: </strong>Select the relevant local network gateway for your connection</div>
<div><strong>Shared Key: </strong>This is the pre-shared key you going to use for the VPN configuration</div>
<div></div>
<div>6)<span class="Apple-tab-span"> </span>Once created its all about configuring the VPN in your VPN device</div>
<div></div>
<div>7)<span class="Apple-tab-span"> </span>Once connected you can see the status in same page by clicking on <strong>connection </strong></div>
<div></div>
<div><a href="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn19.png"><img width="850" height="764" class="alignnone size-full wp-image-2249" alt="vpn19" src="http://www.rebeladmin.com/wp-content/uploads/2016/12/vpn19.png" /></a></div>
</div>
</div>
</div>
</div>
</div>
</div>
</article></div>
</div>
</div>
</div>
</div>
</div>
</article></div>
</div>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Tackling the Dragon – Converting a Java Based Game to Universal Windows Platform</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/tackling-the-dragon-converting-a-java-based-game-to-universal-windows-platform</link>
      <pubDate>Wed, 21 Jun 2017 07:00:53 GMT</pubDate>
      <dc:creator><![CDATA[Anthony Bartolo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22815</guid>
      <description><![CDATA[Ragnarök is Nigh.



Hamilton Ontario based Thrive games have been working on their lead game,...]]></description>
      <content:encoded><![CDATA[<em>Ragnarök is Nigh.</em>

<img width="471" height="265" class="alignnone size-full wp-image-22825" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/Thrive-Screenshot1.jpg" />

Hamilton Ontario based Thrive games have been working on their lead game, Dragon of Legends for sometime with aspirations of delivering their game to the Steam platform.  The game uncovers countless mysteries of the past as players battle across platforms in a vibrant 2D world inspired by Celtic and Norse mythology. Our team recently met with the team at Thrive games as they also had expressed interest in having their proprietary game engine utilized on multiple platforms (PC, OSX, Linux, iOS and Android) in order to stay committed to making our game accessible to everyone.

The Java app platform has been the platform of choice for the team at Thrive Games to architect their Norse tale to share with the world.  While Java games could easily be deployed on Steam, the team was looking for a way to offer Dragon of Legends on other platforms without incurring long development cycles.  Being a Kickstarter funded start-up, Thrive Games needed a cost-effective way to reach gamers on other platforms like Windows.

In a collaborative effort, our teams came together to futher the time Thrive games had invested building the proprietary game engine and graphics on Java to be enjoyed on the Universal Windows Platform via a multitude of Windows based devices.

The following was required to be completed to accomplish this:
<ol>
 	<li>Convert the JAR file to a non-dependant package file to be converted</li>
 	<li>Convert the created Win32 application to a UWP app</li>
 	<li>Submit the completed UWP game to the Windows Marketplace</li>
</ol>
In addition to the above core goals, the team's stretch goal was to complete the conversation of the Dragon of Legends UWP game in a span of 1 day.

Led by Technical Evangelist <a href="https://twitter.com/scruffyfurn">Mickey MacDonald</a>, the team's 1st task was to build the JAR package file from the libGDX game engine's output using <a href="https://gradle.org/">Gradle</a>. To do this the team ran Gradle from the command line with the command: <em>gradlew desktop:dist</em>

Next the team preformed a few steps to obfuscate the project to help protect the game assets and code from being extracted from the final release. This was accomplished by using <a href="https://sourceforge.net/projects/proguard/files">ProGuard</a>, and performing the following steps:
<ol>
 	<li>Construct a config file (config.pro) file. This file lists all the classes, fields, and methods, that need to be kept and/or that their names need to be kept<strong>NOTE:</strong> Refer to https://www.guardsquare.com/en/proguard/manual/ for more details on how this is accomplished</li>
 	<li>Once the config file is created, the team ran ProGuard from the command line, using the command: java -jar proguard.jar @config.pro</li>
</ol>
Once the obfuscating process had completed we then had a JAR package that could be used for release. The next step was to the create a Win32 executable application. This was completed by using cross-platform Java executable wrapper <a href="http://launch4j.sourceforge.net">Launch4j</a>. This wrapper allows a packaged Java application to be run just like a native Win32 application, packaging all dependencies with it, including the JRE (Java Runtime Environment) needed.

<img width="352" height="498" class="alignnone size-full wp-image-22817" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/Thrive-launch4j-use.gif" />
<em>Image source: http://launch4j.sourceforge.net</em>

The steps taken to create the executable in Launch4j are as follows:
<ol>
 	<li>Launch Launch4J and make sure you are on the <strong>Basic</strong> tab</li>
 	<li>On the <strong>Output File*</strong> input: Browse for the destination where you want your EXE file to be name via this "<em>desktop/...../ProjectName.exe</em>"</li>
 	<li>On the <strong>Jar*</strong> input: Browse and locate the jar file you want to convert in your PC</li>
 	<li>On the <strong>Icon</strong> input: Locate your <strong>ico</strong> file for the icon</li>
 	<li>Go to the <strong>JRE</strong> tab</li>
 	<li>On the <strong>Min JRE version</strong> input: type in:<em> 1.4.0</em></li>
 	<li>Click on the gear icon on the top and press save (destination preferably in output file destination, name - "ProjectName")</li>
 	<li>Press the <strong>Play</strong> button next to and the Jar file should be converted to EXE</li>
</ol>
Once completed, the newly created Win32 executable could now be converted to a UWP application using the Desktop Bridge kit. The conversion process itself was done manually due to the game's lack of installer and the developer’s knowledge of the files needed to operate the game. The following steps were completed to convert the Win32 app to a UWP app manually:
<ol>
 	<li>Download and installed the <a href="https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk">Window 10 Software Development Kit</a></li>
 	<li>Create the appxmanifest.xml manually
<strong>NOTE:</strong> detailed steps found here: <a href="https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-manual-conversion">https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-manual-conversion</a></li>
 	<li>Open the Command Prompt in administrator mode</li>
 	<li>Navigate to C:\Program Files (x86)\Windows Kits\10\bin\x86</li>
 	<li>Entered the following command: <em>MakeAppx pack /d "Path to Files" /p "Application Name".appx</em></li>
</ol>
Creation of the appx package of the game is now completed. The following steps were then completed to certificate sign and install the application on the local machine for testing.
<ol>
 	<li>Opened the Command Prompt in administrator mode</li>
 	<li>Navigate to C:\Program Files (x86)\Windows Kits\10\bin\x86</li>
 	<li>Create a certificate to sign the appx
<strong>NOTE:</strong> detailed steps found here <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/jj835832(v=vs.85).aspx">https://msdn.microsoft.com/en-us/library/windows/desktop/jj835832(v=vs.85).aspx </a></li>
 	<li>Use the SignTool to sign the application with the created certificate
<strong>NOTE:</strong> detailed steps found here <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/jj835835(v=vs.85).aspx">https://msdn.microsoft.com/en-us/library/windows/desktop/jj835835(v=vs.85).aspx</a></li>
 	<li>The certificate is then installed on the testing computer</li>
 	<li>Double click the appx and install the application</li>
</ol>
The process of embedding the dependencies, like the JRE in the final build were a challenge. After some careful consideration and research, the team decided on using Launch4j to address this. Launch4j allowed the team to create a lightweight Windows native executable which allowed bundling of the JRE and any other libraries or dependencies without the need to modify any existing code or infrastructure.

<img width="404" height="303" class="alignnone size-full wp-image-22827" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/06/Thrive-submit.jpg" />

The team at Thrive is now working on finalizing the game and adding the much-anticipated multi-player features. The plan is conduct a worldwide launch on all platforms in the next few months allowing Norse gods to battle it out on multiple devices. Checkout the Dragon of Legend demo currently live on the Windows Store here: <a href="https://www.microsoft.com/store/apps/9plhr65j1pr9">https://www.microsoft.com/store/apps/9plhr65j1pr9</a>]]></content:encoded>
    </item>
    <item>
      <title>Powershell Basics: Using Variables In ActiveDirectory Filters</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/powershell-basics-using-variables-in-activedirectory-filters</link>
      <pubDate>Wed, 14 Jun 2017 07:00:11 GMT</pubDate>
      <dc:creator><![CDATA[MVP Thomas Rayner]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22805</guid>
      <description><![CDATA[When working with the ActiveDirectory PowerShell module, the -filter parameter is sometimes required...]]></description>
      <content:encoded><![CDATA[When working with the ActiveDirectory PowerShell module, the -filter parameter is sometimes required to search for accounts or objects in Active Directory. Utilization of variables in those filters may also be required to return a needed value.

As an example, running the following command from the remote Exchange management shell returns an object that includes a username (called Alias in this example).
<pre class="brush: powershell;">$person = (Get-Mailbox ThmsRynr).Alias</pre>
While this value was easy to find (as it currently the only entry in the test directory) the next example will show how to pull the value using a filter.
<pre class="brush: powershell;">Get-AdUser -Filter "SamAccountName -eq $person"</pre>
However this method would result in the following error:
<pre class="brush: powershell;">Get-AdUser : Error parsing query: 'SamAccountName -eq ThmsRynr' Error Message: 'syntax error' at position: '20'.
At line:1 char:1
+ Get-AdUser -Filter "SamAccountName -eq $person"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ParserError: (:) [Get-ADUser], ADFilterParsingException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
</pre>
This is because the filter can’t handle the variable in that context. The filter needs to be wrapped in curly braces in order to use a variable in an ActiveDirectory cmdlet filter.
<pre class="brush: powershell;">Get-AdUser -Filter {SamAccountName -eq $person}</pre>
This will provide the following results:
<pre class="brush: powershell;">DistinguishedName : CN=Thomas Rayner,OU=Users,DC=lab,DC=workingsysadmin,DC=com
Enabled           : True
GivenName         : Thomas
Name              : Thomas Rayner
ObjectClass       : user
ObjectGUID        : &lt;snip&gt;
SamAccountName    : TFRayner
SID               : &lt;snip&gt;
Surname           : Rayner
UserPrincipalName : ThmsRynr@outlook.com
</pre>
Adding the curly braces will now allow the filter to operate as needed.

<img width="595" height="480" class="alignnone size-full wp-image-19935" alt="" src="https://msdnshared.blob.core.windows.net/media/2016/09/PowerShell_Tips_Tricks_thumb.png" />]]></content:encoded>
    </item>
    <item>
      <title>Augmenting Image Metadata with Cognitive Services</title>
      <link>https://docs.microsoft.com/archive/blogs/canitpro/augment-image-metadata-with-cognitive-services</link>
      <pubDate>Wed, 07 Jun 2017 11:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Anthony Bartolo]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/canitpro/?p=22777</guid>
      <description><![CDATA[Hello Folks,

This week, the team from Microsoft Canada has partnered with 4 startup teams at...]]></description>
      <content:encoded><![CDATA[Hello Folks,

This week, the team from Microsoft Canada has partnered with 4 startup teams at Communitech, an industry-led Waterloo Ontario based innovation centre that supports and fosters a community of nearly 1,000 tech companies, to incorporate Microsoft Cognitive Services into their offerings. While I am unfortunately unable to be there, I wanted to share my experience in helping another startup do the same.

Last Month we partnered with a local startup to create a solution to address the ever-growing problem we all have. How do we categorize and index all our digital pictures in such a way that we can search and retrieve based on picture content and not just based on date taken or location.

The Kwilt team is based out of Invest Ottawa. They are a startup with high-level goals for their applications, they currently have several apps to manage how people interact with their photos.
Their products are:
<ul>
 	<li>· <a href="https://play.google.com/store/apps/details?id=com.kwiltapp.companion">Kwilt for iOS and Android</a></li>
 	<li>· <a href="https://store.office.com/en-us/app.aspx?assetid=WA104380375&amp;sourcecorrid=d6da53a3-47c2-4279-a0d0-9f102fc51123&amp;searchapppos=0&amp;ui=en-US&amp;rs=en-US&amp;ad=US&amp;appredirect=false">Kwilt for Office 365</a></li>
 	<li>· <a href="https://store.office.com/en-us/app.aspx?assetid=WA104380372&amp;sourcecorrid=d6da53a3-47c2-4279-a0d0-9f102fc51123&amp;searchapppos=1&amp;ui=en-US&amp;rs=en-US&amp;ad=US&amp;appredirect=false">Kwilt for Outlook</a></li>
</ul>
They’ve created an application that helps navigate the sea of photos located in social, cloud and messaging accounts. This is completed in a manner that is seamless to the end user as all the search work is completed through the Kwilt app. In a Mobile App and on the web.

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/image167.png"><img width="844" height="335" title="image" style="border: 0px currentcolor" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/06/image_thumb168.png" border="0" /></a>

During the project, we leveraged Azure Cognitive Services to augment the capabilities of the app. We introduced capabilities that will assist users facing the challenge of “tagging” all their photos to allow for more accurate searches. Capabilities that will address users mistyping tags that would result in no or wrong photos found. Address accents and special characters for search. i.e.: Montreal ≠ Montréal and more…

Technologies used in this project:
<ul>
 	<li>Azure Storage</li>
 	<li>Azure Functions</li>
 	<li>Microsoft Cognitive Services</li>
 	<li>Computer Vision API</li>
 	<li>Azure Cosmos DB (formerly DocumentDB)</li>
 	<li>Azure Search</li>
</ul>
Here is how we get this done!

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/image168.png"><img width="837" height="353" title="image" style="border: 0px currentcolor" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/06/image_thumb169.png" border="0" /></a>

And by the way the code we used is available <a href="https://github.com/pierreroman/Kwilt">here</a>.
<h2>Ingest and Analyze</h2>
Ingesting all the data from Kwilt database in Azure Cognitive Services allows the service to automatically tag photos, and eliminating the need for manual user input. We started by building a robust/efficient workflow to push data from the Kwilt backend database to Azure in order to facilitate analysis by leveraging Cognitive Services.

You can <a href="https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/">test the capabilities of the service yourselves.</a>

First the data is received from the Kwilt backend into an <a href="https://azure.microsoft.com/en-us/services/storage/queues/">Azure Storage Queue</a>. The process to feed the queue is a proprietary PHP script/process that extract new entries in the Kwilt database, converts them into a JSON format and sends them to the Azure Storage Queue using the Azure Storage PHP SDK to send messages to the configured Storage Account &amp; Key.

Here is a sample message that is being stored in the queues.
<pre class="brush: JavaScript;">{
    "sorting_time": "2015-06-07 22:50:36",
    "type": "image",
    "id": 68682364,
    "name": "010309_0800_6154_nals",
    "created_time": "2015-06-08 05:50:36",
    "width": 919,
    "height": 602,
    "mime_type": "image/jpeg",
    "size": 576761,
    "time_taken": "2015-06-07 22:50:36",
    "modified_time": "2015-06-08 05:50:38",
    "source_url": "https://farm1.staticflickr.com/333/18585231402_798c4247fe_o.jpg",
    "recent_time": "2015-06-07 22:50:36",
    "thumbnail_url": "https://farm1.staticflickr.com/333/18585231402_eac0b3fe77_z.jpg"
}
</pre>
&nbsp;

Once the Message is in the queue it triggered the Azure function. (below is a screen capture of the Azure Function configuration.)

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/image610.png"><img width="853" height="272" title="image6" style="border: 0px currentcolor" alt="image6" src="https://msdnshared.blob.core.windows.net/media/2017/06/image6_thumb.png" border="0" /></a>

Once the data is in the queue for analysis, we leverage Azure Functions
to send the info to Cognitive Services to analyze the image. Of  course,
since we want to utilize proper DevOps practices we have configured
Azure Functions for continuous integration from a Github repository
setup for the various functions.
<pre class="brush: JavaScript;">var https = require('https');

module.exports = function (context, message) {
  logInfo(context, 'Analyzing Image Id: ' + message.id)
  logVerbose(context, 'Queue Message:\n' + JSON.stringify(message));

  // Validate Configuration
  if (!process.env.OcpApimSubscriptionKey) {
    throwError(context, 'Missing Configuration, OcpApimSubscriptionKey not configured in Application Settings.');
  }

  // Validate Message
  if (!message.thumbnail_url) {
    throwError(context, 'Invalid Message, thumbnail_url missing.');
  }

  // Define Vision API options
  var options = {
    host: 'westus.api.cognitive.microsoft.com',
    port: 443,
    path: '/vision/v1.0/analyze?visualFeatures=Categories,Tags,Description,Faces,ImageType,Color,Adult&amp;details=&amp;language=en',
    method: 'POST',
    headers: {
      'content-type': 'application/json',
      'Ocp-Apim-Subscription-Key': process.env.OcpApimSubscriptionKey
    }
  };

  logVerbose(context, 'Thumbnail Url: ' + message.thumbnail_url);

  var req = https.request(options, function (res) {
    res.setEncoding('utf8');

    res.on('data', function (data) {
      logVerbose(context, 'Vision API Response\n' + data);

      var visionData = JSON.parse(data);

      // Was the image successfully processed
      switch (res.statusCode) {
        case 200: // Sucess
          updateFileMetaData(message, visionData);
          break;
        case 400: // Error processing image
          var errorMessage = visionData.message ? visionData.message : "Unknown error processing image";
          logInfo(context, errorMessage);
          updateFileMetaData(message, null, visionData);
          break;
        case 403: // Out of call volume quota
          context.done(new Error('Out of cal volume quota'));
          return;
        case 429: // Rate limit is exceeded
          context.done(new Error('Rate limit is exceeded'));
          return;
      }

      // Set the object to be stored in Document DB
      context.bindings.outputDocument = JSON.stringify(message);

      context.done();
    });
  });

  req.on('error', function (e) {
    logVerbose(context, 'Vision API Error\n' + JSON.stringify(e));
    throwError(context, e.message);
  });

  // write data to request body
  var data = {
    url: message.thumbnail_url
  };

  req.write(JSON.stringify(data));
  req.end();
};


function updateFileMetaData(message, visionData, error) {
  // Document DB requires ID to be a string
  // Convert message id to string
  message.id = message.id + '';

  // Keep a record of the raw/unedited Vision data
  message['azure_vision_data'] = {
    timestamp: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''),
    data: visionData,
    error: error
  };

  if (visionData) {
    // Flatten/append vision data to the file object
    message['isAdultContent'] = visionData.adult.isAdultContent;
    message['isRacyContent'] = visionData.adult.isRacyContent;
    message['auto_tags'] = extractConfidenceList(visionData.tags, 'name', 0.1);
    message['auto_categories'] = visionData.categories ? extractConfidenceList(visionData.categories, 'name', 0.1) : [];
    message['auto_captions'] = extractConfidenceList(visionData.description.captions, 'text', 0.1);
    message['auto_description_tags'] = visionData.description.tags;
    message['auto_dominantColorForeground'] = visionData.color.dominantColorForeground;
    message['auto_dominantColorBackground'] = visionData.color.dominantColorBackground;
    message['auto_accentColor'] = visionData.color.accentColor;
    message['auto_isBWImg'] = visionData.color.isBWImg;
    message['auto_clipArtType'] = visionData.imageType.clipArtType;
    message['auto_lineDrawingType'] = visionData.imageType.lineDrawingType;
  }

  // Convert existing tags field from comma seperated string to array
  if (message.tags &amp;&amp; typeof message.tags === 'string') {
    message.tags = message.tags.split(',');
  } else {
    message.tags = [];
  }

  // Azure Search requires location to be a single field
  if (message.latitude &amp;&amp; typeof message.latitude === 'number') {
    message['location'] = {
      type: 'Point',
      coordinates: [message.longitude, message.latitude]
    }
  }
}

function throwError(context, message) {
  logVerbose(context, 'Error: ' + message);
  throw new Error(message);
}

function logInfo(context, message) {
  context.log('+[Info] ' + message);

}

function logVerbose(context, message) {
  if (process.env.VerboseLogging) {
    context.log('![Verbose] ' + message);
  }
}

// Extracts a list of values by field from an array of objects
// where the confidence value is greater than or equal to the
// optional minConfidenceValue.
function extractConfidenceList(objArray, field, minConfidenceValue) {
  if (Object.prototype.toString.call(objArray) !== '[object Array]') {
    throw new Error("objArray (type: " + Object.prototype.toString.call(objArray) + ") in extractConfidenceList is not an array.");
  }

  if (!field || typeof field !== 'string') {
    throw new Error("field in extractConfidenceList is missing or not an string.");
  }

  // If not min confidence value specified or value is undefined set to 0
  if (!minConfidenceValue) { minConfidenceValue = 0; }

  var list = new Array();

  objArray.forEach(function (obj) {
    // Do we need to do a confidence check?
    if (minConfidenceValue &gt; 0 &amp;&amp; typeof obj['confidence'] === 'number') {
      // Is confidence &gt;= min required?
      if (obj['confidence'] &gt;= minConfidenceValue) {
        list.push(obj[field]);
      }
    }
    else {
      // No check needed push field into array
      list.push(obj[field]);
    }
  });

  return list;
}</pre>
Analysis of the images (visual features &amp; details) is configured in the
function when the Vision API HTTP API call options are defined.
<pre class="brush: JavaScript;">// Define Vision API options
  var options = {
    host: 'westus.api.cognitive.microsoft.com',
    port: 443,
    path: '/vision/v1.0/analyze?visualFeatures=Categories,Tags,Description,Faces,ImageType,Color,Adult&amp;details=&amp;language=en',
    method: 'POST',
    headers: {
      'content-type': 'application/json',
      'Ocp-Apim-Subscription-Key': process.env.OcpApimSubscriptionKey
    }
  };
</pre>
In this case the following features were configured in English (only
English and Chinese are available for the API):
<ul>
 	<li><strong>Categories</strong>- categorizes image content according to a taxonomy defined in documentation.</li>
 	<li><strong>Tags</strong>- tags the image with a detailed list of words related to the image content.</li>
 	<li><strong>Description</strong>- describes the image content with a complete English sentence.</li>
 	<li><strong>Faces</strong>- detects if faces are present. If present, generate coordinates, gender and age.</li>
 	<li><strong>ImageType</strong>- detects if image is clipart or a line drawing.</li>
 	<li><strong>Color</strong>- determines the accent color, dominant color, and whether an image is black&amp;white.</li>
 	<li><strong>Adult</strong>- detects if the image is pornographic in nature (depicts nudity or a sex act). Sexually suggestive content is also detected.</li>
</ul>
Once the analysis is complete the resulting JSON message is stored in Cosmos DB.

Here is the result the processing of the following image:

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/image810.png"><img width="270" height="359" title="image8" alt="image8" src="https://msdnshared.blob.core.windows.net/media/2017/06/image8_thumb.png" border="0" /></a>

The following is the result of the analysis:

&nbsp;
<pre class="brush: JavaScript;">{
	"sorting_time": "2016-06-19 15:59:58",
	"type": "image",
	"id": "68772289",
	"name": "Photo Jun 19, 15 59 58.jpg",
	"created_time": "2016-07-28 15:54:59",
	"modified_time": "2016-07-28 15:55:16",
	"size": 2289041,
	"mime_type": "image/jpeg",
	"latitude": 46.8124,
	"longitude": -71.2038,
	"geoname_id": 6325494,
	"city": "Québec",
	"state": "Quebec",
	"state_code": "QC",
	"country": "Canada",
	"country_code": "CA",
	"time_taken": "2016-06-19 15:59:58",
	"height": 3264,
	"width": 2448,
	"thumbnail_url": "",
	"recent_time": "2016-06-19 15:59:58",
	"tags": [
		"town",
		"property",
		"road",
		"neighbourhood",
		"residential area",
		"street"
	],
	"account_id": 111193,
	"storage_provider_id": 105156,
	"altitude": 53,
	"camera_make": "Apple",
	"camera_model": "iPhone 6",
	"azure_vision_data": {
		"timestamp": "2017-03-29 15:59:55",
		"data": {
			"categories": [
				{
					"name": "outdoor_street",
					"score": 0.96484375
				}
			],
			"adult": {
				"isAdultContent": false,
				"isRacyContent": false,
				"adultScore": 0.007973744533956051,
				"racyScore": 0.010262854397296906
			},
			"tags": [
				{
					"name": "outdoor",
					"confidence": 0.9993922710418701
				},
				{
					"name": "sky",
					"confidence": 0.9988007545471191
				},
				{
					"name": "building",
					"confidence": 0.9975806474685669
				},
				{
					"name": "street",
					"confidence": 0.9493720531463623
				},
				{
					"name": "walking",
					"confidence": 0.9154794812202454
				},
				{
					"name": "sidewalk",
					"confidence": 0.8519290685653687
				},
				{
					"name": "people",
					"confidence": 0.7953380942344666
				},
				{
					"name": "way",
					"confidence": 0.7908639311790466
				},
				{
					"name": "scene",
					"confidence": 0.7276134490966797
				},
				{
					"name": "city",
					"confidence": 0.624116063117981
				}
			],
			"description": {
				"tags": [
					"outdoor",
					"building",
					"street",
					"walking",
					"sidewalk",
					"people",
					"road",
					"city",
					"narrow",
					"bicycle",
					"man",
					"group",
					"woman",
					"standing",
					"old",
					"pedestrians",
					"holding",
					"platform",
					"parked",
					"carriage",
					"riding",
					"train",
					"clock"
				],
				"captions": [
					{
						"text": "a group of people walking down a narrow street",
						"confidence": 0.8872056096672615
					}
				]
			},
			"requestId": "38fa30e6-2a50-4a7f-b780-e6472c6d1a52",
			"metadata": {
				"width": 600,
				"height": 800,
				"format": "Jpeg"
			},
			"faces": [],
			"color": {
				"dominantColorForeground": "Grey",
				"dominantColorBackground": "Grey",
				"dominantColors": [
					"Grey",
					"White"
				],
				"accentColor": "2C759F",
				"isBWImg": false
			},
			"imageType": {
				"clipArtType": 0,
				"lineDrawingType": 0
			}
		}
	},
	"isAdultContent": false,
	"isRacyContent": false,
	"auto_tags": [
		"outdoor",
		"sky",
		"building",
		"street",
		"walking",
		"sidewalk",
		"people",
		"way",
		"scene",
		"city"
	],
	"auto_categories": [
		"outdoor_street"
	],
	"auto_captions": [
		"a group of people walking down a narrow street"
	],
	"auto_description_tags": [
		"outdoor",
		"building",
		"street",
		"walking",
		"sidewalk",
		"people",
		"road",
		"city",
		"narrow",
		"bicycle",
		"man",
		"group",
		"woman",
		"standing",
		"old",
		"pedestrians",
		"holding",
		"platform",
		"parked",
		"carriage",
		"riding",
		"train",
		"clock"
	],
	"auto_dominantColorForeground": "Grey",
	"auto_dominantColorBackground": "Grey",
	"auto_accentColor": "2C759F",
	"auto_isBWImg": false,
	"auto_clipArtType": 0,
	"auto_lineDrawingType": 0,
	"location": {
		"type": "Point",
		"coordinates": [
			-71.2038,
			46.8124
		]
	}
}
</pre>
Once this analysis is stored in the Cosmos DB it can be indexed and searched using Azure Search. as you can see in the following screen captures The Kwilt Team was able to digest the analysis and with Azure Search to build an extremely user friendly search proposition for their users.

In the project beta client we were able to search by keywords (Food, Plates, Fireworks…) and by location (Gatineau) without any manual tagging of the pictures.

<a href="https://msdnshared.blob.core.windows.net/media/2017/06/image1510.png"><img width="832" height="463" title="image15" style="border: 0px currentcolor" alt="image15" src="https://msdnshared.blob.core.windows.net/media/2017/06/image15_thumb.png" border="0" /></a>

All I can say is that i cannot wait to process my own photo streams through this service.  I’ve already installed the app on my phone.

Take the opportunity to test out Microsoft Cognitive Services in your own initiatives by visiting: <a href="https://azure.microsoft.com/en-ca/services/cognitive-services/">https://azure.microsoft.com/en-ca/services/cognitive-services/</a>

Cheers!!

<a href="https://msdnshared.blob.core.windows.net/media/2017/03/clip_image0202.jpg"><img width="240" height="80" title="clip_image003" alt="clip_image003" src="https://msdnshared.blob.core.windows.net/media/2017/04/clip_image0032.jpg" border="0" /></a>

<b>Pierre Roman</b><b>
</b><u>@pierreroman</u>]]></content:encoded>
    </item>
  </channel>
</rss>