Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server

Archives

Office 365: La gestion des Attachments dans les listes riches de SharePoint Online

Lorsque les utilisateurs passe d’une version d’un logiciel vers une nouvelle, il existe de nombreux petits réglages à faire. Parmis ceux-ci, les habitudes prises par ces utilisateurs sont à gérer.

Les listes possédant des champs riches telles que les messages de blogs ou les “Discussion boards” avaient un comportement dans SharePoint 2007 permettant d’ajouter des fichiers joints directement à un message:

image

Cette option n’est plus visible dans SharePoint Online et les utilisateurs habitués à cette façon de procéder peuvent être “perdus”.

La solution est associée au redesign de SharePoint depuis 2010 avec le ruban qui a apporté pour ces champs un menu dédié aux insertions:

image

Dans ce menu “insert”, on retrouve la possibilité d’ajouter un fichier comme pièce jointe. En revanche, ce fichier n’est plus stocké dans la liste elle-même, mais bien dans une librairie documentaire choisie lors de l’upload:

image

Cela veut aussi dire que l’utilisateur doit avoir les permissions adaptées sur les DocLib pour ce faire.

Il ne vous reste plus qu’à communiquer cette solution à vos utilisateurs pour qu’ils s’habituent à ces nouvelles méthodes.

Liens associés:

Fabrice Romelard [MBA Risk Management]

Office 365: Message d’erreur sur SharePoint Online “The file [file name] is checked out or locked for editing by [username]”

Dans un cas particulier, un message d’erreur peut apparaître:

 

image

Celui-ci provient de l’ouverture du document en édition depuis Office Online (Word, Excel ou PowerPoint) mais pour lequel l’utilisateur a quité l’application prématurément ou par accident (IE coupé par exemple).

A ce moment, si l’utilisateur essaye de modifier le même document par une autre voie (Office desktop, mais aussi en changeant le nom du fichier), un message apparaîtra:

  • The file "[file name]" is checked out or locked for editing by "[username]"

Comme dans l’image ci-dessus.

La source est simplement qu’Office Online crée un lock sur le document lors de l’ouverture et ne le lache que si l’utilisateur le ferme correctement.

Dans le cas inverse, le lock agit comme un bloqueur temporaire dont il faut attendre la fin de vie, environ 10 minutes.

Vous trouvez plus d’informations:

Fabrice Romelard [MBA Risk Management]

Office 365 : Script PowerShell pour créer le mapping des utilisateurs dans ShareGate à partir de SharePoint 2007

sharegate-logo

Lors du travail de préparation à la migration des sites SharePoint On Premise vers Office 365 SharePoint Online, il y a plusieurs étapes à mener telles que:

Une fois ce travail effectué, le client de migration ShareGate vous permet de faire un mapping pour chaque utilisateur entre le monde NTLM On Premise et le monde Office 365 et Azure AD.

Pour ceci, l’option la plus simple reste le client lui même avec un module de recherche simple:

image

En revanche dès que le nombre d’utilisateurs est important, il devient impossible de faire ce type de mapping manuel. Le module d’import XML est la solution en respectant le format suivant:

<?xml version="1.0"?>
<UserAndGroupMappings xmlns:xsd="
http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Mappings>
    <Mapping>
      <Source AccountName="DOMAIN\xxxxx_yyyyyy1" DisplayName="Xxxxx Yyyyyy 1" PrincipalType="User" /> 
      <Destination AccountName="i:0#.f|membership|xxxxx.yyyyyy1@mydomain.com" DisplayName="Xxxxx Yyyyyy 1" PrincipalType="User" /> 
    </Mapping>
    <Mapping>
      <Source AccountName="DOMAIN\xxxxx_yyyyyy2" DisplayName="Xxxxx Yyyyyy 1" PrincipalType="User" /> 
      <Destination AccountName="i:0#.f|membership|xxxxx.yyyyyy2@mydomain.com" DisplayName="Xxxxx Yyyyyy 2" PrincipalType="User" /> 
    </Mapping>
  </Mappings>
</UserAndGroupMappings>

Ainsi, dans mon cas, j’ai la chance d’avoir une base de données de référence avec tous les utilisateurs existants et valides dans le domaine.

Le script PowerShell permet donc de:

  • Se connecter à la collection de sites
  • Obtenir la liste de tous les utilisateurs de la collection (SPUsers List)
  • Tester chaque utilisateur dans la base de données
  • Créer le bloc XML de mapping

Une fois terminé, le script crée le fichier XML avec l’extension acceptée par ShareGate.

[string]$ConnectionString = "Data Source=MySQLServer;Integrated Security=True;Initial Catalog=MyDatabase;uid=MyAccount;pwd=MyPassword"
[string]$ProfileTable = "MyInternalUserTable"
[bool]$Verbose = $false
[int]$GLOBAL:TotalUsersUpdated = 0

[int]$NumberRow = 0
[string]$CleanedDestination_DisplayName = ""
[string]$CleanedSource_DisplayName = ""

[string]$MappingFileExported = "C:\TEMP\ShareGate-Create-UserMapping-SiteCollection\_SGS-UserAndGroupMappings-$(get-date -f yyyyMMdd-HHmm).sgum"

function GetSQLToDataSet([string]$sql)
{
    if($Verbose){Write-Host "SQL: ", $sql}

    $sqlCon = New-Object Data.SqlClient.SqlConnection
    $sqlCon.ConnectionString = $ConnectionString
    $ds = new-object "System.Data.DataSet" "MyDataSet"
    $da = new-object "System.Data.SqlClient.SqlDataAdapter" ($sql, $sqlCon)
    $da.Fill($ds)
    Write-Host "   DataSet.Table Row Number:", $ds.Tables[0].Rows.Count

    $sqlCon.close()
    $sqlCon.dispose()
    $table = new-object system.data.datatable
    $table = $set.Tables[0]
    return $table
}

function GetDataTablewithExecuteReader ([string]$SQLQuery)
{
    if($Verbose){Write-Host "SQL: ", $SQLQuery}

    $Datatable = New-Object System.Data.DataTable
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Connection.ConnectionString = $ConnectionString
    $Connection.Open()
    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Command.Connection = $Connection
    $Command.CommandText = $SQLQuery
    $Reader = $Command.ExecuteReader()
    $Datatable.Load($Reader)
    $Connection.Close()
    Write-Host "   DataTable Row Number:", $Datatable.Rows.Count

    return $Datatable
}

