SharePoint Story
The Problem
User: “I get this properties panel opening every time I open a word doc from this SharePoint site.”
The Burdensome Solution
Me Google, find Fix:
Here’re steps:
- Go to Library Settings -> Advanced Settings -> Set “Allow management of Content Types?” as “Yes”.
- Go to Library Settings -> Click the Document content type under content types section -> Document Information panel Settings -> Uncheck the box “Always Show the Document Information Panel”.
I think we can do better than that
Which based on the answer requires 2 steps (enabling editing of content types), then flipping the switch. Which as you may have guessed does not scale well, and would be really time consuming against hundreds of lists. If you know front ends they always rely on some backend, so how’s the backend doing it? How to fix via backend
This didn’t work, Why? Cause the first linked site which is the real answer is doing it per list’s document content type, where the answer above it doing it just at the site level. The difference is noted at the beginning of this long TechNet post.
What it did tell me is how the SchemaXml property is edited, which seems to be by editing the XmlDocuments array property.
So with these three references in mind, we should now be to actually fix the problem via the backend.
The Superuser Solution
First we need to build some variables:
$plainSchema = "http://schemas.microsoft.com/office/2006/metadata/customXsn"
While this variable may not change (in this case its for SharePoint 2016), How this this derived? How? From this:
((((Get-spweb http://spsite.consoto.com).Lists) | ?{($_.ContentTypes["Document"]).SchemaXml -match "<openByDefault>True"})[0].ContentTypes["Document"]).XmlDocuments[1]
This takes a SharePoint Web Site, goes through all it’s lists, but only grab the lists which have a content type of Document associated with them,
all of these objects will have a property “SchemaXml” now only grab the ones that have the Schema property of “openByDefault” that are set to true,
from this list of objects only grab the first one”[0]”, grab it’s Document Content Type Object, and spit out the second XmlDocument “.XmlDocuments[1]”.
From this String XML output we want the xml property of “customXsn”:
<customXsn xmlns="http://schemas.microsoft.com/office/2006/metadata/customXsn"><xsnLocation></xsnLocation><cached>True</cached><openByDefault>True</openByDefault><xsnScope></xsnScope></customXsn>
Why? For some reason the Content Type’s SchemaXml property can not be directly edited.
Why? Unsure, but it is this field property that gets changed when doing the fix via the front end.
$goodSchema = "<customXsn xmlns="http://schemas.microsoft.com/office/2006/metadata/customXsn"><xsnLocation></xsnLocation><cached>True</cached><openByDefault>False</openByDefault><xsnScope></xsnScope></customXsn>"
This can also be derived by using a Replace operation, flipping true to false.
After this is done we need to build an object (type of array) that will hold all lists that are affected (have openByDefault set to true):
$problemDroids = ((Get-spweb http://spsite.consoto.com).Lists) | ?{($_.ContentTypes["Document"]).SchemaXml -match "<openByDefault>True"} $problemDroids | %{($_.ContentTypes["Document"]).XmlDocuments.Delete($plainSchema)} $problemDroids | %{($_.ContentTypes["Document"]).XmlDocuments.Add($GoodSchema)} $problemDroids | %{($_.ContentTypes["Document"]).Update()}
Not good Enough
User: “It’s not working on all sites”
Solution: The above code will go through all document libraries affected at the root site, if you have subsites you simply have to add .Webs[0].Webs to the initial call for creating the “problemDroids” variable. The level of how deep you need to go depends on how many subsites your SharePoint implementation has.
$problemDroids = ((Get-spweb http://spsite.consoto.com).Webs[0].webs.Lists) | ?{($_.ContentTypes["Document"]).SchemaXml -match "<openByDefault>True"}
Summary
Something that should have been a boolean type property on the object was really a boolean nested in XML, which was of a string type.
Standing Ovation. Fun had by all parties involved. Tune in next week when I post more SharePoint content.