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

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Recently uploaded (20)

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 

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