?
Solved

UnauthorizedAccess Exception: When copying Sharepoint 2010 list item

Posted on 2011-02-25
4
Medium Priority
?
2,004 Views
Last Modified: 2012-05-11
I am looking for assistance to resolve an exception being thrown when I attempt to copy an
added Blog list item from one Sharepoint WebApplication/ContenctDB(Webapp0) to a Blog list on a different Sharepoint WebApplication(Webapp1).  The exception raised is
System.UnauthorizedAccessException, however I am the primary adminstrator for both sites,
plus I am executing the code using RunWithElevatedPrivileges.  Help decyphering the error
would be appreicated.

I have attached the code.

The Exception being thrown is:

Error loading and running event receiver CopyBlogListItem.CopyBlogListItem in CopyBlogListItem,
Version = 1.0.0.0,  Culture=neutral, PublicKeyToken=ac27c065e1c5c56b.
Additional information is below.

: CopyBlogListItem, SPSecurity.RunWithElevatedPrivileges(copyListItem):
Exception: [System.Exception: CopyBlogListItem, targetItem.Update():
Exception: [System.UnauthorizedAccessException:
                  <nativehr>0x80070005</nativehr>
                  <nativestack></nativestack>
   at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem
             (String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate,
               Boolean bPreserveItemVersion, Boolean bUpdateNoVersion, Int32& plID,
               String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion,
               Object& pvarAttachmentNames, Object& pvarAttachmentContents,
               Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bMigration,
               Boolean bPublish, String bstrFileName,
               ISP2DSafeArrayWriter pListDataValidationCallback,
               ISP2DSafeArrayWriter pRestrictInsertCallback,
               ISP2DSafeArrayWriter pUniqueFieldCallback)
   at Microsoft.SharePoint.SPListItem.AddOrUpdateItem
               (Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion,
                Boolean bNoVersion, Boolean bMigration, Boolean bPublish,
                Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32& ulID,
                Object& objAttachmentNames, Object& objAttachmentContents,
                Boolean suppressAfterEvents, String filename)
   at Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem,
                 Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration,
                 Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin,
                 Boolean suppressAfterEvents, String filename)
   at Microsoft.SharePoint.SPListItem.Update()
   at CopyBlogListItem.CopyBlogListItem.copyListItem()].
   at CopyBlogListItem.CopyBlogListItem.copyListItem()
   at Microsoft.SharePoint.SPSecurity.<>c__DisplayClass4.<RunWithElevatedPrivileges>b__2()
   at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess
                 (CodeToRunElevated secureCode)
   at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges
                 (WaitCallback secureCode, Object param)
   at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges
                 (CodeToRunElevated secureCode)
   at CopyBlogListItem.CopyBlogListItem.ItemAdded(SPItemEventProperties properties)].
namespace CopyBlogListItem
{
    public class CopyBlogListItem : SPItemEventReceiver
    {

        // Local variable to contain data passed in from sharepoint
        private SPItemEventProperties _properties;

        // Method called after a new item has been added
        public override void ItemAdded(SPItemEventProperties properties)
        {
            // set up a log file
            log = new HTMLFileLogging(c_logFileFolder, string.Format(LogFileName, properties.ListTitle, properties.OpenWeb().Title), true, false);
            // run under system account
            this.WriteToLog("ItemAdded: Executing Event Handler", true);

            _properties = properties;
            this.WriteToLog("ItemAdded: Properties Set", true);
            try
            {
                SPSecurity.RunWithElevatedPrivileges(copyListItem);
            }
            catch (Exception e)
            {
                throw new Exception("CopyBlogListItem, SPSecurity.RunWithElevatedPrivileges(copyListItem): Exception: [" + e.ToString() + "].");
            }
            this.WriteToLog("ItemAdded: Event Handler Complete", true);
            
        }
        private void copyListItem()
        {

            //Step 0: get a handle to the item that raised the event
            this.WriteToLog("copyListItem: Get handle to item", true);
            SPListItem item = _properties.ListItem;

            //step 1: Check category property to determine receiving site.
            //***initialize targetURL***
            this.WriteToLog("copyListItem: Initializing targetURL", true);
            this.WriteToLog("copyListItem: Item Category is " + item["Category"] + ".", true);
            string targetURL = "0";
            string targetCategory = "";
            if (item["Category"].ToString() == "1;#Energy Conservation")
            {
                this.WriteToLog("copyListItem: Match on Energy Conservation", true);
                targetURL = "http://Webapp1:8083/blog/";
                targetCategory = "1;#Energy Conservation";
            }
            this.WriteToLog("copyListItem: targetURL Set", true);

            // Open the site if targetURL is set
            if (targetURL != "0")
            {
                this.WriteToLog("copyListItem: Preparing to open targetSite", true);
                using (SPSite targetSite = new SPSite(targetURL))
                {
                    using (SPWeb targetWeb = targetSite.OpenWeb())
                    {
                        this.WriteToLog("copyListItem: targetSite Opened", true);
                        
                        //Step 2: Set target list to receive new item
                        this.WriteToLog("copyListItem: Setting targetList", true);
                        SPList targetList = targetWeb.Lists["Posts"];

                        //Step 3: Initialize target list to receive copy of new item
                        this.WriteToLog("copyListItem: Initializing targetList", true);
                        SPListItem targetItem = targetList.Items.Add();

                        //Step 4: Initialize item properties on target list.
                        this.WriteToLog("copyListItem: Initializing targetItem", true);
                        targetItem["Location"] = item["Location"].ToString();
                        targetItem["Title"] = item["Title"].ToString();
                        targetItem["Body"] = item["Body"].ToString();
                        targetItem["Category"] = targetCategory.ToString();
                        targetItem["Published"] = System.DateTime.Now;
                        this.WriteToLog("copyListItem: Update targetItem", true);
                        try
                        {
                            targetItem.Update();
                        }
                        catch (Exception e)
                        {
                            this.WriteToLog("ERROR(targetItem.Update):" + e.Message.ToString(), true);
                            throw new Exception("CopyBlogListItem, targetItem.Update(): Exception: [" + e.ToString() + "].");
                        }
                    }
                }
            }
            this.WriteToLog("copyListItem: Sub-Process Complete", true);
        }
   }
}

Open in new window

0
Comment
Question by:HAcalahan
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 

Author Comment

by:HAcalahan
ID: 34985158
Updated question
0
 

Author Comment

by:HAcalahan
ID: 34985172
Added C# zone
0
 
LVL 3

Accepted Solution

by:
KetGuru earned 2000 total points
ID: 34995993
.
We had similar stuff and we tried that way but we have found that to run full method copylistitem under elevatedprevilages is not sufficient. so there are two thing you will have to do.

1. User elevated previlages at the time of targetItem.Update(); only if possible.
or
2. use impersonation for entire Copylistitem method.


0
 

Author Closing Comment

by:HAcalahan
ID: 35011425
Option 2: Impersonation worked great.   Thank you.
0

Featured Post

Veeam Task Manager for Hyper-V

Task Manager for Hyper-V provides critical information that allows you to monitor Hyper-V performance by displaying real-time views of CPU and memory at the individual VM-level, so you can quickly identify which VMs are using host resources.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
A recent project that involved parsing Tableau Desktop and Server log files to extract reusable user queries for use in other systems. I chose to use PowerShell to gather the data, and SharePoint to present it...
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question