「site1」という名前の SharePoint 2013 サイト コレクションがあります。
そのサイト コレクションには 1 つのリストと 1 つのドキュメント ライブラリがあり、リスト アイテムの添付ファイルをドキュメント ライブラリに移動するイベント レシーバーを作成し、リスト アイテムの添付ファイルを移動した後、そのリスト内のファイルをそのドキュメント URL で更新しています。そのリスト アイテムの添付フォームを削除しています。以下は私が使用しているコードです
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);
}
}
}
}
});
}
「寄稿者」と呼ばれる共有ポイントグループと「ユーザー」寄稿者グループには削除なしの編集権限があり、ユーザーグループにはそのリストへの追加権限しかありません。寄稿者グループのメンバーがリスト項目を追加したとき、コードは正常に機能していますが、ユーザー グループのメンバーがリスト項目を追加したとき、以下のエラーがスローされます。
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
誰でも私を助けることができますか?
前もって感謝します。