function Get-All-SiteCollection-Users([string]$SiteCollectionURL)
{
    $Datatable = New-Object System.Data.DataTable
    $Connection = New-Object System.Data.SQLClient.SQLConnection
    $Command = New-Object System.Data.SQLClient.SQLCommand
    $Connection.ConnectionString = $ConnectionString
    [string]$SQLCommandScript = ''
    [string]$AccountMappingXML = ''
   
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
    $site = new-object Microsoft.SharePoint.SPSite($SiteCollectionURL)
    $web = $site.openweb()

    #Debugging - show SiteCollectionURL
    write-host "SiteCollectionURL: ", $SiteCollectionURL
    Write-Output "SiteCollectionURL - $SiteCollectionURL"

    $siteCollUsers = $web.SiteUsers
    write-host "Users Items: ", $siteCollUsers.Count
    [string]$XMLFile = "<?xml version=""1.0""?> `n"
    $XMLFile += "<UserAndGroupMappings xmlns:xsd=""
http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""> `n  <Mappings> `n"

    foreach($MyUser in $siteCollUsers)
    {
        $NumberRow += 1
        if(($MyUser.LoginName.ToLower() -ne "sharepoint\system") -and ($MyUser.LoginName.ToLower() -ne "nt authority\authenticated users") -and ($MyUser.LoginName.ToLower() -ne "nt authority\local service"))
        {
            #Write-Host "  USER: ", $MyUser.LoginName
            $UserName = $MyUser.LoginName.ToLower()
            Write-Host " >> User Login: ", $MyUser.LoginName
           
            $SQLCommandScript = "SELECT USER_NTNAME AS Source_AccountName, USER_PREFERRED_NAME AS Source_DisplayName, CASE LEN(USER_EMAIL) WHEN 0 THEN 'i:0#.f|membership|'+ (RIGHT(USER_NTNAME,LEN(USER_NTNAME)-CHARINDEX('\',USER_NTNAME)) + '@yourtenant.onmicrosoft.com') ELSE 'i:0#.f|membership|'+ USER_EMAIL END AS Destination_AccountName, (USER_LAST_NAME +', '+ USER_FIRST_NAME +' ('+ USER_CITY +')') AS Destination_DisplayName FROM [metricsops].[dbo].[MOSSProfileDataToWSS] WHERE USER_NTNAME = '$($MyUser.LoginName.ToLower())' ORDER BY USER_NTNAME ASC"
            #Write-Host "SQL: ", $SQLCommandScript
           
            $Datatable.Clear()
            $Connection.Open()
            $Command.Connection = $Connection
            $Command.CommandText = $SQLCommandScript
            $Reader = $Command.ExecuteReader()
            $Datatable.Load($Reader)
            $Connection.Close()
            Write-Host "   DataTable Row Number:", $Datatable.Rows.Count
 
            if ($Datatable.Rows.Count -gt 0)
            {
                foreach($myUserDataMapping in $Datatable.Rows)
                {
                    $CleanedDestination_DisplayName =  $myUserDataMapping.Destination_DisplayName -replace "&", " "
                    $CleanedSource_DisplayName =  $myUserDataMapping.Source_DisplayName -replace "&", " "

                    Write-Host " "
                    Write-Host " ========================================================="
                    Write-Host "    Row Number:", $NumberRow, " of ", $siteCollUsers.count
                    Write-Host "    SharePoint Onpremise Account Name:", $myUserDataMapping.Source_AccountName
                    Write-Host "    SharePoint Onpremise Display Name:", $CleanedSource_DisplayName
                    Write-Host "    O365 Destination Account Name:", $myUserDataMapping.Destination_AccountName
                    Write-Host "    O365 Destination Display Name:", $CleanedDestination_DisplayName
                    Write-Host " ---------------------------------------------------------"
                   
                    $AccountMappingXML = "    <Mapping> `n"
                    $AccountMappingXML += "      <Source AccountName=""$($myUserDataMapping.Source_AccountName)"" DisplayName=""$($CleanedSource_DisplayName)"" PrincipalType=""User"" />  `n"
                    $AccountMappingXML += "      <Destination AccountName=""$($myUserDataMapping.Destination_AccountName)"" DisplayName=""$($CleanedDestination_DisplayName)"" PrincipalType=""User"" />  `n"
                    $AccountMappingXML += "    </Mapping> `n"

                    $XMLFile += $AccountMappingXML
                }
            }
        }
    }

    $GLOBAL:TotalUsersUpdated += 1
    $XMLFile += "  </Mappings> `n </UserAndGroupMappings>"
    $XMLFile >> $MappingFileExported

    $web.Dispose()
    $site.Dispose()
}

function StartProcess()
{
    # Create the stopwatch
    [System.Diagnostics.Stopwatch] $sw;
    $sw = New-Object System.Diagnostics.StopWatch
    $sw.Start()
    #cls

    Get-All-SiteCollection-Users http://MySharePoint2007WebApp/sites/MySitecollection

    $sw.Stop()

    # Write the compact output to the screen
    write-host "Time: ", $sw.Elapsed.ToString()
}

StartProcess

Il vous faudra juste adapter le script pour le test des utilisateurs selon votre propre configuration.

Fabrice Romelard [MBA Risk Management]

SharePoint 2007: Script PowerShell pour nettoyer les listes vides avant migration vers Office 365 - Updated

Le contexte est toujours le même:

  • la préparation d’une migration

En effet, lorsqu’on arrive à ce stade, il y a toujours deux situations qui sont distinctes:

  • Upgrade des environnements On Premise vers les nouvelles versions (et donc DB Upgrade)
  • Passage d’environnement On Premise vers le Cloud (Office 365)

La première option implique donc la conservation de la structure et donc une certaine largesse dans la préparation, car on reste toujours dans une zone connue et une liste de plus ou de moins ne change pas grand chose.

La seconde option est plus discutable, car quelque soit l’outil choisi, le transfert reviendra à faire un import des données vers le tenant et donc tout ce que cela implique:

  • Temps de transfert
  • Utilisation du réseau
  • Temps de configuration et création des listes par l’outil
  • Temps pour appliquer les paramètres et les permissions

De ce fait, plus on réduit le nombre de liste plus on accélère la migration potentiel.

Un exemple rapide d’une ferme hypothétique avec la configuration suivante:

  • 100 collections de sites
  • 4 sous-sites par collection
  • 5 listes vides en moyenne (calendrier, contacts, annonces, …)
  • une moyenne de 20KB par liste

On obtient très rapidement la valeur suivante:

  • Nombre de listes vides à migrer: 100 * 4 * 5 = 2000
  • Taille totale inutile pour ces listes: 2000 * 20KB = 40 MB

Le temps pour créer une liste vide avec ShareGate par exemple est d’environ 30 secondes, ce qui vous donne un temps perdu:

  • 2000 * 30 = 60 000 secondes = env. 16 heures utilisées pour rien

Pour palier à cette situation, voici un script PowerShell à adapter selon votre besoin et exécuter sur chaque Web Application:

[int]$LimitMaxNumber = 5000
[int]$NumberMonthsOlder = -18 #(around 18 months before)

[boolean]$RemoveBasicEmptyLists = $true

[array]$ExceptionListnames = "List Template Gallery", "Master Page Gallery", "Site Template Gallery", "Web Part Gallery", "User Information List", "Settings", "Galería de plantillas de sitios", "Galería de plantillas de listas", "Galerie de modèles de sites", "Galerie de modèles de listes", "Galeria de Modelos de Site", "Galeria de Modelos de Lista"

