23.09.2013, 16:42 | #1 |
Участник
|
CRM2011: InitializeFrom lead -> contact
Всем привет.
Пытаемся конвертировать lead в contact , через InitializeFromRequest. InitializeFromRequest req = new InitializeFromRequest(); req.EntityMoniker = new EntityReference(); req.EntityMoniker.Id = leadId; req.EntityMoniker.LogicalName = "lead"; req.TargetEntityName = "contact"; req.TargetFieldType = TargetFieldType.All; InitializeFromResponse rps = (InitializeFromResponse)_organizationService.Execute(req); Entity contact = (Entity)rps.Entity; guidNewContact = _organizationService.Create(contact); У интереса (lead) есть 2 завершенных действия (точнее - campaignresponse), ответсвенный за которые - отключенный пользователь (idisabled = true). При вызове Create в данном коде - выводится invalid user id При включеннии пользователя (все роли отбирают при выключении пользователя) - user has no roles. При добавлении какой либо роли (взял почти пустую) - идет перечень привилегий (первая, которая встретилась - чтение действий prvReadActivity), в 4рке вроде бы работало и так, только действия оставались за интересом (вроде бы, уже точно не помню), т.к. было написано не мало кода по перепривязке действий при слиянии\квалификации и т.д. (в т.ч. с открытием отключенных пользователей и временным добавлением к ним прав) к target entity. Вобщем, как побороть в 5рке такую штуку ? |
|
24.09.2013, 09:20 | #2 |
Moderator
|
Чтобы преобразовать интерес в контакт нужно вызвать QualifyLeadRequest. InitializeFromRequest лишь инициализирует дочернюю запись в контексте родительской записи - заполняет некоторые свойства. С действиями, при этом, ничего происходить не должно.
Честно говоря из вашего вопроса непонятно в чем, собственно проблема. Вы хотите выполнить код под выключенным пользователем у которого нет прав? Боюсь что это не работало ни в одной из версий CRM. Если вы что-то назначаете пользователю, у него должны быть не пустые роли, а роли, которые предусматривают как минимум чтение записей нужного типа.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
24.09.2013, 10:16 | #3 |
Участник
|
нет, запрос выполняется из-под системного администратора.
выключенный пользователь - owner прикрепленного действия к интересу. |
|
24.09.2013, 10:30 | #4 |
Участник
|
QualifyLeadRequest request = new QualifyLeadRequest();
request.CreateContact = true; request.CreateAccount = false; request.CreateOpportunity = false; request.LeadId = new EntityReference("lead", leadId); request.Status = new OptionSetValue(3); QualifyLeadResponse resp = (QualifyLeadResponse)_organizationService.Execute(request); SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: ae6fa61a-ebb8-e011-8180-001a6433b300 |
|
24.09.2013, 10:33 | #5 |
Moderator
|
Когда кто-то либо назначает запись, проверка прав выполняется для обоих пользователей:
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
24.09.2013, 10:51 | #6 |
Участник
|
т.е. действия теперь каскандно перепривязываются в обоих запросах автоматически?
я не особо понимаю, зачем проверять права пользователя на _действие_, привязанное к интересу. действие же останется за интересом .... через стандартный интерфейс не могу кнопочка изменена на кастомный функционал. |
|
24.09.2013, 12:41 | #7 |
Moderator
|
Действия перевешиваются только при переназначении записи, если так настроены связи между объектами (по умолчанию - да). НО некоторые системные операции могут осуществлять дополнительные проверки. Например, при смене валюты возможной сделки, система проверяет, есть связанные с ней предложения, заказы и счета. Если пользователь, который меняет валюту не имеет доступа на чтение записей одного из этих типов, попытка сменить валюту отвалится с ошибкой доступа.
Что происходит в вашем случае не понятно. Возможно, есть какая-то дополнительная логика на создание контакта?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
24.09.2013, 12:44 | #8 |
Участник
|
|
|
24.09.2013, 15:18 | #9 |
Участник
|
полностью отключил все плагины, на интересы и ФЛ. т.е. кастомный код тут не причем.
ошибки повторяются - либо не нравится что пользователь выключен, либо не нравится что у него нет ни одной роли, либо если есть роль (полупустая) - нехватка привилегий. |
|
24.09.2013, 17:22 | #10 |
Участник
|
удалил все плагины. та же ошибка , в т.ч. встроенной кнопкой квалификации.
|
|
24.09.2013, 18:02 | #11 |
Участник
|
так, с нуля опишу проблему, а то не уточнил момент:
1. есть интерес, связанный с откликом от кампании через кастомное поле (1:N) 2. у этого интереса есть закрытый отклик от кампании. 3. ответственный за отклик от кампании - выключенный пользователь/без ролей. 4. выполняем QualifyLeadRequest с таргетом - физлицо. получаем ошибки "нет ролей"/"не хватает привилегий" на ответственного за отклик от кампании пользователя. из трейса: at CrmException..ctor(String message, Exception innerException, Int32 errorCode, Boolean isFlowControlException) ilOffset = 0x0 at CrmException..ctor(String message, Exception innerException, Int32 errorCode) ilOffset = 0x0 at RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType) ilOffset = 0xFFFFFFFF at RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ilOffset = 0xD8 at RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) ilOffset = 0x1E7 at VersionedPluginProxyStepBase.WrapExceptionToThrow(CrmException exception) ilOffset = 0x89 at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65 at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65 at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1C5 at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4 at ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion) ilOffset = 0x156 at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, Boolean traceRequest, OrganizationContext context, Boolean returnResponse) ilOffset = 0x145 at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType) ilOffset = 0x34 at OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType) ilOffset = 0x24 at InprocessServiceProxy.ExecuteCore(OrganizationRequest request) ilOffset = 0x34 at PlatformCommand.XrmExecuteInternal() ilOffset = 0xF6 at QualifyLeadCommand.Execute() ilOffset = 0x6 at LeadRecordPageHandler.Qualify(Object sender, DataEventArgs e) ilOffset = 0x180 at DataEventProcessor.Raise(FormEventId eventId, FormState state, String objectId, Entity entity) ilOffset = 0x44 at AppForm.RaiseDataEvent(FormEventId eventId) ilOffset = 0x5E at EndUserForm.Initialize(Entity entity) ilOffset = 0x1F at CustomizableForm.Execute(Entity entity, FormDescriptor fd) ilOffset = 0x62 at LeadRecordPageHandler.ConfigureFormHandler() ilOffset = 0x66 at RecordPageHandler.ConfigureFormWrapper() ilOffset = 0xC at GenericEventProcessor.RaiseEvent(String eventName) ilOffset = 0x2D at PageManager.OnPreRender(EventArgs e) ilOffset = 0x53 at Control.PreRenderRecursiveInternal() ilOffset = 0x54 at Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) ilOffset = 0x69E at Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) ilOffset = 0x3C at Page.ProcessRequest() ilOffset = 0x14 at Page.ProcessRequest(HttpContext context) ilOffset = 0x31 at finamtest_userdefined_edit_aspx.ProcessRequest(HttpContext context) ilOffset = 0x8 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\82ce50f4\e77f4ed8\App_Web_z0zmcp2g.1.cs at CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() ilOffset = 0x11D at HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) ilOffset = 0x15 at ApplicationStepManager.ResumeSteps(Exception error) ilOffset = 0x10E at HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) ilOffset = 0x5C at HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) ilOffset = 0xFC at ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType) ilOffset = 0x45 >Crm Exception: Message: SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: 1b858e94-1e71-e011-9c74-005056ba670c, ErrorCode: -2147209463, InnerException: Microsoft.Crm.CrmSecurityException: SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user. Returned hr = -2147209463, User: 1b858e94-1e71-e011-9c74-005056ba670c at Microsoft.Crm.BusinessEntities.SecurityLibrary.RetrievePrivilegeForUser(IUser user, Guid privilege, ExecutionContext context) at Microsoft.Crm.BusinessEntities.SecurityLibrary.TryCheckPrivilege(Guid user, Guid privilege, ExecutionContext context) at Microsoft.Crm.BusinessEntities.SecurityLibrary.TryCheckPrivilege(SecurityPrincipal principal, Guid privilege, ExecutionContext context) at Microsoft.Crm.BusinessEntities.SecurityExtension.PreCreateHandlerEntityPrivilegeCheck(Object sender, SecurityTraits traits, SecurityAttributes attributes, ExtensionEventArgs e) at Microsoft.Crm.BusinessEntities.SecurityExtension.PreCreateHandler(ExtensionEventArgs e, Object sender) at Microsoft.Crm.BusinessEntities.BusinessProcessObject.PreCreateEventHandler.Invoke(Object sender, ExtensionEventArgs e) at Microsoft.Crm.BusinessEntities.BusinessProcessObject.Create(IBusinessEntity entity, ExecutionContext context) at Microsoft.Crm.ObjectModel.ContactService.Create(IBusinessEntity entity, ExecutionContext context) at Microsoft.Crm.ObjectModel.InitializeAndCreateUtility.InitializeAndCreate(BusinessEntityMoniker srcMoniker, BusinessEntity targetInput, ExecutionContext context) at Microsoft.Crm.ObjectModel.LeadService.QualifyLead(BusinessEntityMoniker leadId, Boolean createAccount, Boolean createContact, Boolean createOpportunity, BusinessEntityMoniker opportunityCurrencyId, BusinessEntityMoniker opportunityCustomerId, BusinessEntityMoniker sourceCampaignId, Int32 statusCode, ExecutionContext context) зачем СРМу этот SecurityCheck на связанную запись, по кастомному полю вообще (а не системное campaignresponse.customer) при создании физлица ? |
|
24.09.2013, 18:04 | #12 |
Участник
|
попробуйте поменять тип связи на ссылочное и попробовать еще раз
|
|
24.09.2013, 18:11 | #13 |
Участник
|
пробовал уже в двух вариантов "ссылочных" - обычном и с ограничением на удаление.
одно и то же. |
|
24.09.2013, 18:16 | #14 |
Еда - топливо, Одежда - н
|
Цитата:
Сообщение от Eugene.Ostroukhov
так, с нуля опишу проблему, а то не уточнил момент:
1. есть интерес, связанный с откликом от кампании через кастомное поле (1:N) 2. у этого интереса есть закрытый отклик от кампании. 3. ответственный за отклик от кампании - выключенный пользователь/без ролей. 4. выполняем QualifyLeadRequest с таргетом - физлицо. получаем ошибки "нет ролей"/"не хватает привилегий" на ответственного за отклик от кампании пользователя. зачем СРМу этот SecurityCheck на связанную запись, по кастомному полю вообще (а не системное campaignresponse.customer) при создании физлица ? Просто я только что попробовал в онлайне все повторить. 1. Создал компанию 2. Создал отклик 3. Назначил юзера с минимум прав. для этого отклика 4. Создал лукап в интересе на отклик. (указал эту запись отклика там) 5. Квалифицировал (все ок) 6. Удалил пользователя, который был ответственным за отклик. 7. Еще раз квалифицировал. Все равно ок. Последний раз редактировалось -O_o-; 24.09.2013 в 18:33. |
|
24.09.2013, 18:32 | #15 |
Участник
|
так, чего то я трейс не тот дал.
завтра на свежую голову еще раз попробую ) |
|
25.09.2013, 16:05 | #16 |
Moderator
|
Евгений, включите пользователя и дайте ему роль администратора. Вы НЕ СМОЖЕТЕ назначить записи пользователю, у которого недостаточно прав никаким образом!!! Не понимаю что вам не ясно?!?!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
14.10.2013, 14:05 | #17 |
Участник
|
|
|
|
|