SlideShare a Scribd company logo
1 of 40
Working with site policies in
SharePoint 2013
DRAGAN PANJKOV, PLANB.

B: WWW.DRAGAN-PANJKOV.COM
T: @PANJKOV

SHAREPOINT AND PROJECT CONFERENCE ADRIATICS 2013
ZAGREB, NOVEMBER 27-28 2013
sponsors
About
• Dragan Panjkov
• Working with SharePoint since 2007
• www.dragan-panjkov.com
• www.twitter.com/panjkov

• PlanB. d.o.o.
• www.planb.ba

• SharePoint user group
• www.1sug.com
Agenda
• Information Management Policies
• Site Policies
• Configuration steps needed to enable Site Policies on sites
• Creating Site Policies in SharePoint UI
• Working with Site Policies using Server OM
• Working with Site Policies using Client OM
Information management policy?
• An information management policy is a set of rules that govern
the availability and behavior of a certain type of important
content. Policy enables administrators to control and
evaluate who can access information, how long to retain
information, and how effectively people are complying with the
policy.
In other words
• Information Management Policy connects business need and
technical implementation of the solution to ensure that
standards are met
Business
Outcomes

Information
Classification

Functional
Preferences

Information
Architecture

Functional
Design

Information
Management
Standards

Information
Management
Policies

Information
Management
Architecture

Technical
Considerations

Service
Management
Policies

Service
Architecture

Project Constraints
Budget, Timeframe, Resources
Information Management Policy Scopes
• List
• Library
• Content Type
• Site
Site Retention?
• How do we control site lifecycle?
• Are we able to track old and unused sites?
• Are we able to easily delete old, unused, expired sites?
Site Policies
• Opportunity to predefine retention rules for sites
• Assign retention policy at site creation
• Site Policies can be configured that sites are:
• Closed and then deleted automatically
• Deleted automatically after certain period of time
• Marked as read-only

• Site Policies can be published in Content Type Hub
Enabling Site Policy functionality
In UI:
• Enable features in Site Collection
• Library and Folder Based Retention
• Site Policy
• Hidden feature “Record Resources” activated automatically

In onet.xml
<SiteFeatures>
<Feature ID="5bccb9a4-b903-4fd1-8620-b795fa33c9ba" Name="RecordResources" />
<Feature ID="063c26fa-3ccc-4180-8a84-b6f98e991df3" Name="LocationBasedPolicy" />
<Feature ID="2fcd5f8a-26b7-4a6a-9755-918566dba90a" Name="ProjectBasedPolicy" />
</SiteFeatures>
CREATING AND APPLYING SITE POLICIES IN UI
Creating Site Policies in UI
Creating Site Policies in UI
Creating Site Policies in UI
Creating Site Policies in UI
Creating Site Policies in UI
Applying Site Policies in the UI
Applying Site Policies in the UI
Applying Site Policies in the UI
Applying Site Policies in the UI
Site Policies in SSOM
namespace Microsoft.Office.RecordsManagement.InformationPolicy
{
public class ProjectPolicy
{
public string Description { get; internal set; }
public string EmailBody { get; set; }
public string EmailBodyWithTeamMailbox { get; set; }
public string EmailSubject { get; set; }
public string Name { get; internal set; }
public
public
public
public
public
public
public
public
public
public
public
}
}

