mardi 26 janvier 2016

SharePoint 2016 installation de OneDrive for Business

OneDrive for Business fait partie du service de Profil utilisateur depuis SharePoint 2013 et permet de proposer un espace de stockage des documents/vidéos pour tous les utilisateurs de SharePoint.

Sur SharePoint 2016 cette fonctionnalité est améliorée notamment via le service de synchronisation hors ligne des documents ainsi que la taille maximale des fichiers qui est désormais de 4Go.

Sur une machine avec SharePoint 2016 RC nous allons maintenant voir comment installer cette fonctionnalité.

1. Création d'une application Web.

Depuis la page d'accueil de l'administration centrale de SharePoint 2016 cliquez sur "Manage web applications"


Cliquez ensuite sur New dans le coin supérieur gauche

-Spécifier le nom du site IIS, le port sur lequel se trouvera l'application
 

Dans la partie Application pool, saisir un nom pour le pool d'application ainsi que le compte de service en charge de l'éxécuter.


Enfin cliquez sur "Ok" pour créer l'application Web.

2.Création d'une collection de sites de type "MySite"

Depuis la page d'accueil de l'administration centrale cliquez sur "Create site collections"



Sélectionnez l'application web nouvellement ajoutée:
- Saisir un nom pour la collection de sites
- Attention à sélectionnez "My Site Host" dans la liste des templates de collection de sites.
 
-Selectionnez les administrateurs de sites puis cliquez sur "Ok".

Une fois la collection de site de type "Mysite" créée naviguer vers le site pour voir s'afficher la page d'accueil de votre service OneDrive for Business :


3.Création du service de Profil Utilisateur.

Maintenant que la collection de sites "MySite" existe il faut créer l'application de service de Profil Utilisateur pour permettre aux utilisateurs SharePoint d'avoir un site dédié.

Depuis la page d'accueil de l'administration centrale de SharePoint 2016 cliquez sur "Manage Service applications"

Dans la barre d'ajout sélectionner l'élément "User Profile Service Application"

Remplir le formulaire en spécifiant:
- Le nom de l'application de service 
- Le nom du Pool d'application
- Le compte de service à utiliser pour le pool d'application
- Spécifier l'url de l'application web à la racine de laquelle se trouve votre collection de sites de type "MySite" 

-Spécifier le chemin d'accès géré sous lequel les sites par utilisateurs seront ajoutés
- Le format des noms de site avec résolution des conflits le cas échéant
- Choisir si vous désirez utiliser Yammer ou les fonctionnalités de RSE de SharePoint (Yammer nécéssite un abonnement supplémentaire pour être utilisé)

Enfin cliquez sur "Ok" pour créer l'application de service.



4. Votre site OneDrive for Business

Rendez vous sur le site racine de la collection de site "MySite"  puis cliquez sur "Next" pour afficher votre site personnel.
Après quelques minutes votre site personnel s'affiche:


Remarquez alors que l'url de votre site contient votre nom utilisateur (ainsi que le nom de l'AD selon l'option choisie lors de la création de la collection de sites):
Il est alors possible de synchroniser vos documents pour travailler hors ligne et garder vos données à jour.

Il est également très simple de partager un document:
Le partage se fait alors facilement au sein de votre organisation:




Installation de SharePoint 2016 RC

La version Release Candidate de SharePoint 2016 est disponible depuis maintenant quelques jours.

Pour installer cette version il faut avoir au préalable un serveur avec SharePoint 2016 Beta 2 d'installé, voici pour ma part la configuration que j'utilise en guise de plateforme de test pour cette nouvelle version:
- VM HyperV avec 8Go (augmentable jusqu'à 14)
- Windows Server 2012 R2
- SQL Server 2012 Standard

Télécharger le patch SP2016 RC depuis le lien suivant : https://www.microsoft.com/en-us/download/confirmation.aspx?id=50737
Il faut prendre le fichier SharePoint Server 2016 Release Candidate Global Patch ainsi que le patch correspondant à la langue d'installation de SharePoint Server 2016 Beta 2.

Par exemple pour une installation en français:


Depuis le serveur SharePoint 2016 installer "SharePoint Server 2016 Release Candidate French Prerequisite Installer"

Puis installer le fichier "prerequisiteinstaller"



L'installation s'effectue :


Puis se termine et un redémarrage s'imposera:


Après le redémarrage l'installation reprend puis se termine:


Lancer alors le Global Patch:


Puis l'assistant de configuration SharePoint pour appliquer la mise à jour.


mardi 22 septembre 2015

Windows Store Content Dialog Close programmaticaly

Close content Dialog programmaticaly Windows Universal app

The following code can be used to close the new content Dialog after a period of time.

private IAsyncOperation<ContentDialogResult> dialogTask;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
       ContentDialog dlg= new ContentDialog();
        dlg.Content = new TextBlock() { Text = "This content dialog will closed in 5sec!" };
        try
        {
            dialogTask = dlg.ShowAsync();
        }
        catch (TaskCanceledException)
        {
            //this was cancelled
        }

        DispatcherTimer dt = new DispatcherTimer();
        dt.Interval = TimeSpan.FromSeconds(5);
        dt.Tick += dt_Tick;
        dt.Start();
    }

    void dt_Tick(object sender, object e)
    {
        (sender as DispatcherTimer).Stop();
        dialogTask.Cancel();
    }