[array]$BasicListToDelete = "Shared Documents", "Announcements", "Calendar", "Links", "Tasks", "Team Discussion", "Events", "General Discussion", "Contacts", "Discusión de grupo", "Tareas", "Documentos compartidos", "Calendario", "Eventos", "Contactos", "Discusión general", "Vínculos", "Anuncios", "Avisos", "Tarefas", "Documentos Compartilhados", "Contatos", "Discussão Geral", "Calendário", "Discussão em Equipe", "Eventos", "Discussion générale", "Tâches", "Événements", "Documents partagés", "Annonces", "Contacts", "Liens", "Calendrier", "Discussion d'équipe", "Извещения", "Контакты", "События", "Общие обсуждения", "Ссылки", "Ankündigungen", "Teamdiskussion", "Hyperlinks", "Freigegebene Dokumente", "Aufgaben", "Ankündigungen", "Kalender", "Documenti condivisi","Annunci", "Attività", "Calendario", "Collegamenti", "Discussione team", "Dokumenty udostępnione", "Anonsy", "Kalendarz", "Łącza", "Zadania", "Dyskusja zespołu", "共享文件", "宣告", "工作", "行事曆", "連結", "小組討論", "共有ドキュメント", "お知らせ", "タスク", "リンク", "予定表", "チーム ディスカッション", "공유 문서", "공지 사항", "링크", "일정", "작업", "팀 토론"

[array]$AnnouncementListNames = "Announcements", "Anuncios", "Annonces", "Ankündigungen", "Annunci", "Anonsy", "Извещения", "Avisos", "宣告", "お知らせ", "공지 사항"

[array]$AnnouncementDefaultItemValue = "Get Started with Windows SharePoint Services!", "¡Introducción a Windows SharePoint Services!", "Introducción a Windows SharePoint Services", "Guide de mise en route de Windows SharePoint Services", "Erste Schritte mit Windows SharePoint Services", "Introduzione a Windows SharePoint Services", "Rozpocznij pracę z programem Windows SharePoint Services!", "Начало работы с Windows SharePoint Services", "Bem-vindo ao Windows SharePoint Services!", "開始使用 Windows SharePoint Services!", "Windows SharePoint Services について", "Windows SharePoint Services를 시작합니다!"

function Check-Lists([string]$webURL)
{
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
    $mysite = new-object Microsoft.SharePoint.SPSite($webURL)
    $myweb = $mysite.openweb()
    Write-Host "URL", $webURL
    #Write-Host "web", $myweb.Name
    Write-Host "Number of lists", $myweb.lists.count
    $ListsToDeleteFoSPWeb = New-Object System.Collections.ArrayList
   
    $LimitDate = (get-date).Addmonths($NumberMonthsOlder)
    Write-Host " >> Limit date for the lists -[", $LimitDate, "]"

    foreach($MyList in $myweb.lists)
    {
        if($ExceptionListnames -notcontains $MyList.Title)
        {
            if(($MyList.ItemCount -lt 1) -and ($MyList.LastItemModifiedDate -lt $LimitDate))
            {
                Write-Host "     ------------------------------------ "
                Write-Host "      List Name:", $MyList.Title, "- GUID:", $MyList.ID -foregroundcolor green
                Write-Host "      >>Items Count:", $MyList.ItemCount -foregroundcolor green
                Write-Host "      >>Last modified Date:", $MyList.LastItemModifiedDate -foregroundcolor green
                if($BasicListToDelete -contains $MyList.Title)
                {
                    Write-Host "       >>>>> List to delete: ", $MyList.Title, " <<<<<" -foregroundcolor green
                    $ListsToDeleteFoSPWeb += $MyList.ID
                }
            }
            else
            {
                if(($AnnouncementListNames -contains $MyList.Title) -and ($MyList.ItemCount -eq 1) -and ($MyList.LastItemModifiedDate -lt $LimitDate))
                {
                    if($AnnouncementDefaultItemValue -contains $MyList.Items[0].Title)
                    {
                        Write-Host "     ----------------------------------------------------- "
                        Write-Host "      Announcements Item[0] to delete:", $MyList.Items[0].Title -foregroundcolor green
                        Write-Host "       >>>>> List to delete: ", $MyList.Title, " <<<<<" -foregroundcolor green
                        Write-Host "     ----------------------------------------------------- "
                        $ListsToDeleteFoSPWeb += $MyList.ID
                    }
                    else
                    {
                        Write-Host "     ----------------------------------------------------- "
                        Write-Host "      Announcements Item[0] to check:", $MyList.Items[0].Title -foregroundcolor red
                        Write-Host "     ----------------------------------------------------- "
                    }
                }
                else
                {
                    if($MyList.ItemCount -gt 5000)
                    {
                        Write-Host "     ------------------------------------ "
                        Write-Host "      List Name:", $MyList.Title, "- GUID:", $MyList.ID -foregroundcolor magenta
                        Write-Host "      >>Items Count:", $MyList.ItemCount -foregroundcolor magenta
                    }
                    else
                    {
                        #Write-Host "      List Name:", $MyList.Title, "(", $MyList.ItemCount , Items") - GUID:", $MyList.ID  -foregroundcolor green $MyList.BaseTemplate
                    }
                }
            }
        }
    }

   
    if(($RemoveBasicEmptyLists) -and ($ListsToDeleteFoSPWeb.count -gt 0))
    {
        foreach($ToDeleteListGUID in $ListsToDeleteFoSPWeb)
        {
            Write-Host "      ======================================= "
            $myweb.Lists.Delete($ToDeleteListGUID)
            Write-Host "        >>> List GUID deleted:", $ToDeleteListGUID
            Write-Host "      ======================================= "
        }
    }
    foreach ($subweb in $myweb.GetSubwebsForCurrentUser())
    {
        Check-Lists $subweb.Url
    }
    $myweb.Dispose()
    $mysite.Dispose()
}

function Check-Large-Empty-Lists([string]$WebAppURL)
{
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null

    $Thesite = new-object Microsoft.SharePoint.SPSite($WebAppURL)
    $oApp = $Thesite.WebApplication

    foreach ($Sites in $oApp.Sites)
    {
        $mySubweb = $Sites.RootWeb
        Write-Host " -------------------------------------------------------- "
        #Write-Host "URL", $mySubweb.Url
        Check-Lists $mySubweb.Url
       
    }
    $Thesite.Dispose()

}

cls

Check-Large-Empty-Lists “http://YourSharePointSite2007”

En bonus, ce script vous affiche aussi en Magenta les listes qui contiennent plus qu’une valeur limite donnée dans le paramètre “$LimitMaxNumber”.

Le résultat d’exécution est le suivant:

image

Update:

J’ai ajouté la gestion de la liste “Announcement” qui contient de base 1 élément qui n’était pas donc vue comme vide. Cette fois je teste le cas de l’élément unique restant dans sa forme de base avec la valeur par défaut dans l’ensemble des langues (que j’avais à gérer).

Il ne vous reste ensuite plus qu’à faire un contrôle des sites avant migration pour voir si vous n’avez pas de site totalement vide (et donc à supprimer).

Fabrice Romelard [MBA Risk Management]

Office 365: Utiliser les alertes dans SharePoint Online

SharePoint Online permet d’utiliser les alertes via Email (ou SMS si votre tenant le permet) sur des actions se passant sur une liste ou librairie.

Pour effectuer cette mise en place, il faut aller dans la liste et suivant la vision que vous avez (moderne ou classique) vous pouvez cliquer sur “Set an Alert”.

Modern View

Dans la vision “Moderne” vous pouvez trouver le lien “Alert me” directement présent ou après les “…”, dépendant de votre niveau de permissions

SetAnAlertinSPO-02

Cette action ouvrira une fenêtre modale avec tous les paramètres à choisir selon votre souhait (nom, email, type d’action, …). Si vous avez les droits suffisants, vous pouvez aussi ajouter d’autres utilisateurs dans cette alerte créée.