static void ApplyProjectPolicy(SPWeb web, ProjectPolicy projectPolicy);
static void CloseProject(SPWeb web);
static bool DoesProjectHavePolicy(SPWeb web);
static ProjectPolicy GetCurrentlyAppliedProjectPolicyOnWeb(SPWeb web);
static DateTime GetProjectCloseDate(SPWeb web);
static DateTime GetProjectExpirationDate(SPWeb web);
static List<ProjectPolicy> GetProjectPolicies(SPWeb web);
static bool IsProjectClosed(SPWeb web);
static void OpenProject(SPWeb web);
static void PostponeProject(SPWeb web);
void SavePolicy();
SERVER-SIDE OBJECT MODEL DEMOS
Create Site Policies
// ProjectPolicy Content Type ID
SPContentTypeId policyCTID= new SPContentTypeId("0x010085EC78BE64F9478aAE3ED069093B9963");
SPContentTypeCollection contentTypes = site.RootWeb.ContentTypes;
// ProjectPolicy is parent content type
SPContentType parentContentType = contentTypes[policyCTID];
// we create new content type based on ProjectPolicy
policyContentType = new SPContentType(parentContentType, contentTypes, "New Project Policy");
policyContentType = contentTypes.Add(policyContentType);
policyContentType.Group = parentContentType.Group;
policyContentType.Hidden = true;
policyContentType.Update();
// Final step is to create new Policy with new content type
Policy.CreatePolicy(policyContentType, null);
Read Site Policies that exist on site
private static void ReadProjectPolicies()
{
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
List<ProjectPolicy> projectPolicies = ProjectPolicy.GetProjectPolicies(targetWeb);
if (projectPolicies!= null && projectPolicies.Count > 0)
{
Console.WriteLine("Project Policies on web {0}", siteUrl);
foreach (var item in projectPolicies)
{
Console.WriteLine("Name: {0}",item.Name);
Console.WriteLine("Desc: {0}",item.Description);
Console.WriteLine();
}
}
Console.WriteLine();
try
{
targetWeb.Dispose();
}
catch { }
}
}
Get Applied Policy
private static void GetAppliedPolicy()
{
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
ProjectPolicy appliedPolicy = ProjectPolicy.GetCurrentlyAppliedProjectPolicyOnWeb(targetWeb);
if (appliedPolicy != null)
{
Console.WriteLine("Currently applied Project Policy on web {0}", siteUrl);
Console.WriteLine(appliedPolicy.Name);
Console.WriteLine(appliedPolicy.Description);
}
else
{
Console.WriteLine("Project Policy is not applied on web {0}", siteUrl);
}
Console.WriteLine();
try
{
targetWeb.Dispose();
}
catch { }
}
}
Is Policy Applied?
private static void IsPolicyApplied()
{
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
bool isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(targetWeb);
if (isPolicyApplied)
{
Console.WriteLine("Web has policy applied {0}", siteUrl);
}
else
{
Console.WriteLine("Project Policy is not applied on web {0}", siteUrl);
}
Console.WriteLine();
try
{
targetWeb.Dispose();
}
catch { }
}
}
Apply Policy
private static void ApplyPolicySSOM()
{
string policyName = "DEVSITE DoNotClose-ReadOnly Policy";
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
List<ProjectPolicy> webPolicies = ProjectPolicy.GetProjectPolicies(targetWeb);
ProjectPolicy selectedPolicy = webPolicies.Where(p => p.Name ==
policyName).FirstOrDefault();
if (selectedPolicy != null)
{
ProjectPolicy.ApplyProjectPolicy(targetWeb, selectedPolicy);
targetWeb.Update();
Console.WriteLine("Successfully applied policy '{0}' on web '{1}'", policyName,
targetWeb);
}
}
}
Get Project Close and Expiration Date
private static void GetProjectCloseExpirationDate()
{
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
DateTime closedDate = ProjectPolicy.GetProjectCloseDate(targetWeb);
DateTime expirationDate = ProjectPolicy.GetProjectExpirationDate(targetWeb);
if (closedDate != DateTime.MinValue)
{
Console.WriteLine("Close Date: {0}", closedDate);
}
if (expirationDate != DateTime.MinValue)
{
Console.WriteLine("Expiration Date: {0}", expirationDate);
}
Console.WriteLine();
try
{

targetWeb.Dispose();
}
catch { }
}
}
Open Closed Site ELEVATED
private static void OpenProject()
{
using (SPSite site = new SPSite(siteUrl))
{
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite targetSite = new SPSite(siteUrl))
{
SPWeb targetWeb = targetSite.RootWeb;
bool isClosed = ProjectPolicy.IsProjectClosed(targetWeb);
Console.WriteLine("Site is Closed! {0}", siteUrl);
if (isClosed)
{
Console.WriteLine("Trying to open site.");
ProjectPolicy.OpenProject(targetWeb);
Console.WriteLine("Site is now Open! {0}", siteUrl);
}
Console.WriteLine();

try
{
targetWeb.Dispose();
}
catch { }
}
});
}
}
Site Policies in CSOM
namespace Microsoft.SharePoint.Client.InformationPolicy
{
[ScriptType("SP.InformationPolicy.ProjectPolicy", ServerTypeId = "{ec5e0a70-0cc3-408f-a4dc-1bb3495aac75}")]
public class ProjectPolicy : ClientObject
{
[EditorBrowsable(EditorBrowsableState.Never)]
public ProjectPolicy(ClientRuntimeContext context, ObjectPath objectPath);
[Remote]
public static void ApplyProjectPolicy(ClientRuntimeContext context, Web web, ProjectPolicy projectPolicy);
[Remote]
public static void CloseProject(ClientRuntimeContext context, Web web);
[Remote]
public static ClientResult<bool> DoesProjectHavePolicy(ClientRuntimeContext context, Web web);
[Remote]
public static ProjectPolicy GetCurrentlyAppliedProjectPolicyOnWeb(ClientRuntimeContext context, Web web);
[Remote]
public static ClientResult<DateTime> GetProjectCloseDate(ClientRuntimeContext context, Web web);
[Remote]
public static ClientResult<DateTime> GetProjectExpirationDate(ClientRuntimeContext context, Web web);
[Remote]
public static ClientObjectList<ProjectPolicy> GetProjectPolicies(ClientRuntimeContext context, Web web);
protected override bool InitOnePropertyFromJson(string peekedName, JsonReader reader);
[Remote]
public static ClientResult<bool> IsProjectClosed(ClientRuntimeContext context, Web web);
[Remote]
public static void OpenProject(ClientRuntimeContext context, Web web);
[Remote]
public static void PostponeProject(ClientRuntimeContext context, Web web);
[Remote]
public void SavePolicy();
}
}
CLIENT-SIDE OBJECT MODEL DEMOS
Read Site Policies that exist on site
private static void ReadProjectPoliciesCsom()
{
ClientContext policyContext = new ClientContext(siteUrl);
Web targetWeb = policyContext.Web;
ClientObjectList<ProjectPolicy> projectPolicies =
ProjectPolicy.GetProjectPolicies(policyContext, targetWeb);
policyContext.Load(projectPolicies);
policyContext.ExecuteQuery();
if (projectPolicies != null && projectPolicies.Count > 0)
{
Console.WriteLine("Project Policies on web {0}", siteUrl);
foreach (var item in projectPolicies)
{
Console.WriteLine("Name: {0}", item.Name);
Console.WriteLine("Desc: {0}", item.Description);
Console.WriteLine();
}
}
Console.WriteLine();
}
Get Applied Policy
private static void GetAppliedPolicyCsom()
{
ClientContext policyContext = new ClientContext(siteUrl);
Web targetWeb = policyContext.Web;
ClientResult<bool> isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(policyContext, targetWeb);
policyContext.ExecuteQuery();
if (isPolicyApplied.Value)
{
ProjectPolicy appliedPolicy = ProjectPolicy.GetCurrentlyAppliedProjectPolicyOnWeb(policyContext, targetWeb);
policyContext.Load(appliedPolicy);
policyContext.ExecuteQuery();
if (appliedPolicy.TypedObject.ServerObjectIsNull != true)
{
Console.WriteLine("Currently applied Project Policy on web {0}", siteUrl);
Console.WriteLine(appliedPolicy.Name);
Console.WriteLine(appliedPolicy.Description);
}
}
else
{
Console.WriteLine("Project Policy is not applied on web {0}", siteUrl);
}
Console.WriteLine();
}
Is Policy Applied?
private static void IsPolicyAppliedCsom()
{
ClientContext policyContext = new ClientContext(siteUrl);
Web targetWeb = policyContext.Web;
ClientResult<bool> isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(policyContext,
targetWeb);
policyContext.ExecuteQuery();
if (isPolicyApplied.Value)
{
Console.WriteLine("Web has policy applied {0}", siteUrl);
}
else
{
Console.WriteLine("Project Policy is not applied on web {0}", siteUrl);
}
Console.WriteLine();
}
Apply Policy
private static void ApplyPolicyCsom()
{
string policyName = "DEVSITE DoNotClose-ReadOnly Policy";

ClientContext policyContext = new ClientContext(siteUrl);

targetWeb);

