Manage Office 365 Group Creation… the right way

If you have an Office 365 subscription in your organization, you probably know by now that your users can create what is called an Office 365 Group. Don’t get me wrong, it’s an awesome feature with so many possibilities BUT, you need to manage it correctly. Even in a business with less than 50 employees, it can quickly become a mess if not managed.

Why? First, the feature is activated by default meaning that any user can create an Office 365 Group which in turn creates a security group in your AzureAD, a distribution list in your Exchange, a site collection in SharePoint, a plan in Planner and a few other things.

The second point is that management tools associated with O365 Groups are almost non-existent beside using PowerShell which is not an optimal tool for an SMB where there might not be an IT guy. This may only seem a minor annoyance but if you have 50 users who decide to create a O365 Group from the SharePoint Home, Microsoft Teams, Outlook or even Yammer as a test or even for a real use, it doesn’t take very long before you have a several of site collections that are duplicated, unmanaged or unused in your tenant.

So why am I doing a blog post about this? Number 1, if you want to allow the Office 365 group creation capability but only by limited group of users, Microsoft offer you a super handy guide but it doesn’t work because it’s not up to date. Number 2, to remind you that SharePoint and Office 365 is a thing, a very important thing!

How do you manage that pesky Office 365 Group creation?

Note: If you want to completely disable the Office 365 groups in your tenant you can do it from here: https://portal.office.com/adminportal/home#/Settings/ServicesAndAddIns but you will miss out on a very powerful feature of O365.

The official Microsoft guide to do it is available here https://goo.gl/V0Kx9N . The main problem is that the correct version of one of the requirements is not available anymore.

UPDATE as of 2017/04/11: The Microsoft guide has been updated to reflect the changes to the PowerShell modules.

The note mention that you need the version 1.1.130.0 Preview version but the link points to the 1.1.166.0 GA version. A normal human being would say it’s not a problem since surely the 1.1.166.0 version is a later version than 1.1.130.0 thus it contains everything from the previous one. NO that’s not how it works! I won’t do it but if you want to go into details about that read https://goo.gl/TRljUj .

