Category Archives: SharePoint

Managing SharePoint Using PowerShell

SharePoint Online PowerShell Tip: Conditional Scope – Binary Module

SharePoint Online PowerShell Tip to throw exception while connecting to Tenant.

Introduction

Recently one of our customer requested us to share a code which should throw an exception while connecting to SharePoint Online if in case of credential invalid or not connecting to tenant site. Well, they have a binary module delivered by some suppliers which is pretty straight forward and simple. If all set to good code will execute if not exception thrown in other cmdlet. The module they use has bunch of cmdlets which are more or less mock up of SharePoint Online cmdlets. Connect-SPOService throws exception if credential are invalid and they need custom error message for the custom built cmdlet Connect-SPOTenant

Requirement

  • Connect-SPOTenant : The sign-in name or password does not match one in the Microsoft account system
  • Connect-SPOTenant : Current site is not a tenant administration site.

PowerShell Code

Below is the PowerShell code shared by our client.

function global:Connect-SPOSite {
 [CmdletBinding()]
 param (
 [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]
 $Url
 )
 
 begin {
 [System.Reflection.Assembly]::LoadFile("C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll") | Out-Null
 [System.Reflection.Assembly]::LoadFile("C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll") | Out-Null
 }
 process {
 if ($global:spoCred -eq $null) {
 $cred = Get-Credential -Message "Enter your credentials for SharePoint Online:"
 $global:spoCred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($cred.UserName, $cred.Password)
 }
 $ctx = New-Object Microsoft.SharePoint.Client.ClientContext $Url
 $ctx.Credentials = $spoCred
 
 if (!$ctx.ServerObjectIsNull.Value) {
 Write-Host "Connected to site: '$Url'" -ForegroundColor Green
 }
 return $ctx
 }
 end {
 }
}

Solution

Indeed, the above code will not throw any exception because the ClientContext Object is instantiated and will not validate the credential but returns the ClientContext Object as output. More over Microsoft.SharePoint.Client.ClientContext doesn’t have ServerObjectIsNull property. No matter we supply wrong password the host shows Connected to Site!

Conditional Scope

C# code with conditional scope is below. This is just a demo so we haven’t used any scope methods or properties

using System;
using System.Management.Automation;
using Microsoft.SharePoint.Client;
using Microsoft.Online.SharePoint.TenantAdministration;
namespace xSharePointOnline
{
 [Cmdlet(VerbsCommunications.Connect, "SPOTenant")]
 
 public class ConnectSPOTenant : PSCmdlet
 {
 [Parameter()]
 public Uri SPOUrl;
 
 [Parameter()]
 [Credential]
 public PSCredential SPOCredential;
 protected override void ProcessRecord()
 {
 using (ClientContext SPOClientContext = new ClientContext(SPOUrl))
 {
 SPOClientContext.Credentials = new SharePointOnlineCredentials(SPOCredential.UserName, SPOCredential.Password);
 Tenant oTenant = new Tenant(SPOClientContext);
 ConditionalScope Scope = new ConditionalScope(SPOClientContext, () => oTenant.ServerObjectIsNull.Value != true);
 SPOClientContext.ExecuteQuery();
 }
 }
 }
}

Screen Shot

1

2

Bulk Import Folders and Files in SharePoint Document Library | Part 1

This noon I was on a call with SharePoint Development team to discuss few activities which is pretty straight forward approach for SharePoint IT Professionals. However, we need to inform about the activity we carry out in the farm to both IT Pro’s and developers. By doing this we simply avoid confusion. And, as always in any farm bulk upload of files and folders may cause one or other issues like threshold, performance high risk of uploading vulnerable files etc.

Our client came with 5000 odd folders which has almost 9000 files approximately and the requirement is to push it to document folder. For example, files underneath the folder should be organized as a single folder and files needs to be stored in it. The appended a request “Share the cmdlet so we can add more in future!”

Everything is easy if we build one! There is no out of the box solution. We can’t drag and drop easily as we know the limitations in document library. So, I built a small cmdlet in Visual C# which serves the purpose.

The folder structure is very simple, Main Folder which contains N number of folder and each folder may have some files. No Folders underneath the folders.