Web targetWeb = policyContext.Web;
ClientObjectCollection<ProjectPolicy> webPolicies = ProjectPolicy.GetProjectPolicies(policyContext,
policyContext.Load(webPolicies);
policyContext.ExecuteQuery();

ProjectPolicy selectedPolicy = webPolicies.Where(p => p.Name == policyName).FirstOrDefault();
if (selectedPolicy != null)
{
ProjectPolicy.ApplyProjectPolicy(policyContext, targetWeb, selectedPolicy);
policyContext.ExecuteQuery();
Console.WriteLine("Successfully applied policy '{0}' on web '{1}'", policyName, siteUrl);
}
Console.WriteLine();
}
Get Project Close and Expiration Date
private static void GetProjectCloseExpirationDateCsom()
{
ClientContext policyContext = new ClientContext(siteUrl);
Web targetWeb = policyContext.Web;
ClientResult<DateTime> closedDate = ProjectPolicy.GetProjectCloseDate(policyContext, targetWeb);
ClientResult<DateTime> expirationDate = ProjectPolicy.GetProjectExpirationDate(policyContext, targetWeb);
policyContext.ExecuteQuery();
if (closedDate.Value != DateTime.MinValue)
{
Console.WriteLine("Close Date: {0}", closedDate.Value);
}
if (expirationDate.Value != DateTime.MinValue)
{
Console.WriteLine("Expiration Date: {0}", expirationDate.Value);
}
Console.WriteLine();
}
Close Site
private static void CloseProjectCsom()
{
ClientContext policyContext = new ClientContext(siteUrl);
Web targetWeb = policyContext.Web;
ClientResult<bool> isClosed = ProjectPolicy.IsProjectClosed(policyContext, targetWeb);
policyContext.ExecuteQuery();
if (!isClosed.Value)
{
ProjectPolicy.CloseProject(policyContext, targetWeb);
}
policyContext.ExecuteQuery();
isClosed = ProjectPolicy.IsProjectClosed(policyContext, targetWeb);
policyContext.ExecuteQuery();
if (isClosed.Value)
{
Console.WriteLine("Project is closed! {0}", siteUrl);
}
else
{
Console.WriteLine("Project is NOT closed!");
}
Console.WriteLine();
}
Resources
• http://msdn.microsoft.com/enus/library/microsoft.office.recordsmanagement.informationpolicy.proj
ectpolicy_members.aspx
• http://technet.microsoft.com/en-us/library/jj219569.aspx
• http://blog.dragan-panjkov.com/archive/2013/06/30/creating-sitepolicy-in-sharepoint-2013-using-server-code.aspx
• http://blog.dragan-panjkov.com/archive/2013/10/27/configuring-sitepolicy-in-sharepoint-2013-using-server-code.aspx
• http://blogs.technet.com/b/tothesharepoint/archive/2013/03/28/sitepolicy-in-sharepoint.aspx
• http://stevemannspath.blogspot.com/2012/08/sharepoint-2013-siteretention-getting.html
• http://www.booden.net/ProjectPolicy.aspx
questions?
WWW.DRAGAN-PANJKOV.COM

@PANJKOV
thank you.
SHAREPOINT AND PROJECT CONFERENCE ADRIATICS 2013
ZAGREB, NOVEMBER 27-28 2013

More Related Content

Similar to Working with site policies in SharePoint 2013

Relearning SharePoint Development
Relearning SharePoint DevelopmentRelearning SharePoint Development
Relearning SharePoint Developmentbgerman
 
SharePoint 2013 Search and Creating Dynamic Content Management Solutions
SharePoint 2013 Search and Creating Dynamic Content Management SolutionsSharePoint 2013 Search and Creating Dynamic Content Management Solutions
SharePoint 2013 Search and Creating Dynamic Content Management SolutionsInnoTech
 
Consider performance and security for SharePoint WP/App
Consider performance and security for SharePoint WP/AppConsider performance and security for SharePoint WP/App
Consider performance and security for SharePoint WP/AppTuấn Hải
 
Getting Started with Site Designs and Site Scripts - SPSChi
Getting Started with Site Designs and Site Scripts - SPSChiGetting Started with Site Designs and Site Scripts - SPSChi
Getting Started with Site Designs and Site Scripts - SPSChiDrew Madelung
 
