none
How to include permissions in a site template? OR How to include workflow associations in a content migration package?

    Question

  • An answer to either one of these will solve my problem.
    The situation is that when a site template is used to generate a new web the new web does not have the list level permissions that the templated site did.
    Maybe I am generating my template or new web incorrectly?

    If I use Sharepoint Designer administration functionality I can backup and restore a .cmp file to a new empty web and get the list level permission to
    be in their proper place on the new web but then the workflow associations are not preserved.

    Either approach leaves the configuration of the new site incomplete.

    Is there a web to web copy permission utility?

    • Moved by Mike Walsh FIN Wednesday, May 20, 2009 5:56 PM covers a couple of forums (From:SharePoint - Setup, Upgrade, Administration and Operation)
    Wednesday, May 20, 2009 3:32 PM

Answers

  • Correct answers

    How to include permissions in a site template?  You can't
    How to include workflow associations in a content migration package?  You can't

    How to overcome this

    Build the web that you want to be your save as a template, Site0
    Create a custom list called WorkflowCarrier.
    No need to add any columns to it (but you could), Title is sufficient.
    First item title is Run the PermissionsWorkflow immediately after New Site Creation.
    -this workflow could be attached to any list but it seems to make sense to add some structure to this
    here is one pattern.

    The PermissionsWorkflow is deployed as a feature and built as a
    Sharepoint Sequential Workflow Project from VS2008 with the VSeSS1.3
    Debug it at http://home/Site0
    PermissionWorkflow is Associated to the WorkflowCarrier list, which exists only as a parking spot to house this functionality.
    The workflows history and tasks can be set as any other workflow
    Set the workflow to be started only Manual

    The PermissionsWorkflow can be a single code activity.


            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                SPWeb web = this.workflowProperties.Web;
                SPList list = web.Lists["Invoices"];  // List permissions are what we are concerned with here but a web or list item objects also could be set with RoleAssignments.Add
                SPRoleDefinition RoleDefinition = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                SPRoleAssignment RoleAssignment = new SPRoleAssignment("<domain>\\Accounting", "email", "name", "notes"); //SPRoleAssignment's other overloaded constructor takes SPPrincipal. That seems like a nicer option.

                RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
                if (!list.HasUniqueRoleAssignments)
                {
                    list.BreakRoleInheritance(true);
                }
                list.RoleAssignments.Add(RoleAssignment);
                list.Update();
            }  
      

    Here is a method that could work for List.Item permissions thanks to Pranab Paul's Blog

    http://blogs.msdn.com/pranab/archive/2007/07/04/how-to-set-item-level-permission-for-moss-wss-list-document-library-programmatically.aspx  
      
            public string ItemPermission(string SitePath)
            {
                string ReturnVal = "";
                try
                {
                    SPSite WebApp = new SPSite(SitePath);
                    SPWeb Site = WebApp.OpenWeb();
                    SPList list = Site.Lists["TestDocLib"];
                    SPListItem item = list.Items[0];
                    SPRoleDefinition RoleDefinition = Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
                    SPRoleAssignment RoleAssignment = new SPRoleAssignment("<domain>\\<user>", "email", "name", "notes");

                    RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
                    if (!item.HasUniqueRoleAssignments)
                    {
                        item.BreakRoleInheritance(true);
                    }
                    item.RoleAssignments.Add(RoleAssignment);
                    item.Update();
                }
                catch (Exception ex)
                {
                    ReturnVal += "Permission not set, reason: " + ex.Message;
                }
                return ReturnVal;
            } 
      
    Really that's all there is to it.
    Say you wanted to create Site1 through Site500 your template which is based on Site0 now
    carries a self referencing utility which can apply permissions

    example:
    Vestas may have Site1 through Site500 representing their next 500 wind farm installations.
    For operational management of these installations Vestas has decided to exploit sharepoint.
    Program managers need to have a concept of the invoicing, quoted or sold Engineering changes,
    feasbility costs etc. but so does accounting and sales.
    The project managers are already contributors to all Sites but we don't want accounting
    distracted by the technical specification documention on each Sitexxx, however accounting
    should have access to the Invoices list.
    Each new site creation would take place from the custom template generated from Site0
    and would probably have unique permissions set to
    Site level Owners
    Site level Members
    Site level Visitors
    That leaves http://home free to have a unique (OOTB) Owners, Members, Visitors permissions set
    that won't trickle down to Site1->Siten.

    • Edited by Toomanyhats Friday, May 22, 2009 8:08 PM
    • Marked as answer by Toomanyhats Friday, May 22, 2009 8:29 PM
    Friday, May 22, 2009 7:19 PM