Now what is the solution:

  1. Install the listed prerequisites (use the 1.1.166.0 version for the second one).
  2. Also, install the Azure Active Directory V2 PowerShell module (https://goo.gl/my1zQg) using the PowerShell command: Install-Module -Name AzureADPreview
  3. Proceed with the steps 1 and 2 of the Microsoft guide.
  4. At steps 3, things get a bit different as the powershell commands changed in the V2 of the PowerShell module. To create a new Group settings objects, use the following commands:

Connect-AzureAD
Get-AzureADGroup -SearchString "NAME_OF_YOUR_SECURITY_GROUP"
$template = Get-AzureADDirectorySettingTemplate | where-object {$_.displayname -eq "Group.Unified"}
$setting = $template.CreateDirectorySetting()
$setting["EnableGroupCreation"] = "false"
$setting["GroupCreationAllowedGroupId"] = "ID_OF_YOUR_SECURITY_GROUP"
New-AzureADDirectorySetting -DirectorySetting $setting

If you want to edit a Group settings object instead of creating a new one, the easiest way I found is to use the following script:

Connect-AzureAD
Get-AzureADDirectorySetting
Remove-AzureADDirectorySetting -Id "ID_OF_YOUR_AZUREAD_SETTING"

After this you can simply recreate the AzureADDirectorySetting using the previous procedure. I used this approach because the $setting.GetSettingsValue() method from the Microsoft procedure doesn’t seem to exist anymore in the AzureADPreview module and I haven’t found a replacement.

Now you can now test that only the Admin Office 365 Group can create groups using either graph of try create one with a non admin account.

More to come on the governance part in my next post!

Coder proprement pour sauver du temps!

Le méthodologie du clean code, lancé par Robert Martin, aussi connu sous le nom de Uncle Bob, a pour but est de faire sauver du temps à tout le monde qui devra travailler sur votre projet ainsi qu’à vous-même. Que ce soit pour l’entretien de votre projet, la compréhension de votre code ou tout simplement pour vous faire aimer de vos collègues. De plus, vous augmenterez le rendement de votre équipe et si d’autres gens prennent le relais suite à votre passage, vous deviendrez une source de référence.

Vous codez pour les autres

Lorsque je suivais mes cours de conduite, le professeur disait toujours de conduire pour les autres parce qu’on ne sait jamais comment ils vont réagir. Cette théorie est aussi vrai pour un programmeur. Vous ne devriez jamais programmer en étant la seule personne à comprendre votre code. Encore pire, si vous devez changer ce que vous avez fait plusieurs mois après parce que votre client veut quelque chose de nouveau, vous ne devriez pas avoir à le passer en revue au grand complet pour vous comprendre. Codez plutôt dans l’optique que vous écrivez un livre, et comme dans un livre vous ne devriez pas avoir besoin de remonter dans votre code pour voir à quoi servent vos variables. Afin de réussir ce coup fumant, il faudra le faire sans aucun commentaire et simplement avec l’aide de vos variables et de vos méthodes!

/* Pas de commentaire */

Vous ne devriez pas avoir besoin d’avoir recours aux commentaires et ce pour plusieurs raisons :

  • Attire l’attention sur autre chose que le code
  • Écrire des commentaires de qualités prend du temps
  • Si le code change, vous devez prendre le temps de modifier les commentaires
  • Il peuvent devenir désuet et semer la confusion s’ils sont mal maintenu

Voici deux exemples flagrant de commentaires inutiles qui nuisent à la lecture du code :

///summary
/// Méthode permettant de transformer le texte
///summary
/// <returns>Retourne le texte transformé</returns>
private string TransformerTexte(){
[…]
return monTexteTransforme;
}

private string TransformerTexte(){
[…]
//retourner mon texte transformé
return monTexteTransforme;
}

Dans le premier exemple, le nom de la méthode est suffisamment parlant pour ne pas avoir à expliquer son but et votre nom de variable est très claire également. Pour le deuxième, les commentaires viennent créer un doublons puisque vous dites exactement la même chose que la variable. Vous pouvez donc retirer commentaires sans nuire à la compréhension. N’oubliez pas que l’absence de commentaire est plus utile qu’un mauvais commentaire. Si toutefois vous sentez le besoin d’expliquer votre méthode ou vos variables, c’est probablement parce qu’elle est trop longue ou que les noms sont mal choisis.

C’est ici que vos noms de variables et les noms de vos classes CSS entrent en action!

Des noms de variables qui parlent!

Lorsqu’un autre programmeur lit votre code, vos noms de variables doivent lui indiquer ce que vous êtes en train de faire. Par exemple si vous déclarer un booléen, choisissez un autre nom que

bool estValable = false;

dites plutôt ce que vous vérifiez en nommant votre variable convenablement :

bool imageDeTailleCorrecte = false;

Vos noms de variables seront plus long la plupart du temps mais vous allez voir ce qui « est valable » au premier coup d’œil et vous n’aurez donc pas besoin d’une ligne de commentaire pour expliquer ce que vous validez.

N’oubliez pas de les déclarer juste avant de les utilisez pour facilité la lecture et de ne pas donner des noms stylisés du genre « int nombre = 1 ».

Vos noms de classes CSS vous servent de carte géographique

Tout comme vos variables, vos nom de classes doivent parler à la personne qui doit utilisez votre code et lui indiquer à quel endroit cette classe est utilisée.

Par exemple, la classe suivante pourrait facilement être renommée :

<div class="contenu">Vive le chocolat</div>

Au lieu de simplement dire que les styles de cette classe s’applique au contenu, dites plutôt à quelle endroit se trouve ce contenu.

<div class="contenu-page-accueil">Vive le chocolat</div>

De cette façon, si quelqu’un doit modifier ce que vous avez fait, il sera simple de savoir où cette classe est appliquée et vous sauverez du temps.

Autre point très important pour vos classes CSS, évitez de les faire avec des noms qui ressemblent à du « inline style » comme par exemple :

<div class="gras petit-padding titre-page-accueil">Vive le bacon</div>

.gras{
font-weight:bold;
}
.petit-padding{
padding:5px;
}

Dans cet exemple il serait beaucoup plus efficace de regrouper tout vos styles sur la classe « titre-page-accueil » pour ne pas créer de doublons dans votre CSS et grandement faciliter l’entretien de votre projet.

La longueur compte

Lors de l’élaboration d’une méthode, gardez celle-ci la plus courte possible. Une bonne façon de voir si elle est trop longue est si vous réalisez qu’elle est utilisée pour plusieurs choses à la fois.

Voici l’exemple d’une mauvaise méthode :

private void ObtenirItemListePrix (){
//Code pour obtenir les items de la liste nommée Prix
//Code qui ajoute des items dans la liste
}

La méthode sert à deux choses, ce qui invalide son nom. Optez plutôt pour deux méthodes, une qui obtient les items de la liste et une autre qui va ajouter les items.

Pour une méthode la plus claire et simple possible, privilégiez celles de type « void », avec le moins de paramètre possible et sans validation booléenne (faites en deux à la place). Bien entendu il s’agit d’un idéal, il est normal de ne pas toujours y parvenir.

Par la suite, si vous avez des problèmes, il sera beaucoup plus rapide de trouver quelle partie de votre code est en erreur, vos fonctions seront plus courtes donc plus faciles à entretenir, comprendre et lire en plus de décrire véritablement ce qu’elles font, ce qui vous permet de ne pas mettre de commentaire.

Coder proprement, une mentalité

Pendant votre développement vous devrez constamment vous remettre en question et parfois renommer vos variables ou méthodes plus votre code évoluera. Cependant si votre équipe maîtrise bien le concept, vous sauverez un temps considérable pour l’entretien de vos projets et aussi stopper la perte de cheveux devant du code incompréhensible.

How to: manage SharePoint 2013 navigation settings in c#

I recently needed to manage SharePoint 2013’s navigation settings from code (c#) because we were deploying a custom web template.

Believe me, there are a bunch of different objects you need to use depending on which setting you are trying to edit.

  • web.Navigation (Namespace: Microsoft.SharePoint)
  • publishingWeb.Navigation (Namespace: Microsoft.SharePoint.Publishing)
  • WebNavigationSettings (Namespace: Microsoft.SharePoint.Publishing.Navigation)

After a lot of search, I found an incredible article by Johannes Milling on the subject. Check it out here:

http://discoveringsharepoint.wordpress.com/2013/03/19/programmatically-set-navigation-settings-in-sharepoint-2013/

Once again, I hope it saves someone some time!

SharePoint 2013 et Responsive design : 5 lignes directrices pour réussir votre projet

Il est possible de réaliser un site web de publication SharePoint 2013 responsive design, dans une grille fluide et adaptable à plusieurs formats d’écran. Comme c’est souvent le cas avec SharePoint, la question n’est pas tant s’il est possible de le faire, mais comment réussir sans trop se casser la gueule !

Plusieurs approches sont possibles, voici quelques pistes qui pourront vous aider à réaliser un projet responsive dans SharePoint.

responsive

1. D’abord, ce qu’il ne faut pas faire

Oubliez la fonctionnalité « affichage de navigateur mobile » ainsi que l’utilisation de canal périphérique (channel). Leur utilisation étant respectivement inappropriée et complexe. Sans vouloir rentrer dans les détails, tout ce que vous réussirez à faire, c’est vous compliquer la vie.

2. Utilisation d’un framework

Ma seconde recommandation et sûrement la plus importante, consiste en l’utilisation d’un framework comme Bootsrap3 ou Foundation the zurb. Leur utilisation est gratuite, simple et très bien documentée, mais il n’y a pas de magie, vous devez avoir les compétences nécessaires pour les utiliser.

Quel framework choisir? Ça, c’est à vous de le déterminer en fonction de votre projet. Voici un article intéressant sur le sujet qui pourra probablement vous éclairer.
http://designmodo.com/bootstrap-vs-foundation/

3. Utilisation d’une trousse de départ

Certaines communautés de développeurs comme Codeplex ont développé des trousses de départ  à partir des framework. Personnellement, j’ai eu l’occasion d’explorer celle développée avec bootstrap 3 et j’ai été très satisfaite des comportements obtenus.

L’ensemble pour la publication comprend :

  • Une page maître de départ, clairement construite et commentée
    Rien à voir avec la page maître native de SharePoint.
    D’ailleurs, je vous déconseille fortement d’utiliser les pages maîtres natives comme point de départ pour votre projet.
  • Six gabarits de mises en page (Page layout)
  • Les composantes du framework (JS,CSS, fonts)

L’avantage d’une telle trousse de départ, c’est qu’il y a déjà une base de grille établie dans la page maître. Il suffit alors de l’ajuster en fonction du design désiré. De plus, un travail a déjà été fait pour ajuster les styles natifs de SharePoint au framework. Il restera sans doute du travail à faire selon votre projet, mais c’est déjà ça d’accompli. Avec une trousse de départ bien montée, on est certain de partir notre projet sur des bonnes bases.

4. Pensez Responsive design

Le projet doit être pensé responsive dès le départ. Quoi que moins technique, c’est un point extrêmement important. Un site web responsive se réfléchit dès la première minute où l’on s’assoit avec le client. Le design, l’architecture d’information, tout doit être conçu en fonction de la grille du framework et de SharePoint. Faites des maquettes en wireframes, pour concrétiser le projet et planifier ce qui s’affichera dans les différentes interfaces. Restez simple, optez pour un visuel épuré et utilisez vos éléments de design plus « punchés » pour faire ressortir ce qui est important dans l’interface.

5. Rappelez-vous que vous êtes dans SharePoint

Même si vous êtes le meilleur intégrateur Web au monde, n’oubliez jamais que vous intégrez dans SharePoint. Il est facile de s’éparpiller et d’engendrer des bogues d’affichage. Méfiez-vous, la plus récente méthode d’intégration ne sera pas toujours la meilleure approche dans SharePoint. Voici quelques conseils d’intégration:

  • L’inspecteur de Firebugs sera votre meilleur ami.
  • Testez fréquemment, évitez de faire trop de modifications consécutives. C’est plus facile ainsi de savoir d’où provient le problème.
  • Testez les composantes natives (ruban, panneau de paramètres des webparts) assurez-vous qu’ils fonctionnent bien et que leur affichage n’est pas affecté pas les styles que vous appliquez. Les contrôles de paramétrisation doivent demeurer 100% fonctionnels.
  • Conservez la page maître native pour les pages systèmes. Vous éviterez la gestion de bogues pour des pages où il n’est pas nécessaire que l’affichage soit adaptatif.

Il faut savoir apprivoiser « la bête »: restez simple et le plus natif possible. C’est toujours bon de l’avoir à l’esprit quand on développe sur SharePoint.

Je vous promets un prochain billet dès que j’aurai l’occasion d’explorer davantage l’intégration responsive pour les sites de collaboration (d’équipe) pour lesquels les enjeux sont bien différents.

Preset refinements when calling a SharePoint 2013 search results page

In a recent SharePoint 2013 publishing portal project for a customer, we had to use a content query web part to display news on an intranet portal. The news elements are all of the same content type which contains a taxonomy field used to specify the type of news. In the CQWP, the news are grouped by type and the customer wanted a link with «View all the XYZ news» for each group. Considering the many requirements, the way we did it was to link to a search page and to preset the refinement web part to automatically filter on the type of news.

The query string syntax for the refinement is a bit weird since it’s actually a JSON request that is URL encoded but once decoded it looks like this:

/Pages/results.aspx?k=YOUR_SEARCH_TERM#Default={"k":"YOUR_SEARCH_TERM","r":[{"n":"MANAGED_PROPERTY_NAME","t":["string(\"#GUID_FOR_THE_TERM_VALUE\")"],"o":"and","k":false,"m":null}]}

To use this solution, it means we have to get the term’s GUID for each type of news inside the CQWP’s XSLT. The main problem is that the taxonomy field only returns the name of the term, not its GUID.

We could have hardcoded the GUIDs but since our development process include deployment across many development environments, that wasn’t really doable (MMS term’s GUID are generated by SharePoint i.e. different for each environment). After a bit of thinking and searching, what we ended up doing was to access the hidden note field associated with every taxonomy field (something along the lines of «TaxonomyFieldName_0»). When called in a CQWP, the hidden field returns a string in the «term value|term GUID» format. Once we found that out, a simple string manipulation, URL encoding and some basic XSLT gave us the result we wanted. The result is something along the lines of:

<xsl:variable name="newsTypeGuid">
	<xsl:value-of select="substring-after(@TaxonomyFieldName_0,'|')" />
</xsl:variable>

<xsl:variable name="newsTypeUrl">
	<xsl:value-of select="concat('/Pages/results.aspx?k=%2A_YOUR_SEARCH_TERM_#Default=%7B%22k%22%3A%22_YOUR_SEARCH_TERM_%22%2C%22r%22%3A%5B%7B%22n%22%3A%22_MANAGED_PROPERTY_NAME_%22%2C%22t%22%3A%5B%22string(%5C%22%23', $newsTypeGuid, '%5C%22)%22%5D%2C%22o%22%3A%22and%22%2C%22k%22%3Afalse%2C%22m%22%3Anull%7D%5D%7D%0A')" disable-output-escaping='yes'/>
</xsl:variable>

<a href="{$newsTypeUrl}"><xsl:value-of select="@TaxonomyFieldName" /></a>

I really hope it helps / saves some time to someone!

 

* Il est assez rare que je publie des articles en anglais. Vu le caractère plutôt technique du billet courant j’ai choisi de faire cette publication dans la langue de Shakespeare pour simplifier le vocabulaire et afin de rejoindre un maximum de développeurs.

Cas d’étude: Les assurances Royer Delisle

Les Assurances Royer Delisle est une société autonome en assurance de dommages, un franchisé de la Capitale assurance générales. Depuis quelques années, cette entreprise domine le marché tant au niveau de l’assurance des particuliers que des entreprises.  Oeuvrant dans un secteur de plus en plus compétitif ou les marges sont minimes, les Assurances Royer Delisle ont dû retravailler leur façon de faire pour d’accroitre leur efficacité opérationnelle, quantifier la qualité des différents liens d’ affaires, améliorer la gestion et communication interne. Tout cela dans le but de pouvoir se concentrer davantage sur leur mission, la croissance du volume d’affaire.

DELISLE_L_ROYER_S_BEAULIEU_V

Dans ce contexte, les assurances Royer Delisle ont fait appel au groupe Metalogique afin de mettre sur pied un partenariat visant à trouver les paramètres de l’équation suivante « Travailler mieux = Travailler plus efficacement supporté par de meilleures outils ». Ainsi, les membres de Metalogique se sont mis à pied d’oeuvre pour revoir le processus de gestion de l’information avec les dirigeants de l’entreprise. Il nous a fallu prendre en compte certains éléments qui commandaient un investissement de temps considérable pour la direction :
  •    Gestion du temps des employés et horaires de travail
  •    Suivi des ventes dans un intervalle de temps précis par employé et par type de produit vendu
  •    Identifier des ratios de ventes par secteur d’activité , par produit , par contact d’affaire, etc.
  •    Réassignation d’un dossier à une ressource
  •    Diffusion de l’information interne de toute sorte
Suite aux ateliers, nous avons développé sous SharePoint une application qui permet de fixer des objectifs mensuels communs pour les équipes de ventes et d’afficher visuellement l’évolution de celles-ci via un thermomètre de rendement, adjoint à cela un système simplifié de gestion du temps des employés fut mis en place permettant ainsi aux ressources de pouvoir gérer leur temps adéquatement afin de pouvoir prendre quelques heures de congé lors des moments moins sollicités.
Ventes
Concernant le volet gestion ; les gestionnaires ont des outils leur permettant de produire des rapports sur les ventes et sur les commissions, tant par employés que par région ou produit. Ces données sont ensuite exploitées par Powerview où des tableaux de gestion basés sur des données géomatiques sont produits.
Note.: Le graphique ci-bas est un exemple avec des données et valeurs fictives, en vue de protéger la confidentialité des données »
ExPowerView
Nous avons démarré un projet pilote qui a rapidement permis à l’entreprise de rencontrer ses objectifs d’affaires, en plus de constater des gains à des niveaux inattendus  :
  • Comptabilisation de chaque lien d’affaires d’affaires, produit.
  • Identification des opérations rentables vs celles qui le sont moins
  • Planification stratégique sur le développement et la mise en marché
  • Fixation d’objectifs de ventes réalistes basés sur des chiffres réels
  • Meilleure structure dans le classement des documents et de l’actif organisationnel
  • Meilleure communication entre les membres de l’équipe
Aux dires de madame Beaulieu, membre du CA de l’organisation:

Metalogique a su comprendre tous nos besoins rapidement et nous emmener des points de vue très utiles pour nous aider à performer davantage en utilisant adéquatement les bonnes solutions d’affaires pour chaque situation.  Il nous ont permis notamment d’avoir une meilleure vision pour l’atteinte de nos objectifs de ventes. Sans cet outil de travail, il nous aurait été difficile de croire qu’il est réaliste de planifier une croissance de 28% pour l’an prochain. Grâce à eux,  nous savons où concentrer nos efforts et notre rendement collectif s’en voit grandement amélioré.

Monsieur Delisle, membre du CA de l’organisation:

Le portail préparé par l’équipe de Métalogique nous permet en quelques secondes de répondre à une foule de questions à savoir par exemple  si dans une région donnée, pour un type de produit précis, notre  ratio de  vente est bon.  Nous pouvons avec cet outil planifier notre positionnement stratégique et quelques mois plus tard facilement quantifier les actions posées et se réajuster en fonction des résultats.
Merci Métalogique

Pour contacter Les assurances Royer & Delisle :
1 866 432-2049

Metalogique accompagne les entreprises et les organisations dans leur évolution TI.
Imaginez demain, réalisez-le aujourd’hui avec nous !
En savoir plus sur nos solutions.

Google Chrome to go!

Vous avez besoin d’un autre navigateur que IE mais vous ne pouvez pas en installer un autre parce que vous n’avez pas accès à internet ? Parce que vous n’avez pas les droits nécessaires ? Parce que c’est un serveur de production du client ?

Gardez espoir, il y a une solution : Google Chrome Portable !

google_Chrome

Google Chrome Portable consiste en un répertoire contenant les fichiers nécessaires avec l’exécutable du navigateur. Il vous suffit d’aller chercher le fichier d’installation ici et de l’exécuter pour qu’il crée le répertoire. Vous pouvez ensuite le mettre sur une clé usb ou le partager de la façon dont vous le désirez. Il ne vous reste qu’à exécuter l’application pour pouvoir naviguer avec Google Chrome.

Enjoy!