using System;
using System.IO;
using System.Management.Automation;
using Microsoft.SharePoint.Client;
namespace SP2010Admin
{
    [Cmdlet(VerbsData.Import, "Document")]
    public class ImportDocument : Cmdlet
    {
        [Parameter(Mandatory = true)]
        public Uri SPUrl;
        [Parameter(Mandatory = true)]
        public string SPDocLib;
        [Parameter(Mandatory = true,
                   ValueFromPipeline = true,
                   ValueFromPipelineByPropertyName = true)]
        public string FolderPath;
        protected override void ProcessRecord()
        {
            ClientContext ctx = new ClientContext(SPUrl);
            Web web = ctx.Web;
            ctx.Load(web);
            ctx.ExecuteQuery();

            List DocLib = web.Lists.GetByTitle(SPDocLib);
            string[] filenames = Directory.GetFiles(FolderPath);
            DirectoryInfo dInfo = new DirectoryInfo(FolderPath);
            FolderCollection folders = DocLib.RootFolder.Folders;
            ctx.Load(folders);
            ctx.ExecuteQuery();
            bool exists = false;
            foreach (Folder efolder in folders)
            {
                if (efolder.Name.Equals(dInfo.Name))
                {
                    foreach (string filename in filenames)
                    {
                        string[] names = filename.Split('\\');
                        WriteObject("Existing " + filename);
                        byte[] data = System.IO.File.ReadAllBytes(filename);
                        FileCreationInformation fci = new FileCreationInformation();
                        fci.Content = data;
                        fci.Url = names[names.Length - 1];
                        efolder.Files.Add(fci);
                        exists = true;
                    }
                }
            }
            if (!exists)
            {
                Folder tFolder = folders.Add(dInfo.Name);
                foreach (string filename in filenames)
                {
                    string[] names = filename.Split('\\');
                    WriteObject("Uploading file " + filename);
                    byte[] data = System.IO.File.ReadAllBytes(filename);
                    FileCreationInformation fci = new FileCreationInformation();
                    fci.Content = data;
                    fci.Url = names[names.Length - 1];
                    tFolder.Files.Add(fci);
                    exists = true;
                }
                ctx.ExecuteQuery();
            }
        }
    }
}

Usage:

