Showing posts with label Sharepoint 2010. Show all posts
Showing posts with label Sharepoint 2010. Show all posts

Tuesday, December 18, 2018

SharePoint upgrade missing feature reference issue

While I tried to migrated the SharePoint 2010 Data base to SharePoint 2016 through the database upgrade approach , I received the below missing feature error

Database [database] has reference(s) to a missing feature: Name = [PowerPivot Feature 
                  Integration for Site Collections], Id = [1a33a234-b4a4-4fc6-96c2-8bdb56388bd5

usually if you follow this blog Link, you should be able to clean up the missing feature , if not by using the feature admin tool you should be able to clean up the faulty feature at the source . But in this case neither worked . SharePoint 2010 was not showing that this feature was activated , but the upgrade was failing in SharePoint 2013/2016 .

Hence i decide to do some digging myself  in SQL and try to resolve the issue , below are the steps followed to resolve the issue




1.      Open SSMS in source (SharePoint 2010 /2013), run the below script to find the tables in DB where the missing feature is referenced

USE [Name of the DB]
GO
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%FeatureId%'
ORDER BY schema_name, table_name;

2.      Query result would provide the list of tables in SQL

table_name        schema_name   column_name
AllLists                  dbo                       tp_FeatureId
CustomActions   dbo                       FeatureId
Features              dbo                       FeatureId
FeatureTracking dbo                      FeatureId

3.      Open up each table in SQL and identify the row as per sample query

Select * from [data base name].[dbo].[tablename] where tp_featureID = ‘guid of missing feature’

Results would provide the webID of the website

4.      Open up any of the SharePoint server in the farm and execute the below query , this would list all the site and webs with the ID
5       
Get-SPWebApplication http://sharepoint.dev.symetra.com/ | Get-SPSite -Limit All | Get-SPWeb -Limit All | Select Title, URL, ID, ParentWebID | Export-CSV C:\InfoArch.csv –NoTypeInformation

6.      Navigate to the website and clean up the component which is referred by the feature .

I In my case there was a faulty power pivot library at SharePoint 2010 , I went ahead and cleaned up the library at 2010

Thursday, December 13, 2018

Sharepoint 2016 User profile sync unable to update manager field



I was migrating a User profile from SharePoint 2010 to SharePoint 2013 and then to SharePoint 2016 . During the process of migration I did decide to leave out the sync and social DB , as we wanted the   new social features available in SharePoint 2016 and we decided not having to migrate the social and sync DB from SharePoint 2010 would be a cleaner approach .

As per the Microsoft article I did migrate the User profile DB and the MySite DB through Data base upgrade process. Everything did migrate all fine and I did opt for "Active Directory Import" to configure the new Sync in SharePoint 2016 . I was able to create a custom property to import the "Employee ID " from AD and post completion of Full sync ,I was able to see the Employee ID property in user's profile .

Strangely I noticed that the manager field was not being updated , yes it did have the old values carried over from SharePoint 2010 , but if the manager field was updated in AD , it was not being synced to SharePoint . Did restart the service and triggered full sync of user profile on few occasion , but this did not resolve the issue .

But below steps finally synced the manager field from AD to SharePoint 2016 .


  1. Clicked "Configure Synchronization Settings" in central admin of SharePoint 2016
  2. Since I had configured the "  Active Directory Import " to sync the data from AD , this option was selected .
  3. Select the "Enable External Identity Manager" 
  4. click OK
  5. Now get back to the same screen ""Configure Synchronization Settings"
  6. But this time select the right setting "Use SharePoint Active Directory Import"
  7. Click OK
  8. Trigger the "Full Sync"

This resolved the issue and manager field for all the users were updated .

Note : Manager property should not be configured with any import filed in "Manage User Property" this field has to be kept blank , only then the SharePoint 2016 would sync  the data from AD .

Previously in SharePoint 2010 , you had to map the SharePoint "manager" user property with "manager" field in "Property mapping for synchronization"

Friday, September 16, 2016

Using Custom fonts in SharePoint

You can use the custom fonts in SharePoint applications ,below are the few things you may have to perform in order to get the new stylish fonts which you want to display to your users in your application .

My experience was to try use the "Avenier" fonts ,this is a paid font and it is been widely used these days .

1)I received the few packages like "Avenir Next Condensed.ttc" "Avenir Next.ttc" "Avenir.ttc"
2) If you try to use these package directly on to your site it will not work ,as the the extension of the file says it is a collection  "TrueType collection font file" .
3)Hence use some tools (many tools are readily available online)  to convert the truetype collection font file to "TrueType font file.
4)What it basically does it breaks the collection of files into individual files (ttf from ttc)
5)Now there are many different formats of font file you can use in your application
6)I have again used the online converter and converted my ttf  files to ".woff"  format
7)Upload these files in any of the document library (eg: site assets"
8)Now you are ready to use your new font in your css file as below