vendredi 21 août 2015

Windows Universal App erreur avec Visual studio 2015 FR lors du build en Release


Si vous rencontrez l'erreur suivante lors du build en mode release de votre application Windows Universal App en utilisant Visual Studio Community 2015 FR ou Pro : 

"Erreur ILT0005: 'C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\Tools\nutc_driver.exe 
@"...\obj\x86\Release\ilc\intermediate\nutcargs.rsp"' a retourné le code de sortie -1073741819"

ou l'erreur :

"Erreur La commande ""C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\x86\ilc\ilc.exe" /in:"E:\dev\Lol Ingame\Lol Ingame\Lol Ingame\obj\x86\Release\ilc\in" 
/out:"E:\dev\Lol Ingame\Lol Ingame\Lol Ingame\bin\x86\Release\ilc" /intermediatespath:"....obj\x86\Release\ilc\intermediate" 
/v:normal /keepintermediates:true /buildtype:ret /exename:"Lol Ingame.exe" /makepripath:"C:\Program Files (x86)\Windows Kits\10\bin\x64\MakePri.exe" 
/appPriProjectRoot:"Project" /rcpath:"C:\Program Files (x86)\Windows Kits\10\\bin\x86\rc.exe" 
/targetplatformsdklibpath:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\um" 
/targetplatformsdkmetadatapath:"...obj\x86\Release\ilc\in\WinMetadata" 
/targetframeworkpath:"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319" /RdXmlPath:"C:\Program Files (x86)\MSBuild\Microsoft\.NetNative\LibraryXML" 
/suppressPDBWarnings:true /AllowNoManagedCode /UseCustomFramework "/logger:CsvLogger;2284;2168"" s'est arrêtée avec le code 1201."

Il vous suffit de passer Visual studio en Anglais en utilisant le menu  "Outils / Options / Paramétres internationaux" et d'ajouter la langue anglaise. Après téléchargement et installation vérifier que les menus de Visual Studio s'affichent bien en Anglais.

mardi 18 août 2015

Le SDK de Microsoft Advertising pour Windows 10 est enfin disponible !

Depuis quelques jours le SDK permettant de monétiser vos applications à travers des publicités est disponibles pour les applications universelles de windows 10 et windows phone 10

Voici le lien pour télécharger le sdk :
https://visualstudiogallery.msdn.microsoft.com/401703a0-263e-4949-8f0f-738305d6ef4b

De même voici un exemple de comment intégrer le nouveau composant, interstitial vidéo dans une application:
http://www.microsoftvirtualacademy.com/training-courses/a-developers-guide-to-windows-10

Cela se fait très simplement

private void Pub()
        {
            var ad = new Microsoft.Advertising.WinRT.UI.InterstitialAd(); //Création de l'objet Interstitial Ad
            ad.ErrorOccurred += (s, args) => {  /* didn't load */}; //En cas d'erreur
            ad.Cancelled += (s, args) => {  /* didn't watch */}; //Si l'utilisateur décide de ne pas regarder la vidéo en entier
            ad.Completed += (s, args) => {  /* did watch*/}; //Si l'utilisateur regarder la vidéo en entier, le contenu est débloqué
            ad.AdReady += (s, args) => { ad.Show(); }; //Dès que l'Ad est prêt on l'affiche.

            var unitId = "11532061";
            var appId = "e1b25f9e-fdb2-454c-8dfd-09887f228128"; //Inscription depuis le site https://pubcenter.microsoft.com
            ad.RequestAd(Microsoft.Advertising.WinRT.UI.AdType.Video, appId, unitId); //Demande de la vidéo avec les identifiants de l'application et de la vidéo.
        }

Lien officiel:
http://advertising.microsoft.com/en/blog/34601/announcing-the-microsoft-universal-ad-client-sdk-with-support-for-video-interstitial-ads-and-ad-mediation

