I recently ran into the issue of a document appearing in search results that didn’t use the name field OR the title field. I was perplexed by this until checking the search schema for the “Title” field. In an attempt to be helpful, there’s a property called MetadataExtractorTitle that was given higher preference than the actual title field. To fix this, I simply had to bump it down the list a bit.
Scenario
The document in question is a SharePoint Governance meeting agenda named SP Governance – 2017-11-17.
It appeared correctly in its library, which is to be expected:
And a look at its properties revealed there was no Title value, meaning it would default to the document name.
However, when searching for “SP” I found the document listed as “Agenda.” This was used because the MetadataExtractorProperty found “Agenda” within the document as a potential title (as the first line of the document).
Solution
Note: You must be at least a site collection administrator.
Go to Site Settings at the top level of the site collection for the document library.
Choose “Search Schema” under Site Collection Administration (not just “Schema” under search – that’s only site level)
Search for title and edit the property
Move “MetadataExtractorTitle” down until it’s beneath ows_Title. Click OK when finished.
Click to enlarge
Checking your work
After fixing the schema, go back to the document library and re-index it to check. (Library Settings –> Advanced Settings –> Reindex Document Library)
This will have the library re-crawled during the next incremental crawl (interval depends on administrator settings). Alternatively, you could trigger it immediately or run a full crawl.
Once the crawl has run, try your search again. Your items should now have a correct title when appearing in search results.
In an on-prem environment, it’s convenient to be able to run Chrome as a test user with general permissions instead of my admin permissions. This possibility makes it so I don’t need to remote to another machine or log out and in with another account just for a simple check.
If you have a shortcut to Chrome on your desktop (not your task bar), skip ahead to step two.
1. Search “Chrome” from the start menu, right click and select “Open File Location”
2. Hold “Shift” on your keyboard and right-click the Internet Explorer icon. Select “run as different user”
3. Enter the credentials for the second user (your screen/prompt may look different) and click OK/Login. In some cases, you may be prompted to enter these more than once.
Chrome will now run as if the other user is logged in.
It’s often helpful in our on-prem environment to be able to run IE as a test user with general permissions instead of my admin permissions. This possibility makes it so I don’t need to remote to another machine or log out and in with another account just for a simple check.
If you have a shortcut to IE on your desktop (not your task bar), skip ahead to step two.
Search “IE” from the start menu, right click and select “Open File Location”
2. Hold “Shift” on your keyboard and right-click the Internet Explorer icon. Select “run as different user”
3. Enter the credentials for the second user (your screen/prompt may look different) and click OK/Login. In some cases, you may be prompted to enter these more than once.
IE will now run as if the other user is logged in.
If you want to see which groups a user belongs to, or how an individual is granted (or restricted) access to a particular site or resource, use the “Check permissions” button in Site Settings –> Site Permissions (or any advanced permissions page).
SharePoint 2016 example of checking permissionsSharePoint Online example of checking permissions (see specific allowances)
The word ‘pwned’ (pronouned pōn’d) was more present in written works around 1800, likely because of typos due to the proximity of “p” to “o” on keyboards. We know it in a modern context as an actual term, reclaimed by video game communities to mean utterly defeating an opponent (Dude, you got pwned!) or in cyber-security conversations meaning an unwelcome party gained ownership of your credentials through a data breach or hack.
With data breaches and hacker activity being more prevalent, it’s more important than ever to protect yourself and your information from being pwned.
Have I been pwned?
There are several free ways to find out if you’ve been included in a data breach or credential publishing.
HaveIBeenPwned.com lets you enter your email address to see which breaches you were discovered in (if any)
CreditKarma.com has identity monitoring for the email address you used to register. It’s a free service, and will tell you if you email address surfaced in any breaches or credential leaks and any associated passwords. Go to Resources –> Identity Monitoring
LastPass.com’s Security Score will show you specifically which sites have been compromised so that you can change those specific passwords. It’ll also help you fix the “duplicate password” issue where you use the same password for everything AKA one data breach gives bad actors access to all your stuff.
What’s a secure password?
UseAPassPhrase.com demonstrates that pass phrases (not passwords) are significantly more secure than traditional abc123! type passwords. The site will tell you how long it would take hackers to figure out (crack) your password using bots.
The typical password requirements you’ll find might have you make a password like ‘sPlib197!’ which will only take 149 days to crack.
While phrases are generally more secure, you have to be careful to select a phrase that is NOT logical in structure. For example, a logical sentence like ‘I love kitties!’ would take 18 days to crack. But illogical collections of words like ‘stopping plots argument received’ would take 467,000 centuries to crack. Throw in a capital letter and a special character and you’re set for a few lifetimes.
Upgrade your security (enable two-factor authentication)
Two-step, or multi-factor, authentication helps guarantee it’s actually you logging into one of your sites. You’ll find this security option on all kinds of services including Google (gmail), Microsoft (outlook), and your banking sites. I highly recommend setting this up on every site you’re able to.
What is it? Basically, when you attempt to login using your credentials as usual (or someone who stole your data is attempting to log in as you), you’ll either use the Microsoft Authenticator App to approve a login from your mobile device or you’ll receive a text code to enter into a prompt to show that not only do you know your credentials, but you acknowledged the login from a phone number or mobile device you registered.
3. Follow the prompts to device’s number as an additional layer of security
4. Return to the same URL in step 1 and click “Set up identity verification app” which will have you install the Microsoft authenticator app on your phone. When someone attempts to log in using your credentials, you’ll get a push notification to approve or reject the attempt before they’re allowed access. (learn more about using the authenticator app)
5. Follow the prompts to install and activate the app
Work or school accounts
You administrator handles the setup of multi-factor authentication. This article does a great job of explaining how to enable it for your users.
Save the first script below as stoplight.css and add to your site assets folder. You’ll need the second OR third snippet in the next section (depending on if you want to use dots or images/icons).
Create the Project Health list
Create a new list on your site and name it Project Health. You’ll need these columns:
All of the choice columns (KPI in name) will be dropdowns with these options:
1 – Green
2 – Yellow
3 – Orange
4 – Red
The other four columns (no KPI in name) are calculated columns with the following formula. Just change the “Cost KPI” to the correct column name for each (i.e. Time’s formula will be …(LEFT([Time KPI],1)…). All of the non-KPI calculated columns are number type.
You can copy and paste this from the GitHub embedded snippets in the first section.
Note: If you want to use images/icons, see bottom of post.
Modify your main list view so you ONLY see the KPI columns (displaying color names). Don’t forget to uncheck the “Title” column. We’re about to hide it from the new item form and won’t be using it.
Then, in your list settings –> Advanced settings, change “Allow management of content types” to “Yes” and click OK.
Then select your item content type.
Select “Title” and change it to hidden and OK.
Click to enlarge
Finally, so we have some “lights” to work with, go to your new list and add a “new item” with whatever initial statuses you wish.
Click to enlarge
Add a web part where you want the indicators
On your home page or dashboard, add a “Content Editor” web part and reference the stoplight.css script.
Edit page
Insert –> web part –> media and content –> content editor –> Add
Edit web part
Paste URL to stoplight.css (saved in your site assets earlier)
Set chrome type to None and Apply
Insert an app part for Project Health.
Click to enlarge
“Save and keep editing” – our next step will navigate away from this page and you will lose changes unless you save now.
Edit the new “Project Health” web part you added
Edit the current view
Uncheck all of the KPI columns and check the other four (without KPI in the name). Arrange them as you wish, and add “Edit (link to edit item)” as first position. Click OK.
Edit page again, and edit the web part again. Set “Toolbar type” to No Toolbar
Set “Title” to whatever you want displayed above the stoplights on the dash/page, set dimensions to 100×300 pixels and set “Chrome type” to “Title only.”
Under “Miscellaneous” check the box for “Server Render.” Then click OK and save/publish the page. Once the page refreshes after save, you should see your stoplights.
Going forward, your users will simply click the “edit icon” next to the row of stoplights to update the status indicators.
Use images/icons instead of dots
If you’d prefer to use images/icons, you can alter the other calculated column formula included above to include an image URL in place of a dot as seen in the example below.
Copy and paste this script from the GitHub gists at the top of this post.
I once ran into situations with users where some data files are exported from software solutions in .rtf or .txt format only. To improve the user experience once these files are dropped into SharePoint, we can convert any .rtf file automatically to .doc.
Why convert from RTF?
When RTF files are opened in the browser, the option to “Edit in browser” is grayed out since the file type isn’t compatible with that functionality.
Click to enlarge
Okay, but why .doc and not .docx?
Unfortunately, we can’t convert from RTF to DOCX without the use of Azure functions (thanks, Pieter Veenstra for that info). But if we can at least convert it to DOC for users, they’ll get the “Edit in Browser” option which will then prompt them to convert the file to DOCX in two clicks (Convert –> Edit). Then we finally have a .docx file.
Click to enlarge
How to auto-convert .rtf to .doc using Power Automate (Flow)
Update 12/3/2020 (big thanks to Dawid Ziolkowski for the tip on trigger condition)
Create the flow (.rtf to .doc)
Create a new flow with the trigger When a file is created or modified (properties only) and select (or enter) your site and library name.
Click the ellipsis and Settings.
3. Add a Trigger Condition as @endsWith(triggerOutputs()?[‘body/{FilenameWithExtension}’],’rtf’) and click Done.
Now the flow will only run if the file’s extension is RTF.
Next, configure each next step as pictured below (beginning with the blue-outlined Get File content using path step), careful with file paths not to include the whole URL – just the relative path beginning something like /Shared Documents/…
Trigger step for when file is created (we already configured this with the trigger condition)
Get file content using path (gets contents of the .rtf file – use File name with extension dynamic data from step 1/red)
Create file (creates new .doc file using the .rtf contents – use dynamic data from step 2/blue)
Delete file (deletes original .rtf file to avoid confusion – use Identifier from step 1/red)
Click to enlarge
That’s it! Now when an RTF file is added, it’ll be replaced with a DOC version and the RTF file will be deleted. Any non-RTF file won’t be touched, and won’t trigger/count as a flow run.
Expand the flow (optional – delete .doc if .docx created)
Users can easily convert .doc to .docx in two clicks in the browser. But it leaves the original file (.doc) behind which can be confusing for users. So we can create a separate flow to delete a .doc file IF a .docx by the same name is created.
It starts out the same as our first flow, with a “when a file is added” step paired with a trigger condition but looking for .docx this time.
Create the second (optional) flow (delete .doc version if .docx version with same name exists)
Create a new flow with the trigger When a file is created or modified (properties only) and select (or enter) your site and library name.
Click the ellipsis and Settings.
3. Add a Trigger Condition as @endsWith(triggerOutputs()?[‘body/{FilenameWithExtension}’],’docx’) and click Done.
Then use a “Get file metadata using path” step to get any file by the same name from that library (use the “Name” dynamic content from the trigger step and add a .doc). Then in your “delete file” step, simply use the ID from the get file metadata step.
Now when a user converts a .doc to a .docx file in the browser, your Flow will delete the .doc that’s left behind if there’s a match. Note that this runs on ANY .docx file in the library when added/modified, and will fail if no .doc name match is found. There’s probably a cleaner way to do this.
While these are certainly not ideal workarounds, it may be the best you’re able to do with the resources on hand. Not everyone has Azure, or developers, premium add-ins/vendors or the budgets for such things. Best of luck!
I recently tried to use the “Populate a Microsoft Word template” step in Microsoft Flow (currently in preview) to insert text into content controls, but ran into the error above.
The selected file doesn’t contain template elements.
The issue was that my content controls in the template were of rich text format and date. This preview step currently only supports plain text, combo box, and dropdown content controls.
Plain text, combo box, and drop down are the only supported content controls as of the publishing of this post.
So for all of your text fields, make sure you use the correct (plain text) control:
Once I replaced my rich text content controls with plain text, the content controls showed up in Flow as options for populating:
To keep this organized, I recommend giving each content control a title (in its properties) so you can easily identify each field when in Flow (select content control, then “Properties” from developer tab).
Remember, you’ll only see supported content type fields in Flow. Even if you have a date content control, you won’t be able to populate it using Flow.
Note: Screenshots and steps from a 2016 environment
There may be times when you have AD accounts showing up in search results that you can’t delete, but need to hide from results. The following sections will guide you through removing specific profiles from your people search results.
Steps:
Create a mapped property for user profiles
Use the new property at least once
Start a full crawl of people source
Create a managed property mapped to your new user property
Start a full crawl of site source
Edit the query on the people search results page
(optional) If you have “People Results” as “Promoted Results” or “Ranked Result Blocks”
1. Create a mapped property for user profiles
From Central admin, click on “Manage service applications”
Select “user profile service application”
Click “Manage User Properties” under “People”
Select “New Property”
Set the new properties settings as follows:
Name and display name: RemoveFromPeopleSearch
Policy Setting: Optional
Default Privacy Setting: Everyone
Search settings, Alias: checked
Click to enlarge
Click OK.
2. Use the new property at least once
For the rest to work, you’ll need to mark at least one user profile to not show up in search. I did this by adding a “1” to the property we just created for a user I wished to remove from results.
Back under “User profile service application” (Central admin –> Manage service applications –> “User profile service application”) click on “Manage user profiles.”
Search for and edit the profile of who you’d like to remove from search results.
4. Edit the query on the people search results page
Once your crawl is finished (may take a while), you’ll want to go to your people search results page and “Edit page.”
Click to enlarge
Edit the “Results” web part
In the menu that appears on the right, select “Change Query.”
If you’re not in advanced mode, switch to advanced mode. Then expand the “property filter” dropdown and select “show all managed properties.”
Try the dropdown again, and now you’ll see your new property listed. Select it and click “OK
Set properties as follows and click “Add property filter”
Click OK
Click “Apply” on the web part menu
Click “Save” and publish (if checked out)
5. (optional) If you have “People Results” as “Promoted Results” or “Ranked Result Blocks”
If you have people results outside your regular people search (such as a promoted result block in Local SharePoint Results) you’ll just need to be sure to also add the RemoveFromPeopleSearch<>1 string to the end of your query rule’s query.
Query rules can be accessed through central admin (manage service applications –> search service application –> query rules) or from Site Settings –> Query rules depending on where you initially setup your query rules/promoted results.
via site settings
via central admin
Edit the query rule in question, click “edit” next to the result block that’s relevant, then “Launch Query Builder” to be able to add the RemoveFromPeopleSearch<>1 string to your query.