image

Classic View

Dans la vue classique, vous avez l’onglet “Library” qui vous propose ensuite le bouton “Alert me” et l’action “Set Alert on this library”

SetAnAlertinSPO-01

La création de l’alerte est ensuite la même que pour la vue moderne.

Attention:

Si vous ou vos utilisateurs ne recevez pas ces alertes une fois paramétré et alors que des actions contrôlées se sont bien déroulées, il faut aller dans votre Outlook Online et vérifier les répertoires suivants:

  • Clutter
  • Junk Email

Fabrice Romelard [MBA Risk Management]

Windows: Comment comparer les outils de copie de fichiers disponibles en mode console avec un script PowerShell

Dans de nombreux cas, il est utile de pouvoir scripter ses copies de fichiers pour les intégrer dans une processus plus complèxe.

Ainsi, voici un petit script en exemple qui vous permet d’exécuter un test sur la copie d’un fichier de grande taille (10GB dans mon exemple d’un fichier MDF).

Ceci vous permet de faire une estimation sur l’outil le plus adapté à votre configuration et communiquer avec un temps estimé relativement valide.

#   ---- Start the File Move PowerShell Script ----
cls
[System.Diagnostics.Stopwatch] $sw;
$sw = New-Object System.Diagnostics.StopWatch
$sw.Start()
Import-Module BitsTransfer
Start-BitsTransfer -Source "D:\FAKE_DATABASE.mdf" -Destination "H:\FAKE_DATABASE_BITS.mdf" -Description "Datafile move" -DisplayName "Datafile move"
write-host " >>>>BITS-Transfer Time: ", $sw.Elapsed.ToString() -foreground Red

$sw = New-Object System.Diagnostics.StopWatch
$sw.Start()
cmd /c copy /z "D:\FAKE_DATABASE.mdf" "H:\FAKE_DATABASE_DOS.mdf"
write-host " >>>>DOS COPY Time: ", $sw.Elapsed.ToString() -foreground Red

$sw = New-Object System.Diagnostics.StopWatch
$sw.Start()
robocopy "D:\" "H:\" "FAKE_DATABASE.mdf" /NP
write-host " >>>>ROBOCOPY Time: ", $sw.Elapsed.ToString() -foreground Red

$sw = New-Object System.Diagnostics.StopWatch
$sw.Start()
xcopy "D:\FAKE_DATABASE.mdf" "H:\"  /E /I /Y
write-host " >>>>XCOPY Time: ", $sw.Elapsed.ToString() -foreground Red

$sw = New-Object System.Diagnostics.StopWatch
$sw.Start()
Copy-Item "D:\FAKE_DATABASE.mdf" "H:\FAKE_DATABASE_PowerShellCOPY.mdf"
write-host " >>>>PowerShell Copy Time: ", $sw.Elapsed.ToString() -foreground Red

#   ---- End the File Move PowerShell Script ----

Une fois que vous executez ce fichier, vous aurez les temps d’exécution de chaque outil vous permettant de créer un tableau tel que:

image

Il ne vous reste plus que faire le calcul avec votre fichier de production pour avoir le temps estimé.

Attention, les vitesses de copie de fichier dépendent de très nombreux paramètres à tel point qu’il est difficile de dire lequel est le meilleur de manière générale.

Fabrice Romelard [MVP]

Office 365: Configurer l’ouverture des fichiers dans Office Web Apps pour une Librarie Documentaire

Lorsqu’on travaille avec Office 365 et surtout SharePoint Online, un des gros avantages est de pouvoir ouvrir les documents dans Office Web Apps (Word, Excel, PowerPoint, OneNote Online).

Tout ceci est parfait lorsqu’on crée une librarie documentaire depuis SharePoint Online et le paramètre est automatiquement appliqué pour suivre la configuration du tenant.


Visualisation du paramètre dans une librarie

  • [Votre Document Librarie] > Library Settings > Advanced Settings

image


Configuration manuelle par l’utilisateur

En revanche, si on utilise un outil de migration, le paramètre est remis avec une valeur autre dans de nombreux cas (notamment si vous passez de SharePoint 2007 à SPO via ShareGate):

image

Ainsi, il faut absolument reconfigurer les librairies après migration pour bénéficier des applications Online au niveau des documents.


Configuration via PowerShell pour SharePoint 2013 On Premise uniquement

Pour effectuer cette modification, il faut modifier la valeur du paramètre “DefaultItemOpen” et aussi “DefaultItemOpenUseListSetting” du modèle objet SharePoint 2013/2016

Les deux paramètres ont une logique simple:

  • Soit on veut appliquer le paramètre par défaut du serveur
    • DefaultItemOpenUseListSetting = $false
  • Soit on veut appliquer un paramètre spécifique pour la liste
    • DefaultItemOpenUseListSetting = $true
    • DefaultItemOpen = [Microsoft.Sharepoint.DefaultItemOpen]::PreferClient (pour ouverture avec Office desktop)
    • DefaultItemOpen = [Microsoft.Sharepoint.DefaultItemOpen]::Browser (pour ouverture avec Office Online)

La solution est expliquée ici:


Cas particulier de Office 365 SharePoint Online

SharePoint Online n’est accessible que via le modèle ClientContext qui est une version plus light que le modèle objet SharePoint 2013/2016.

Tous les paramètres ne sont pas disponibles dans ce client même avec la dernière version de SharePoint Online Management Shell [16.0.5625.1200].

L’objet “List” ne possède donc pas ces paramètres et il n’est pas possible de scripter cette modification.


Conclusion

Non seulement la plateforme Office 365 est très mouvante et changeante, mais les basiques n’y sont pas encore tous, tels que cette modification, pourtant plutôt simple en termes d’impact et intéressante pour les clients et Microsoft (Utiliser au mieux les applications Online).

Il reste à espérer que ce paramètre sera intégré dans une prochaine mise à jour du modèle objet Client Contexte.

Liens utiles:

Fabrice Romelard [MBA Risk Management]

Office 365: Comment gérer les Access Requests dans les sites SharePoint Online

Dans les sites SharePoint Online, il est possible de gérer les demande d’accès au niveau des sites, sous-sites ou listes.

Ce principe est basé sur une solution déjà éprouvée qui était expliquée ici:

Dans Office 365, le principe est très proche de la version 2013 avec le menu “Access Requests and invitations”:

image

Vous pouvez trouver toutes les demandes en attente (sachant que les Owners de sites peuvent gérer ces options):

image

 

Vous pouvez aussi aller dans les paramètres (Site Settings > Site permissions) et définir une adresse email pour recevoir les nouvelles demandes d’accès:

image clip_image008

C’est surtout une piqure de rappel pour déléguer cette gestion de permission au niveau des propriétaires de sites pour les responsabiliser sur ces accès.

Romelard Fabrice [MBA Risk Management]

Windows 2008 R2: Réduire la taille du répertoire system volume information

3513_Windows-Server-2008-R2-Logo-V_2652ACEF

Dans certains cas, il arrive que Windows Server 2008 R2 remplisse le disque système [C:\], et en regardant plus en détail, on trouve le folder “system volume information” prenant toute la place disponible:

image

