1

新しいアイテムを追加しながらアイテムのセキュリティを更新しようとしていますが、フォローされています。このトレースから問題を見つける方法は?

InvalidOperationException: Operation is not valid due to the current state of the object.]
   Microsoft.SharePoint.SPListItem.InitSecurity() +26790031
   Microsoft.SharePoint.SPListItem.get_SecurableObjectImpl() +16
   Microsoft.SharePoint.SPSecurableObject.get_RoleAssignments() +10
   Updateroutine.<>c__DisplayClass2.<updatelistpermission>b__0() +1955
   Microsoft.SharePoint.<>c__DisplayClass4.<RunWithElevatedPrivileges>b__2() +729
   Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) +27947702
   Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param) +27648393
   Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) +93

ここに私の機能があります、

private static void updatelistpermission(Header objEntity, SPListItem lstItem,string strStatus)
        {

            SPUserToken token = lstItem.Web.Site.SystemAccount.UserToken;

            try
            {

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {

                    using (SPSite site = new SPSite(lstItem.Web.Site.ID, token))
                    {
                        site.AllowUnsafeUpdates = true;
                        using (SPWeb web = site.OpenWeb(lstItem.Web.ID))
                        {
                            web.AllowUnsafeUpdates = true;
                            lstItem.BreakRoleInheritance(false); 

                            SPRoleDefinition roleUserDefintion = null;
                            SPRoleDefinition roleSupervisorDefintion = null;
                            SPRoleDefinition roleOpManagerDefintion = null;

                            if (strStatus == "Active")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                            }
                            else if (strStatus == "Submitted")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                            }
                            else if (strStatus == "Completed")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                            }

                            SPUser uParticipant = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.Participant));
                            SPRoleAssignment roleUserAssignment = new SPRoleAssignment(uParticipant);

                            SPUser uSupervisor = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.Supervisor));
                            SPRoleAssignment roleSupervisorAssignment = new SPRoleAssignment(uSupervisor);

                            SPUser uOpManager = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.OpsManager));
                            SPRoleAssignment roleuOpManagerAssignment = new SPRoleAssignment(uOpManager);

                            roleUserAssignment.RoleDefinitionBindings.Add(roleUserDefintion);
                            lstItem.RoleAssignments.Add(roleUserAssignment);

                            roleSupervisorAssignment.RoleDefinitionBindings.Add(roleSupervisorDefintion);
                            lstItem.RoleAssignments.Add(roleSupervisorAssignment);

                            roleuOpManagerAssignment.RoleDefinitionBindings.Add(roleOpManagerDefintion);
                            lstItem.RoleAssignments.Add(roleuOpManagerAssignment);

                            lstItem.Update();
                            web.AllowUnsafeUpdates = false;
                        }
                    }
               });
            }
            catch (SPException spex)
            {
                SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("APP", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, spex.Message , "");
            }
        }

@Dmitry Kozlov によって提案された新しいコードですが、それでも同じエラー

try
                {
                    {
                        SPUserToken token = SPContext.Current.Web.Site.SystemAccount.UserToken;

                        SPSecurity.RunWithElevatedPrivileges(delegate()
                        {
                            using (SPSite site = new SPSite(SPContext.Current.Web.Site.ID, token))
                            {
                                site.AllowUnsafeUpdates = true;

                                using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
                                {
                                    web.AllowUnsafeUpdates = true;
                                    web.BreakRoleInheritance(true);
                                    web.AllowUnsafeUpdates = true;

                                    SPList lstProject = web.Lists["SharedSurveyHeader"];
                                    SPListItem lstItem = lstProject.Items.Add();
                                    loadToListItem(sharedHeader, ref lstItem, true);
                                    updatelistpermission(web, sharedHeader, lstItem, strStatus);
                                    lstItem.Update();
                                    objWeb.AllowUnsafeUpdates = false;
                                    intResult = lstItem.ID;
                                    lstItem = null;
                                    lstProject = null;
                                }
                            }
                        });


                    }

                 }


private static void updatelistpermission(SPWeb web, SharedSurveyHeader objEntity, SPListItem lstItem,string strStatus)
        {
             try
            {

                            SPRoleDefinition roleUserDefintion = null;
                            SPRoleDefinition roleSupervisorDefintion = null;
                            SPRoleDefinition roleOpManagerDefintion = null;

                            if (strStatus == "Active")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                            }
                            else if (strStatus == "Submitted")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                            }
                            else if (strStatus == "Completed")
                            {
                                roleUserDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleSupervisorDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                                roleOpManagerDefintion = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                            }

                            SPUser uParticipant = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.Participant));
                            SPRoleAssignment roleUserAssignment = new SPRoleAssignment(uParticipant);

                            SPUser uSupervisor = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.Supervisor));
                            SPRoleAssignment roleSupervisorAssignment = new SPRoleAssignment(uSupervisor);

                            SPUser uOpManager = Utility.convertStringToSPUser(Utility.getSPStringLookupFromListGLT(objEntity.OpsManager));
                            SPRoleAssignment roleuOpManagerAssignment = new SPRoleAssignment(uOpManager);

                            roleUserAssignment.RoleDefinitionBindings.Add(roleUserDefintion);
                            lstItem.RoleAssignments.Add(roleUserAssignment);

                            roleSupervisorAssignment.RoleDefinitionBindings.Add(roleSupervisorDefintion);
                            lstItem.RoleAssignments.Add(roleSupervisorAssignment);

                            roleuOpManagerAssignment.RoleDefinitionBindings.Add(roleOpManagerDefintion);
                            lstItem.RoleAssignments.Add(roleuOpManagerAssignment);

            }
            catch (SPException spex)
            {

            }
        }
4

1 に答える 1

0

昇格されたアクセス許可で開いた Web からリスト アイテムを取得し、それを操作してみてください。

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(lstItem.Web.Site.ID, token))
    {
        site.AllowUnsafeUpdates = true;
        using (SPWeb web = site.OpenWeb(lstItem.Web.ID))
        {
           web.AllowUnsafeUpdates = true;

           // Get list item here:
           var newListItem = web.GetListItem(itemUrl);
           ...
        }
    }
}
于 2012-10-30T19:14:11.290 に答える