20150211 seo in drupal presentation
20150211 seo in drupal presentation20150211 seo in drupal presentation
20150211 seo in drupal presentationDagmar Muth
 
Using Microsoft Project to automate a workplace culture that works
Using Microsoft Project to automate a workplace culture that worksUsing Microsoft Project to automate a workplace culture that works
Using Microsoft Project to automate a workplace culture that worksProductivity Intelligence Institute
 
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...Prashant G Bhoyar (Microsoft MVP)
 
SharePoint Saturday San Diego - SharePoint 2013 Apps
SharePoint Saturday San Diego - SharePoint 2013 AppsSharePoint Saturday San Diego - SharePoint 2013 Apps
SharePoint Saturday San Diego - SharePoint 2013 AppsRyan Schouten
 
Developing For Multiple Environments on SharePoint Online
Developing For Multiple Environments on SharePoint OnlineDeveloping For Multiple Environments on SharePoint Online
Developing For Multiple Environments on SharePoint OnlineFrank Sikorski
 
SharePoint 2016 Hybrid Overview
SharePoint 2016 Hybrid OverviewSharePoint 2016 Hybrid Overview
SharePoint 2016 Hybrid OverviewRoy Kim
 
Governance of content, permissions & apps in sharepoint 2013
Governance of content, permissions & apps in sharepoint 2013Governance of content, permissions & apps in sharepoint 2013
Governance of content, permissions & apps in sharepoint 2013Kashish Sukhija
 
Building MuleSoft Applications with Google BigQuery Meetup 4
Building MuleSoft Applications with Google BigQuery Meetup 4Building MuleSoft Applications with Google BigQuery Meetup 4
Building MuleSoft Applications with Google BigQuery Meetup 4MannaAkpan
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Derek Jacoby
 
An Introduction to Django Web Framework
An Introduction to Django Web FrameworkAn Introduction to Django Web Framework
An Introduction to Django Web FrameworkDavid Gibbons
 
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...lisbk
 
Custom Runtimes for the Cloud
Custom Runtimes for the CloudCustom Runtimes for the Cloud
Custom Runtimes for the CloudCloudBees
 
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018DevOpsGroup
 
Secrets of Custom API Policies on the Oracle API Platform
Secrets of Custom API Policies on the Oracle API PlatformSecrets of Custom API Policies on the Oracle API Platform
Secrets of Custom API Policies on the Oracle API PlatformPhil Wilkins
 

Similar to Working with site policies in SharePoint 2013 (20)

Relearning SharePoint Development
Relearning SharePoint DevelopmentRelearning SharePoint Development
Relearning SharePoint Development
 
SharePoint 2013 Search and Creating Dynamic Content Management Solutions
SharePoint 2013 Search and Creating Dynamic Content Management SolutionsSharePoint 2013 Search and Creating Dynamic Content Management Solutions
SharePoint 2013 Search and Creating Dynamic Content Management Solutions
 
Consider performance and security for SharePoint WP/App
Consider performance and security for SharePoint WP/AppConsider performance and security for SharePoint WP/App
Consider performance and security for SharePoint WP/App
 
Getting Started with Site Designs and Site Scripts - SPSChi
Getting Started with Site Designs and Site Scripts - SPSChiGetting Started with Site Designs and Site Scripts - SPSChi
Getting Started with Site Designs and Site Scripts - SPSChi
 
20150211 seo in drupal presentation
20150211 seo in drupal presentation20150211 seo in drupal presentation
20150211 seo in drupal presentation
 
Using Microsoft Project to automate a workplace culture that works
Using Microsoft Project to automate a workplace culture that worksUsing Microsoft Project to automate a workplace culture that works
Using Microsoft Project to automate a workplace culture that works
 
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...
Getting Started with SharePoint Patterns and Practices Provisioning Engine-SP...
 
SharePoint Saturday San Diego - SharePoint 2013 Apps
SharePoint Saturday San Diego - SharePoint 2013 AppsSharePoint Saturday San Diego - SharePoint 2013 Apps
SharePoint Saturday San Diego - SharePoint 2013 Apps
 
Developing For Multiple Environments on SharePoint Online
Developing For Multiple Environments on SharePoint OnlineDeveloping For Multiple Environments on SharePoint Online
Developing For Multiple Environments on SharePoint Online
 
SharePoint 2016 Hybrid Overview
SharePoint 2016 Hybrid OverviewSharePoint 2016 Hybrid Overview
SharePoint 2016 Hybrid Overview
 
Governance of content, permissions & apps in sharepoint 2013
Governance of content, permissions & apps in sharepoint 2013Governance of content, permissions & apps in sharepoint 2013
Governance of content, permissions & apps in sharepoint 2013
 
Building MuleSoft Applications with Google BigQuery Meetup 4
Building MuleSoft Applications with Google BigQuery Meetup 4Building MuleSoft Applications with Google BigQuery Meetup 4
Building MuleSoft Applications with Google BigQuery Meetup 4
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9
 
An Introduction to Django Web Framework
An Introduction to Django Web FrameworkAn Introduction to Django Web Framework
An Introduction to Django Web Framework
 
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...
BS 8878: Systematic Approaches to Documenting Web Accessibility Policies and ...
 
Custom Runtimes for the Cloud
Custom Runtimes for the CloudCustom Runtimes for the Cloud
Custom Runtimes for the Cloud
 
Getting started with Content Deployment in SharePoint 2013
Getting started with Content Deployment in SharePoint 2013Getting started with Content Deployment in SharePoint 2013
Getting started with Content Deployment in SharePoint 2013
 
Pyramid tutorial
Pyramid tutorialPyramid tutorial
Pyramid tutorial
 
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018
DevOpsGuys - Cloud Adoption Frameworks - IPExpo April 2018
 