La source de ce soucis est souvent liée au processus de Shadow Copy, qu’il faut reconfigurer correctement selon son besoin.

Le détail est dans cet échange:

De ce fait, le jeu de commandes est le suivant:

  • vssadmin list shadowstorage

Ce qui dans mon cas donne le résultat suivant

image

A partir de ce moment, il faut reconfigurer le disque avec une commande du type (que vous devez adapter à votre situation):

  • vssadmin resize shadowstorage /For=C: /On=C: /MaxSize=2GB

image

Cela aura pour effet de faire un clear du contenu et de forcer la limite à la valeur voulue.

On retrouve alors une situation plus normale sur la machine concernée.

image

Fabrice Romelard [MBA Risk Management]

Office 365: Comment éviter de taper son mot de passe du Tenant dans les scripts PowerShell

Lorsqu’on commence à gérer un Tenant Office 365, quelque soit le module à gérer, PowerShell est le seul outil à maîtriser absolument.

En revanche, il devient très rapidement pénible de taper le mot de passe du compte Office 365 à chaque exécution du script, et surtout impossible de scheduler un script avec ce concept. On ne va pas pour autant stocker son mot de passe en clair dans un fichier texte de la machine.

La solution est donc d’utiliser un script de génération de fichier avec le password crypté qui peut ensuite être utilisé dans son script

Voici donc un petit exemple de script:

[string]$username = "YourTenantAccount@yourtenant.onmicrosoft.com"
[string]$PwdTXTPath = "C:\FOLDERTOSTOREPWD\ExportedPWD-$($username).txt"

Write-Host " >> Account used:", $username -Foreground "Green"

Read-Host -Prompt "Please enter password:" -AsSecureString | ConvertFrom-SecureString | Out-File $PwdTXTPath

Write-Host " ---------------------------------------------- "
Write-Host " >> Your SecuredString file is stored in", $PwdTXTPath
Write-Host "    =>> You can use it in your script" -Foreground "Red"
Write-Host " ---------------------------------------------- "

Ce fichier qui sera stocké avec le path exact: “C:\FOLDERTOSTOREPWD\ExportedPWD-YourTenantAccount@yourtenant.onmicrosoft.com.txt” pourra être utilisé dans votre script de connexion comme suit:

[string]$username = "YourTenantAccount@yourtenant.onmicrosoft.com"
[string]$PwdTXTPath = "C:\FOLDERTOSTOREPWD\ExportedPWD-$($username).txt"

$secureStringPwd = ConvertTo-SecureString -string (Get-Content $PwdTXTPath)

$ctx=New-Object Microsoft.SharePoint.Client.ClientContext($Url)

$creds = New-Object System.Management.Automation.PSCredential -ArgumentList ($username , $secureStringPwd)
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($creds.UserName,$creds.Password)
$ctx.RequestTimeout = 1000000 # milliseconds
$spoweb = $ctx.Web
$ctx.Load($spoweb)
$ctx.ExecuteQuery()

Write-Host
Write-Host $ctx.Url -BackgroundColor White -ForegroundColor DarkGreen

Il ne vous reste plus qu’à mettre à jour ce fichier à chaque changement de mot de passe.

Liens utiles:

Romelard Fabrice [MBA Risk Management]

Office 365: Portal.office.com avec le compatibility View d’Internet Explorer 11

Microsoft a annoncé avec Windows 10 la fin du navigateur Internet Explorer, et de ce fait IE 11 est la dernière version.

C’est aussi le seul navigateur Microsoft possible sur l’OS Windows 7 (qui est encore sous support pour un moment). Nous avons d’ailleurs déjà eu des surprise avec une option de ce browser “Compatibility View Setting” avec SharePoint 2007 (SharePoint 2007 : Internet Explorer 10 incompatible avec certaines fonctionnalités).

Cette fois, ce paramètre joue des tours pour les utilisateurs Office 365 sous Windows ,  en ne présentant pas le même écran suivant sa configuration. D’ailleurs le même effet n’est pas toujours constaté sur Windows 10 (sans réelle explication).


Avec “Display intranet sites in Compatibility view” activé

image

On voit donc la page d’accueil Office 365 [https://portal.office.com] sans la barre de recherche et sans les fichiers proposés (au bas de la page).


Avec “Display intranet sites in Compatibility view” désactivé

image

La même page d’accueil présente maintenant la barre de recherche ainsi que les derniers documents accédés.


Windows 10 n’est pas aussi catégorique et sans pouvoir l’expliquer, le paramètre n’est pas toujours pris en compte, en revanche, c’est toujours vrai pour Windows 7.

De plus ce changement ne concerne que le navigateur Internet Explorer, pour les utilisateurs sous FireFox, Chrome ou autres, la barre de recherche est toujours présente.

Romelard Fabrice [MBA Risk Management]

Office 365: Comment utiliser la DLL Microsoft.SharePoint.Client.UserProfiles.dll dans son code PowerShell

Nous avons vu dans un précédent article comment accéder à la base de profile de son Tenant Office 365 via PowerShell:

Et les première lignes du code d’exemple chargent les DLL nécessaires:

Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.UserProfiles.dll"

La partie plus probématique est la troisième ligne, car pour utiliser ce code telquel, il faut avoir installé le package:

Dont la date commence un peu à dater, mais surtout qui n’est pas compatible avec le package de management en PowerShell nécessaire pour Office 365:

Nous avions évoqué ce point dans un message relatif à la mise en place d’un serveur de gestion Office 365:

Ce package contient de nombreuses DLL, mais pas celle des profiles (Microsoft.SharePoint.Client.UserProfiles.dll) comme on peut le voir ci-dessous:

clip_image002

La solution est un peu barbare, mais a le mérite de fonctionner, car le seul but est d’obtenir une copie de cette DLL pour son code PowerShell.

Pour cela, il existe plusieurs méthodes, plus ou moins sauvage.

La plus simple est l’utilisation d’un outil d’unzip pour extraire le contenu du fichier MSI et trouver alors les fichiers (dans l’exemple avec 7ZIP):

image

image

Les fichiers DLL sont alors tous présent et il suffit de le renommer selon son besoin et de l’utiliser dans son script.

La seconde méthode est plus propre, car utilisant le moteur d’installation de Microsoft “MSIExec”.

image

Elle s’utilise selon le modèle:

  • msiexec /a c:\testfile.msi /qb TARGETDIR=c:\temp\test

Ce qui donne dans notre cas précis la commande suivante:

  • msiexec.exe /a C:\TEMP\sharepointclientcomponents_16-4002-1211_x64-en-us.msi /qb TARGETDIR=C:\TEMP\sharepointclientcomponentsMSIFiles

Après quelques secondes, on trouve le contenu de ce package dans le répertoire voulu:

image

On trouve à ce moment les fichiers DLL simplement dans les sous-répertoires, comme pour notre cas précis, dans le sous-répertoire “GAC_MSIL”:

image

Il ne nous reste plus qu’à copier ce fichier “Microsoft.SharePoint.Client.UserProfiles.dll” dans notre repository qui sera utilisé par PowerShell.

Voici un exemple de script PowerShell utilisable pour les cas de serveur de gestion (Office 365: Monter une machine de management pour gérer Office 365):

[string]$defaultDLLPath = ""
# Load assemblies to PowerShell session
$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)
$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)
$defaultDLLPath = "C:\TEMP\sharepointclientcomponentsMSIFiles\GAC_MSIL\Microsoft.SharePoint.Client.UserProfiles.dll"
[System.Reflection.Assembly]::LoadFile($defaultDLLPath)

