0

J'ai la collection de sites SharePoint 2013 appelé « site1 »exception UnauthorizedAccessException dans ItemAdded et gestionnaire Mise à jour dans le récepteur d'événements

j'ai une liste et une bibliothèque de documents dans cette collection de sites, j'écrit un récepteur d'événements pour déplacer la liste pièce jointe dans la bibliothèque de documents et après avoir déplacé la pièce jointe de l'élément de liste je mets à jour un classé dans cette liste avec l'URL de ce document après que je supprime le formulaire de pièce jointe cet élément de la liste. Voici le code que je utilise

public override void ItemAdded(SPItemEventProperties properties) 
    { 
     base.ItemAdded(properties); 

     this.EventFiringEnabled = false; 


     if (properties.List.Title.Equals("ListName", StringComparison.CurrentCultureIgnoreCase)) 
     { 
      try 
      { 
       SPSecurity.RunWithElevatedPrivileges(delegate() 
       {      
        MoveAttachments(properties); 
        DeleteAttachments(properties);       
       }); 
       properties.ListItem.Update(); 
      } 
      catch (Exception ex) 
      { 
       CreateLog.Create(ex.StackTrace); 
       CreateLog.Create(ex.Message); 
      } 

     } 

     this.EventFiringEnabled = true; 
    } 

public override void ItemUpdated(SPItemEventProperties properties) 
    { 
     base.ItemUpdated(properties); 
     this.EventFiringEnabled = false; 
     if (properties.List.Title.Equals("ListName", StringComparison.CurrentCultureIgnoreCase)) 
     { 
      try 
      { 
       SPSecurity.RunWithElevatedPrivileges(delegate() 
       { 
        MoveAttachments(properties); 
        DeleteAttachments(properties); 
       }); 
       properties.ListItem.Update(); 
      } 
      catch (Exception ex) 
      { 
       CreateLog.Create(ex.StackTrace); 
       CreateLog.Create(ex.Message); 
      } 
     } 


     this.EventFiringEnabled = true; 
    } 

public void MoveAttachments(SPItemEventProperties properties) 
    { 
     string siteURL = properties.Web.Url; 
     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      using (SPSite tSite = new SPSite(siteURL)) 
      { 
       using (SPWeb tWeb = tSite.OpenWeb()) 
       { 
        //Move Hiring Req Attachments 
        if (properties.List.Title.Equals("ListName", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         try 
         { 
          SPList docDestination = tWeb.Lists["LibraryName"]; 
          SPFolder fldRoot = tWeb.Folders[docDestination.Title]; 
          SPFileCollection flColl = null; 
          SPList list = tWeb.Lists["ListName"]; 
          SPListItem listItem = properties.ListItem; 

          if (listItem.Attachments != null && listItem.Attachments.Count > 0) 
          { 
           foreach (String strName in listItem.Attachments) 
           { 
            flColl = fldRoot.Files; 
            SPListItem listtem = docDestination.Items.Add(); 
            SPFile FileCopy = listItem.ParentList.ParentWeb.GetFile(listItem.Attachments.UrlPrefix + strName); 
            string extention = FileCopy.Name.Substring(FileCopy.Name.LastIndexOf('.')); 
            string fileName = listItem["Title"].ToString().Replace(" ", "_"); 

            string buildfilename = fileName + extention; 
            string destFile = flColl.Folder.Url + "/" + buildfilename; 
            byte[] fileData = FileCopy.OpenBinary(); 
            SPFile flAdded = flColl.Add(destFile, fileData, tWeb.CurrentUser, tWeb.CurrentUser, Convert.ToDateTime(listItem[SPBuiltInFieldId.Created]), Convert.ToDateTime(listItem[SPBuiltInFieldId.Modified])); 
            SPListItem item = flAdded.Item; 
            item[SPBuiltInFieldId.Created] = Convert.ToDateTime(listItem[SPBuiltInFieldId.Created]); 
            item[SPBuiltInFieldId.Modified] = Convert.ToDateTime(listItem[SPBuiltInFieldId.Modified]); 

            flAdded.Item.Update(); 

            listItem["DocumentURL"] = siteURL + "/" + item.Url; 
            listItem.Update(); 
           } 
          } 
         } 
         catch (Exception ex) 
         { 
          CreateLog.Create(ex.StackTrace); 
          CreateLog.Create(ex.Message); 
         } 
        } 
       } 
      }      
     }); 

    } 


public void DeleteAttachments(SPItemEventProperties properties) 
    { 
     string siteURL = properties.Web.Url; 

     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      using (SPSite tSite = new SPSite(siteURL)) 
      { 
       using (SPWeb tWeb = tSite.OpenWeb()) 
       { 

        if (properties.List.Title.Equals("ListName", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         try 
         { 
          SPListItem listItem = properties.ListItem; 

          List<string> fileNames = new List<string>(); 

          if (listItem["Attachments"] != null) 
          { 
           foreach (string fileName in listItem.Attachments) 
           { 
            fileNames.Add(fileName); 
           } 
           foreach (string fileName in fileNames) 
           { 
            SPSecurity.RunWithElevatedPrivileges(delegate() 
            { 
             listItem.Attachments.Delete(fileName); 
            }); 
           } 
          } 
          listItem.Update(); 
         } 
         catch (Exception ex) 
         { 
          CreateLog.Create(ex.StackTrace); 
          CreateLog.Create(ex.Message); 
         } 
        } 
       } 
      } 
     }); 
    } 

Je dois groupe sharepoint appelé groupe contributeur « contributeurs » et « utilisateurs » ont le groupe d'autorisations editwithoutdelete et les utilisateurs ont seulement ajouter des autorisations à cette liste. Lorsque les membres du groupe de contributeurs ont ajouté l'élément de liste, le code fonctionne correctement, mais lorsque les membres du groupe d'utilisateurs ont ajouté l'élément de liste, l'erreur ci-dessous est générée.

at Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException ex) at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, 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, Boolean bPreserveItemUIVersion) 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, Boolean bPreserveItemUIVersion) at Microsoft.SharePoint.SPListItem.Update() at TA.Tech360.HD.HiringReqEventReciever.HiringReqEventReciever.<>c_DisplayClass24.b_23()-------->8/11/2013 7:03:23 AM

0x80070005-------->8/11/2013 7:03:23 AM

peut me aider.

merci d'avance.

Répondre

2

Vous devez obtenir tout ce que vous mettez à jour à partir du Web surélevé. Dans MoveAttachments et méthodes DeleteAttachments, modifiez la ligne suivante:

SPListItem listItem = properties.ListItem; 

qui récupère le listItem PAS en tant qu'administrateur mais comme l'utilisateur actuel (qui n'a probablement pas les autorisations nécessaires), à ceci:

SPListItem listItem = tWeb.Lists[properties.ListId].GetItemById(properties.ItemId); 

cela récupère le listItem VRAIMENT en tant qu'administrateur.

Questions connexes