Secrets of Custom API Policies on the Oracle API Platform
Secrets of Custom API Policies on the Oracle API PlatformSecrets of Custom API Policies on the Oracle API Platform
Secrets of Custom API Policies on the Oracle API Platform
 

More from Dragan Panjkov

Leveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsLeveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsDragan Panjkov
 
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...Dragan Panjkov
 
Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDragan Panjkov
 
Building serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsBuilding serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsDragan Panjkov
 
Building serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsBuilding serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsDragan Panjkov
 
How to create custom connector for Microsoft Flow
How to create custom connector for Microsoft FlowHow to create custom connector for Microsoft Flow
How to create custom connector for Microsoft FlowDragan Panjkov
 
Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDragan Panjkov
 
How to create custom Connector for Microsoft Flow
How to create custom Connector for Microsoft FlowHow to create custom Connector for Microsoft Flow
How to create custom Connector for Microsoft FlowDragan Panjkov
 
Building serverless applications with Microsoft Graph and Azure Functions - S...
Building serverless applications with Microsoft Graph and Azure Functions - S...Building serverless applications with Microsoft Graph and Azure Functions - S...
Building serverless applications with Microsoft Graph and Azure Functions - S...Dragan Panjkov
 
How to create custom connector for Microsoft Flow - SPSNL18
How to create custom connector for Microsoft Flow - SPSNL18How to create custom connector for Microsoft Flow - SPSNL18
How to create custom connector for Microsoft Flow - SPSNL18Dragan Panjkov
 
Building Serverless Applications with Microsoft Graph - ECS 2018
Building Serverless Applications with Microsoft Graph - ECS 2018Building Serverless Applications with Microsoft Graph - ECS 2018
Building Serverless Applications with Microsoft Graph - ECS 2018Dragan Panjkov
 
How to: Create a custom connector for Microsoft Flow
How to: Create a custom connector for Microsoft FlowHow to: Create a custom connector for Microsoft Flow
How to: Create a custom connector for Microsoft FlowDragan Panjkov
 
Microsoft Graph and Azure Functions - SharePoint User Group Frankfurt
Microsoft Graph and Azure Functions - SharePoint User Group FrankfurtMicrosoft Graph and Azure Functions - SharePoint User Group Frankfurt
Microsoft Graph and Azure Functions - SharePoint User Group FrankfurtDragan Panjkov
 
ATD 13 - Enhancing your applications using Microsoft Graph API
ATD 13 - Enhancing your applications using Microsoft Graph APIATD 13 - Enhancing your applications using Microsoft Graph API
ATD 13 - Enhancing your applications using Microsoft Graph APIDragan Panjkov
 
SPS Vienna 2017 - Getting started with APIs for Groups and Planner
SPS Vienna 2017 - Getting started with APIs for Groups and PlannerSPS Vienna 2017 - Getting started with APIs for Groups and Planner
SPS Vienna 2017 - Getting started with APIs for Groups and PlannerDragan Panjkov
 
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph API
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph APISPS Lisbon 2017 - Enhancing your applications using Microsoft Graph API
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph APIDragan Panjkov
 
SPKonferenz 2017 - Introducing SDKs for Microsoft Graph
SPKonferenz 2017 - Introducing SDKs for Microsoft GraphSPKonferenz 2017 - Introducing SDKs for Microsoft Graph
SPKonferenz 2017 - Introducing SDKs for Microsoft GraphDragan Panjkov
 
SPKonferenz 2017 - Planning with Planner
SPKonferenz 2017 - Planning with PlannerSPKonferenz 2017 - Planning with Planner
SPKonferenz 2017 - Planning with PlannerDragan Panjkov
 
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabs
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabsMSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabs
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabsDragan Panjkov
 
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAAS
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAASMSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAAS
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAASDragan Panjkov
 

More from Dragan Panjkov (20)

Leveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsLeveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutions
 
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...
NetWork9-Pretvorite svoju poslovnu aplikaciju u Teams Tab u tri jednostavna k...
 
Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premises
 
Building serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsBuilding serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure Functions
 
Building serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure FunctionsBuilding serverless applications with Microsoft Graph and Azure Functions
Building serverless applications with Microsoft Graph and Azure Functions
 
How to create custom connector for Microsoft Flow
How to create custom connector for Microsoft FlowHow to create custom connector for Microsoft Flow
How to create custom connector for Microsoft Flow
 
Developing with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premisesDeveloping with SharePoint Framework (SPFx) on-premises
Developing with SharePoint Framework (SPFx) on-premises
 
How to create custom Connector for Microsoft Flow
How to create custom Connector for Microsoft FlowHow to create custom Connector for Microsoft Flow
How to create custom Connector for Microsoft Flow
 
Building serverless applications with Microsoft Graph and Azure Functions - S...
Building serverless applications with Microsoft Graph and Azure Functions - S...Building serverless applications with Microsoft Graph and Azure Functions - S...
Building serverless applications with Microsoft Graph and Azure Functions - S...
 
How to create custom connector for Microsoft Flow - SPSNL18
How to create custom connector for Microsoft Flow - SPSNL18How to create custom connector for Microsoft Flow - SPSNL18
How to create custom connector for Microsoft Flow - SPSNL18
 
Building Serverless Applications with Microsoft Graph - ECS 2018
Building Serverless Applications with Microsoft Graph - ECS 2018Building Serverless Applications with Microsoft Graph - ECS 2018
Building Serverless Applications with Microsoft Graph - ECS 2018
 
