As this issue keeps showing up again and again in support requests, I thought it is worth mentioning here.
The problem is that the External User account gets, somehow, associated with a different UPN in the Users List of SharePoint Online or gets corrupted somehow. Either way the first thing to do is to find it and get rid of it so that we can recreate a health account in the Users List.
I had like to mention that I have seen cases where the Administrator has executed the command Get-SPOExternalUser in the Power Shell Administration console but the External User account was not found using this method.
The solution in this case was to look for the External User account in the Users List page:
<URL>/_layouts/15/people.aspx?MembershipGroupId=0
If the account appears listed in there, just delete it and then re-invite the user. This time around it should work.
I hope this works for you, when facing a similar problem.
Helio De Andrade
The site Administrator is unable to change the regional settings for a site collection. Whenever he tries to do so a message appears that says something similar to the following:
"The column "Workflow History Parent Instance" in the list or library "CreateDateExpiredTasks History" has been marked for indexing. Please turn off all indexed columns before changing the collation of this site. You may re-index those columns after the collation of the site has been changed."
Or
"The column "Invitation" in the list or library "correlation ID number" has been marked for indexing. Please turn off all indexed columns before changing the collation of this site. You may re-index those columns after the collation of the site has been changed."
"The site regional settings cannot be changed because one or more columns has been marked for indexing".
You could try to get rid of the afore mentioned column manually but that could take hours on a medium to large site.
The best way I have found so far to be able to change the Regional Settings under this condition is to make sure the "Sort Order" option is set to "General", as in this screen-shot:
I hope this help.
Thanks to Dominique VIVES for having reviewed my post.
For more details: https://about.yammer.com/success/activate/activation-guide/why-yammer/
As part of Yammer Enterprise, you receive access to your own Office 365 Admin Portal with a Global Admin account. Use this portal to configure your account and activate your Yammer Enterprise network.
Yammer requires a company domain, such as contoso.com to activate the network. This means the default domain (contoso.onmicrosoft.com) you created with your Office 365 account can't be used to activate Yammer Enterprise. So, if you don't have a company domain, you can purchase one from a domain name registrar (for example GoDaddy.com, Gandi.net, etc.), or on the Domains page in O365 Admin portal.
If your enterprise domain is already created, you'll need to have access to your DNS hosting provider or domain registrar to confirm ownership of this domain.
For more details: Add a Company Domain
By default, Office 365 uses the user authentication service of Azure Active Directory to provide authentication to Office 365 services (such as Exchange Online, Lync Online, SharePoint Online, and so on). This means Office 365 uses the identity that is synchronized with Azure AD to provide authentication. This flexible model allows you to use one of the following three methods to manage your accounts:
Source : Plan for managing Office 365 user accounts using Azure Active Directory
7. Define how you'll use your domain by selecting Yammer or a combination with other Office 365 services like Exchange Online or Lync Online.
8. Set up DNS records for your enterprise domain at your DNS hosting provider
9. If this domain is your organization's primary domain, change your default Office 365 domain from onmicrosoft.com to the company domain you just added. Go to Admin > Office 365, click your organization name in the upper-right corner, and then choose Default domain.
10. If you choose to manage user accounts in Office 365, you should create a new user in this newly configured domain (for example johndoe@imenbacha.com) and assign it "Global admin". He will automatically be Yammer administrator.
Note :
Assign Global Admins :
Office 365 Global Admin accounts assigned to *.onmicrosoft.com or with generic usernames will not be synchronized with Yammer.
Generic usernames include: admin, noreply, help, support, workfeed, feedback, yammer, api, abuse, postmaster, hostmaster, root, new, create, index, show, destroy, delete, and update.
Source : https://about.yammer.com/success/activate/activation-guide/why-yammer/
Create a new user in the new domain:
12. Now you are ready to activate Yammer in O365 Admin center!
To do this: Office 365 Admin Site > Dashboard > Included Services > Yes, activate Yammer Enterprise for my network
You can now see Yammer Admin Link:
Note: Your account is Global Admin in O365 Admin center, so it will automatically be Yammer Admin. However you should explicitly create your Yammer profile.
14. Click on: Don't have an account? Sign Up
15. When you signup, you will receive an email in order to complete registration. Click on "Complete Signup":
To access Yammer's administration menu, click on "Network Admin"
19. Now you can use your enterprise social network.
Thanks to Hélène Lemontvert & Dominique VIVES for having reviewed my post.
Imen Bacha
Version : Microsoft Office 365 Plan E3
Date : 25/09/2014
As we all know we have multiple flavors of PowerPivot for SharePoint and sometimes it's a bit strange how you install updates for PowerPivot.
Let us start with the beginning J We have SharePoint 2010 that can use PowerPivot from SQL 2008 R2 or PowerPivot from SQL 2012 SP1/SQL 2014 and on the other hand we have SharePoint 2013 that can use only PowerPivot from SQL 2012 SP1/SQL 2014. I'm grouping SQL 2012 SP1 and SQL 2014 because from the update perspective they are behaving identical.
You are installing an update for SQL 2008 R2 like SP2 due to the fact that you need to have your environment supported (SQL 2008 R2 is out of main support starting with 08/07/2014 and the least supported version is SQL 2008 R2 SP2). You can download SP2 and the latest Cumulative Update for it (CU 13) from Update Center for Microsoft SQL Server
In order to upgrade the PowerPivot service application and its components all you have to do is to install the updates and check the Health Analyzer that it picked up the correct version. As explained in the following article Upgrade (PowerPivot for SharePoint), here are the steps to do it:
PowerPivot: The deployed farm solution is not up-to-date
Now we start to have some fun! While for SQL 2008 R2 all you had to do was to install the hotfix (QFE) with PowerPivot 2012 SP1 the situation has changed and be careful you should install the x64 hotfix as SharePoint and PowerPivot for SharePoint are only on x64.
Please check the articles describing procedure:
Upgrade PowerPivot for SharePoint (SQL 2012 SP1)
Upgrade PowerPivot for SharePoint (SQL 2014)
Radu CARAIVAN
This post explains how to manage your SharePoint Online environment and manipulate SPO objects. In other words, this post describes how to manage SharePoint sites, SharePoint lists using Powershell and CSOM (Client Side Object Model).
1. Prerequisites
In order to use CSOM within your PowerShell scripts, you first need to download the "Office Developer Tools for Visual Studio 2013". This package contains the client Dlls components for SharePoint Online. You can download the office Developer tools on this link.
You can find more details regarding the Office Developer Tools for Visual Studio in the following articles:
Note: the examples of this post use the office developer tools of March 2014.
In this post, I' am using a PowerShell version 4.0 provided with Windows 8.1, however the scripts should also work since PowerShell 2.0 (at least).
2. Walkthrough
a. Loading Clients Assemblies
In order to manipulate SharePoint Online objects in our PowerShell script, we first need to load the Clients DLL installed with the Office Developer tools on our local machine.
We will load two client DLLs with the two following lines:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
Note: "Add-Type" cmdlet is an alternative to Loadwithpartialname. LoadWithPartialName is actually deprecated (link).
b. Create Client Context and Authenticate to SPO
Now that the client DLLs have been loaded with the previous lines, we can access the SP client objects model. However in order to manipulate SharePoint objects and run operations, we need a new client context.
To create the context, we first have to provide the site collection URL:
$weburl= 'https://tenant.sharepoint.com/sites/team'
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($webUrl)
Then we should provide the site collection administrator credentials to the context object to authenticate against on the site:
$username = 'user@tenant.onmicrosoft.com'
$password = Read-Host -Prompt "Password for $username" –AsSecureString
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password)
Note: if the credentials or the WebUrl are wrong, you will face an error when executing the above command.
c. Query Objects through Context
Now that we are authenticated to a SPO Site and that we have a context object, we can access objects by loading them in the current context.
The following query will retrieve the site (SPWeb) in the $ctx:
$web = $ctx.Web
$ctx.Load($web);
$ctx.ExecuteQuery();
$web.Title # will print the name of the site
Note: we could also retrieve the site collection (SPSite), $site = $ctx.Site
Now, that we have the site (SPWeb), we can also query objects like lists (SPList) and their basic properties:
$listname = "Documents"
$list = $context.Web.Lists.GetByTitle($listname);
$ctx.Load($list);
$list.ItemCount # will print the number of documents and folders
With the following PowerShell script, we will upload a local Temp.txt file to a SharePoint document library.
This script is provided on an "as is" basis without warranties of any kind, whether express or implied. The entire risk as to the quality and performance of the code is with the end user.
$loadInfo1 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
$loadInfo2 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
$weburl= Read-Host -Prompt "Please type or paste the site url you want to connect to (ex: https://tenant.sharepoint.com/sites/TeamSite)"
$username = Read-Host -Prompt "Enter or paste the site collection administrators user name"
$password = Read-Host -Prompt "Password for $username" -AsSecureString
$listTitle= Read-Host -Prompt "Please type the Documents library TITLE in which you updload the demo text file(ex: Documents)"
#$webUrl = 'https://contoso.sharepoint.com/sites/dev/'
#$username = 'administrator@contoso.onmicrosoft.com'
#$password = ConvertTo-SecureString 'passwod' -AsPlainText -Force
#$ListTitle= "Documents"
try
{
#Creating the SharePoint Context with SP Site Url and the Site Collection admin credential.
Write-Output "Connecting to $weburl ...";
}
catch
Write-output "... Couldn't connect. Please check your credential or the provided Url: $weburl." ;
break
#Retrieving the Root Web
Write-Output "`nRetrieving Web ..."
catch{
Write-output 'Unable to get the $web site.';
write-output "Web title : $($web.Title)";
write-output "Web Template : $($web.WebTemplate)";
#Retrieving the "Documents" list.
Write-Output "`nRetrieving Documents document library..."
$list = $ctx.Web.Lists.GetByTitle("$ListTitle");
Write-Output "Unable to get Documents library. Please check the $listTitle document library exists..." ;
break;
Write-Output "List contains: $($list.ItemCount) items."
#Retrieving the root folder and the Sub folders.
Write-Output "`nRetrieving Root Folder of list..."
$ctx.Load($list.RootFolder);
$folder = $list.RootFolder;
Write-Output "Root Folder Name : $($folder.Name)"
Write-Output "Face an error when retrieving RootFolder object or Folders nested in this RootFolder.";
#Creating a file on local folder.
Write-Output "`nCreating a file on local folder."
$myfile = New-Item -Path .\Temp.txt -ItemType file -Force
$textFile = "Congratulations, this file has been updloaded through CSOM & PowerShell";
#Adding data to file
Out-File -InputObject $textFile -Append -FilePath $($myfile.FullName)
Write-Output "`nAdded Text to Temp file."
Write-Output "`nAdding file to $($folder.Name) root folder in List ..."
$FileInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation($null);
$FileInfo.Content = get-content -encoding byte -path $($myfile.FullName)
$FileInfo.Url = "$($myfile.Name)";
$FileInfo.Overwrite = $true;
$fileUpload = $folder.Files.Add($FileInfo);
$ctx.Load($fileUpload);
Write-Output "... Face an issue when updloading file to the $ListTitle Doc Library.";
Write-Output "File was added sucessfully."
Write-Output "Now List contains: $($list.ItemCount) items.
Vous avez généré sur votre environnement SharePoint 2013 une solution Visual Studio de type Visual Web Part et cette solution comporte un élément UpdatePanel (AJAX Extensions) ainsi qu’un élément InputFormTextBox (Microsoft.SharePoint.WebControls.InputFormTextBox).
Cette solution pourrait avoir la forme suivante :
L’intérêt du contrôle <asp:Button ID="btn" runat="server" Text="Refresh Panel" OnClick="btn_Click"/> est de pouvoir déclencher un post de la page et de mettre en évidence le fonctionnement présenté dans cet article de blog. Le code « behind » de ce contrôle pourrait effectuer l’action suivante :
Au final la page affichée par SharePoint pourrait avoir la forme suivante :
Un clic sur le bouton « Refresh Panel » aura l’effet suivant :
Le contrôle RTE ainsi que la barre d’outils sont dupliqués, le contenu est perdu et le contrôle devient non opérationnel.
Des informations complémentaires sur ce comportement sont données dans le paragraphe « Conclusion ».
Depuis SharePoint 2013, un nouveau mode de rendu des pages ASPX est proposé, nommé « Minimal Download Strategy ». Cette fonctionnalité accélère le rendu d’une page lorsque peu d’éléments changent sur cette page. Dans ce contexte, les contrôles utilisés sur la page doivent pouvoir être rappelés. En d’autres termes, le code de l’élément doit être fonctionnel en mode réentrant. Dans l’exemple ci-dessus, nous voyons très bien que l’élément InputFormTextBox présente un dysfonctionnement dans un tel contexte.
Pour contourner ce fonctionnement, l'idée est de vérifier si l'élément est déjà sur la page lors de son appel pour affichage. Si tel est le cas il faut bloquer cet appel.
Voici, ci-dessous, quelques méthodes permettant de mettre en place ce contournement :
Dans un tel contexte, le code suivant, ajouté dans une page ASPX, serait suffisant :
Dans ce cas, cela se complique un peu. En effet, la fonction document.getElementById, pour pouvoir être utilisable, va nécessiter de fournir le ClientID du contrôle recherché sur la page ASPX.
Il faut récupérer le ClientID du contrôle en éditant le code source de la page dans IE. La contrainte ici est que si la page est modifiée, alors le ClientID va changer. Il sera nécessaire de recompiler la solution Visual Studio et la redéployer.
Le code aurait la forme suivante :
Cette solution semble plus optimale pour contourner ce comportement. Elle consiste à remplacer la fonction JavaScript exposée ci-dessus par la version suivante :
Il n’est pas nécessaire d’ajouter le code ci-dessus directement dans le fichier ASCX de la solution Visual Studio. Ce code peut être injecté par la fonction suivante déclarée dans le fichier ASCX.CS de la solution Visual Studio.
Ce dysfonctionnement a été rapporté au groupe produit SharePoint. Leur décision a été de ne pas toucher au code source utilisé par l’élément Rich Text Editor. RTE existe depuis plusieurs versions de SharePoint et le modifier maintenant pourrait avoir des impacts inattendus sur des plateformes SharePoint déjà installées.
La solution de contournement exposée ci-dessus a été officialisé par le groupe produit SharePoint et la fourniture d’une solution sous forme de correctif est pour l’instant exclue des prochaines mises à jour SharePoint.
Je remercie Cédric Naudy pour la relecture de ce billet.
Yamine Taiëb
En analysant des problèmes de performance, je me suis confronté à un environnement où le developer dashboard n'est pas disponible.
Les logs ULS contiennent les temps d'exécution dans les évènements B4LY. Les évènements B4LY ne sont logués que lorsque pour le produit SharePoint Foundation, la catégorie Monitoring est à High ou plus verbeuse.
J'ai écrit un script PowerShell pour extraire les temps d'exécution des logs ULS, pour un correlation ID donné. L'objectif est de comprendre rapidement ce qui a consommé le temps de réponse. J'ai publié le script à https://dumpexecutiontime.codeplex.com/
La documentation complète (syntaxe, exemples, paramètres) est disponible sur codeplex.
dir v:*log | C:\Tests\Dump-ExecutionTime.ps1 -Threshold 500
La sortie sera par exemple:
Extracting Execution Times above 500 ms from file V:\srs\Ignacio Verbose-c52663.log with correlation
id matching *
ExecTime Monitored Scope---------- ------------------------------ 729.130 Leaving Monitored Scope (Directory Search). 792.014 Leaving Monitored Scope (Directory Search). 666.610 Leaving Monitored Scope (PortalSiteMapNode: Populating navigation children for web:
/<PII:..>). 722.340 Leaving Monitored Scope (Directory Search). 659.460 Leaving Monitored Scope (Directory Search). 675.208 Leaving Monitored Scope (Directory Search). 510.887 Leaving Monitored Scope (Directory Search). 616.288 Leaving Monitored Scope (Directory Search). 603.682 Leaving Monitored Scope (Directory Search). 523.035 Leaving Monitored Scope (Directory Search). 592.420 Leaving Monitored Scope (Directory Search). 507.795 Leaving Monitored Scope (Directory Search). 620.947 Leaving Monitored Scope (Directory Search). 8,580.957 Leaving Monitored Scope (Render the Web part of the PII own documents). 8,581.096 Leaving Monitored Scope (Redner the Web part- Main). 8,641.322 Leaving Monitored Scope (SharePointForm Control Render).14,294.430 Leaving Monitored Scope (Request GET:https://server.domain.com/Forms/AllItems.aspx)).
17 monitored scopes matched, for a total of 48317.62 ms
Dans cet exemple, les appels à Directory Search (surlignés en jaune) sont responsables de la plus grande partie du temps de réponse.
Je remercie Dominique Vives pour la relecture de ce billet.
Vincent Runge
Vous avez généré sur votre environnement SharePoint 2010 une solution basée sur la fonctionnalité variations.
Imaginons que cette solution est la forme simple suivante :
Au final la solution disponible sur SharePoint 2010 pourrait avoir la forme suivante.
Vous décidez de migrer ce contenu vers SharePoint 2013. Pour ce faire, la base de données est sauvegardée, restaurée sur le nouvel environnement SQL et attachée à la nouvelle application web SharePoint 2013 avec la commande PowerShell « Mount-SPContentDatabase ».
Dans ce nouvel environnement toute modification effectuée sur le label racine ne sera plus propagée vers les labels « enfants » faisant parties de la hiérarchie.
La raison de ce dysfonctionnement, après la migration, est que tous les labels, autre que le label racine, devraient avoir une propriété nommée « NotificationMode » égale à False, alors que le label racive devrait cette propriété égale à True, ce qui n'est pas le cas. Cette propriété après la migration est positionnée à Null pour tous les labels.
Une solution de contournement a été trouvée par le service support de Microsoft et ce dysfonctionnement a été reportée auprès du groupe produit SharePoint.
La solution de contournement suivante a été officialisée (supporté) par le groupe produit SharePoint et la fourniture d'une solution sous forme de correctif est pour l'instant hors du champ de vision des prochaines mises à jour SharePoint 2013.
Le script PowerShell suivant peut être utilisé pour mettre à jour les labels appartenant à la hiérarchie.
$web = Get-SPWeb http://nomDuSite
$list = $web.GetListFromUrl("/Variation Labels/AllItems.aspx")
$nbItems = $list.ItemCount
For ($i = 0 ; $i -lt $nbItems ; $i++)
If ($i -eq 0)
$item = $list.Items[$i]
$item["NotificationMode"] = $true
$item.Update()
Else
$item["NotificationMode"] = $false
Je remercie Dominique Vives pour la relecture de ce blog.
an English version of this post is also available - click here for English
Après avoir donné les formations internes Workflows, j'ai trouvé utile de compiler une "checklist" de référence pour le support des workflows 2013. Voici donc cette liste, contenant les actions de diagnostic les plus usitées.
1. Observer la "Workflow History list", eg "http://sp2013/Lists/Workflow History". Y a-t-il des erreurs?
2. Le compte de l'utilisateur qui démarre le workflows est-il:
(Plus de détails à http://technet.microsoft.com/en-us/library/jj658588.aspx#section7)
3. Les services User Profile Service et App Management Service sont-ils démarrés ? Voir les cadres verts dans copie d'écran depuis l'Administration Centrale \ Manage Services on Server :
4. Les service-applications App Management Service Application et User Profile Service Application sont-elles démarrées? Leurs proxies sont-elles également démarrées ? Voir les cadres verts dans copie d'écran depuis l'Administration Centrale \ Manage Service Applications :
Non supporté en production, mais très pratique en développement!
Dans la page SharePoint workstat.aspx , copier le champs "requestor id"
1. Puis dans les paramètres d'appels de l'url de la page worsktat.aspx, copier le champs "instanceid"
2. Ouvrir la base WFInstanceManagementDB avec SQLManagement Studio, faire une requête table DebugTrace
3. l'exception est dans la colonne "WorkflowStatusDetail"
Dans l'Administration Centrale \ MaService Applications \ Workflow Service Application Proxy:
Quel est le status? Le status est-il bien "connecté" comme dans la copie d'écran ci-dessous:
Sur un serveur de la ferme Worflow Manager,
1. Lancer un Workflow Manager PowerShell
2. lancer la commande get-WFStatus
3. Les status sont-ils Running comme sur la copie d'écran ci-dessous:
Sur le serveur SharePoint 2013, lancer IE, et vérifier que les metadonnées OAuth sont accessibles. L'url est de la forme: http://wfm1:12291/$SYSTEM/$Metadata/json/1
Voici un exemple de résultat:
Il est possible de vérifier depuis Internet Explorer que les scopes sont bien enregistrés. Il est également possible de parcourir les données des workflows. Les URLs indiquées ci-dessous permettent de vérifier ces éléments:
http://wfm1:12291/$ChildScopes
http://wfm1:12291/SharePoint/default/659f1e87-c228-420e-9eb6-c2ca4b5b7cf8/aa605c44-734b-4bd4-b961-2afd253d1c3d/$ChildScopes
http://wfm1:12291/SharePoint/default/659f1e87-c228-420e-9eb6-c2ca4b5b7cf8/aa605c44-734b-4bd4-b961-2afd253d1c3d/$Workflows
http://wfm1:12291/SharePoint/default/659f1e87-c228-420e-9eb6-c2ca4b5b7cf8/aa605c44-734b-4bd4-b961-2afd253d1c3d/$Workflows/0ce48b29-b821-4785-ab12-34564e7332a3/$Instances
Les GUIDs des URLs ci-dessus ne sont pas fixes.
L'outil ci-dessous pour naviguer plus simplement dans les données du workflows manager:
http://code.msdn.microsoft.com/windowsdesktop/Workflow-Resource-Browser-a67b1d27
Sur un serveur Workflows Manager, il convient d'exécuter l'outil Workflow-Resource-Browser en tant qu'administrateur
1. Lancer l'observateur d'évènements
2. Étendre Applications and Services Logs \ Microsoft-Workflow
3. Dans le menu View \ Show Analytical and Debug logs
4. Sélectionner le log Debug, cliquer-droit enable Log
5. Reproduire le problème
6. Sélectionner le log Debug, cliquer-droit Disable Log. (L'objectif est de ne pas saturer la plateforme.)
7. Il est alors possible d'enregistrer le log au format EVTX
SharePoint 2013 v15.0.4551.1001
Workflow Manager 1.0.0
Je remercie Yvan Duhamel pour la relecture de ce blog.
Notre objectif est d’aider les utilisateurs directement, leur évitant l’ouverture d’un incident support. Ce blog, ainsi que les exemples et le code inclus, sont fournis à titre d'information uniquement et ne sont assortis d'aucune garantie expresse ou implicite. Les informations contenues dans ce blog, y compris les URL et autres références à des sites Web Internet, pourront faire l'objet de modifications sans préavis. L'utilisateur reconnaît assumer tous les risques liés à l'utilisation ou aux résultats de l'utilisation de ce blog.
-----------------------------------------------------------------------------
Dominique VIVES de la part de l'équipe "GBS SharePoint FR"
Our blog is aimed at helping people help themselves, and to avoid having to open a support incident for the more common problems. We cannot engage deeply with anyone via the blog - but if we get a comment where a quick response should help someone on their way then we will try to do this. We do monitor comments before publishing, but so far it is only spam we have not published. Feel free to respond to others comments if you have the answers before we do. Also we enjoy feedback pointing us in a direction the readers need us to go in - so let us know of any specific topics you need covering. All messages posted to this blog are provided "AS IS" with no warranties, and confer no rights. Use of any script or code samples is subject to the terms specified in the Terms of Use”
--------------------------------------------------------------------------
Dominique VIVES on behalf of the SharePoint GBS Team