@font-face {
      font-family: "ThiloshNewFont";
      src: url("http://SiteCollection/SiteAssets/HLS-LEAD-FontFamily/AvenirNext-DemiBold.woff");


using in the custom class as below 


.testNewclass
{

     font-family: "ThiloshNewFont";

}


So now in which ever HTML element you use this ".testNewClass" the font style applied will be  "AvenirNextDemiBold"


Tuesday, September 8, 2015

Move Sharepoint folders and files in list/Libraries through powershell



I had this folder movement structure of
1)Adjacency
    2)Group
          3)Subgroup

Below is the Powershell code through which I achieved it.It can be used to move files and folders in the same library or to different library.You could also pick only the subfolders to be moved or the whole main folder to be moved



$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}


$logFile = "LogFile_MoveFiles.txt"

function create-fileitems()
    {
     [CmdletBinding()]
     param(
[Parameter(position=1, mandatory=$true, parametersetname="Default")] [Microsoft.SharePoint.SPDocumentLibrary]$SourceList,
[Parameter(position=2, mandatory=$true, parametersetname="Default")] [Microsoft.SharePoint.SPDocumentLibrary]$DestinationList,
     [Parameter(position=3, mandatory=$true, parametersetname="Default")] [string] $SourceAdjacencyToMove,
     [Parameter(position=4, mandatory=$true, parametersetname="Default")] [string] $ConfirmAdjToMove,
     [Parameter(position=5, mandatory=$true, parametersetname="Default")] [string] $SourceGroupToMove,
     [Parameter(position=6, mandatory=$true, parametersetname="Default")] [string] $DestinationAdjToMove,
     [Parameter(position=7, mandatory=$true, parametersetname="Default")] [Microsoft.SharePoint.SPWeb]$sourceweb
     )
        $src = $SourceList
        $tgt = $DestinationList
        $SourceAdjacency = $SourceAdjacency
        $AllFolders = $src.Folders
        $srcRootFolder = $src.RootFolder
        $allfiles = $src.items
        $RootItems = $srcRootFolder.files
        $destRootFolder = $tgt.RootFolder
        $arrListFolderURLToDelete = New-Object System.Collections.ArrayList
        Try
         {
          foreach($Folder in $src.RootFolder.SubFolders)
           {
         if($Folder.Name -eq $SourceAdjacencyToMove)
           {
            $srcFolderURL = $folder.url
            $destFolderURL = $srcFolderURL          
            $destFolderURL = $destFolderURL -replace $SourceAdjacencyToMove, $DestinationAdjToMove
            $srcItems = $Folder.folder.files
            if(!($tgt.Folders | ? {$_.URL -eq $destFolderURL}))
            {
             
                $parentFolderURL = $Folder.ParentFolder.ServerRelativeUrl
                $newFolder = $src.Additem($parentFolderURL,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$DestinationAdjToMove)
                $newFolder.Update()
                write-host -ForegroundColor Green "Folder Creation:"$destFolderURL" - Complete"
                Add-Content $logFile "Folder Creation: $destFolderURL - Complete"
            }          
               foreach($subFolder in $Folder.SubFolders)
               {
                   if($ConfirmAdjToMove -eq "N" -or $ConfirmAdjToMove -eq "n")
                     {
                        if($subFolder.Name -eq $SourceGroupToMove)
                        {
                            MoveGroup $Folder $subFolder $srcRootFolder $destRootFolder $tgt $AllFiles
                            $arrListFolderURLToDelete.Add($subFolder.URL) | Out-Null
                        }
                     }
                   else
                     {
                       MoveGroup $Folder $subFolder $srcRootFolder $destRootFolder $tgt $AllFiles
                       $arrListFolderURLToDelete.Add($subFolder.URL) | Out-Null
                     }
                   
               }
             if($ConfirmAdjToMove -eq "Y" -or $ConfirmAdjToMove -eq "y")
               {
                 $arrListFolderURLToDelete.Add($Folder.URL) | Out-Null
               }  
                     
           }

        }
          Foreach($folderURLToDelete in $arrListFolderURLToDelete)
           {

                $folderToDelete = $sourceweb.GetFolder($folderURLToDelete)
                $folderToDelete.Delete()

             }
         }
        catch
         {
            Write-Host  $_.Exception.Message
            Add-Content $logFile    "***Error description Starts****`n"
            Add-Content $logFile    $_.Exception.Message      
            Add-Content $logFile    "***Error description ends****`n"
         }

      }

 function MoveGroup($Folder,$subFolder , $srcRootFolder ,$destRootFolder,$tgt,$AllFiles)
    {
        $srcSubFolderURL = $subFolder.url
        $destSubFolderURL = $srcSubFolderURL                  
        $destSubFolderURL = $destSubFolderURL -replace $SourceAdjacencyToMove, $DestinationAdjToMove
        $srcSubItems = $subFolder.folder.files
          if(!($tgt.Folders | ? {$_.URL -eq $destSubFolderURL}))
              {
                        $parentFolderURL = $Folder.serverrelativeurl
                        $parentFolderURL = $parentFolderURL -replace $SourceAdjacencyToMove, $DestinationAdjToMove                                              
                        $newFolder = $src.Additem($parentFolderURL,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$subFolder.name)
                        $newFolder.Update()
                        write-host -ForegroundColor Green "Folder Creation:"$destSubFolderURL" - Complete"
                        Add-Content $logFile "Folder Creation: $destSubFolderURL - Complete"
                      }
                   
                foreach($sub2Folder in $subFolder.SubFolders)
                      {
                            $srcSub2FolderURL = $sub2Folder.url
                            $destSub2FolderURL = $srcSub2FolderURL                          
                            $destSub2FolderURL = $destSub2FolderURL -replace $SourceAdjacencyToMove, $DestinationAdjToMove
                            $srcSub2Items = $sub2Folder.folder.files
                            if(!($tgt.Folders | ? {$_.URL -eq $destSub2FolderURL}))
                              {
                                $parentFolderURL = $subFolder.serverrelativeurl              
                                $parentFolderDestination = $destRootFolder                              
                                $parentFolderURL = $parentFolderURL -replace $SourceAdjacencyToMove, $DestinationAdjToMove                                                      
                                $newFolder = $src.Additem($parentFolderURL,[Microsoft.SharePoint.SPFileSystemObjectType]::Folder,$sub2Folder.name)
                                $newFolder.Update()
                                write-host -ForegroundColor Green "Folder Creation:"$destSub2FolderURL" - Complete"
                                Add-Content $logFile "Folder Creation: $destSub2FolderURL - Complete"
                              }
                     
                       $destFolder = $src.Folders | ? {$_.url -eq $destSub2FolderURL}
                             if($sub2Folder.Files.count -gt 0)
                              {
                                $srcItems = $sub2Folder.Files
                                    foreach ($item in $srcItems)
                                    {
                                        $sourceListItem = $item.Item
                                        [Microsoft.Office.RecordsManagement.RecordsRepository.Records]::UndeclareItemAsRecord($sourceListItem)
                                        $Relative = $Item.URL
                                        $TargetItem = $AllFiles | ? {$_.URL -eq $Relative}
                                        $sBytes = $TargetItem.File.OpenBinary()
                                        $dFile = $destFolder.Folder.Files.Add($TargetItem.Name, $sBytes, $true)
                                        $ditem = $dfile.Item
                                        $ditem["Modified"] = $Item.TimeLastModified.ToLocalTime()
                                        $ditem["Created"] = $Item.TimeCreated.ToLocalTime()
                                        $ditem["Author"] = $Item.Author
                                        $ditem["Editor"] = $Item.ModifiedBy                                                                              
                                        $ditem.SystemUpdate($true)
                                        $dFile.CheckIn("Check in by Administrator")
                                        $dFile.Update()
                                        write-host -ForegroundColor Green "File Creation:" $dfile.name" - Complete"
                                        Add-Content $logFile "File Creation: $dfile.name - Complete"
                                    }
                               }
                       }
   }
 


