SharePoint Search – Reset Index error “Sorry, something went wrong, request time out. “

Error – “Sorry, something went wrong, request time out. ”

Follow below steps –

  1. Start -> Run -> Services.msc
  2. Select and right click on “SharePoint Timer Service”.
  3. Select properties.
  4. Go to the Recovery tab and set all the Failures to “Take No Action”. This is very important.
  5. Stop “SharePoint Timer Service:” service.
  6. Do this for all SharePoint servers in the farm.
  7. Find the cache folder. It’s usually somewhere like C:\ProgramData\Microsoft\SharePoint\Config. Just do a search for the file cache.ini and that will be the right folder.
  8. Delete all the files in that folder EXCEPT Cache.ini.
  9. Open Cache.ini with Notepad and change the number to 1. You can make note of that number for later if you wish.
  10. Do this for all the SharePoint servers in the farm.
  11. No go back and turn on the “SharePoint Timer Service” on all the servers. You can put back the Failures their previous state at this time, too.
  12. Take a look in the cache folders and make sure they are filling up with new files. If you are ultra paranoid, you can compare the cache.ini number to the one you saved and make sure they are the same.

Try doing the Reset Index again and it should work.

Cheers….

Search has encountered a problem that prevents results from being returned. If the issue persists, please contact your administrator.

Error – Search has encountered a problem that prevents results from being returned. If the issue persists, please contact your administrator.

Search1

After searching in the internet, found this article helpful –

http://moresharepoints.blogspot.in/2015/07/search-has-encountered-problem-that.html”

Ran below commands to check if the search index partition is degraded on the search.

$searchApp= Get-SPEnterpriseSearchServiceApplication

Get-SPEnterpriseSearchStatus –SearchApplication $searchApp[0].Name

Search2

And found that Search index partition is degraded.

Then reset the index on the central admin

Search3

After Index reset and the full crawl, search started working perfectly.

Thank you Purna for saving my day…

 

PowerShell – Upload user pictures to AD and user profile

Below script helps to upload pictures to AD