mardi 30 juin 2015

Lancement d'un powershell via tâche planifiée

Il arrive en production de devoir lancer des scripts certains jours ou à une certaine heure de la journée.

Les tâches planifiées Windows peuvent vous aider à effectuer ce travail.


Depuis l'outil "Task Sheduler" effectuez un clic droit puis "Create new task"
Spécifiez un nom pour la tâche puis un mode de lancement

Create task powershell with task sheduler
Puis un type de schedule ici une fois par mois le dernier jour du mois à 23h30

Create task powershell with task sheduler
Ajouter une action

Create task powershell with task sheduler

Create task powershell with task sheduler
Saisir "Powershell.exe" dans le programme à lancer. Saisir dans les arguments "-File" puis le chemin complet vers le fichier.

Create task powershell with task sheduler
Enregistrer enfin la tâche et tester là via l'option "Run"

Create task powershell with task sheduler

Suppression de documents en masse dans SharePoint à l'aide de SPWeb.ProcessBatchData

Aujourd'hui je dois supprimer plus de 100.000 documents dans plusieurs collection de sites et le tout en un temps de traitement le plus court qui soit, VDM.

Cela aurait pu se terminer comme ça !

Plus sérieusement, SharePoint offre plusieurs moyen pour supprimer des éléments au sein d'une liste / Bibliothèque. En revanche toutes les méthodes ne sont pas aussi performantes, en particulier la fonction SPList.Items.DeleteById si cette fonction reste facile à utiliser et à mettre en place lors de la suppression d'un ou plusieurs éléments.

Mais lorsqu'il s'agit de supprimer plusieurs milliers d'élément cela va lentement très très lentement (environ 3-4 secondes par fichier sur un environnement de développement) Alors effectuer ce traitement sur un volume plus important va vite devenir problématique.

Heureusement une autre fonction existe et permet d'effectuer des traitements par lot.  La méthode SPWeb.ProcessBatchData prend en paramètre une chaîne CAML (Collaborative Application Markup Language) qui contient les commandes, qui se compose d'un élément de Batch et un nombre quelconque d'éléments subordonnés Method qui spécifient chacun une méthode d'appel (RPC) de procédure à distance SharePoint .

 La forme la plus simple est la suivante:
<batch>
  <method>
    <setlist scope="Request">ID_LIST</setlist>
    <setvar name="ID">ID_ELEMENT</setvar>
    <setvar md="" name="`">COMMANDE</setvar>
  </method>
</batch>

Dans le cadre d'une suppression en masse la fonction suivante qui prend en paramètre l'url du site et le nom de la bibliothèque permet de supprimer les éléments par lot de 2000.
Une requête CAML permet de faire un filtre sur les documents à supprimer.

Function purgeSite($params){

$web = get-spweb $params[0]
$list = $web.lists[$params[1]]

    try
    {
        $i=0
        $spQuery = New-Object Microsoft.SharePoint.SPQuery
        $spQuery.ViewFieldsOnly = $true
        $spQuery.Query = "<where><lt><fieldref name="Created"><value type="DateTime"><today offsetdays="2"></today></value></fieldref></lt></where>"
        $spQuery.RowLimit = 2000;
        $itemCount = 0;          
        $listId = $list.ID;

        do
        {
            [System.Text.StringBuilder]$batchXml = New-Object "System.Text.StringBuilder";
            $batchXml.Append("<batch>");
            $command = [System.String]::Format( "<method><setlist scope="Request">{0}</setlist><setvar name="`">{1}</setvar><setvar name="owsfileref">{2}</setvar><setvar md="" name="`">Delete</setvar></method>", $listId, "{0}","{1}" );

            $listItems = $list.GetItems($spQuery)
            $spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
            $count = $listItems.Count

            Write-Host $count
            foreach ($item in $listItems)
            {
                Write-Host -ForegroundColor Green "Delete item "$item.ID
                $list.Items.DeleteItemById($item.ID)
                if($item -ne $null)
                {
                    $batchXml.Append([System.String]::Format($command, $item.ID.ToString(),$item["FileRef"])) | Out-Null;
                }
                #break;
            }
            $batchXml.Append("</batch>");

          #  $web.ProcessBatchData($batchXml.ToString())

            $result = $web.ProcessBatchData($batchXml.ToString())
       
            $web.RecycleBin.DeleteAll()

        }
        while ($spQuery.ListItemCollectionPosition -ne $null)
    }
    catch
    {
        Write-Host -ForegroundColor Red $_.Exception.ToString()
    }
}