$siteURL = Read-Host "Enter the Site collection URL - Eg:http://Yourwebapplication:1234/ "
$site = Get-SPSite -Identity  $siteURL
$sourceweb = $site.Openweb()
$sourcelist = $sourceweb.lists["LibraryA"]
$destinationlist = $sourceweb.lists["LibraryB"]

$SourceAdjacencyToMove = Read-Host "Enter the name of source Adjacency to be moved"
$DestinationAdjToMove = Read-Host "Enter the name of Destination Adjacency where the files has to be moved to :"
$ConfirmAdjToMove = Read-Host "Press (Y) to move all files ,Press (N) to select Group"


if($ConfirmAdjToMove -eq "N" -or $ConfirmAdjToMove -eq "n")
    {
        $SourceGroupToMove =Read-Host "Enter the Name of Group to be moved"
        create-fileitems -sourcelist $sourcelist -destinationlist $destinationlist -SourceAdjacencyToMove $SourceAdjacencyToMove  -ConfirmAdjToMove  $ConfirmAdjToMove -SourceGroupToMove $SourceGroupToMove -DestinationAdjToMove $DestinationAdjToMove -sourceweb $sourceweb
    }
elseif($ConfirmAdjToMove -eq "Y" -or $ConfirmAdjToMove -eq "y")
    {
        $SourceGroupToMove = " "
        create-fileitems -sourcelist $sourcelist -destinationlist $destinationlist -SourceAdjacencyToMove $SourceAdjacencyToMove  -ConfirmAdjToMove  $ConfirmAdjToMove -SourceGroupToMove $SourceGroupToMove -DestinationAdjToMove $DestinationAdjToMove  -sourceweb $sourceweb
    }




