|  03.08.2006, 16:29 | #1 | 
| Участник | права доступа к отдельным клиентам 
			
			Здравствуйте! Подскажите, как можно спрятать группу организаций (или персон) от определенного пользователя (группы пользователей) ? Понятно, что это можно сделать с помощью представлений, но как можно это сделать с помощью прав доступа? Спасибо!   
				__________________ тел. 8(916) 411-4006 | 
|  | 
|  04.08.2006, 00:13 | #2 | 
| Moderator | 
			
			Присвоить этим пользователям роль, для которой право чтения организаций/контактов установлено в "читать только свои".
		 | 
|  | |
| За это сообщение автора поблагодарили: Paolo (1). | |
|  04.08.2006, 11:44 | #3 | 
| Microsoft CRM Certified Professional | 
			
			Или используете Business Units (в одном подразделении все видят всё), а в другом подразделении  только записи своего подразделения: Например 2 подразделения: -логистика - 2 пользователя -продажи - 20 пользователей логисты видят контакты во всей организации (т.е. видят контакты поставщиков и клиентов), а продавци только записи в рамках своего подразделения (т.е. видят только контакты клиентов) Последний раз редактировалось mystic; 07.08.2006 в 18:07. | 
|  | 
|  08.08.2006, 10:38 | #4 | 
| Участник | Цитата: 
		
			Сообщение от AndreyS
			
			 Присвоить этим пользователям роль, для которой право чтения организаций/контактов установлено в "читать только свои". спасибо! это же элементарно  как я сам забыл? 
				__________________ тел. 8(916) 411-4006 | 
|  | 
|  14.08.2006, 11:59 | #5 | 
| Участник | 
			
			Следующий вопрос: допустим, есть 2 группы пользователей, у одной из которых есть "свои клиенты", но при этом, другая группа также работает с частью из этих клиентов, причем, две группы относятся к разным подразделениям и НЕ должны видеть всех клиентов в базе для первой группы ставим - видеть только своих, что ставить для 2-? Нужно ли создавать рабочую группу? Или как это правильно можно сделать? 
				__________________ тел. 8(916) 411-4006 | 
|  | 
|  14.08.2006, 12:32 | #6 | 
| Участник | 
			
			Может быть так? Нужно две роли - каждой роли доступ только для своих клиентов. Потом создаем рабочую группу - (общие клиенты например). В эту группу включаем пользователей которые должны видеть клиентов. Дальше из списка организаций выбираем нужные и нажимаем Другие действия\ Предоставить доступ и указываем рабочую группу. | 
|  | |
| За это сообщение автора поблагодарили: Paolo (1). | |
|  15.08.2006, 09:39 | #7 | 
| Microsoft CRM Certified Professional | 
			
			Можно сделать видимыми для двух подразделений только организации (действия, продажи, контакты видеть только свои), обычно если проанализировать ситуацию это не несёт опасности. Далее если человек видет. что ему надо работать с этой организации, он обращается к владельцу организации и он (владелец), представляет права по суенарию описанному sam | 
|  | 
|  23.11.2007, 12:04 | #8 | 
| Заноза в заднице | 
			
			Пожалуй, подниму тему наверх, поскольку есть проблема... Значит, у нас есть пользователь, некий Иванов Ваня. Ему присвоена роль, по которой он может смотреть контакты только своего подразделения и в активных контактах у него не числится ни один контакт параллельного департамента (это правильно). Но к одному контакту потребовалось дать доступ. Для этого ответственный за контакт забрался в пункт меню "Предоставить доступ..." соответсвующего контакта и добавил Иванова Ваню в пользователи, пометив одну единственную галку "Чтение". После этого Ваня Иванов увидел в списке активных контактов тот контакт (о чудо!) и кроме того даже смог отредактировать поля этого контакта и успешно сохранить свои изменения (что пипец как неправильно). Собсна я щас пребываю в состоянии культурного шока: как такое может быть, если доступ открыт тока на чтение (я потом спецом открыл и перепроверил)? | 
|  | 
|  26.01.2009, 16:30 | #9 | 
| Участник | 
			
			Господа, вопрос: Хочу определить доступ к записи по определенному атрибуту сущности. Думаю сделать так: Создать Определенную роль "Роль1". Написать Плагин на Pre Retrieve message, в котором буду по значению атрибута и наличию у пользователя "Роли1" возвращать/не возвращать данные. Кто-нибудь делал подобное? Дайте ссылки или исходники. В частности нужна помощь в определении наличия права у Пользователя. Последний раз редактировалось Bakai Madybaev; 26.01.2009 в 16:34. | 
|  | 
|  26.01.2009, 18:41 | #10 | 
| Moderator | 
			
			Есть готовое решение, но оно денег стоит: http://mscrm4ever.blogspot.com/2008/...ty-wizard.html.
		 
				__________________ http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.   MS Certified Dirty Magic Professional | 
|  | 
|  26.01.2009, 21:21 | #11 | 
| Чайный пьяница | Цитата: 
		
			Сообщение от Артем Enot Грунин
			   Есть готовое решение, но оно денег стоит: http://mscrm4ever.blogspot.com/2008/...ty-wizard.html. 
				__________________ Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit | 