Cette stratégie est adaptable pour toutes les autres DLL qui ne sont pas dans le package de management PowerShell pour Office 365.

Romelard Fabrice [MBA Risk Management]

Office 365: Comment obtenir des informations des Users Profiles du tenant via PowerShell

SharePoint Server permet depuis plusieurs versions de présenter les profiles d’utilisateurs, ceci basé sur un mix de données provenant de l’Active Directory et des données ajoutées par l’utilisateurs lui même.

Lors du passage à Office 365 et donc SharePoint OnLine, ce principe reste valable et on peut gérer un certain nombre de paramètres via l’application “SharePoint Admin Center”:

image

En revanche, comment se connecter à cette base de profiles depuis PowerShell ?

Pour cela, voici un exemple de code permettant de vous connecter sur la base de profiles et de lister les propriétés dans des fichiers Txt (uniquement à titre d’exemple):

Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.UserProfiles.dll"

$site = 'https://YourTenant-admin.sharepoint.com/'
$mysite = 'https://YourTenant-my.sharepoint.com/'
$admin =
'AdminEmail@YourTenant.onmicrosoft.com'

$password = Read-Host 'Enter Password' -AsSecureString

$context = New-Object Microsoft.SharePoint.Client.ClientContext($site)
$contextmy = New-Object Microsoft.SharePoint.Client.ClientContext($mysite)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($admin , $password)
$context.Credentials = $credentials
$contextmy.Credentials = $credentials
$users = $contextmy.Web.SiteUsers
$contextmy.Load($users)
$contextmy.ExecuteQuery()

$people = New-Object Microsoft.SharePoint.Client.UserProfiles.PeopleManager($context)
$personProperties = $people.GetMyProperties();

$collection = @()

Foreach($user in $users)
{
    $userprofile2 = $people.GetPropertiesFor($user.LoginName)
    $context.Load($userprofile2)
    $context.ExecuteQuery()

    If($userprofile2.Email -ne $null)
    {
        
        $userprofile2.UserProfileProperties | Out-File C:\TEMP\$($userprofile2.Email).txt  -Encoding UTF8
     }
}

Ce code n’a aucune intelligence est plutôt à caser dans la liste des codes PowerShell trash, en revanche, il peut servir de base pour autre chose de plus subtile selon votre besoin.

A vous de laisser s’exprimer votre fibre artistique.

Romelard Fabrice [MBA Risk Management]

Event: La saison des conférence reprend, comme les champignons

Après une pause de plusieurs mois, me voici à nouveau sur des évènements pour présenter une des composantes importantes de la suite Office 365.

Tout d’abord, le Samedi 8 Octobre à Lyon pour le SharePoint Saturday Lyon:

image

Pour les personnes ne pouvant se rendre à Lyon, je présenterai à nouveau cette session quelques jours plus tard à Genève, le Mercredi 12 Octobre durant le meeting du Swiss SharePoint Club:

image

J’espère vous voir nombreux, sauf si c’est pour me jeter des tomates moisies Smile

Romelard Fabrice [MBA Risk Management]

Office 365: Le ContentTypeHub et les Content Types Orphelins

Nous avons découvert dans un précédent message les possibilités offertes par le Hub de Types de Contenu ou Content Type (CT):

Cette solution est une fonctionnalité très intéressante mais qu’il faut prendre avec beaucoup d’attention.

En effet, le principe est basé sur un Timer qui s’exécute au sein de la ferme toutes les XX minutes pour publier les modifications à toute la ferme ou tout le tenant pour Office 365.


Création d’un Content Type orphelin

Le cas typique est la création d’un CT qui a été publié et qui est supprimé du Hub avant d’avoir été totalement “dépublié” de la ferme ou du tenant. Le résultat est donc la présence au sein de certaines collections (voir toutes) de ces CT qui sont maintenant orphelin du Hub. A cela il faut rajouter la même présence dans les collections “OneDrive” des utilisateurs de ces mêmes CT.

Prenons un exemple concrêt:

Imaginons maintenant un tenant de 30’000 utilisateurs avec 20’000 collections OneDrive, à cela on rajoute une 100 de sites SharePoint classiques.

On parle donc de 20’100 collections de sites qui sont susceptibles de recevoir les CT depuis le Hub. Maintenant, on publie un CT et disons qu’il mette 5 secondes par collection pour se déployer au sein du tenant (valeur hypothétique bien sur). Il nous faudra donc 100’500 secondes pour publier le CT sur tout le tenant, soit environ 28 heures au total.

Il suffit maintenant d’imaginer un administrateur, un peu trop pressé et voulant corriger son erreur, peut très facilement supprimer le CT du HUB avant même que celui-ci soit publié partout et donc créer des orphelins dans de nombreuses collections.

Le cas est expliqué en commentaire de ce post d’ailleurs:


Nettoyer les Content Type orphelins

La solution est un peu tricky mais fonctionne bien surtout quand on souhaite éviter d’aller sur 20’100 collections de site et supprimer les CT à la main. Il faut trouver une collection ou le CT est encore présent pour obtenir:

Une fois qu’on a cela, il faut utiliser un script PowerShell (Le CT ID peut être défini uniquement via Code) utilisant la base fournie:

Vous devez juste modifier la partie centrale en commentant les colonnes et forcant l’ID:

# create Content Type using ContentTypeCreationInformation object (ctci)
$ctci = new-object Microsoft.SharePoint.Client.ContentTypeCreationInformation
$ctci.id = $MyContentTypeID
$ctci.name = $contentTypeName
#$ctci.ParentContentType = $parentContentType
$ctci.group = $contentTypeGroup
$ctci = $contentTypes.add($ctci)
$context.load($ctci)

Ce script doit être exécuté sur le Content Type Hub pour recréer les CT (Vides pour le coup) afin de les republier et dépublier après 24/48 heures.

C’est seulement une fois la dépublication effectuée que vous pouvez supprimer les CT du Hub (en vérifiant les log d’exécution dans le Hub).


Attention

La dépublication ne fonctionne que si le site collection admin n’a pas utilisé ce CT dans sa collection. Si c’est le cas, la dépublication ne s’exécutera pas sur cette collection.


Conclusion

L’utilisation du CT Hub est vraiment une très bonne chose, mais il faut vraiment bien réfléchir à sa stratégie avant de créer ces CT dans le Hub sous peine de devoir risquer de gros soucis.

Romelard Fabrice [MBA Risk Management]

Office 365: Comment trouver simplement l’adresse de la collection de site associée à une chaine

Peu à peu, nous découvrons ensemble différents aspects autour du service de vidéo d’Office 365:

Lors de la création d’une chaine (Channel), l’application crée automatiquement une collection de sites pour stocker le contenu associé et gérer les permissions. De ce fait, pour un administrateur, il peut être utile de connaître l’URL de la collection de sites associée à une chaine.

La solution la plus simple nécessite d’avoir au moins une vidéo présente dans la chaine, mais ne demande aucune application.

Il suffit donc d’aller dans une des vues listant les vidéos de la chaine