Note: I am using the "[Microsoft.Office.RecordsManagement.RecordsRepository.Records]" because I am working on the Record center and my files are marked as records .Without un-declaring as record ,you cannot perform any action on the document even through powershell or through C# codes.



Monday, March 2, 2015

Add Expiration/Rentention policy in Sharepoint Through powershell


Below is the power-shell script which can be used to add expiration/Retention policy in any version of share-point  through powershell.This helps in moving the policy from one environment to other in a very easy and hassle free way.
               Below power shell script adds the expiration policy to the Content Type at the site collection level ,This is designed to add at Site collection level because this can be run in the Content Hub hosting site and the policy can be migrated to other site collections which are leveraging the Hub.You can make the necessary changes to the script to add the policy at the "Library level" or" to the "content type " at the library level by instantiating the suitable object .
      The script below add the expiration policy like "DocumentDate+0 days" move to "Recycle bin"
"DocumentDate" is my custom column of DateTime type field.



$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
$logFile = "LogFile_RDM_Expiration_Policy"

function AddExpirationPolicy($web , $contentTypes)
 {
     try
     {
        $arrayCT = $contentTypes.Split(",")
        foreach($CT in $arrayCT)
         {
              Write-host -for yellow "Checking if the Content type" $CT "exists ?"
              Add-Content $logFile "Checking if the Content type $CT exists ?"
              $CT = $web.ContentTypes[$CT]
              if($CT -ne $null)
              {
                Write-host -ForegroundColor green "Content Types -" $CT.Name  "exists !!"
                Add-Content $logFile "Content Types - $CT.Name exists !!"
                $policy=[Microsoft.Office.RecordsManagement.InformationPolicy.Policy]::GetPolicy($CT);
                 if ($policy -eq $null)
                   {
                    $policy=[Microsoft.Office.RecordsManagement.InformationPolicy.Policy]:: CreatePolicy($CT,$null);
                    $policy=[Microsoft.Office.RecordsManagement.InformationPolicy.Policy]::GetPolicy($CT);
                   }
                $policy.Description="Thilosh expiration Policy";
                $policy.Statement="Thilosh expiration Policy";
                $policy.Update();
                $expirypolicyexists=$false;
                if ($policy.Items.Count -ne 0)
                {
                foreach ($policyitem in $policy.Items)
                {
                    if ($policyitem.Name -eq "Retention")
                    {
                        $expirypolicyexists=$true;
                    }
                }
                }
                if ($expirypolicyexists -eq $false)
                 {
                $policyFeatureID = [Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration];
                #Expires data when the current date is equal to the document date set for the record      
                $customData = '<Schedules nextStageId="2">
                                <Schedule type="Default">
                                <stages>
                                  <data stageId="1">
                                    <formula id="Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn">
                                      <number>0</number>
                                      <property>DocumentDate</property>                        
                                      <period>days</period>
                                    </formula>
                                    <action type="action" id="Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.MoveToRecycleBin" />
                                  </data>
                                </stages>
                              </Schedule>
                            </Schedules>'
                $policy.Items.Add($policyFeatureID,$customData);
                #$policy.Items.Add("Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration",$customData);
                $policy.Update();
                Write-Host -ForegroundColor Green  "Expiration  policy added for thr Content Type -" $CT.Name
                Add-Content $logFile "Expiration  policy added for thr Content Type - $CT.Name"
                 }
                else
                 {
                   Write-Host -ForegroundColor Red  "An expiry policy already exists and is not overwritten for the Content type -" $CT.Name
                   Add-Content $logFile   "An expiry policy already exists and is not overwritten for the Content type - $CT.Name"
                 }
              }
              else
              {
                Write-host -ForegroundColor red "Content Types -" $CT  "doesnot exists !!"
                Add-Content $logFile "Content Types - $CT doesnot exists !!"
              }
         
       }
     }
     catch
     {
         Write-Host  $_.Exception.Message      
         Add-Content $logFile    "***Error description Starts****`n"
         Add-Content $logFile    $_.Exception.Message        
         Add-Content $logFile    "***Error description ends****`n"

     }
 }

 $siteURL = Read-Host "Enter the Site collection URL - Eg:http://Thilosh:1234/ "
 $site = Get-SPSite -Identity  $siteURL
 $web = $site.RootWeb
 $contentTypes =  "ContentType1,ContentType2,ContentType3"

 AddExpirationPolicy $web $contentTypes

 $web.Dispose();
 $site.Dispose();