|  | 
|  27.01.2009, 08:44 | #12 | 
| Участник | |
|  | 
|  27.01.2009, 08:52 | #13 | 
| Moderator | 
			
			Другого пути сделать это я не вижу. Надо отдать должное этим ребятам. Судя по демонстрациям, они сделали кучу классных продуктов, притом большинство из них полностью поддерживаемые.
		 
				__________________ http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.   MS Certified Dirty Magic Professional | 
|  | 
|  27.01.2009, 11:30 | #14 | 
| Чайный пьяница |   
				__________________ Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit | 
|  | 
|  28.01.2009, 10:22 | #15 | 
| Участник | 
			
			Подскажите, как НЕ вернуть данные из Plugin на Retrieve message?
		 | 
|  | 
|  28.01.2009, 10:26 | #16 | 
| Чайный пьяница |   
			
			В методе Execute плагина вызовите исключение. Например InvalidPluginException.
		 
				__________________ Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 28.01.2009 в 10:31. | 
|  | 
|  29.01.2009, 08:20 | #17 | 
| Участник | |
|  | 
|  29.01.2009, 09:03 | #18 | 
| Moderator | 
			
			Все верно, исключений быть не должно. Думаю, надо изменять OutputParameters с тем, чтобы они не содержали лишних данных. Обращаю ваше внимание на тот факт, что пользователи должны иметь возможность сохранять изменения в дозволенных на чтение/изменения полях. А это значит, что если вы просто удалите данные из запроса, то можете получить проблему очистки скрываемых значений при сохранении из формы. Будьте внимательны! С другой стороны, если эти поля скрыты, то они не должны стать isDirty и передаваться на сохранение. Словом одними плагинами и без скриптов вам, видимо, не обойтись! 
				__________________ http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.   MS Certified Dirty Magic Professional | 
|  | |
| За это сообщение автора поблагодарили: Bakai Madybaev (1). | |
|  29.01.2009, 11:34 | #19 | 
| Участник | 
			
			Артем, спасибо за информацию. Пока что сделал так на попытку открытия формы клиента. Но теперь мне надо сделать так, чтобы Запись совсем не отображалась в Представлении и отчете Пользователю без необходимой роли. Насколько я понимаю, для этого мне нужно плагин подключить к RetrieveMultiple message? | 
|  | 
|  29.01.2009, 11:38 | #20 | 
| Участник | X++: public void Execute(IPluginExecutionContext context) { if (context.Depth > 1) return; Microsoft.Crm.Sdk.Moniker entity = null; if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is Microsoft.Crm.Sdk.Moniker) { entity = (Microsoft.Crm.Sdk.Moniker)context.InputParameters.Properties["Target"]; if (entity.Name != Microsoft.Crm.SdkTypeProxy.EntityName.account.ToString()) { return; } } else { return; } ICrmService serv = context.CreateCrmService(true); TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); // Set the properties of the target. targetRetrieve.EntityName = entity.Name; targetRetrieve.EntityId = entity.Id; // Create the request object. RetrieveRequest retrieve = new RetrieveRequest(); // Set the properties of the request object. ColumnSet cols = new ColumnSet(); cols.Attributes.Add("customertypecode"); cols.Attributes.Add("name"); retrieve.Target = targetRetrieve; retrieve.ColumnSet = cols; // Indicate that the BusinessEntity should be retrieved as a DynamicEntity. retrieve.ReturnDynamicEntities = true; // Execute the request RetrieveResponse retrieved = (RetrieveResponse)serv.Execute(retrieve); DynamicEntity retrievedentity = (DynamicEntity)retrieved.BusinessEntity; if (retrievedentity.Properties["customertypecode"] != null) { if (((Picklist)retrievedentity.Properties["customertypecode"]).name == "Клиент") { // Create a QueryExpression. QueryExpression qe = new QueryExpression(); qe.EntityName = "role"; qe.ColumnSet = new AllColumns(); // Set up the join between the role entity // and the intersect table systemuserroles. LinkEntity le = new LinkEntity(); le.LinkFromEntityName = "role"; le.LinkFromAttributeName = "roleid"; le.LinkToEntityName = "systemuserroles"; le.LinkToAttributeName = "roleid"; // Set up the join between the intersect table // systemuserroles and the systemuser entity. LinkEntity le2 = new LinkEntity(); le2.LinkFromEntityName = "systemuserroles"; le2.LinkFromAttributeName = "systemuserid"; le2.LinkToEntityName = "systemuser"; le2.LinkToAttributeName = "systemuserid"; // The condition is to find the user ID. //Microsoft.Crm.Sdk.Query.c ConditionExpression ce = new ConditionExpression(); ce.AttributeName = "systemuserid"; ce.Operator = ConditionOperator.Equal; ce.Values = new object[] { context.UserId }; FilterExpression fe = new FilterExpression(); fe.AddCondition(ce); le2.LinkCriteria = fe; le.LinkEntities.Add(le2); qe.LinkEntities.Add(le); // Execute the query. BusinessEntityCollection bec = serv.RetrieveMultiple(qe); string rolename = "Системный администратор"; bool roleFound = false; if (bec.BusinessEntities.Count > 0) { for (int i = 0; i < bec.BusinessEntities.Count; i++) { if (rolename == ((role)bec.BusinessEntities[i]).name) roleFound = true; } } if (!roleFound) { throw new InvalidPluginExecutionException("У вас нет достаточных прав на просмотр данных о клиенте."); } } } } | 
|  |