none
Kann ein Kontakt teilweise sichtbar sein? RRS feed

  • Frage

  • Hallo zusammen,
    ich möchte einige Kontakte innerhalb unseres MS CRM 4.0-Systems nur teilweise sichtbar machen. Das heißt: Attribute wie Telefon etc. sollen nicht für jeden sichtbar sein. Ist eine derartige Konstellation möglich?
    Falls nicht, kann ich auch Kontakte nur für den Besitzer erscheinen lassen und dieser kann den Kontakt freigeben?

    Vielen Dank schonmal für Rückmeldungen.

    Liebe Grüße
    Montag, 3. August 2009 11:53

Antworten

  • Hallo MSCRM,

    soll diese Eingrenzung nur für einige, aber nicht für alle Datensätze einer Entität gelten ?  Gibt es dafür ein gemeinsames Merkmal ? Z.B. nur für die Einträge im Firmenstamm mit dem Kennzeichen Lieferant oder die Datensätze mit einem "Dummy-Besitzer?  

    Jürgen Beck hat in dem folgenden Thread einige JScript Beispiele zum Ausblenden von Feldern / Absätzen zusammengestellt.
    http://social.msdn.microsoft.com/Forums/de-DE/crmgerman/thread/dcd442a0-b8e6-47d1-a551-6ca8b8cae431

    Vor Durchführung der Statements muss man abprüfen, ob der aktuelle Datensatz zu den sperrrelevanten Sätze gehört. Und ob der angemeldete Benutzer die Felder nicht sehen darf. Dazu könnte man die Zugehörigkeit zu einer Sicherheitsrolle abprüfen.  

    Wenn man die relevanten Felder auf einem Reiter oder in einem Abschnitt zusammenfassen kann, dann ist das einfacher zu programmieren und es gibt "keine Löcher im Dialog". In der Konsequenz dürfen dann diese Felder aber auch nicht in Listen oder als Suchfelder angezeigt werden.

    Alternativ würde ich vorschlagen, eine Zusatzentität (1 zu n bzw 1 zu 1) zu definieren und die schutzwürdigen Felder dahin zu verlagern. Diese Entität kann man leicht über die Standardlogik mit Sicherheitsrollen schützen. Das wäre vermutlich die schnellste und einfachste Lösung. Du muß halt prüfen, ob das in dein Konzept passt.


    Jetzt zu der Anforderung "Kontakte nur für den Besitzer sichtbar". Das ist möglich. Man kann über die Sicherheitsrollen einstellen, dass jeder Benutzer nur seine Datensätze sieht. Dazu grenzt man die Rechte (Lesen, Schreiben, Ändern, Zuweisen etc) in den Tabellen (Kontakte, Firmen etc) auf die Ebene Benutzer ein.

    Der Benutzer kann nachfolgend aber einzelne Datensätze für andere Anwender freigeben, die die Datensätze auch sehen bzw. bearbeiten sollen. Das erfordert aber eine bewußte Aktivität des Anwenders.

    Ich halte von diesem engen Berechtigungskonzept nicht so viel :-)  Der Hauptnutzen von CRM (Übersicht für das gesamte Unternehmen) geht verloren. Man kann sich Doubletten und Diskussionen ohne Ende einfangen. Die manuelle Freigabe ist viel Arbeit und erfordert viel Abstimmungsbedarf innerhalb der Firma.


    Herzliche Grüße Markus Müller
    Montag, 3. August 2009 12:59
  • Hallo,

    ich hab vor einige Zeit (Link hab ich leider nicht mehr!) einen Link bzgl. der Vergabe von Schreibrechten auf bestimmte Felder gefunden. (Script funktioniert auch!)  Dieses Javascript ermöglicht es, Usern mit einer bestimmten Rolle Schreibrechte auf die definierten Felder zu vergeben. Für andere Benutzer ohne die entsprechende Rolle ist das Feld schreibgeschütz..... vielleicht kann man das Script entsprechend anpassen. (User ID statt Rolle und ausblenden statt Schreibschutz.... ( bin kein Javascript Experte ;-))

    //Schreibschutz Felder ...
    crmForm.all.new_XXX.Disabled = true;
    crmForm.all.new_XYZ.Disabled = true;
    
    //Aufhebung des Schreibschutzes die Rolle Systemsadministrator
     if(UserHasRole('Systemadministrator'))
    {
    crmForm.all.new_XXX.Disabled = false;
    crmForm.all.new_XYZ.Disabled = false;
    }
    
    
    //Funktion für GetRolename
    function UserHasRole(roleName)
    {
     //get Current User Roles, oXml is an object
     var oXml = GetCurrentUserRoles();
    //alert(oXml.xml); // add this debug alert
     if(oXml != null)
     {
      //select the node text
      var roles = oXml.selectNodes("//BusinessEntity/q1:name");
      if(roles != null)
      {
       for( i = 0; i < roles.length; i++)
       {
        if(roles[i].text == roleName)
        {
         //return true if user has this role
         return true;
        }
       }
      }
     }
     //otherwise return false
     return false;
    }
    
    
    //Hauptfunktion erzeugen einer .xml mit User spezifischem Inhalt
    function GetCurrentUserRoles()
    {
     var xml = "" +
     "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
     "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
     GenerateAuthenticationHeader() +
     " <soap:Body>" +
     " <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
     " <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
     " <q1:EntityName>role</q1:EntityName>" +
     " <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
     " <q1:Attributes>" +
     " <q1:Attribute>name</q1:Attribute>" +
     " </q1:Attributes>" +
     " </q1:ColumnSet>" +
     " <q1:Distinct>false</q1:Distinct>" +
     " <q1:LinkEntities>" +
     " <q1:LinkEntity>" +
     " <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +
     " <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +
     " <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +
     " <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +
     " <q1:JoinOperator>Inner</q1:JoinOperator>" +
     " <q1:LinkEntities>" +
     " <q1:LinkEntity>" +
     " <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +
     " <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +
     " <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +
     " <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +
     " <q1:JoinOperator>Inner</q1:JoinOperator>" +
     " <q1:LinkCriteria>" +
     " <q1:FilterOperator>And</q1:FilterOperator>" +
     " <q1:Conditions>" +
     " <q1:Condition>" +
     " <q1:AttributeName>systemuserid</q1:AttributeName>" +
     " <q1:Operator>EqualUserId</q1:Operator>" +
     " </q1:Condition>" +
     " </q1:Conditions>" +
     " </q1:LinkCriteria>" +
     " </q1:LinkEntity>" +
     " </q1:LinkEntities>" +
     " </q1:LinkEntity>" +
     " </q1:LinkEntities>" +
     " </query>" +
     " </RetrieveMultiple>" +
     " </soap:Body>" +
     "</soap:Envelope>" +
     "";
    
     var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    
     xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
     xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
     xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
     xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
     xmlHttpRequest.send(xml);
    
     var resultXml = xmlHttpRequest.responseXML;
     return(resultXml);
    }

    Gruß Patrick
    Montag, 3. August 2009 15:21
  • Hallo MSCRM,

    hat alles funktioniert?

    Das mit der Sichtbarkeit kann und sollte man zwar mit JScript machen, sollte aber in jedem Falle darauf achten, dass man an die Felder auch nicht über die erweiterte Suche herankommt. Dort sind ja Felder ebenso zugänglich. Zwar nur schreibgeschützt, aber dir geht es ja darum, dass man die Felder in keinem Falle lesen darf. Etwas anderes ist es, wenn es nur um komfortables Arbeiten geht.

    Man kann Felder tatsächlich vollständig sperren, indem man die entsprechenden Nachrichten per PlugIn manipuliert. Das ist interessanterweise nicht nur supported sonder sogar in dem folgenden Artikel dokumentiert.

    Security and Authentication in Microsoft Dynamics CRM: Field-level Security in Microsoft Dynamics CRM: Options and Constraints
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=471f8670-47b3-4525-b25d-c11a6774615c

    Viele Grüße,
    Jürgen
    Jürgen Beck

    Dipl. Kfm./Wirtschaftsinformatik
    MVP, MCSD.NET, MCITP DBA, MCDBA, MCSE
    Microsoft Certified Business Management Solutions Professional
    Microsoft Certified CRM Developer
    Microsoft Certified Trainer

    ComBeck IT Services & Business Solutions
    Microsoft Gold Certified Partner
    Microsoft Small Business Specialist

    Developing & Supporting Business Applications from small business to big enterprises covering scores of sectors

    http://www.combeck.de
    Dienstag, 5. Januar 2010 14:31
    Moderator