image

et cliquer avec le bouton droit sur l’image (thumbnail) de la vidéo et choisir “propriétés”

image

pour trouver dans la propriété “Address” l’URL du fichier image en question

image

Cette adresse URL est toujours du format:

  • https://[yourtenant].sharepoint.com/portals/XXXXX/

Il ne vous reste plus qu’à copier cette adresse dans votre navigateur WEB pour accéder à la collection de sites contenant les vidéos de la chaine.

Romelard Fabrice [MBA Risk Management]

Office 365: La distribution des types de contenu à travers le tenant - ContentTypeHub

Le Content Type (ou type de contenu) est une des fonctionnalité disponible dans SharePoint depuis 2007. Chaque génération de SharePoint reçoit des améliorations autour de cette stratégie de contenu typé.


Le Content Type Hub

Ainsi depuis 2010 et principalement 2013 Microsoft a permis la mise en place de Hub de Content Type:

La raison de cette nouveauté est l’isolation des collections de sites, car les content types sont créés au niveau de la racine de la collection et utilisable à n’importe quel niveau de l’arborescence de cette collection.

En revanche, avoir un content type tranverse entre collection est très difficile à maintenir, puisque chaque modification exige de rejouer cette modification sur toutes les collections utilisant ce type de contenu.

Le Content Type Hub permet d’avoir un master de Content Types qui est ensuite utilisable:

  • dans n’importe quel niveau du tenant, toutes les collections (sauf les collections de Vidéo Portal)
  • dans tous les OneDrive utilisateurs


Dans un tenant Office 365

Cette logique est totalement adaptée au monde Office 365 SharePoint Online et il est activé par défaut dans tous les tenants Enterprise. En revanche la collection de sites HUB n’est pas visible dans la liste des sites existants (comme de nombreux sites d’ailleurs), mais son adresse est sous le format:

On peut dès lors créer un type de contenu dans cette collection,

image

Puis le publier (ou republier si vous devez le modifier)

image image

le voir apparaître dans toutes les autres collections (entre 15 et 60 minutes) pour l’utiliser dans vos listes selon vos besoins

Dans un OneDrive
image
Dans une collection de sites
image


Suivre les publications de Types de contenu

Pour effectuer un monitoring de ce qui est publié depuis ce hub, il faut aller dans la collection du Hub et chercher dans les menu d’administration de la collection “Publication de type de contenu” ou “Content Type Publishing”

image

Cette page vous permet de forcer la mise à jour de tous les types de contenu publiés et suivre les erreurs éventuelles


Conclusion

Cette solution est très pratique pour réfléchir autour des modèles de document corporate que vous souhaitez appliquer sur tout un ensemble de sites afin de mettre à disposition de vos utilisateurs les modèles officiels de votre entreprise.

Romelard Fabrice [MBA Risk Management]

Office 365: Les navigateurs supportés par Office 365 Video Portal

Office 365 Video Portal est une solution vraiment attractive pour les entreprises afin de mettre en place une communication basée sur des vidéos, ou pour des solution de training interne.

Dans le cadre d’une mise en place globale, il convient de connaître au mieux sa population d’utilisateurs et valider que la solution est adaptée avec ces configurations type.

Ainsi, en regardant les statistiques globales de répartition des systèmes d’exploitation, on ne peut pas ignorer la présence des versions anciennes de Windows:

image

On voit dans le schéma ci-dessus (pour le mois de Juillet 2016) Windows 7 et XP représente plus de la moitié des machines, de plus on sait que de nombreuses entreprises sont encore totalement sous Windows 7.

Le support des navigateurs par Office 365 Video est détaillé dans la page

image

Quand on regarde cette page:

  • Le premier point est que la version minimale d’Internet Explorer est 9, or Windows XP ne supporte que IE 8 pour sa dernière version.
  • Pour Windows 7, le navigateur Internet Explorer est bien IE 11, mais avec un comportement différent de celui de Windows 8/8.1/10. Ainsi, le player de vidéo se fait uniquement avec le module Adobe Flash.

Il convient maintenant de voir comment se comporte la solution Office 365 sur chacune de version d’OS


Windows XP et Office 365

Officiellement cet version n’est plus du tout supportée par Microsoft, mais avec plus de 10% d’utilisateurs, on ne peut pas les ignorer.

Lorsqu’on lance Microsoft Internet Explorer 8, qui est la dernière version supportée par cet OS, l’aventure s’arrète immédiatement après le portail Office.com avec de très nombreuses erreurs Javascript:

image Il est donc totalement impossible d’utiliser Internet Explorer sous Windows XP pour accéder à Office 365 Video Portal.

Par contre, losque l’on regarde le tableau de support, Firefox ou Google Chrome sont totalement compatibles si on maintient les versions à jour

image

Mais en essayant avec Firefox d’accéder au site du Video Portal, tout semble être OK, car on voit tous les Channels et les thumbnails de chaque video. Mais lorsque l’on veut visionner une vidéo, le message suivant apparaît, nous renvoyant alors vers la page de présentation de Office 365 Video Portal

image image

Par contre, avec Google Chrome, le résultat est différent puisque la vidéo se lance et le player est celui HTML 5 (donc supportant les sous-titres)

image

  • On peut donc dire qu’Office 365 Video Portal supporte Windows XP que pour Google Chrome


Windows 7 et Office 365

Le cas de Windows 7 est plus subtile, car cet OS est encore supporté par Microsoft pour quelques années et donc les développeurs ne doivent pas l’ignorer, en revanche il est impensable de demander une modification de l’OS hors du cadre des patches de sécurités.

De ce fait, Microsoft ne supporte Office 365 Video Portal pour Windows 7 que dans le contexte suivant:

  • Google Chrome avec le Player HTML5 (total support des sous-titres)
  • Firefox avec le Player HTML5 (total support des sous-titres)


Conclusion

Il convient donc de bien savoir ce que vous souhaitez faire avec Office 365 Video Portal avant de partir sur cette solution et surtout de matcher avec la configuration de vos postes utilisateurs.

Si les sous-titres ne sont pas essentiels pour vous, tout est OK pour Windows 7, mais si c’est un point important, il est indispensable de passer sur un navigateur alternatif.

Romelard Fabrice [MBA Risk Management]

Office 365: Le versionning dans OneDrive for Business

OneDrive for Business utilise un mix de technologies dont certaines des fonctionnalités de SharePoint Online.

Lorsque l’on crée son espace OneDrive for Business, en interne, il s’agit plus ou moins d’une site SharePoint avec une unique librairie documentaire qui sera ensuite synchronisée via le client Offline OneDrive sur votre machine de travail.

La page d’accueil a été totalement retravaillée pour en simplifier son usage avec les options basiques de gestion

image


Activation des menus de gestion

En revanche, on trouve sur le bas à gauche un lien pour passer la page de présentation avec le look SharePoint 2013 auquel on peut rajouter le ruban, via le menu sur la droite

image image

Une fois ce menu réactivé, on obtient enfin toutes les options classiques de gestion des librairies documentaires

image


La gestion des versions de document

Maintenant que nous avons les options de gestion, il faut aller dans les paramètres pour trouver ceux de versionning

image image

En on trouve le niveau de gestion des sauvegardes de versions

image