[Code type=”PowerShell”]
function Upload-PhotosToSP
{

if ( (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null )
{
Write-Host “Loading SharePoint assemblies…”
Add-PsSnapin Microsoft.SharePoint.PowerShell
}

#Get site, web and profile manager objects
$LocalPath = “C:\Scripts\UPLOAD-ProfilePhotos\picture library test\”
$MySiteUrl = “http://mySite.com:82/”
$mySiteHostSite = Get-SPSite $MySiteUrl
$mySiteHostWeb = $mySiteHostSite.OpenWeb()
$context = Get-SPServiceContext $mySiteHostSite
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
try
{
#Get files from local folder
$localPhotosFolder = Get-ChildItem $LocalPath
#Get User Photos document library in the My Site host site
$spPhotosFolder = $mySiteHostWeb.GetFolder(“User Photos”)

#Upload each image file and configure user profiles
$localPhotosFolder | ForEach-Object {

#Generate file path for upload into SharePoint
$spFullPath = $spPhotosFolder.Url + “/” + $_.Name
#$Overwrite= true
$FilePath = $LocalPath + $_.Name

#Check if the file exists and the overwrite option is selected before adding the file
#if ((!$mySiteHostWeb.GetFile($spFullPath).Exists) -or ($Overwrite)) {
#Add file to the User Photos library
write-host “Copying” $_.Name “to” $spFullPath.Replace(“/” + $_.Name,””) “in” $mySiteHostWeb.Title “…” -foregroundcolor Green
$spFile = $spPhotosFolder.Files.Add($spFullPath, $_.OpenRead(), $true)
$spImagePath = $mySiteHostWeb.Url + “/” + $spFile.Url

#Get the domain and user name from the image file name
$domainName = $_.Name.Split(“_”)[0]
$userName = $_.Name.Split(“_”)[1].Replace($_.Extension, “”)
$adAccount = $domainName + “\” + $userName

#Check to see if user profile exists
if ($profileManager.UserExists($adAccount))
{
#Set picture in AD also
$image = [Byte[]](Get-Content $FilePath -Encoding byte)
Set-ADUser -Identity $userName -replace @{thumbnailPhoto=$image}
Set-ADUser -Identity $username -replace @{jpegPhoto=$image}
write-host “Uploading” $_.Name “picture to AD ” -foregroundcolor Green

#Get user profile and change the Picture URL value
$up = $profileManager.GetUserProfile($adAccount)
$up[“PictureURL”].Value = $spImagePath
$up.Commit()
}
else
{
write-host “Profile for user”$adAccount “cannot be found”
}
#}
#else
#{
# write-host “`nFile”$_.Name “already exists in” $spFullPath.Replace(“/” + $_.Name,””) “and shall not be uploaded” -foregroundcolor Red
#}
}

#Run the Update-SPProfilePhotoStore cmdlet to create image thumbnails and update user profiles
write-host “Waiting to update profile photo store – Please wait…”
Start-Sleep -s 60
Update-SPProfilePhotoStore –MySiteHostLocation $MySiteUrl
write-host “Profile photo store update run – please check thumbnails are present in Profile Pictures folder.”
}
catch
{
write-host “The script has stopped because there has been an error: “$_
}
finally
{
#Dispose of site and web objects
$mySiteHostWeb.Dispose()
$mySiteHostSite.Dispose()
}
}

Upload-PhotosToSP

PowerShell – DownLoad pictures from SharePoint

Below script helps to download the files from SharePoint library.

[Code type=”PowerShell”]

Remove-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

######################## Variables #####################
$destination = “C:\Scripts\UPLOAD-ProfilePhotos\”
$webUrl = “http://mySite/IntranetServices/”
$listUrl = “http://mySite/IntranetServices/pictures/”
#####################################################

$web = Get-SPWeb -Identity $webUrl
$list = $web.GetList($listUrl)
function parseUser([string] $m ){
# function takes a lastname, firstname MI string and parses to match manager info. returns email address.

if ($m -ieq “”)
{
return $null
}
else
{
$split = $m.split(” “)
$fn = $split[0]
$ln = $split[1]
#$splitfn = $fnmi.split(” “)
#$fn = $splitfn[1]
$fi = $fn.substring(0,1)
$em = $fi + $ln #+ “@healthgrades.com”
#$validatedManager = checkManager($em)
return $em
}
}

function DownLoadImages($folderUrl)
{
$folder = $web.GetFolder($folderUrl)
foreach ($file in $folder.Files)
{
$UserID = parseUser($file.Name)
$UserID = “_” + $UserID

#Ensure destination directory
$destinationfolder = $destination + “/” + $folder.Url
if (!(Test-Path -path $destinationfolder))
{
$dest = New-Item $destinationfolder -type directory
}
#Downloading file
$binary = $file.OpenBinary()
$stream = New-Object System.IO.FileStream($destinationfolder + “/” + $UserID), Create
$writer = New-Object System.IO.BinaryWriter($stream)
$writer.write($binary)
$writer.Close()
}
}
try
{
#Download root files
DownLoadImages($list.RootFolder.Url)
#Download files in folders
foreach ($folder in $list.Folders) {
DownLoadImages($folder.Url)
}
}
catch
{
write-host $_.exception
}
finally
{
if($web -ne $null)
{
$web.Dispose()
}
}

[/code]

Cheers…

Error: The root of the certificate chain is not a trusted root authority

Error while running the command “Register-SPWorkflowService” in SharePoint 2013

I was not getting SharePoint 2013 workflow template type in SharePoint Designer 2013, so configured workflow manager and was trying to register SPWorkflowService by running below command but received below error .

Command – Register-SPWorkflowService –SPSite “http://server/sites/” –WorkflowHostUri “https://server:12290/”

workflowerror3

did multiple trial and errors but nothing worked, then got the solution in below blog.

http://blog.binarybits.net/programming/sharepoint/error-the-root-of-the-certificate-chain-is-not-a-trusted-root-authority-register-spworkflowservice-sharepoint-2013/

Steps –

There are 2 things to check.

  1. Check if the WorkflowHostUri is having a Fully Qualified Domain (FQD) instead of machine name.
  2. Check if the SharePoint server trusts the workflow site’s certificate

1. Use FQD. Hence instead of using machine name for WorkflowHostUri, use full domain name, like https://wfserver.domain.com:12290/
2. Make sure the SharePoint Server trusts the certificate of Workflow site. For that do the following

  1. In the server browse the site https://wfserver.domain.com:12290/ and check if you get Certificate trust error, if so proceed to next point
  2. Start Management Power Shell as Administrator in the workflow server and run the following 2 commands
  3. $rootCert = (Get-SPCertificateAuthority).RootCertificate
  4. $rootCert.Export(“Cert”) | Set-Content C:\SharePointRootAuthority.cer -Encoding byte
  5. Navigate to the SharePoint Server and open run or command prompt and type MMC and hit Enter. This will open Console1.
  6. In Console1 navigate to file in the ribbon menu and select “Add/Remove snap-in”
  7. Add “Certificates” to the right hand side and then click “OK”. You will prompted with the Certificates snap-in. I selected “Computer account”>Next>Local computer>Finish>OK
  8. Import the certificate “C:\SharePointRootAuthority.cer” into “Trusted root certification authority” location. You can complete this by right clicking on “Trusted root certification authority” and selecting All Tasks > Import
  9. Then run the register command again and check the Designer for SharePoint 2013 template.

Register-SPWorkflowService -SPSite “http://server/site ” -WorkflowHostUri “http://server:12290/” -AllowOAuthHttp -Force -ScopeName “SharePoint”

Enjoy exploring…

 

Workflow error – System.InvalidOperationException: Operation failed with error Microsoft.Workflow.Client.ScopeNotFoundException: Scope ‘/SharePoint/default’ was not found. HTTP headers received from the server – ActivityId: . NodeId: server1. Scope: /SharePoint/default/. Client ActivityId : . —> System.Net.WebException: The remote server returned an error: (404) Not Found. at Microsoft.Workflow.C

Error – In SharePoint 2013 on premises, I was trying to publish the workflow and received below error

“System.InvalidOperationException: Operation failed with error Microsoft.Workflow.Client.ScopeNotFoundException: Scope ‘/SharePoint/default’ was not found.  HTTP headers received from the server – ActivityId: 0f2a45dd-abc8-4c5b-bd44-229f27e1090a. NodeId: server1. Scope: /SharePoint/default/c02de6f4-c3ce-405b-8d51-3be3fbf0755a. Client ActivityId : 7c53c79d-f6f8-a073-cc84-45a75a835626. —> System.Net.WebException: The remote server returned an error: (404) Not Found.    at Microsoft.Workflow.C”

Solution: Register the workflow by setting the scope as shown below and it worked like a charm 🙂

workflowerror1

Steps – Open SharePoint 2013 Management shell and run below command to register the workflow by setting the scope.

Register-SPWorkflowService -SPSite “http://server/site ” -WorkflowHostUri “http://server:12291/” -AllowOAuthHttp -Force -ScopeName “SharePoint”

Thank you so much to Karthick https://social.msdn.microsoft.com/Forums/sharepoint/en-US/fe913695-fb3e-4b5a-a229-f5bcd80fbbc9/sharepoint-2013-workflow-error?forum=sharepointcustomization

Enjoy learning…

 

 

 

Error – Import-Csv : Exception setting “Replace”: Object reference not set to an instance of an object

While running a Powershell script, faced below problem. If you get the same issue, check the CSV header names which you have used in Powershell to retrieve the csv data. Referring to a wrong name doesn’t give any error but throws error when you perform any action that variable.

E.g.

$supervisor = $_.Supervisor
$dept = $_.Dept

Error powershell-error1

Enjoy…

PowerShell – Update Active Directory User properties for multiple users

Requirement – Monthly once users details like Manager, Title, Working State etc. need to be updated in the active directory. User details will be shared through excel. To achieve that, PowerShell script was written.

Below is the excel Format, We Saved the file as Updated-Users.csv

powershell

And below is the working complete code for updating the user properties in AD

[Code type=”PowerShell”]

#—————————
# VARIABLES
#—————————

# Set $script:WhatIf = $true to prevent making changes to AD.
# Set $false to execute normally, making changes.
$script:WhatIf = $false

# Compute a string indicator
if ($script:WhatIf) { $strWhatif = “What If: “} else { $strWhatif = “” }
cls
Import-Module ActiveDirectory
<# Quest
Add-PSSnapin quest.activeroles.admanagement
#>

$department = $null
$Manager = $null
$file = New-Item -ItemType file C:\scripts\userAccountInfo.txt -Force

#—————————
# FUNCTIONS
#—————————

function parseManager([string] $m ){
# function takes a lastname, firstname MI string and parses to match manager info. returns email address.
if ($m -ieq “”)
{
return $null
}
else
{
$split = $m.split(” “)
$fn = $split[0]
$ln = $split[1]
#$splitfn = $fnmi.split(” “)
#$fn = $splitfn[1]
$fi = $fn.substring(0,1)
$em = $fi + $ln + “@healthgrades.com”
$validatedManager = checkManager($em)
return $validatedManager
}
}

function parseDept([string] $d){
$splitdept = $d.split(“-“)
$deptCode1 = $splitdept[0]
return $deptCode1
}

function checkManager ([string] $mg){

switch ($mg)
{
“ldisaverio@TestSites.com” { $mg = “ldisaver@TestSites.com”}
default { }
}

<# Quest
if (Get-QADUser -Identity $mg) {
return $mg
}

$mgid = $mg -replace ‘@TestSites.com’,”
if (Get-ADUser -Identity $mgid) {
return $mg
}

else
{
$updated = Read-Host “Manager $mg not found, please enter new Manager information”
$mg = checkManager $updated
return $mg
}
} # end function check Manager

function fnUpdateUsers(){

<#
The CSV has following default headers:
Payroll Name [Payroll Information],Preferred Name,Job Title,Work E-mail,dept,Location,Hire Date,Birth Date,Supervisor

It WAS required to change these to the following before processing:
Payroll Name [Payroll Information],Preferred Name,Title,email,dept,Location,HireDate,BirthDate,Supervisor

but now the script can recognize either set of headers, so it’s no longer required to change them
#>

Write-Host
Write-Host (“Processing Individual Users”)
Write-Host (“—————————“)

Import-Csv C:\scripts\updated-users.csv | foreach {

if ($_.”Work E-Mail”) { $email = $_.”Work E-Mail” } else { $email = $_.email }
if ($_.”Job Title”) { $title = $_.”Job Title” } else { $title = $_.Title }
if ($_.”Birth Date”) { $birthdate = $_.”Birth Date” } else { $birthdate = $_.BirthDate }
if ($_.”Hire Date”) { $hiredate = $_.”Hire Date” } else { $hiredate = $_.HireDate }
$supervisor = $_.Supervisor
$dept = $_.Dept
$dept = ([int]$_.Dept).ToString()

switch ($dept)
{
“110” { $department = “Corporate”}
“115” { $department = “Marketing”}
“118” { $department = “Product Management”}
default { $department = $null}
}

$name = $email -replace ‘@TestSites.com’,”
Write-Host (“Supervisor info: {0}” -f $supervisor)

$Manager = parseManager($supervisor)
Write-Host (“Supervisor info: {0}” -f $Manager)
$MgrName = $Manager -replace ‘@healthgrades.com’,”
Write-Host (“Supervisor info: {0}” -f $MgrName)
$MgrDN = (Get-ADUser $MgrName).DistinguishedName

Write-Host (“User info: {0}, {1}, {2}, {3}, Department: {4}” -f $email,$department,$title,$Manager,$dept)
try {
if ( $Manager -ne “”)
{
Set-ADUser -Identity $name -department $department -company “Test Company, Inc.” -Title $title -Description $title -Manager $MgrDN -WhatIf:($script:WhatIf)
Set-ADUser -Identity $name -replace @{hGCustomEmployeeBirthday = $birthdate} -WhatIf:($script:WhatIf)
Set-ADUser -Identity $name -replace @{hGCustomHireDate = $hiredate} -WhatIf:($script:WhatIf)
}
else {
Set-ADUser -Identity $email -department $department -Title $title -WhatIf:($script:WhatIf)
Set-ADUser -Identity $name -replace @{hGCustomEmployeeBirthday = $birthdate} -WhatIf:($script:WhatIf)
Set-ADUser -Identity $name -replace @{hGCustomHireDate = $hiredate} -WhatIf:($script:WhatIf)
}
}
catch [Exception] {
if ($_.Exception.Message -match “Cannot find an object with identity”) {
Write-Host -ForegroundColor Yellow (“Can’t find enabled user {0} in AD” -f $email)
}
else { throw $_.Exception }
}

#Add-Content $file “———————-”
Add-Content $file (“{0}User updated per CSV file: {1}” -f $strWhatif,$name)
#Add-Content $file “———————-”
#Add-Content $file ” ”
}
Add-Content $file “———————-”
Add-Content $file (“{0}Users updated per CSV file” -f $strWhatif)
Add-Content $file “———————-”
Add-Content $file ” ”
}
#—————————
# INVOKE MAIN FUNCTION
#—————————

fnUpdateUsers [/code]

Cheers…

SharePoint – Auto Populate value in Lookup fields using Query string parameter

Requirement –  There were two lists,  “Active jobs”, “Applied Jobs” . We had to place a “Apply job” link across every item in Active jobs list. On click of that link, it should take user to New form of “Applied Jobs” and Job Name from Active jobs should be auto populated in Applied Jobs new form.

Steps  – 

To set the Apply link with JobID parameter, we used workflow. On creation of item in Active Jobs, Link gets updated with link to New form of “Applied jobs” and appended with “JobID=”Current Item ID”.

In the “applied jobs” List >> Go to list >> Click on list tab >> Under customize list Category click on Modify Form Web parts >> add a Script editor and place this code.

<script type="text/javascript">
(function () {
 var ctx = {};
 ctx.Templates = {};
 ctx.Templates.Fields = {
 'Job_Name': {
 'NewForm': renderTaskCategory
 }
 };
 SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);
})();

function renderTaskCategory(ctx) {
 var jobId = GetUrlKeyValue('JobID'); //extract cat parameter from a query string
 ctx.CurrentFieldValue = jobId; //set lookup field value
 return SPFieldLookup_Edit(ctx); //default template for rendering Lookup field control
}
</script>

It gets populated when you click on apply link..

Cheers..

 

 

 

SharePoint – Make attachment field mandatory in the list

Requirement : There was a list where users fill in their details and need to attach their resume to the respective item. We had to make the attachment field mandatory so that every employee attaches the resume. Client dint want to create document library.

Follow below steps to implement the same

  1. Go to list >> Click on list tab >> Under customize list Category click on Modify Form Web parts >> add a Script editor and place this code. Basically we are overriding inbuilt PreSaveAction method .

If attachment not found, it will give an alert with message “Please attach resume”.

</pre>
<script type="text/javascript" language="javascript">
function PreSaveAction() {

var elm = document.getElementById("idAttachmentsTable");
 if (elm == null || elm.rows.length == 0)
{
 document.getElementById("idAttachmentsRow").style.display='none';
alert("Please attach resume");
return false ;
}
else { return true ;}
}
</script>

Cheers….