All replies

  • Permissions are not applied via the Site Definition but are often applied via a Site Provisioning WF... You should use VS205 or VS08 please review the example below. However, it sounds like your looking for tools to enable the cut and paste of SecurityACLs...

    Tools
    Security Explorer for SharePoint is a powerful, graphical solution for real-time management of SharePoint that dramatically simplifies SharePoint security with a full tree view of the SharePoint site, point-and-click permissions management, search, and backup and recovery of permissions. http://www.scriptlogic.com/products/security-explorer/sharepoint/

    or

    Universal SharePoint Manager v2007 enables enterprises to administer and manage thier SharePoint environments and focus on the key areas of burden.  Universal SharePoint Manager v2007 features turn SharePoint administration and support tasks from Days into Hours and Hours into Minutes! http://www.idevfactory.com/products/uspm2007/

    WorkFlow Example:

    Your WorkFlow.CS would look something like the example below,....
    using System;
    
    using System.ComponentModel;
    
    using System.ComponentModel.Design;
    
    using System.Collections;
    
    using System.Drawing;
    
    using System.Workflow.ComponentModel.Compiler;
    
    using System.Workflow.ComponentModel.Serialization;
    
    using System.Workflow.ComponentModel;
    
    using System.Workflow.ComponentModel.Design;
    
    using System.Workflow.Runtime;
    
    using System.Workflow.Activities;
    
    using System.Workflow.Activities.Rules;
    
    using System.Xml.Serialization;
    
    using System.Xml;
    
    using Microsoft.SharePoint;
    
    using Microsoft.SharePoint.WorkflowActions;
    
    
    
    namespace CreateTeamSiteWorkflow
    
    {
    
        public sealed partial class Workflow1 : SequentialWorkflowActivity
    
        {
    
            public Workflow1()
    
            {
    
                InitializeComponent();
    
            }
    
    
    
            public Guid workflowId = default(System.Guid);
    
            public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties = new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();
    
    
    
            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    
            {
    
                try
    
                {
    
                    SPListItem item = workflowProperties.Item;
    
                    string title = item["Title"].ToString();
    
                    string url = item["URL"].ToString();
    
                    if (url.StartsWith(@"/"))
    
                        url = url.Remove(0, 1);
    
                    if (url.EndsWith(@"/"))
    
                    {
    
                        int index = url.LastIndexOf(@"/");
    
                        url = url.Remove(index);
    
                    }
    
    
    
                    string description = String.Empty;
    
                    object descr = item["Description"];
    
                    if (descr != null)
    
                        description = descr.ToString();
    
    
    
                    //user
    
                    SPUserCollection ucol = workflowProperties.Web.AllUsers;
    
                    SPUser currentUser = null;
    
    
    
                    string cUser = item["Created By"].ToString();
    
                    int ind = cUser.IndexOf(";");
    
                    if (ind > -1)
    
                        cUser = cUser.Remove(0, ind + 2);
    
                    foreach (SPUser u in ucol)
    
                    {
    
                        if (u.Name == cUser)
    
                        {
    
                            currentUser = u;
    
                            break;
    
                        }
    
                    }
    
    
    
                    SPWebCollection coll = workflowProperties.Web.Webs;
    
    
    
    
    
                    SPWeb newWeb = coll.Add(url, title, description, 1033, "sts#0", true, false);
    
                    newWeb.Navigation.UseShared = true;
    
    
    
                    //owners
    
                    newWeb.SiteGroups.Add(title + " - Owners", currentUser, currentUser, "Owners");
    
                    SPGroup grOwners = GetSiteGroup(newWeb, title + " - Owners");
    
                    newWeb.Properties["vti_associateownergroup"] = grOwners.ID.ToString();
    
                    AssignLink(grOwners, string.Format("Use this group to give people full control permissions to the SharePoint site: <a href=\"{0}\">{1}</a>",
    
                        newWeb.ServerRelativeUrl, title));
    
                    SPUserCollection uc = newWeb.Users;
    
                    AssignPermissions(newWeb, grOwners, "Full Control");
    
                    grOwners.AddUser(currentUser);
    
    
    
                    //members
    
                    newWeb.SiteGroups.Add(title + " - Members", currentUser, currentUser, "Members");
    
                    SPGroup grMembers = GetSiteGroup(newWeb, title + " - Members");
    
                    newWeb.Properties["vti_associatemembergroup"] = grMembers.ID.ToString();
    
                    AssignLink(grMembers, string.Format("Use this group to give people contribute permissions to the SharePoint site: <a href=\"{0}\">{1}</a>",
    
                            newWeb.ServerRelativeUrl, title));
    
                    AssignPermissions(newWeb, grMembers, "Contribute");
    
    
    
                    //visitors
    
                    newWeb.SiteGroups.Add(title + " - Visitors", currentUser, null, "Visitors");
    
                    SPGroup grVisitors = GetSiteGroup(newWeb, title + " - Visitors");
    
                    newWeb.Properties["vti_associatevisitorgroup"] = grVisitors.ID.ToString();
    
                    AssignLink(grVisitors, string.Format("Use this group to give people read permissions to the SharePoint site: <a href=\"{0}\">{1}</a>",
    
                            newWeb.ServerRelativeUrl, title));
    
                    AssignPermissions(newWeb, grVisitors, "Read");
    
    
    
                    //set up groups
    
                    newWeb.Properties["vti_associategroups"] = grVisitors.ID.ToString() + ";" +
    
                        grMembers.ID.ToString() + ";" + grOwners.ID.ToString();
    
                    newWeb.Properties.Update();
    
    
    
    
    
                    //create WIKI subsite
    
                    SPWebCollection newColl = newWeb.Webs;
    
                    SPWeb wikiWeb = newColl.Add("wiki", title + " - Wiki", "", 1033, "WIKI", false, false);
    
                    wikiWeb.Navigation.UseShared = true;
    
    
    
                    //create BLOG subsite
    
                    SPWeb blogWeb = newColl.Add("blog", title + " - Blog", "", 1033, "BLOG", false, false);
    
                    blogWeb.Navigation.UseShared = true;
    
    
    
                }
    
            }
    
            private SPGroup GetSiteGroup(SPWeb web, string name)
    
            {
    
                foreach (SPGroup group in web.SiteGroups)
    
                    if (group.Name.ToLower() == name.ToLower())
    
                        return group;
    
                return null;
    
            }
    
            private void AssignLink(SPGroup group, string about)
    
            {
    
                SPWeb root = workflowProperties.Site.RootWeb;
    
                SPList userInformation = root.Lists["User Information List"];
    
                SPQuery query = new SPQuery();
    
    
    
                query.Query = string.Format("<Where><Eq><FieldRef Name='ID'/><Value Type='Text'>{0}</Value></Eq></Where>",
    
                    group.ID.ToString());
    
                SPListItemCollection items = userInformation.GetItems(query);
    
                if ((items != null) && (items.Count == 1))
    
                {
    
                    SPListItem item = items[0];
    
                    item["About me"] = about;
    
                    item.Update();
    
                }
    
            }
    
            private void AssignPermissions(SPWeb web, SPGroup group, string perm)
    
            {
    
                SPRoleAssignment assignment = new SPRoleAssignment(group);
    
                SPRoleDefinition role = web.RoleDefinitions[perm];
    
                assignment.RoleDefinitionBindings.Add(role);
    
                web.RoleAssignments.Add(assignment);
    
            }
    
        }
    
    
    
    }
    
    

    -Ivan

    All code is provided as is and without warranty of any kind
    Ivan Sanders http://linkedin.com/in/iasanders http://dimension-si.com/blog
    Wednesday, May 20, 2009 5:02 PM
  • Ivan, what do you think - is this something that should go in the Workflow forum or not ?

    Most of your reply seems to be dealing with the Workflow aspect of it.

    Mike


    P.S. (and off-topic) Thanks for marking a post that I recently unmarked because it was self-proposed. Good to see the system (of other people proposing good posts rather than the writer) is working.

    WSS FAQ sites: http://wssv2faq.mindsharp.com and http://wssv3faq.mindsharp.com
    Total list of WSS 3.0 / MOSS 2007 Books (including foreign language) http://wssv3faq.mindsharp.com/Lists/v3%20WSS%20FAQ/V%20Books.aspx
    Wednesday, May 20, 2009 5:14 PM
  • Hey Mike,

    Its up to you, I included the tools also... But I love WF & never get down to that Forum, I seem to get stuck at the top of the list so its cool with me & we may get a few more comments....



    -Ivan


    Ivan Sanders http://linkedin.com/in/iasanders http://dimension-si.com/blog
    Wednesday, May 20, 2009 5:26 PM
  • OK. Thanks Ivan. I'll move it to General (!). 

    It's asking for tools (= General) and it covers more than one area (=general (just))

    Mike

    WSS FAQ sites: http://wssv2faq.mindsharp.com and http://wssv3faq.mindsharp.com
    Total list of WSS 3.0 / MOSS 2007 Books (including foreign language) http://wssv3faq.mindsharp.com/Lists/v3%20WSS%20FAQ/V%20Books.aspx
    Wednesday, May 20, 2009 5:55 PM
  • Thanks for the answer but can you give me a few hints to translate it into the the sharepoint dialect that I wrote the question in?

    You mention site definitions and provisioning,
    I mentioned site templates and backup and restore of a content management package.

    These are probably functionally close to the same thing.


    As seen below each approach has a core limitation,

    Sitetemplate
    PRO
    structure, content, VS2008 workflow list association
    CON
    permissions

    .cmp
    PRO
    structure, content, permissions
    CON
    VS2008 workflow list association 

    Backup and Restore (.cmp file)  Use this feature when you want to make a backup copy of an entire site or subsite, or when you want to move an entire site or subsite to another server or location. Unlike Web packages, content migration packages include list data, and you cannot choose to include only specific site elements. Note that you may lose some customizations or settings in the process. For example, the backup file does not include workflows, alerts, and properties stored at the site collection level. The backup file also does not include the Recycle Bin state or objects inside it. To use Backup and Restore, you must have administrator permissions to that site.

    Site Template (.stp file)  Use this feature when you want to create multiple Web sites that start with the same base content or site structure. For example, you may want all of the subsites created on a site to have a similar site structure, look and feel, and even content. You can do this by saving a site as a site template and adding it to the Site Template Gallery so that anyone can use the site as a template. Unlike Web packages, site templates can include list data. You must have both administrator permissions to the Web site where you want to create the site template and write access to Site Template Gallery. 




    WRT your code

    Which list is the workflow you coded associated to?
    Where does it reference a copy of the site that already exists? (or template) Otherwise by scratch seems a massive effort.

    But it gave me an idea that I can build a PermissionsWorkflow in the site template that is associated to a list whose sole purpose to to carry that
    workflow. Using workflowProperties.Web I could gain reference to the newly created web and then set the pemissions to the lists and libraries
    contained in that .Web. I could set this workflow to run manual and right after create new site from template I could go to that new web
    and kickoff the workflow.

    cut and paste of SecurityACLs?
    if that is how someone has solved it, fine?
    I would then apply that after new web creation with a site template.
    But I would rather they were preseved in the site template or the content migration package.

    thanks very much

    Wednesday, May 20, 2009 7:03 PM
  • My last question got marked as answered and I gues it was. If I wanted to buy a $1500 third party solution.

    An answer to either one of these (questions in the subject edit) will solve my problem.
    The situation is that when a site template is used to generate a new web the new web does not have the list level permissions that the templated site did.
    Maybe I am generating my template or new web incorrectly?

    If I use Sharepoint Designer administration functionality I can backup and restore a .cmp file to a new empty web and get the list level permission to
    be in their proper place on the new web but then the workflow associations are not preserved.

    Either approach leaves the configuration of the new site incomplete.

    Is there a web to web copy permission utility? (pointing to an add is not an answer)
    • Merged by Mike Walsh FIN Thursday, May 21, 2009 5:56 AM same poster; same Title; different forum
    Thursday, May 21, 2009 4:24 AM
  • If you don't like the answer you have got so far, carry on in the old thread. (You as original poster can unmark an answer).

    Don't start another thread with an identical Title and (apart from the first line) identical Content and especially don't do this in a different forum.

    (Moderator)

    WSS FAQ sites: http://wssv2faq.mindsharp.com and http://wssv3faq.mindsharp.com
    Total list of WSS 3.0 / MOSS 2007 Books (including foreign language) http://wssv3faq.mindsharp.com/Lists/v3%20WSS%20FAQ/V%20Books.aspx
    Thursday, May 21, 2009 5:59 AM
  • Mike your a work.a.holic, lol...

    In summary to your questions:
    The wonderful thing about SharePoint specifically and application development generally, is the sense of community that supports you and encourages you to invent solutions to solve problems and hey I love my job. The best advice is that when anyone replies to your Questions with Answers, you perform the research necessary to understand the material provided. Currently, I am not working with either of the companies listed previously. However, I did work with the folks that developed SharePoint Security Explorer, prior to the purchase of Scriptlogic by Quest. Also, instead of asking additional questions, shouldnt you and your team review free evaluations of the tools and see if you can find any additional information, then ping back with a request for additional information or the ability to make an informed decision.. I have used both of the Tools, they are both Elegant, Easy to Install and use but dont take my word for it, install the Evals....


    What List - Any List that has Title and URL

    SPListItem item = workflowProperties.Item;
    string title = item["Title"].ToString();
    string url = item["URL"
    ].ToString();
    if (url.StartsWith(@"/"))
    url = url.Remove(0, 1);
    if (url.EndsWith(@"/"))

    You should want to understand the differences between SiteTemplates / SiteDefinitions (Google), the ramifications of using backup and restore as a method to move dev to prod, at least spend the time to learn the stsadm commands to backup and restore...

    Question what Site Definition? STS#0
    SPWebCollection coll = workflowProperties.Web.Webs;
    SPWeb newWeb = coll.Add(url, title, description, 1033, "sts#0", true, false);


    Question What Tools will copy permissions?
    The two Tools I recommended earlier are the best. However, you may be able find a couple of additional ones but they may not be as elegant but they are cheap. Oh what the ____ Bamboo Solutions has one that would solve all of your issues, lol.... I wont provide a link I, I dont want you to think Im advertizing...


    Neither Site Defintions or Templates contain security information.

    I hope this helps, take a little time and do your homework based on the informationprovided by this forum in general & hey if Im wrong give back and show me.... that way everyone grows...



    Cheers,

    -Ivan




    Ivan Sanders http://linkedin.com/in/iasanders http://dimension-si.com/blog
    Thursday, May 21, 2009 7:34 AM
  • Thanks Mike for handling and explaining how to keep a thread alive. It is not that I didn't like the answer, it reduced the scope to something
    trivial, which it isn't.

    Diagramed like this you can conceptualize the web reproduction fidelity hurdles.

    Sitetemplate
    PRO
    structure, content, VS2008 workflow list association
    CON
    permissions

    .cmp
    PRO
    structure, content, permissions
    CON
    VS2008 workflow list association 


    http:/home/Site0
    should make exact clones of itself
    at
    http:/home/Site1
    http:/home/Site2
    http:/home/Site3


    So with all of the years of development of sharepoint and all of the millions of man hours put into wrangling the framework
    there still exists this gap. Hence the third party solutions. 
    I know others out there have faced this and can give me clues how to solve it.

    I highly doubt this is an original idea...I will persue it but have my doubts as to if it will work.

    build a PermissionsWorkflow in the site template that is associated to a list whose sole purpose to to carry that
    workflow. Using workflowProperties.Web I could gain reference to the newly created web and then set the pemissions to the lists and libraries
    contained in that .Web. I could set this workflow to run manual and right after create new site from template I could go to that new web
    and kickoff the workflow.


    Chris O'Brien's project http://spdeploymentwizard.codeplex.com/ may help me.

    I'll just run along and do my homework and solve this where it appears that the whole sharepoint universe has so far failed.  ;-)

    Thursday, May 21, 2009 1:32 PM
  • Correct answers

    How to include permissions in a site template?  You can't
    How to include workflow associations in a content migration package?  You can't

    How to overcome this

    Build the web that you want to be your save as a template, Site0
    Create a custom list called WorkflowCarrier.
    No need to add any columns to it (but you could), Title is sufficient.
    First item title is Run the PermissionsWorkflow immediately after New Site Creation.
    -this workflow could be attached to any list but it seems to make sense to add some structure to this
    here is one pattern.

    The PermissionsWorkflow is deployed as a feature and built as a
    Sharepoint Sequential Workflow Project from VS2008 with the VSeSS1.3
    Debug it at http://home/Site0
    PermissionWorkflow is Associated to the WorkflowCarrier list, which exists only as a parking spot to house this functionality.
    The workflows history and tasks can be set as any other workflow
    Set the workflow to be started only Manual

    The PermissionsWorkflow can be a single code activity.


            private void codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                SPWeb web = this.workflowProperties.Web;
                SPList list = web.Lists["Invoices"];  // List permissions are what we are concerned with here but a web or list item objects also could be set with RoleAssignments.Add
                SPRoleDefinition RoleDefinition = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                SPRoleAssignment RoleAssignment = new SPRoleAssignment("<domain>\\Accounting", "email", "name", "notes"); //SPRoleAssignment's other overloaded constructor takes SPPrincipal. That seems like a nicer option.

                RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
                if (!list.HasUniqueRoleAssignments)
                {
                    list.BreakRoleInheritance(true);
                }
                list.RoleAssignments.Add(RoleAssignment);
                list.Update();
            }  
      

    Here is a method that could work for List.Item permissions thanks to Pranab Paul's Blog

    http://blogs.msdn.com/pranab/archive/2007/07/04/how-to-set-item-level-permission-for-moss-wss-list-document-library-programmatically.aspx  
      
            public string ItemPermission(string SitePath)
            {
                string ReturnVal = "";
                try
                {
                    SPSite WebApp = new SPSite(SitePath);
                    SPWeb Site = WebApp.OpenWeb();
                    SPList list = Site.Lists["TestDocLib"];
                    SPListItem item = list.Items[0];
                    SPRoleDefinition RoleDefinition = Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
                    SPRoleAssignment RoleAssignment = new SPRoleAssignment("<domain>\\<user>", "email", "name", "notes");

                    RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
                    if (!item.HasUniqueRoleAssignments)
                    {
                        item.BreakRoleInheritance(true);
                    }
                    item.RoleAssignments.Add(RoleAssignment);
                    item.Update();
                }
                catch (Exception ex)
                {
                    ReturnVal += "Permission not set, reason: " + ex.Message;
                }
                return ReturnVal;
            } 
      
    Really that's all there is to it.
    Say you wanted to create Site1 through Site500 your template which is based on Site0 now
    carries a self referencing utility which can apply permissions

    example:
    Vestas may have Site1 through Site500 representing their next 500 wind farm installations.
    For operational management of these installations Vestas has decided to exploit sharepoint.
    Program managers need to have a concept of the invoicing, quoted or sold Engineering changes,
    feasbility costs etc. but so does accounting and sales.
    The project managers are already contributors to all Sites but we don't want accounting
    distracted by the technical specification documention on each Sitexxx, however accounting
    should have access to the Invoices list.
    Each new site creation would take place from the custom template generated from Site0
    and would probably have unique permissions set to
    Site level Owners
    Site level Members
    Site level Visitors
    That leaves http://home free to have a unique (OOTB) Owners, Members, Visitors permissions set
    that won't trickle down to Site1->Siten.

    • Edited by Toomanyhats Friday, May 22, 2009 8:08 PM
    • Marked as answer by Toomanyhats Friday, May 22, 2009 8:29 PM
    Friday, May 22, 2009 7:19 PM
  • Congratulation Toomy.....  You shouold choose it as the answer to the question, moderatores ususly get upset..... But Congratiulations again, your thought process is so ,mych more coherent on tyhe subject.... It was fun huh? When I first started writing them a few years ago, this was an exampke of opne of my first. I tpp that and created a list of all available features on a site and a l;ist of all available site definitions and allowed the user through Managing the List te Coould Create the site, sub Site and all of the document libraries and lists, its ppretty cool....


    Have a Fun Memorial Weekend :)


    Cheers,

    -Ivan
    Ivan Sanders http://linkedin.com/in/iasanders http://dimension-si.com/blog
    Sunday, May 24, 2009 10:49 AM
  • Thanks Ivan, I thought you had mentioned somewhere that security is taken care of in a workflow?
    Like I said that gave me the idea. It was seeing the correct workflow abstraction and wrangling after that;
    however the words were getting in the way.

    Provisioning, site definition, site template, web, site, multiply by 3 because each customizing tool uses a sublte different dialect.
    This goes back to the beginning I guess. "Extend the virtual server" that was some pretty freaky double talk back then and has set a pattern that endures to this day.

    And as you mention the extensibility through lists and features is a natural.
    I wanted to keep the Solution explaination very direct. Lots of time for comment now. Like below. (hee hee)

    Truely at this moment in time there is no support for the same parent exact replication of a site under a different name.
    Would it be a copy, a clone, a template??? Someone will invent a Sharepoint word for it. This permissionsWorkflow in template workaround
    is the way to beat that limitation.

    In a high concept sense, sharepoint examples, documentantion and functionality, may be flawed in a lot of ways.
    I'm not sure but, it seems to me an Accounting Site, or a Sales Site makes little sense. Many companies have Accounting or Sales
    people or departments but they exist to support the companies true product. So in the case of Vestas, wind farm installations
    could be their product (a logical object). Sharepoint sites should be structured as parts of that value stream.
    Both physically (build and deploy windmills to a certain location) and informationally.

    That is really what this topic is about, the value stream site template and the enterprise permissions that allow structured deployment to each discreate instance of
    value (production, thinking, making money, selling whatever).

    Tuesday, May 26, 2009 3:38 PM