Ainsi, dans mon cas, les versions sont toutes enregistrées sans aucune limite de nombre, ce qui est discutable pour la bonne gestion de votre volume par collaborateur.

Dans certains cas, une valeur limite peut être paramétrée à 500 pour le champ “Conserver le nombre suivant de versions principales”

image


Impact du versionning sur l’utilisation du volume alloué par collaborateur

Deux cas précis se distingue dans cette question de la place occupée par les versions:

  1. Document Office 2013/2016 modifié directement en sauvegarde dans le cloud ou dans le répertoire Offline
  2. Document Office ou autre type uploadé manuellement par le client Web (ou écrasé dans le répertoire Offline)

Le cas numéro 1 permet de voir entrer en jeu la sauvegarde des deltas de modification.

Pour faire simple, lors de la modification du document Office (via Office Rich Client ou Web Client), le système ne fait passer au niveau réseau que le Delta de ce qui a été modifié dans le document et non le fichier tout entier. Par contre le moteur SharePoint (OneDrive for Business) crée une nouvelle version une fois le mode édition terminé. On voit alors la multiplication des versions du document avec le menu “Historique des versions”

image image

Le cas numéro 2 correspond à tous les autres types de documents. Le changement de version correspond simplement à :

  • l’utilisation du client dédié au fichier dans le répertoire offline
  • le changement du document (copier/coller) dans ce même répertoire offline
  • l’upload d’une nouvelle version du document dans le même emplacement (répertoire) via le site web

Le transfert réseau est différent du client Office, car l’intégralité du fichier est remplacé et donc uploadé vers le stockage cloud, par le client web ou le client offline.


Conclusion

Cette fonctionnalité de versionning est vraiment intéressante pour un usage courant, mais il faut absolument comprendre les risques de sur consommation des espaces OneDrive collaborateurs avec des fichiers multimédia ou des fichiers ayant un très grand nombre de versions.

Romelard Fabrice [MBA Risk Management]

Office 365: Gestion des Thumbnails dans Office 365 Video Portal

Nous avons vu dans un précédent article la gestion des sous-titres dans Office 365 Video Portal:

Mais il existe d’autres options de personalisation offertes par la plateforme.


Introduction

En effet, lors du chargement d’une vidéo dans la plateforme Office 365 Vidéo, celle-ci propose une série de 5 images en miniatures (thumbnails) qui sont d’ailleurs générés automatiquement par le système.

Il y a alors deux options:

  • Laisser Office 365 Vidéo attribuer la première miniature automatiquement
  • Choisir une miniature spécifique

La première option ne demande rien au responsable de contenu.


Choisir la miniature pour une vidéo parmis la liste automatique

Pour effectuer cette sélection, il faut aller dans la vidéo (après le travail de conversion effectué par Azure Media Services) et sélectionner dans le menu “Thumbnail”

image

A ce moment, le système propose 5 images autogénérées dont la première est celle utilisée par défaut

image

Les images présentées dans cette liste sont générées à la volée par un fichier ASHX specifique qui sera appelé selon la règle suivante:

  • getpreview.ashx?guidSite=36b8e1b1-c7fa-4b3e-9d0a-d9c391f4ae89&amp;guidWeb=02f1cf27-6f8a-438a-a08d-1f3805e66b11&amp;guidFile=40dea05e-0fff-4bd1-9ea9-69afccb4b7bd&amp;index=4

Le numéro de l’index va bien sur de 0 à 4 (pour les cinq previews proposées).

Lorsque l’on choisie une miniature, celle-ci est alors stockée en PNG dans la librairie SharePoint Video de la Collection associée au Channel


Comment sont choisies les miniatures par Azure Media Services ?

Le calcul est basé sur le temps de la vidéo en secondes.

Ainsi prenons le cas d’une video de 500 secondes (8 min 20 secondes), le moteur va donc calculer un pas basé sur le nombre de miniatures (5):

  • Pas de capture = 500 sec / 5 thumbnails = 100 secondes

En revanche, la première image sera prise à un demi pas, et non un pas entier, ceci afin de ne pas avec une image vide en fin, comme dans beaucoup de videos.

On peut donc déduire le minutage de chacune des thumbnails avec le calcul suivant:

  • Thumbnail N°1: (durée de la video en secondes) / (nombre de thumbnails) / 2
  • Thumbnails du N°2 à 5: (durée de la video en secondes) / (nombre de thumbnails) / 2 + ((Numéro du thumbnail – 1) * (durée de la video en secondes) / (nombre de thumbnails))

Donc dans notre exemple d’une vidéo de 500 secondes, nous auront des thumdnails au secondes suivantes: 50, 150, 250, 350 et 450


Choisir la miniature personnalisée

Il est par contre possible de charger sa propre miniature pour ne pas être dépendant du rythme du générateur, pour cela, il faut cliquer sur le bouton “Upload an Image”

image

A ce moment, vous pouvez uploader une image selon votre besoin réel depuis votre poste de travail. Ce fichier sera alors stocké dans la librairie vidéo en respectant la même logique que lors du choix d’un thumbnail automatique:

Il sera stocké en interne dans son format original, mais le fichier ASHX génère plusieurs miniatures selon la valeur donnée dans le paramètre “width”, telle que suit:

  • Certaines largeurs donneront une image rectangulaire (ratio 16/9)
  • Si votre fichier source est au format carré, certaines largeurs donneront une image carrée (au dessus de 500px)

Quelque soit la miniature choisie, la mise à jour de celle-ci est faite quelques secondes après le changement dans tous les affichages de la vidéo.


Conclusion

Cette solution est simple à gérer et permet d’apporter une présentation plus agréable des listes de vidéos. Il est aussi utilisé pour les images plus grande dans les pages de news (avant de cliquer sur le bouton play).

Romelard Fabrice [MBA Risk Management]


Liens en rapport

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- Office 365: La gestion des Attachments dans les listes riches de SharePoint Online par Blog Technique de Romelard Fabrice le 01-10-2017, 17:56

- [IIS] On désactive le recyclage des pools, ou on le contrôle ? par Blog de Jérémy Jeanson le 01-06-2017, 20:48

- Bon Visual Studio 2017 ! par Blog de Jérémy Jeanson le 01-06-2017, 12:53

- Office 365: Message d’erreur sur SharePoint Online “The file [file name] is checked out or locked for editing by [username]” par Blog Technique de Romelard Fabrice le 01-05-2017, 16:02

- Office 365 : Script PowerShell pour créer le mapping des utilisateurs dans ShareGate à partir de SharePoint 2007 par Blog Technique de Romelard Fabrice le 12-29-2016, 15:36

- Regroupez vos sections javascript ! par Blog de Jérémy Jeanson le 12-29-2016, 13:02

- Retour en arrière sur Windows Server Core 2016 par Blog de Jérémy Jeanson le 12-20-2016, 13:07

- SharePoint 2007: Script PowerShell pour nettoyer les listes vides avant migration vers Office 365 - Updated par Blog Technique de Romelard Fabrice le 12-14-2016, 16:34

- Server Essentials 2016 et site remote web access indisponible par Blog de Jérémy Jeanson le 12-09-2016, 13:10

- Office 365: Utiliser les alertes dans SharePoint Online par Blog Technique de Romelard Fabrice le 11-30-2016, 12:45