Alle Antworten

  • Du könntest es bei dem OnLoad Funktion ausblenden...

    Ob es ganz normal mit Rechten geht, kann ich dir leider nicht sagen.

    z.B.
    function OnLoad
    {
    Feldname .style.display = "none";
    }
    Montag, 3. August 2009 12:39
  • Hallo MSCRM,

    soll diese Eingrenzung nur für einige, aber nicht für alle Datensätze einer Entität gelten ?  Gibt es dafür ein gemeinsames Merkmal ? Z.B. nur für die Einträge im Firmenstamm mit dem Kennzeichen Lieferant oder die Datensätze mit einem "Dummy-Besitzer?  

    Jürgen Beck hat in dem folgenden Thread einige JScript Beispiele zum Ausblenden von Feldern / Absätzen zusammengestellt.
    http://social.msdn.microsoft.com/Forums/de-DE/crmgerman/thread/dcd442a0-b8e6-47d1-a551-6ca8b8cae431

    Vor Durchführung der Statements muss man abprüfen, ob der aktuelle Datensatz zu den sperrrelevanten Sätze gehört. Und ob der angemeldete Benutzer die Felder nicht sehen darf. Dazu könnte man die Zugehörigkeit zu einer Sicherheitsrolle abprüfen.  

    Wenn man die relevanten Felder auf einem Reiter oder in einem Abschnitt zusammenfassen kann, dann ist das einfacher zu programmieren und es gibt "keine Löcher im Dialog". In der Konsequenz dürfen dann diese Felder aber auch nicht in Listen oder als Suchfelder angezeigt werden.

    Alternativ würde ich vorschlagen, eine Zusatzentität (1 zu n bzw 1 zu 1) zu definieren und die schutzwürdigen Felder dahin zu verlagern. Diese Entität kann man leicht über die Standardlogik mit Sicherheitsrollen schützen. Das wäre vermutlich die schnellste und einfachste Lösung. Du muß halt prüfen, ob das in dein Konzept passt.


    Jetzt zu der Anforderung "Kontakte nur für den Besitzer sichtbar". Das ist möglich. Man kann über die Sicherheitsrollen einstellen, dass jeder Benutzer nur seine Datensätze sieht. Dazu grenzt man die Rechte (Lesen, Schreiben, Ändern, Zuweisen etc) in den Tabellen (Kontakte, Firmen etc) auf die Ebene Benutzer ein.

    Der Benutzer kann nachfolgend aber einzelne Datensätze für andere Anwender freigeben, die die Datensätze auch sehen bzw. bearbeiten sollen. Das erfordert aber eine bewußte Aktivität des Anwenders.

    Ich halte von diesem engen Berechtigungskonzept nicht so viel :-)  Der Hauptnutzen von CRM (Übersicht für das gesamte Unternehmen) geht verloren. Man kann sich Doubletten und Diskussionen ohne Ende einfangen. Die manuelle Freigabe ist viel Arbeit und erfordert viel Abstimmungsbedarf innerhalb der Firma.


    Herzliche Grüße Markus Müller
    Montag, 3. August 2009 12:59
  • Hallo,

    ich hab vor einige Zeit (Link hab ich leider nicht mehr!) einen Link bzgl. der Vergabe von Schreibrechten auf bestimmte Felder gefunden. (Script funktioniert auch!)  Dieses Javascript ermöglicht es, Usern mit einer bestimmten Rolle Schreibrechte auf die definierten Felder zu vergeben. Für andere Benutzer ohne die entsprechende Rolle ist das Feld schreibgeschütz..... vielleicht kann man das Script entsprechend anpassen. (User ID statt Rolle und ausblenden statt Schreibschutz.... ( bin kein Javascript Experte ;-))

    //Schreibschutz Felder ...
    crmForm.all.new_XXX.Disabled = true;
    crmForm.all.new_XYZ.Disabled = true;
    
    //Aufhebung des Schreibschutzes die Rolle Systemsadministrator
     if(UserHasRole('Systemadministrator'))
    {
    crmForm.all.new_XXX.Disabled = false;
    crmForm.all.new_XYZ.Disabled = false;
    }
    
    
    //Funktion für GetRolename
    function UserHasRole(roleName)
    {
     //get Current User Roles, oXml is an object
     var oXml = GetCurrentUserRoles();
    //alert(oXml.xml); // add this debug alert
     if(oXml != null)
     {
      //select the node text
      var roles = oXml.selectNodes("//BusinessEntity/q1:name");
      if(roles != null)
      {
       for( i = 0; i < roles.length; i++)
       {
        if(roles[i].text == roleName)
        {
         //return true if user has this role
         return true;
        }
       }
      }
     }
     //otherwise return false
     return false;
    }
    
    
    //Hauptfunktion erzeugen einer .xml mit User spezifischem Inhalt
    function GetCurrentUserRoles()
    {
     var xml = "" +
     "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
     "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
     GenerateAuthenticationHeader() +
     " <soap:Body>" +
     " <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
     " <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
     " <q1:EntityName>role</q1:EntityName>" +
     " <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
     " <q1:Attributes>" +
     " <q1:Attribute>name</q1:Attribute>" +
     " </q1:Attributes>" +
     " </q1:ColumnSet>" +
     " <q1:Distinct>false</q1:Distinct>" +
     " <q1:LinkEntities>" +
     " <q1:LinkEntity>" +
     " <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +
     " <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +
     " <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +
     " <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +
     " <q1:JoinOperator>Inner</q1:JoinOperator>" +
     " <q1:LinkEntities>" +
     " <q1:LinkEntity>" +
     " <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +
     " <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +
     " <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +
     " <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +
     " <q1:JoinOperator>Inner</q1:JoinOperator>" +
     " <q1:LinkCriteria>" +
     " <q1:FilterOperator>And</q1:FilterOperator>" +
     " <q1:Conditions>" +
     " <q1:Condition>" +
     " <q1:AttributeName>systemuserid</q1:AttributeName>" +
     " <q1:Operator>EqualUserId</q1:Operator>" +
     " </q1:Condition>" +
     " </q1:Conditions>" +
     " </q1:LinkCriteria>" +
     " </q1:LinkEntity>" +
     " </q1:LinkEntities>" +
     " </q1:LinkEntity>" +
     " </q1:LinkEntities>" +
     " </query>" +
     " </RetrieveMultiple>" +
     " </soap:Body>" +
     "</soap:Envelope>" +
     "";
    
     var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    
     xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
     xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
     xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
     xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
     xmlHttpRequest.send(xml);
    
     var resultXml = xmlHttpRequest.responseXML;
     return(resultXml);
    }

    Gruß Patrick
    Montag, 3. August 2009 15:21
  • Hallo MSCRM,

    hat alles funktioniert?

    Das mit der Sichtbarkeit kann und sollte man zwar mit JScript machen, sollte aber in jedem Falle darauf achten, dass man an die Felder auch nicht über die erweiterte Suche herankommt. Dort sind ja Felder ebenso zugänglich. Zwar nur schreibgeschützt, aber dir geht es ja darum, dass man die Felder in keinem Falle lesen darf. Etwas anderes ist es, wenn es nur um komfortables Arbeiten geht.

    Man kann Felder tatsächlich vollständig sperren, indem man die entsprechenden Nachrichten per PlugIn manipuliert. Das ist interessanterweise nicht nur supported sonder sogar in dem folgenden Artikel dokumentiert.

    Security and Authentication in Microsoft Dynamics CRM: Field-level Security in Microsoft Dynamics CRM: Options and Constraints
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=471f8670-47b3-4525-b25d-c11a6774615c

    Viele Grüße,
    Jürgen
    Jürgen Beck

    Dipl. Kfm./Wirtschaftsinformatik
    MVP, MCSD.NET, MCITP DBA, MCDBA, MCSE
    Microsoft Certified Business Management Solutions Professional
    Microsoft Certified CRM Developer
    Microsoft Certified Trainer

    ComBeck IT Services & Business Solutions
    Microsoft Gold Certified Partner
    Microsoft Small Business Specialist

    Developing & Supporting Business Applications from small business to big enterprises covering scores of sectors

    http://www.combeck.de
    Dienstag, 5. Januar 2010 14:31
    Moderator