Question

I have an event receiver that creates 13 subfolders automatically when a folder is created by user. The code below can do this and everything is ok when the Administrator account creates the folder. But when it comes to other users, the subfolders are not created whitout any error.

public override void ItemAdded(SPItemEventProperties properties)
{
    base.ItemAdded(properties);
    SPWeb web = properties.OpenWeb();
    web.AllowUnsafeUpdates = true;
    SPDocumentLibrary docLib = (SPDocumentLibrary)web.List[properties.ListId];
    if (properties.ListItem.ContentType.Name == "Folder"
        && properties.ListItem.Folder.ParentFolder.ToString().ToLower().EndsWith("opportunity"))
    {
        String url = properties.ListItem.ParentList.RootFolder.ServerRelativeUrl.ToString();
        SPFolder libFolder = properties.ListItem.Folder;
        string newFolderUrl = (web.Url + "/" + libFolder.ToString());
        foreach (string subfolder in folders)
        {
            SPListItem newFolder = docLib.Items.Add(newFolderUrl, SPFileSystemObjectType.Folder, subfolder);
            newFolder.Update();
        }
    }
}

I read many posts about elevating SPSite and SPWeb and wrote a code to elevate the objects before I create subfolders. However the code below doesn't work:

public override void ItemAdded(SPItemEventProperties properties)
{
    Guid siteId = properties.SiteId;
    Guid webId = properties.OpenWeb().ID;
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        using (SPSite elevatedSite = new SPSite(siteId))
        {
            using (SPWeb web = elevatedSite.OpenWeb(webId))
            {
                base.ItemAdded(properties);
                web.AllowUnsafeUpdates = true;
                SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists[properties.ListId];
                if (properties.ListItem.ContentType.Name == "Folder"
                     && properties.ListItem.Folder.ParentFolder.ToString().ToLower().EndsWith("opportunity"))
                {
                    String url = properties.ListItem.ParentList.RootFolder.ServerRelativeUrl.ToString();
                    SPFolder libFolder = docLib.RootFolder.SubFolders[properties.ListItem.Name];
                    SPFolder libFolder = properties.ListItem.Folder;

                    string newFolderUrl = (web.Url + "/" + libFolder.ToString());
                    foreach (string subfolder in folders)
                    {
                        SPListItem newFolder = docLib.Items.Add(newFolderUrl, SPFileSystemObjectType.Folder, subfolder);
                        newFolder.Update();
                    }
              }
              web.AllowUnsafeUpdates = false;
            }
         }
    });
} 

Can anybody help to solve the problem? Note that all the users are home members and can create folders manually.

No correct solution

OTHER TIPS

Try to place your call to ItemAdding.

ItemAdding is called while method is called (synchronously with current logged in user) and ItemAdded is called after the method is executed - asynchronously with SharePoint\System user, which normally is a worker process.

Maybe this will help.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top