Read-Host "Press enter Key to exit !!"



Now you must be thinking how do I change the formula in "$customData ".This is very simple,You must have heard about a tool named "Sharepoint Manager" by using this you should be able to create formula for literally anything what ever possible in the sharepoint :)


Wednesday, October 22, 2014

Bulk creation of Sharepoint Site column ,Content types ,list and permission groups



Here is the GitHub Link  where I have upload the CSV and power shell scripts which can be used for bulk creation of Sharepoint Site column,Content types,List and permissions,

All you need to do is enter the values in the respective CSV which already consists of some sample values.


https://gallery.technet.microsoft.com/Create-Sharepoint-81bba042#content

Thursday, October 9, 2014

Sharepoint break role inherentence and add custom permission in sharepoint library/List through Powershell

$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}



function AddGroupsToList($groupName,$permissionLevel)
{
    $Group = $web.SiteGroups[$groupName]
    $GroupAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($Group)
    #Get the permission levels to apply to the new groups
    $RoleDefinition = $web.Site.RootWeb.RoleDefinitions[$permissionLevel]
    #Assign the groups the appropriate permission level
    $GroupAssignment.RoleDefinitionBindings.Add($RoleDefinition)
    #Add the group to the site with the permission level
    $list.RoleAssignments.Add($GroupAssignment)    
    $list.Update()
}


$site = Get-SPSite "http://webapplication/sites/RECMRepository/"
$web = $site.RootWeb



#Break Roleinherentence for "Public Documents" list
Write-Host  -foreground "green" "Breaking Role inherentence for the list - Public Documents"
$list = $web.Lists["Public Documents"]
$list.BreakRoleInheritance($false)
#Add Groups to the list with permission levels assigned
AddGroupsToList "Group1" "Full Control"
AddGroupsToList "Group2" "Contribute"
AddGroupsToList "Group3" "Read"


Note:Breaking role inherentence of either site or library or list with Parameter "False" will give you with clean slate no groups from top level will be copied hence I am adding the groups which I need later,

But if the parameter is "True" it will copy the groups from top level,in the case you may need to delete the unwanted groups from the list
 

Create Sharepoint Site Group and role definition through powershell

Below code to be used in powershell file


function createSiteGroups($groupName,$groupOwner,$groupDescription,$permissionLevel,$users)
{
    Write-Host  -foreground "green"  "Creating Sharepoint group -" $groupName
    $web.SiteGroups.Add($groupName, $groupOwner, $groupOwner, $groupDescription)
    $Group = $web.SiteGroups[$groupName]
    $Group.AllowMembersEditMembership = $true
    $Group.Update()
    Write-Host  -foreground "green"  "Creating role assignment for the group -" $groupName
    $GroupAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($Group)

    #Get the permission levels to apply to the new groups
    $RoleDefinition = $web.Site.RootWeb.RoleDefinitions[$permissionLevel]
    #Assign the groups the appropriate permission level
    $GroupAssignment.RoleDefinitionBindings.Add($RoleDefinition)
    #Add the group to the site with the permission level
    $web.RoleAssignments.Add($GroupAssignment)
    Write-Host  -foreground "green"  "Creation of group and role assignment completed successfully for the group -" $groupName
    #Adding users to the group
    Write-Host  -foreground "green"  "Adding users to the group -" $groupName
    $arrayUsers = $users.split(",")
    foreach($user in $arrayUsers)
        {
           if($user -ne "")
             {
               $adUser = $web.Site.RootWeb.EnsureUser($user)
               $Group.AddUser($adUser)
              }
        }
}


You can call the function as below

#Creating Sharepoint security Groups
#create group "Group1 "
$groupName = "Group1"
$groupOwner = $web.Site.Owner
$groupDescription =  "test Group"
$permissionLevel = "Full Control"
$users = "domain\user1,Domain\user2"
createSiteGroups $groupName  $groupOwner $groupDescription $permissionLevel $users



 