Import-Module "c:\users\ChenV\documents\visual studio 2015\Projects\SP2010Admin\SP2010Admin\bin\Debug\SP2010Admin.dll" -Verbose
(Get-ChildItem "C:\Users\ChenV\ProjectFolder\Test\" -Recurse).FullName | Import-Document -SPUrl http://www.contoso.com/web -SPDocLib "Doc Lib" -Verbose

In Part 2 we will discuss about the best practice and will enhance this code much better! Enjoy PowerShell πŸ™‚ πŸ™‚ πŸ™‚

Thanks to Author Rashu, Rahul in TechNet Wiki

SharePoint 2013 Foundation | Central Administration | File Not Found

Yet another day with SharePoint 2013 foundation troubleshooting. I was building a SharePoint 2013 Foundation farm on Windows 2008 R2 Standard with Service Pack 1. The same box has SQL Server 2012! Lesson learnt “Do not do installation on the fly!” J

I was very much sure the box I chose for installing SharePoint 2013 foundation meets the software and hardware requirements. Indeed, scalability and performance was not considered at this point of time.

First and foremost, Symantec Antivirus blocked the configuration wizard at step 4.

Solution: Uninstalled the Symantec Antivirus Software and fixed the access issue.

Then we moved one step ahead and completed the Set up and was bit happy to see the below window

Then, while launching Central Admin we got the glossy and silky error J

Sorry, Something Went Wrong

File Not Found

Followed the below steps

Turned on Custom Error mode – No luck! No clue why including stack trace $true browser didn’t show the error message

Removed Central Admin and Recreated new one – No Luck!

Un-Provisioned the Central Admin and Central Admin Database using below code – No Luck!

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction 0
Function Remove-CentralAdmin
{
    $CA = Get-SPWebApplication -IncludeCentralAdministration | ? {$_.IsAdministrationWebApplication -eq $true}
    if($CA -eq $null)
    {
        "Central Admnistration is missing!"
    }
    foreach($App in $CA)
    {
        $App.UnprovisionGlobally($true)
        foreach($DB in $App.ContentDatabases)
        {
            $DB.Unprovision()
        }
        $App.Delete()
    }
}

Remove-CentralAdmin

Checked the IIS host header and virtual directory settings! All set to good!

Finally, the below simple snippet saved my day!

Get-SPEventLog -StartTime <DateTimeStamp> -EndTime <EndTimeStamp> | ? { $_.Correlation -eq "CorrelationID"
$_.Level -eq 'Unexpected'} | Select Message

Message:

System.IO.FileNotFoundException: Could not load file or assembly ‘MySql.Web.v20, Version=6.9.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d’ or one of its dependencies.

The system cannot find the file specified.

Simply Awesome!

Again, I modified the Web.Config File custom errors and stack trace, restarted the IISAdmin service and bounced the server – Just to keep things neat and clean! Bingo, it worked – I got the same error message


The line number 287 in the system machine configuration file is below

<providers>

Line 287: <add name=”MySqlSiteMapProvider” type=”MySql.Web.SiteMap.MySqlSiteMapProvider, MySql.Web.v20, Version=6.9.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d” connectionStringName=”LocalMySqlServer” applicationName=”/” />

</providers>

Solution: Commented this line!

<providers>

<!– <add name=”MySqlSiteMapProvider” type=”MySql.Web.SiteMap.MySqlSiteMapProvider, MySql.Web.v20, Version=6.9.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d” connectionStringName=”LocalMySqlServer” applicationName=”/” /> –>

</providers>

Now, the Central Admin opened up fine J

Keep SharePointing and Enjoy PowerShell !

Converting JSON Time Format in SharePoint Document Library Metadata


The SharePoint farm has aΒ Document Library and a List which are linked for some requirements, while querying information we received some data whichΒ are not in proper format. Challenge is to split, remove characters and count the total which is little tedious

Example- The Field3 in CSVΒ yields [“\/Date(1444995273796)\/”,”\/Date(1444996968515)\/”]

It’s a JSON format and the time format is EPOCH (UNIX format) – With Reference to the link MSDNΒ My advice to customer was to use below codeΒ snippet to break the mystery!

To get the count: (Unfortunately, this is what customer need!) – No Fun in it because this kills the actual flavor of SharePoint development and data.

(@"
["\/Date(1444995273796)\/","\/Date(1444996968515)\/"]
"@ | ConvertFrom-Json).Count

#Output
#2

The reason for the SPContext Code by developer is unknown. So here comes the ConvertFrom-JSON power in Windows PowerShell Version 3+ πŸ™‚ πŸ™‚ πŸ™‚

To get the information about the data in JSON: [We will deep dive in Part 2 of this Blog]

@"
["\/Date(1444995273796)\/","\/Date(1444996968515)\/"]
"@ | ConvertFrom-Json

#Output

#Friday, October 16, 2015 11:34:33 AM
#Friday, October 16, 2015 12:02:48 PM

The file which is generated as report is done using C# and CSOM – So, in nextΒ blog post (Part 2)Β we will cover Binary Module using C# Class Library, PowerShell Module, String Manipulation and Data consolidation.

Enjoy PowerShell !

Show or Hide SharePoint List Using CSOM | C# | PowerShell

Disclaimer: This is pretty old topic just remade it using CSOM and PowerShell at my client work place.

During SharePoint due diligence many suggested to use SharePoint Manager Tools, CAML Query Builder etc. It’s better to keep tools handy but gathering and executing the client requirement is better than the best.

Environment: Client has WSS 3.0, MOSS 2007 and SharePoint 2010 platforms, they want to organize the structure and keep the contents similar. An ideal goal is to move to upgraded versions.

During this big discussion development team suggested to make a script which reads the web, site, lists and document library properties and set the same in each farm. Dude! writing script is easy and deploying is very easy as well. But, before we do that let’s know why properties are set differently ? Who made the decision? Business Justification is much more important so I suggested Power Users or SharePoint L1 to decide and deploy the solution.

How? Power Users like GUI based solutions they don’t want to execute console applications or scripts. As usual we picked up a call and I was shocked by listening to content manager requirement – “Need one liner cmdlet and we will create Lists and Set it’s Property. It may be one or many!” It’s that simple PowerShell reached to content managers as well. πŸ™‚ I was happy because I am going to meet their needs in short span of time!

To kick on the demo in a catchy way. I showed them how PowerShell one liner looks like πŸ™‚

Get-EvenNumbers -From 1 -To 10

It’s that simple to use, I haven’ t used any validation in this function very simple code which prints the even number using range operators. The function code is below

Function Get-EvenNumbers
{
    param(
    [Parameter(Mandatory = $true)]
    $From,
    [Parameter(Mandatory=$true)]
    $To
    )

    ($From..$To).ForEach({if($_ %2 -eq 0){$_}})
}
Get-EvenNumbers -From 1 -To 10

Solution for Content Managers:

Consume CSOM and build binary module using Class Library πŸ™‚ πŸ™‚ πŸ™‚ This time I used Visual Studio 2013 just for a change πŸ™‚

using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Net;
using System.Management.Automation;
using Microsoft.SharePoint.Client;

[Cmdlet(VerbsCommon.Set,"SPListVisibility")]
public class SetSPListVisibility : Cmdlet
{
    [Parameter(Mandatory = true)]
    public string SPUrl;

    [Parameter(Mandatory = true)]
    public string SPListName;

    [Parameter(Mandatory = true)]
    public bool ListVisibility;
    protected override void ProcessRecord()
    {
        ClientContext ctx = new ClientContext(SPUrl);
        NetworkCredential credentials = CredentialCache.DefaultNetworkCredentials;
        ctx.Credentials = credentials;

        List list = ctx.Web.Lists.GetByTitle(SPListName);
        ctx.Load(list);

        list.Hidden = ListVisibility;
        list.Update();
        ctx.ExecuteQuery();
        ctx.Dispose();
    }
}

Usage (Just for Demo):

Import-Module C:\Scripts\Module\CSOM_Demo.Dll
#Hide the List
Set-SPListVisibility -SPUrl http://weburl -SPListName "PowerShell" -ListVisibility $false

#Show the List
Set-SPListVisibility -SPUrl http://weburl -SPListName "PowerShell" -ListVisibility $true

In next my next blog I will share the complete module! It’s that’s easy ! Happy SharePointing and Enjoy PowerShell πŸ™‚ πŸ™‚ πŸ™‚

Reason: Content manager need this kind of solution for re usability. Smart Guy!

SharePoint Content Management using PowerShell | Dude! it’s a Due Diligence – Part 1

October-26-2015: Due to SharePoint tasks I missed MVP Summit 2015; Energy drained out due to disappointment!. So, I engaged 16 hours of my time with SharePoint team to perform a due diligence. Traveled in and around Netherlands for consultations with clients, developers and IT Professionals.

Introduction: Though we know each other we gathered at a party lounge for a friendly handshake and a BIER πŸ™‚ and that’s Hertog Jan a typical Dutch Bier!

Daan_Samson_Hertog_Jan3

 

Not huge if we are four in numbers to share! – Cheers!!!

Challenge 1: Our security team will not allow us to install any third party components and products not guaranteed by Microsoft. So, we need to code to inventory of SharePoint farm(s). Includes MOSS 2007 & WSS 3.0,Β  SharePoint 2007 and SharePoint 2013.

Challenge 2: Developer team is busy in SharePoint Online training, we can engage them only twice a week.

Challenge 3: We need to plot a blue print of SharePoint farm without third party tools. The same needs to be shared with IT Managers before we design a plan for deployment or migrations or transformations.

πŸ™‚ πŸ™‚ πŸ™‚ Let’s keep the challenges apart. We may come across many while working on the Test and Production environment. So, we decided to get back to work on October-27-2015 with fresh mind! Yeah! we concluded not to work at home or not even to bing for solutions a day prior to work. A fresh mind is most important to work independently!

Requirement 1: Get all the items from Large List – We can see 30,000 + items we need a report in Excel.

I quickly showed the option in ribbon “Export to Excel” πŸ™‚ “Assuming things will not help at work place!” Clients need Large List items reports to be shared in email and uploaded SharePoint portal. If it’s in portal why in email? To gain customer satisfaction we stopped asking questions, we gathered our tasks and grabbed a cup of coffee to our desk.

th

oops! That’s not a large list, it’s a Document Library enabled with Document Set! The complete web is built and deployed using custom code. Exploring is not a challenge but need to be handled it with care. Many columns are Interconnected or mapped with multiple lists in the same web.

CAML Query is SharePoint IT Professionals best friend, Just three things we need to do Query, Select Fields, and set Attributes to do this we need a tool; Indeed that will be PowerShell. The mission begins now!

12

Dude, that’s SharePoint 2010 hosted on Windows 2008 R2 Standard. PowerShell Version 2.0 πŸ™‚ πŸ™‚ πŸ™‚ – Developers Team looked at me and laughed – Do you remember this version? Can we raise a request to upgrade the version of PowerShell? (Nope! PowerShell 4.0 stable version requires some workaround in SharePoint box and PS 5.0 Product Preview is not stable version) shall we do a timer job? (No! No! No! – Folks, don;t forget MOSS 2007 we did many without Shell Mangement – Now, we have a tool to manage!. Go and Check your Visual Studio version and updates – I assume you may need one more Bier!)

Dusted up my old SharePoint script file and modified it as required

Step 1: Export – Items to CSV

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction 0
$spsite = Get-SPWeb -Identity http://www.contoso.com/web
$splist = $spsite.Lists["Large List"]
$spQuery = New-Object Microsoft.SharePoint.SPQuery
$camlquery = "<Where><Eq><FieldRef Name='FSObjType'></FieldRef><Value Type='Text'>1</Value></Eq></Where>"
$spQuery.Query = $camlQuery
$spQuery.ViewFields = [String]::Concat("<FieldRef Name='Project_Number'/><FieldRef Name='Created'/><FieldRef Name='Editor'/><FieldRef Name='Author'/><FieldRef Name='Number_of_downloads'/>")
$spQuery.ViewAttributes = [String]::Concat("Scope='RecursiveALL'")
$spQuery.ViewFieldsOnly = $true
$spListItems = $spList.GetItems($spQuery)
$collections = @()
Foreach($spListItem in $spListItems)
{
    $results = New-Object psobject -Property @{
    "Number" = $spListItem["Project_Number"]
    "Created By" = $spListItem["Author"].Split("#")[1]
    "Status" = $SPListItem.ModerationInformation.Status
    "Modified By" = ($spListItem["Editor"]).Split("#")[1]
    "Number of Downloads" = ($spListItem["Number_of_downloads"])
    }
    $collections += $results 
}
$Collections #| Export-Clixml C:\temp\LargeList_Report.xml

Step 2: Send in email as attachment and close the requirement!

$param = @{
FROM = "From@contoso.com"
TO = "To@contoso.com"
Subject = "Large List Report"
SMTPServer = "SMTP Server"
Attachment = "C:\temp\LargeList_Report.csv"
}
Send-MailMessage @param

Requirement 2: We have removed the existing Approval Workflow and lost the track of Content Approved Items – We can get that in search result.

Yes, this time no SharePoint Shell Management, kicked on Windows PowerShell 5.0 Product Preview from my local machine and got the report. Lucky me! the SharePoint document library will not allow duplicate items πŸ™‚ so, search results returns one URL (customized search page!) and team didn’t reset the Search Index πŸ™‚ “25% of the tasks completed – Yes, users can search and read contents from the application

The items found in search results URL will be re-processed : Set Content Approval to $true πŸ™‚

(Get-Content C:\Temp\Large_list.csv).Foreach({
(Invoke-WebRequest -Uri "http://www.contoso.com/web/Pages/SearchPage.aspx?k=$_" -UseDefaultCredentials | 
Select -ExpandProperty Links).href | Select -Last 1
})

Requirement 3: Approve all documents – No need to think about the tasks which are already fired. So, concluded to change moderation status information to approved for the items found in search result.

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction 0
$web = Get-SPWeb -Identity 'http://www.contoso.com/web'
$list = $web.Lists["Large List"]
$ids = Get-Content C:\Temp\Approved_Id.txt 
foreach($id in $ids)
{
    $item = $list.GetItemById($id)
    $item.ModerationInformation.Status = "Approved"
    "Approving Project {0} - Status: {1}" -F ($item["Project_Number"] , $item.ModerationInformation.Status)
    $item.Update()
}

Content mangers did a sanity checks and confirmed all set to good! So, it’s time for us to deploy new (or) upgraded solution. Moved to look at developer team. Oops! really pity – a laptop with 4 GB RAM running Visual Studio 2010 in SharePoint Development environment.

lgf01a201311081300

It’s lunch time πŸ™‚ πŸ™‚ πŸ™‚ we have few more fun to flow in! Gained energy with BitterBal

l_6572_dutch-food-1

Continued discussion with development at lunch and assessed the challenges – We discussed about buying some more time πŸ™ “My Mind voice: I could have been to MVP Summit 2015!”. That was just a discussion not a conclusion; Post lunch we were back at desk to continue content management automation.

I requested developer to ignore all exiting πŸ™‚ DOC LIB items and automation tasks. So, they can develop ASP.NET form to map with DOC LIB columns – Yayyyyyy! Now we have Metadata Columns in the library! – Need a coffee! πŸ™‚

Requirement 4: Deploy the new solutions – Yep deploying new WSP! One liner using PowerShell – Deployment went fine and development team signed off (Will be back into production support as required), But Application didn’t turned up well!

It’s time for us to show the Power of Shell πŸ™‚ πŸ™‚ πŸ™‚

I expected the below shiny error πŸ™‚ But I should explain this to IT Managers like “sorry, we are encountering an unexpected error

Capture

πŸ™‚ Woot! Go ! Open up SharePoint Management Shell and execute the below piece of code with start and end time parameters – Pipe and fetch the correlation ID. It’s that simple!

Start Time : Grab it from the error screen shot

End Time : Just increase by 1 minute or 2 (Assumption!)

Get-SPLogEvent -StartTime "05/11/2015 11:22:08" -EndTime "05/11/2015 11:23:08" | Where-Object 
{$_.Correlation -eq "8a343106-0d90-492f-a683-dd0fb59c0058"}

“Missing LCID for <Column>” πŸ™‚ he he he. Missing English and French!

New solution includes new fields which is set to be mandatory; managed term store now need two more language English and French – Dutch is by default!

Okay, I had the service packs binaries so installed English and French Language Packs to confirm the fix- Voila! we were back on track – 45% of the tasks accomplished! Note: If you are in RTM – Download the latest service pack – Extract and Delete any entries in Update folder which is in the year 2013. So, you can install the SharePoint 2010 Service Packs as RTM and upgrade to the current farm build version id required.

We have done only the initial phase of the work. Few more SharePoint 2010 IT Professional tasks are shared below

  1. Update all missing fields.
    • How to find the missing fields? We may have newly added columns πŸ™‚
  2. Read other list and update the DOC LIB.
    • Dude! it’s Note Field so we have HTML tags Export and Import in PowerShell or editing in DOC LIB using data sheet looks ugly πŸ™
  3. Approve all the approved items in the DOC LIB.
    • After manipulating the items – Approve the items if it was approved and pending should remain as pending. πŸ™‚ We haven’t touched workflow
  4. Most of the information are rendering in SharePoint portal by reading Active Directory.
    • Few users left the organization – We need to update author names with common ID (This is interesting πŸ™‚ )
  5. What happened to LYNC Presence in the SharePoint portal? LYNC Client is upgraded to Skype for Business. Need to investigate further more! May be browser add in!
    • Not my cup of tea though still I will figure out the reason!
  6. Who created the item? Who Modified the same?
    • We sorted this – But will discuss this again!
  7. Read the department of author and update it in the DOC LIB field (This is very interesting task because we need to explore User Profile Service Application)
  8. Complete the content automation – After all set to good we will start the due diligence for migrate the farm to SharePoint 2013. Or, will think about a POC using SharePoint 2016 Technical Preview!
    • I am waiting ! Not, that easy but possible!
  9. Mean while we need to upgrade the Operating System of MOSS 2007 – Since Windows 2003 server has no support we need to upgrade it to Windows 2008 R2 Standard and strictly needs to be in 32 bit.

More real time scripts, SharePoint Developer and IT Professional discussion about PowerShell will be continued in next blog πŸ™‚

 

Get OU Included in SharePoint User Profile Synchronization Configurations

Summary

This TechNet Wiki is to share PowerShell Snippet which retrieves Included OU in SharePoint 2010 User Profile Synchronization. Ensure you are farm admin while executing the script. Please do read the code and execute in acceptance and then in Production.

Background

This morning we received some email alerts “Your Mysite is marked for deletion”. Indeed user ID is not disabled but moved from one OU to other OU So what’s wrong in it. Nothing much if your SharePoint 2010 UP SYNC Connections has all the OU’s. If not it’s a challenge. You can review more articles in web. We started analyzing the issue – Technically each and every SP admin had different opinion.

Conclusion

Hey SP Admins get me the Included OU list in SharePoint UPS SYNC. Follow the below process

  1. Disable MySite Clean Up Timer Job.
  2. Edit Sync settings.
  3. Drill down the Forest and get me the OU names.

Solution

Above steps are easy to draft as solution document but it’s huge work for SP Admins (Indeed I am part of SP Admin Team). Running Mysite clean up job manually will become an operational task. We do have one step solution – Open SharePoint Shell Management and execute the below code

Add-PSSnapin Microsoft.SharePoint.PowerShell
$userprofileService = @(Get-SPServiceApplication | Where-Object {$_.TypeName -eq 'User Profile Service Application'})[0]
$context = [Microsoft.SharePoint.SPServiceContext]::GetContext($ups.ServiceApplicationProxyGroup,[Microsoft.SharePoint.SPSiteSubscriptionIdentifier]::Default)
$ConfigMgr = New-Object Microsoft.Office.Server.UserProfiles.UserProfileConfigManager($context)
$AD = $ConfigMgr.ConnectionManager
$AD | Select -ExpandProperty NamingContexts | Select -ExpandProperty ContainersIncluded

 

SharePoint 2010 Publishing Feature Activation

One of our clients reported an issue while editing the home page of SharePoint portal.

Error: “An Unexpected Error Occurred”

Impact: Unable to save the changes made.

Reason Provided by the customer: Power User tried to deactivate and activate the publishing feature.

Team tried reactivating the publishing feature which caused more pain. The Navigation bar was broken in the home page. (Expected SP 2010 Behavior).

Fix: Activate SP 2010 Publishing Feature using PowerShell (Force it with Proper Bag Parameter)

1. Installed SharePoint Manager 2010

2. Explored the property bag to identify the TRUE value of Publishing Feature

3. Though the User Interface shows the feature as ACTIVATED and PowerShell output gave the same result. But, the knot is the [“__PublishingFeatureActivated”] was set to FALSE in property bag.

4. No option to right clickΒ to activate (Sounds More Cranky) – But no other go, I took a chance to implement the below PowerShell code.

#Solution: SharePoint 2010 - PowerShell
#To activate the publishing feature in SP2010 portal
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") | Out-Null 
$site = Get-SPSite "http://www.yourportal.com/"
$web = $site.openweb()
$Web.AllProperties["__PublishingFeatureActivated"]="True" 
$Web.Update()
#If SP 2010 fails to read the __PagesListsID (Internal Name). I prefer to do the below
 
$web = get-spweb "http://www.yourportal.com/"
$correctId = $web.Lists["Pages"].ID
$web.AllProperties["__PagesListId"] = $correctId.ToString()
$web.Update()

 

Delete SharePoint 2010 Library View

We tried modifying the view in SharePoint 2010 using Designer 2010 and it’s corrupted! No option to delete the view !

Spin up your SharePoint Shell Management and execute the below code

Start-SPAssignment -Global
$SPWeb = Get-SPWeb $WebUrl
$List = $SPWeb.Lists[$ListName]
$View = $List.Views[$ViewName]
#$view.ID
$List.Views.Delete($View.ID)
$List.Update()
$SPWeb.Update()
$SPWeb.Dispose()
Stop-SPAssignment -Global

 

Β 

Note: Ensure the View you are removing. Cross check by it’s ID [GUID]

Events: Metalogix – SharePoint and Office 365 Road Map to the Cloud

On March 18, 2015 Metalogix organized and conducted a Road Show at Microsoft – Amsterdam. Title: SharePoint and Office 365 Road Map to the Cloud with the partnership of K2 , Wipro and Wortell.

Contents

  • How to drive adoption for Office 365
  • 5 Things you need to know before migrating to SharePoint 2013, Onedrive for Business and Office365
  • Large Office365 Migration and its best practices
  • Driving innovation with Office365 and Azure
  • Building Hybrid Business Apps in SharePoint
  • Designing a SharePoint Online Intranet

Β Location

  • Amsterdam, Netherlands – Event Date March 18, 2015
  • Reading, UK – Event Date April 1, 2015
  • Cologne, Germany – April 17, 2015
  • Copenhagen, Denmark – Event Date May 21, 2015
  • Dublin, Ireland – Event Date June, 2015 [Date is not confirmed]

This event provided a great insight about Cloud Migrations. Most of the speakers delivered the challenges and best practices. K2 delivered a short demo about building interactive workflow in SharePoint platform which impressed many audience.

Team Metalogix spoke about 5 things you need to know before migrating to SharePoint 2013 – Which made audience to think a lot!

If you are planning to attend in any one of the mentioned location register and make use of it!

Registration

http://www.metalogix.com/Events/road-show

Raffle

Do not forget to fill the feedback form! That’s a ticket for Winning Surface Pro!

Surface-6