How to: Create a custom connector for Microsoft Flow
How to: Create a custom connector for Microsoft FlowHow to: Create a custom connector for Microsoft Flow
How to: Create a custom connector for Microsoft Flow
 
Microsoft Graph and Azure Functions - SharePoint User Group Frankfurt
Microsoft Graph and Azure Functions - SharePoint User Group FrankfurtMicrosoft Graph and Azure Functions - SharePoint User Group Frankfurt
Microsoft Graph and Azure Functions - SharePoint User Group Frankfurt
 
ATD 13 - Enhancing your applications using Microsoft Graph API
ATD 13 - Enhancing your applications using Microsoft Graph APIATD 13 - Enhancing your applications using Microsoft Graph API
ATD 13 - Enhancing your applications using Microsoft Graph API
 
SPS Vienna 2017 - Getting started with APIs for Groups and Planner
SPS Vienna 2017 - Getting started with APIs for Groups and PlannerSPS Vienna 2017 - Getting started with APIs for Groups and Planner
SPS Vienna 2017 - Getting started with APIs for Groups and Planner
 
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph API
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph APISPS Lisbon 2017 - Enhancing your applications using Microsoft Graph API
SPS Lisbon 2017 - Enhancing your applications using Microsoft Graph API
 
SPKonferenz 2017 - Introducing SDKs for Microsoft Graph
SPKonferenz 2017 - Introducing SDKs for Microsoft GraphSPKonferenz 2017 - Introducing SDKs for Microsoft Graph
SPKonferenz 2017 - Introducing SDKs for Microsoft Graph
 
SPKonferenz 2017 - Planning with Planner
SPKonferenz 2017 - Planning with PlannerSPKonferenz 2017 - Planning with Planner
SPKonferenz 2017 - Planning with Planner
 
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabs
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabsMSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabs
MSNetWork 7 - Microsoft Teams Extensibility - bots, connectors, tabs
 
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAAS
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAASMSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAAS
MSNetWork 7 - Implementacija SharePoint 2016 farme na Azure IAAS
 

Recently uploaded

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 