Sharepoint create List and attach Content Type to Library or List through powershell

Below code to be used in Powershell file


$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}

function AddContentTypes($web,$libraryName,$libraryDescription,$libraryTemplate,$customContentTypes)
{
   
    #Adding CT
    Write-Host -foreground "green" "Adding Content Types to the Library - " $libraryName
    $docLib = $web.Lists[$libraryName]
    $docLib.ContentTypesEnabled = "True"
    $docLib.update()
    $customContentTypeArray = $customContentTypes.Split(",")
    foreach($customContentType in $customContentTypeArray)
       {
         $customCT = $web.ContentTypes[$customContentType]
         $docLib.ContentTypes.Add($customCT)
         Write-Host -foreground "green" "Content Type -"$customContentType "Added to the List"
       }
    $docLib.update()

}



$site = Get-SPSite "http://Webapplication:777"
$web = $site.RootWeb

$libraryName = "Config"
$libraryDescription = ""
$libraryTemplate = [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary;
Write-Host -foreground "green" "Creating Library - " $libraryName "...."
# Adding Library
$web.Lists.Add($libraryName,$libraryDescription,$libraryTemplate);
$web.Update();

$customContentTypes = "CT1,CT2,CT3"
AddContentTypes $web $libraryName $libraryDescription $libraryTemplate $customContentTypes



$web.Dispose()
$site.Dispose()

Read-host "Press Enter key to exit ...."



To create site column and Content type use the Link
 

Create sharepoint Site column and Content Types through powershell

Use the below code in Powershell file




$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null) {
Write-Host "Loading SharePoint Powershell Snapin"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}
$site = Get-SPSite http://WebApplication:777
$web = $site.RootWeb 

$fieldXML = '<Field Type="Text" ID="{20152dbc-7793-46cb-bc0d-5dd98b0aa1a4}" StaticName="Col1" Name=" Col1" DisplayName=" Col1"
            Description="A document classification ." Required="TRUE" MaxLength="255"
            Group="RDM Site Columns"  ></Field>'
write-host -foreground "green" "Adding Site Column"
$web.Fields.AddFieldAsXml($fieldXML) 

$fieldXML =  '<Field Type="Note" ID="{2808ba7f-78a9-4930-8840-385a18e85b53}" StaticName="Col2" Name=" Col2" DisplayName=" Col2"
        Description="The type of business conducted at a site." Required="FALSE"  NumLines="6" RichText="TRUE"
        Group="RDM Site Columns"  ></Field>'
write-host -foreground "green" "Adding Site Column"
$web.Fields.AddFieldAsXml($fieldXML) 

$fieldXML = '<Field Type="Choice" ID="{ce7f74d7-fc8c-4844-85a9-903e208e68d2}" StaticName="Col3" Name=" Col3" DisplayName=" Col3"
        Description="The status of a complete location." Required="TRUE" Group="EICM Site Columns" >   
<CHOICES>
      <CHOICE>Active</CHOICE>
      <CHOICE>InActive</CHOICE>
      <CHOICE>Pending</CHOICE>
    </CHOICES>
    <Default>Pending</Default>
  </Field>'
write-host -foreground "green" "Adding Site Column"
$web.Fields.AddFieldAsXml($fieldXML) 
 

Write-Host -foreground "green" "Creating Content Type-CT1 ...."
$ctypeName = “CT1”
$ctypeParent = $web.availablecontenttypes["Document"]
$ctype = new-object Microsoft.SharePoint.SPContentType($ctypeParent, $web.contenttypes, $ctypeName)
$ctype.Group = "CT"
$ctype.Description = ""
$web.contenttypes.add($ctype)
 

$field = $web.fields.getfield(“Col1”)
$fieldLink = new-object Microsoft.SharePoint.SPFieldLink($field)
$ctype.fieldlinks.add($fieldLink)
$field = $web.fields.getfield(“Col2”)
$fieldLink = new-object Microsoft.SharePoint.SPFieldLink($field)
$ctype.fieldlinks.add($fieldLink)
$field = $web.fields.getfield(“Col3”)
$fieldLink = new-object Microsoft.SharePoint.SPFieldLink($field)
$ctype.fieldlinks.add($fieldLink)
$ctype.update()
 

If u need to delete any field in child CT which got inherted from Parent CT then you can use the below code 

 

Write-Host -foreground "green" "Creating Content Type-CT2 ...."
$ctypeName = “CT2”
$ctypeParent = $web.availablecontenttypes["CT1"]
$ctype = new-object Microsoft.SharePoint.SPContentType($ctypeParent, $web.contenttypes, $ctypeName)
$ctype.Group = "EICM Content Types"
$ctype.Description = ""
$web.contenttypes.add($ctype)
 

$field = $web.fields.getfield(“col1”)
$fieldLink = new-object Microsoft.SharePoint.SPFieldLink($field)
$ctype.fieldlinks.Delete($fieldLink.Id)
$ctype.update()

Wednesday, January 22, 2014

MSOCAF error- Remove inline code present in the aspx pages


Remove inline code present in the aspx pages. Inline code is not recommended within a site definition due to the issues involved with the code no longer rendering as soon as the page is customized. Inline code is supportable if included on a page in the _layouts directory. Inline code should not be allowed through the PageParserPath exclusion, except in extremely rare circumstances, because it can be modified without going through any review process. As a result, it represents a danger to the environment’s performance and security. Adding PageParserPath element to the web.config files is not allowed. Modifying these files may ‘break’ SharePoint in some way if you change the wrong part of the file
 
 
Found this error while running the MSOCAF on my project having aspx file been deployed to Layouts folder.
 
This error is mainly due to using the <script> tag in your ascx file as below to refere your "js" files in different location like site assests,layouts or any other location
 
 
<script src="myscripts.js"></script>
 
This tag throws the above error
 
This can be resolved by using the tags as mentioned below
 
<SharePoint:ScriptLink ID="ScriptLink1" Name="~sitecollection/siteassests/myscripts.js" runat="server" />
 
 

Wednesday, September 25, 2013

This page allows a limit of 200 controls, and that limit has been exceeded in SharePoint

I was working on custom New form which I had created in Visual Studio 2012 as aspx page and attched it to the list.
I had large number of controls in the page and found this error when i tried to browse it through browser.

The solution for this error was to change a setting in web.config.

Here I am working on SharePoint 2013

So I went to

C:\inetpub\wwwroot\wss\VirtualDirectories\

Now open webapplication Eg:80 where your site is hosted

open web.config

Find the tag below in the web.config

 <SafeMode MaxControls="200" CallStack="false" DirectFileDependencies="10" TotalFileDependencies="250" AllowPageLevelTrace="false">  


by default  MaxControls="200" is set to 200.So you get the exception.

You can change this according to your requirement.

This is resolve the issue.

Tuesday, August 27, 2013

SharePoint Event receiver triggering for all list .Need to trigger for only one list or one type of list

Hi one of the most common requirement in SharePoint is to have event receiver attached to a list .But when you add a event receiver item in Visual Studio and deploy .It will be attached to all the list .

Below are the few things you need to follow to attach a Event Receiver to particular list in SharePoint

1)In the Element.xml of Event Receiver change the tag property as below

         <Receivers ListUrl="Lists/List1">

This will attach the Event Reciever to only List1


2)Changing the tag as below

        <Receivers ListTemplateId="10001" >

will attach the Event Receiver to all the list in site which as listTemplateID =10001

These id are found when you create a list definition by yourself through Visual Studio.
Follow  this link Default list template Id to know about default list id of share point list.


Even after doing this few people see that Event Receiver is been attached to all the list .

The main reason for this is the Feature which is trying to activate the Event Receiver is at Site scope it has to be always at Web scoped . If it at Site scoped the ListUrl and ListTemplateId will be overridden and it will be attached to all the list in the site.

Monday, August 19, 2013

Add data to people picker in Visual webpart programatically - sharepoint 2010

Add the People picker field in the ascx file as below

 <SharePoint:PeopleEditor runat="server" ID="peoplePickerID" MultiSelect="true" 
SelectionSet="User" />

in the code behind on page load write the logic to fill teh people picker from a list having a
people/group type column.


ArrayList PickerEntities = new ArrayList(); 
SPFieldUserValueCollection fieldUserValueCollection = (SPFieldUserValueCollection)item["PeopleGroupTypeColumnDispName"];

            foreach (SPFieldUserValue spuserval in fieldUserValueCollection)
            {
                SPUser userToassign = spuserval.User;
                PickerEntity entity = new PickerEntity();
                PeopleEditor pepEditor = new PeopleEditor();
                entity.EntityData["AccountName"] = spuserval.User.LoginName;
                entity.EntityData["SPUserID"] = spuserval.User.ID;
                entity.EntityData["Email"] = spuserval.User.Email;
                entity.Key = spuserval.User.LoginName;
                entity.Description = spuserval.User.LoginName;
                entity.DisplayText = spuserval.User.Name;
                entity = pepEditor.ValidateEntity(entity);
                entity.IsResolved = true;
                PickerEntities.Add(entity);
            }