Recently uploaded (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 

Working with site policies in SharePoint 2013

  • 1. Working with site policies in SharePoint 2013 DRAGAN PANJKOV, PLANB. B: WWW.DRAGAN-PANJKOV.COM T: @PANJKOV SHAREPOINT AND PROJECT CONFERENCE ADRIATICS 2013 ZAGREB, NOVEMBER 27-28 2013
  • 3. About • Dragan Panjkov • Working with SharePoint since 2007 • www.dragan-panjkov.com • www.twitter.com/panjkov • PlanB. d.o.o. • www.planb.ba • SharePoint user group • www.1sug.com
  • 4. Agenda • Information Management Policies • Site Policies • Configuration steps needed to enable Site Policies on sites • Creating Site Policies in SharePoint UI • Working with Site Policies using Server OM • Working with Site Policies using Client OM
  • 5. Information management policy? • An information management policy is a set of rules that govern the availability and behavior of a certain type of important content. Policy enables administrators to control and evaluate who can access information, how long to retain information, and how effectively people are complying with the policy.
  • 6. In other words • Information Management Policy connects business need and technical implementation of the solution to ensure that standards are met Business Outcomes Information Classification Functional Preferences Information Architecture Functional Design Information Management Standards Information Management Policies Information Management Architecture Technical Considerations Service Management Policies Service Architecture Project Constraints Budget, Timeframe, Resources
  • 7. Information Management Policy Scopes • List • Library • Content Type • Site
  • 8. Site Retention? • How do we control site lifecycle? • Are we able to track old and unused sites? • Are we able to easily delete old, unused, expired sites?
  • 9. Site Policies • Opportunity to predefine retention rules for sites • Assign retention policy at site creation • Site Policies can be configured that sites are: • Closed and then deleted automatically • Deleted automatically after certain period of time • Marked as read-only • Site Policies can be published in Content Type Hub
  • 10. Enabling Site Policy functionality In UI: • Enable features in Site Collection • Library and Folder Based Retention • Site Policy • Hidden feature “Record Resources” activated automatically In onet.xml <SiteFeatures> <Feature ID="5bccb9a4-b903-4fd1-8620-b795fa33c9ba" Name="RecordResources" /> <Feature ID="063c26fa-3ccc-4180-8a84-b6f98e991df3" Name="LocationBasedPolicy" /> <Feature ID="2fcd5f8a-26b7-4a6a-9755-918566dba90a" Name="ProjectBasedPolicy" /> </SiteFeatures>
  • 11. CREATING AND APPLYING SITE POLICIES IN UI
  • 21. Site Policies in SSOM namespace Microsoft.Office.RecordsManagement.InformationPolicy { public class ProjectPolicy { public string Description { get; internal set; } public string EmailBody { get; set; } public string EmailBodyWithTeamMailbox { get; set; } public string EmailSubject { get; set; } public string Name { get; internal set; } public public public public public public public public public public public } } static void ApplyProjectPolicy(SPWeb web, ProjectPolicy projectPolicy); static void CloseProject(SPWeb web); static bool DoesProjectHavePolicy(SPWeb web); static ProjectPolicy GetCurrentlyAppliedProjectPolicyOnWeb(SPWeb web); static DateTime GetProjectCloseDate(SPWeb web); static DateTime GetProjectExpirationDate(SPWeb web); static List<ProjectPolicy> GetProjectPolicies(SPWeb web); static bool IsProjectClosed(SPWeb web); static void OpenProject(SPWeb web); static void PostponeProject(SPWeb web); void SavePolicy();
  • 23. Create Site Policies // ProjectPolicy Content Type ID SPContentTypeId policyCTID= new SPContentTypeId("0x010085EC78BE64F9478aAE3ED069093B9963"); SPContentTypeCollection contentTypes = site.RootWeb.ContentTypes; // ProjectPolicy is parent content type SPContentType parentContentType = contentTypes[policyCTID]; // we create new content type based on ProjectPolicy policyContentType = new SPContentType(parentContentType, contentTypes, "New Project Policy"); policyContentType = contentTypes.Add(policyContentType); policyContentType.Group = parentContentType.Group; policyContentType.Hidden = true; policyContentType.Update(); // Final step is to create new Policy with new content type Policy.CreatePolicy(policyContentType, null);
  • 24. Read Site Policies that exist on site private static void ReadProjectPolicies() { using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; List<ProjectPolicy> projectPolicies = ProjectPolicy.GetProjectPolicies(targetWeb); if (projectPolicies!= null && projectPolicies.Count > 0) { Console.WriteLine("Project Policies on web {0}", siteUrl); foreach (var item in projectPolicies) { Console.WriteLine("Name: {0}",item.Name); Console.WriteLine("Desc: {0}",item.Description); Console.WriteLine(); } } Console.WriteLine(); try { targetWeb.Dispose(); } catch { } } }
  • 25. Get Applied Policy private static void GetAppliedPolicy() { using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; ProjectPolicy appliedPolicy = ProjectPolicy.GetCurrentlyAppliedProjectPolicyOnWeb(targetWeb); if (appliedPolicy != null) { Console.WriteLine("Currently applied Project Policy on web {0}", siteUrl); Console.WriteLine(appliedPolicy.Name); Console.WriteLine(appliedPolicy.Description); } else { Console.WriteLine("Project Policy is not applied on web {0}", siteUrl); } Console.WriteLine(); try { targetWeb.Dispose(); } catch { } } }
  • 26. Is Policy Applied? private static void IsPolicyApplied() { using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; bool isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(targetWeb); if (isPolicyApplied) { Console.WriteLine("Web has policy applied {0}", siteUrl); } else { Console.WriteLine("Project Policy is not applied on web {0}", siteUrl); } Console.WriteLine(); try { targetWeb.Dispose(); } catch { } } }
  • 27. Apply Policy private static void ApplyPolicySSOM() { string policyName = "DEVSITE DoNotClose-ReadOnly Policy"; using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; List<ProjectPolicy> webPolicies = ProjectPolicy.GetProjectPolicies(targetWeb); ProjectPolicy selectedPolicy = webPolicies.Where(p => p.Name == policyName).FirstOrDefault(); if (selectedPolicy != null) { ProjectPolicy.ApplyProjectPolicy(targetWeb, selectedPolicy); targetWeb.Update(); Console.WriteLine("Successfully applied policy '{0}' on web '{1}'", policyName, targetWeb); } } }
  • 28. Get Project Close and Expiration Date private static void GetProjectCloseExpirationDate() { using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; DateTime closedDate = ProjectPolicy.GetProjectCloseDate(targetWeb); DateTime expirationDate = ProjectPolicy.GetProjectExpirationDate(targetWeb); if (closedDate != DateTime.MinValue) { Console.WriteLine("Close Date: {0}", closedDate); } if (expirationDate != DateTime.MinValue) { Console.WriteLine("Expiration Date: {0}", expirationDate); } Console.WriteLine(); try { targetWeb.Dispose(); } catch { } } }
  • 29. Open Closed Site ELEVATED private static void OpenProject() { using (SPSite site = new SPSite(siteUrl)) { SPSecurity.RunWithElevatedPrivileges(delegate { using (SPSite targetSite = new SPSite(siteUrl)) { SPWeb targetWeb = targetSite.RootWeb; bool isClosed = ProjectPolicy.IsProjectClosed(targetWeb); Console.WriteLine("Site is Closed! {0}", siteUrl); if (isClosed) { Console.WriteLine("Trying to open site."); ProjectPolicy.OpenProject(targetWeb); Console.WriteLine("Site is now Open! {0}", siteUrl); } Console.WriteLine(); try { targetWeb.Dispose(); } catch { } } }); } }
  • 30. Site Policies in CSOM namespace Microsoft.SharePoint.Client.InformationPolicy { [ScriptType("SP.InformationPolicy.ProjectPolicy", ServerTypeId = "{ec5e0a70-0cc3-408f-a4dc-1bb3495aac75}")] public class ProjectPolicy : ClientObject { [EditorBrowsable(EditorBrowsableState.Never)] public ProjectPolicy(ClientRuntimeContext context, ObjectPath objectPath); [Remote] public static void ApplyProjectPolicy(ClientRuntimeContext context, Web web, ProjectPolicy projectPolicy); [Remote] public static void CloseProject(ClientRuntimeContext context, Web web); [Remote] public static ClientResult<bool> DoesProjectHavePolicy(ClientRuntimeContext context, Web web); [Remote] public static ProjectPolicy GetCurrentlyAppliedProjectPolicyOnWeb(ClientRuntimeContext context, Web web); [Remote] public static ClientResult<DateTime> GetProjectCloseDate(ClientRuntimeContext context, Web web); [Remote] public static ClientResult<DateTime> GetProjectExpirationDate(ClientRuntimeContext context, Web web); [Remote] public static ClientObjectList<ProjectPolicy> GetProjectPolicies(ClientRuntimeContext context, Web web); protected override bool InitOnePropertyFromJson(string peekedName, JsonReader reader); [Remote] public static ClientResult<bool> IsProjectClosed(ClientRuntimeContext context, Web web); [Remote] public static void OpenProject(ClientRuntimeContext context, Web web); [Remote] public static void PostponeProject(ClientRuntimeContext context, Web web); [Remote] public void SavePolicy(); } }
  • 32. Read Site Policies that exist on site private static void ReadProjectPoliciesCsom() { ClientContext policyContext = new ClientContext(siteUrl); Web targetWeb = policyContext.Web; ClientObjectList<ProjectPolicy> projectPolicies = ProjectPolicy.GetProjectPolicies(policyContext, targetWeb); policyContext.Load(projectPolicies); policyContext.ExecuteQuery(); if (projectPolicies != null && projectPolicies.Count > 0) { Console.WriteLine("Project Policies on web {0}", siteUrl); foreach (var item in projectPolicies) { Console.WriteLine("Name: {0}", item.Name); Console.WriteLine("Desc: {0}", item.Description); Console.WriteLine(); } } Console.WriteLine(); }
  • 33. Get Applied Policy private static void GetAppliedPolicyCsom() { ClientContext policyContext = new ClientContext(siteUrl); Web targetWeb = policyContext.Web; ClientResult<bool> isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(policyContext, targetWeb); policyContext.ExecuteQuery(); if (isPolicyApplied.Value) { ProjectPolicy appliedPolicy = ProjectPolicy.GetCurrentlyAppliedProjectPolicyOnWeb(policyContext, targetWeb); policyContext.Load(appliedPolicy); policyContext.ExecuteQuery(); if (appliedPolicy.TypedObject.ServerObjectIsNull != true) { Console.WriteLine("Currently applied Project Policy on web {0}", siteUrl); Console.WriteLine(appliedPolicy.Name); Console.WriteLine(appliedPolicy.Description); } } else { Console.WriteLine("Project Policy is not applied on web {0}", siteUrl); } Console.WriteLine(); }
  • 34. Is Policy Applied? private static void IsPolicyAppliedCsom() { ClientContext policyContext = new ClientContext(siteUrl); Web targetWeb = policyContext.Web; ClientResult<bool> isPolicyApplied = ProjectPolicy.DoesProjectHavePolicy(policyContext, targetWeb); policyContext.ExecuteQuery(); if (isPolicyApplied.Value) { Console.WriteLine("Web has policy applied {0}", siteUrl); } else { Console.WriteLine("Project Policy is not applied on web {0}", siteUrl); } Console.WriteLine(); }
  • 35. Apply Policy private static void ApplyPolicyCsom() { string policyName = "DEVSITE DoNotClose-ReadOnly Policy"; ClientContext policyContext = new ClientContext(siteUrl); targetWeb); Web targetWeb = policyContext.Web; ClientObjectCollection<ProjectPolicy> webPolicies = ProjectPolicy.GetProjectPolicies(policyContext, policyContext.Load(webPolicies); policyContext.ExecuteQuery(); ProjectPolicy selectedPolicy = webPolicies.Where(p => p.Name == policyName).FirstOrDefault(); if (selectedPolicy != null) { ProjectPolicy.ApplyProjectPolicy(policyContext, targetWeb, selectedPolicy); policyContext.ExecuteQuery(); Console.WriteLine("Successfully applied policy '{0}' on web '{1}'", policyName, siteUrl); } Console.WriteLine(); }
  • 36. Get Project Close and Expiration Date private static void GetProjectCloseExpirationDateCsom() { ClientContext policyContext = new ClientContext(siteUrl); Web targetWeb = policyContext.Web; ClientResult<DateTime> closedDate = ProjectPolicy.GetProjectCloseDate(policyContext, targetWeb); ClientResult<DateTime> expirationDate = ProjectPolicy.GetProjectExpirationDate(policyContext, targetWeb); policyContext.ExecuteQuery(); if (closedDate.Value != DateTime.MinValue) { Console.WriteLine("Close Date: {0}", closedDate.Value); } if (expirationDate.Value != DateTime.MinValue) { Console.WriteLine("Expiration Date: {0}", expirationDate.Value); } Console.WriteLine(); }
  • 37. Close Site private static void CloseProjectCsom() { ClientContext policyContext = new ClientContext(siteUrl); Web targetWeb = policyContext.Web; ClientResult<bool> isClosed = ProjectPolicy.IsProjectClosed(policyContext, targetWeb); policyContext.ExecuteQuery(); if (!isClosed.Value) { ProjectPolicy.CloseProject(policyContext, targetWeb); } policyContext.ExecuteQuery(); isClosed = ProjectPolicy.IsProjectClosed(policyContext, targetWeb); policyContext.ExecuteQuery(); if (isClosed.Value) { Console.WriteLine("Project is closed! {0}", siteUrl); } else { Console.WriteLine("Project is NOT closed!"); } Console.WriteLine(); }
  • 38. Resources • http://msdn.microsoft.com/enus/library/microsoft.office.recordsmanagement.informationpolicy.proj ectpolicy_members.aspx • http://technet.microsoft.com/en-us/library/jj219569.aspx • http://blog.dragan-panjkov.com/archive/2013/06/30/creating-sitepolicy-in-sharepoint-2013-using-server-code.aspx • http://blog.dragan-panjkov.com/archive/2013/10/27/configuring-sitepolicy-in-sharepoint-2013-using-server-code.aspx • http://blogs.technet.com/b/tothesharepoint/archive/2013/03/28/sitepolicy-in-sharepoint.aspx • http://stevemannspath.blogspot.com/2012/08/sharepoint-2013-siteretention-getting.html • http://www.booden.net/ProjectPolicy.aspx
  • 40. thank you. SHAREPOINT AND PROJECT CONFERENCE ADRIATICS 2013 ZAGREB, NOVEMBER 27-28 2013