peoplePickerID.UpdateEntities(PickerEntities);

 *item["PeopleGroupTypeColumnDispName"];--> is list column of people/group type


Have a look at other post about client people picker of Sharepoint 2013
Client people picker-Sharepoint 2013 



 

Tuesday, July 30, 2013

Add data from People Picker control into people/Group column field of a list in Sharepoint Visual Webpart

The below code can be used in visual webpart where in you have a requirement to pick the data from people picker field and add the data to people or group column of any list


 SPFieldUserValueCollection customer = new SPFieldUserValueCollection();
                    foreach (PickerEntity enity in pepPickCustomer.ResolvedEntities)
                    {
                        SPUser user = SPContext.Current.Site.RootWeb.EnsureUser(enity.Key);
                       
customer .Add(new SPFieldUserValue(SPContext.Current.Site.RootWeb, user.ID, user.Name));

                    }

Later to add data to list

item["PeopleGroupColumName"] = customer;


*
pepPickCustomer is the ID of Client people picker control which is a new type of people picker control available Sharepoin 2013.

Friday, July 5, 2013

Add data to People picker field programatically -Sharepoint 2013

I had a requirement where in the visual webpart had a people picker control .I used the client people picker which is a new and betta control in Sharepoint 2013.This control had to be binded with the data coming from a people picker field of some list.Here is the code to achieve it




SPFieldUserValueCollection reviewers = (SPFieldUserValueCollection)Item["PeoplePickerFieldColumnDisplayName"];
List<PickerEntity> reviewersEntity = new List<PickerEntity>();
foreach (SPFieldUserValue spuserval in reviewers){

SPUser userToassign = spuserval.User;
PickerEntity entity = new PickerEntity();
PeopleEditor pe = new PeopleEditor();
entity.EntityData["AccountName"] = spuserval.User.LoginName;
entity.EntityData["SPUserID"] = spuserval.User.ID;
entity.EntityData["Email"] = spuserval.User.Email;
entity.Key = spuserval.User.LoginName;
entity.Description = spuserval.User.LoginName;
entity.DisplayText = spuserval.User.Name;
entity = pe.ValidateEntity(entity);
entity.IsResolved =true;
 reviewersEntity.Add(entity);
}
PeoplePickerControlName.AddEntities(reviewersEntity);



*"item " is a SPListItem type


in ascx file client people picker looks like

<SharePoint:ClientPeoplePicker runat="server" ID="PeoplePickerControlName" Required="true" ValidationEnabled="true"
                        InitialHelpText="text"
                        VisibleSuggestions="3"
                        Rows="1"
                        AllowMultipleEntities="true"
                        CssClass="ms-long ms-spellcheck-true" /> 

Have a look at other post about  people picker of Sharepoint 2010
People Picker -Sharepoint 2010 

Friday, June 14, 2013

Get the details of features in sitecollection in sharepoint

open the Sharepoint management shell and use the code

Get-SPSite hhtp://yoursitecollection | Get-SPWeb -Limit ALL | %{ Get-SPFeature -Web $_ } | Sort DisplayName -Unique | FT DisplayName,Id

Monday, June 10, 2013

Multilingual markups in aspx pages

You can use the below tag to have a multilingual texts in aspx pages

Text="<%$Resources:testresourcefile, lbltest; %>"

Where testresourcefile is the default resource file name and lbltest is a key in all the resource files .

you got to have Resource files

  •  testresourcefile.resx
  • testresourcefile.en-US.resx
  • testresourcefile.de-DE.resx
  • etc
in Mappaed foledr called "RESOURCES" in your visual studio project.



for other multinguals

Infopath forms
Visual Webparts
Site columns,Content types and lists

Wednesday, June 5, 2013

Create Multilingual Sharepoint Site Columns,Content types and Lists from Visual studio programatically




·         Create resource file Eg: test.resx ; test.en-US.resx for English and  test.de-DE.resx for German
·         Add the key values Eg: Stringtest = Documan
·         Create site columns
·         Change the display name of site columns in element.xml as DisplayName="$Resources:Stringtest" Note:Stringtest should be in all the above resource files.
·         Now since your site columns are create in multilingual.
·         Create content type using these columns.
·         In the content types element.xml also do the same leave the FieldRef “id” “name” same but change the displayname as Eg ( DisplayName="$Resources:Stringtest ")
·         Now create the list using the content type .You the change the list definition and instance also in the same way as specified above
·         You can now deploy and check everything will be multilingual.


But Please note that these resource files should be added to the sharepoint MAPPED RESOURCE folder and also open you feature property and change the “default resource file “ to “test”
As our default resource file name in test