コード例 #1
0
        private void btnGetTeams_Click(object sender, EventArgs e)
        {
            WorkAsync(new WorkAsyncInfo
            {
                Message = "Loading Access Teams",
                Work    = (worker, args) =>
                {
                    var q       = new QueryExpression("team");
                    q.ColumnSet = new ColumnSet(true);
                    q.AddCriteria("teamtype", 1);
                    //q.AddCriteria("teamtemplateid", teamTemplateId);
                    q.AddCriteria("regardingobjectid", new Guid(txtEntityId.Text));
                    var l         = q.AddLink("teamtemplate", "teamtemplateid", "teamtemplateid");
                    l.Columns     = new ColumnSet("teamtemplatename");
                    l.EntityAlias = "tt";

                    args.Result = Service.GetMultiple(q);

                    foreach (var team in (args.Result as List <Entity>))
                    {
                        var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
                        {
                            Target = new EntityReference((cBoxEntities.SelectedItem as EntityInfo).LogicalName, new Guid(txtEntityId.Text))
                        };

                        var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)Service.Execute(accessRequest);

                        var p = accessResponse.PrincipalAccesses.SingleOrDefault(x => x.Principal.Id == team.Id);
                        if (p != null)
                        {
                            team["accessrights"] = p.AccessMask;
                        }
                    }
                },
                PostWorkCallBack = (args) =>
                {
                    if (args.Error != null)
                    {
                        MessageBox.Show(args.Error.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    lvTeams.Items.Clear();
                    lvTeamMembers.Items.Clear();

                    var result = args.Result as List <Entity>;
                    if (result != null)
                    {
                        foreach (var team in result)
                        {
                            var item = new ListViewItem {
                                Text = team.GetValue <string>("tt.teamtemplatename"), Tag = team
                            };
                            item.SubItems.Add(team["accessrights"].ToString());
                            lvTeams.Items.Add(item);
                        }
                    }
                }
            });
        }
コード例 #2
0
        public void Test_That_Existing_Permissions_Can_Be_Modified()
        {
            XrmFakedContext      context         = new XrmFakedContext();
            IOrganizationService service         = context.GetOrganizationService();
            List <Entity>        initialEntities = new List <Entity>();

            Entity contact = new Entity("contact");

            contact.Id = Guid.NewGuid();
            initialEntities.Add(contact);

            Entity user = new Entity("systemuser");

            user.Id = Guid.NewGuid();
            initialEntities.Add(user);

            context.Initialize(initialEntities);

            GrantAccessRequest grantRequest = new GrantAccessRequest()
            {
                Target          = contact.ToEntityReference(),
                PrincipalAccess = new PrincipalAccess()
                {
                    Principal = user.ToEntityReference(), AccessMask = AccessRights.ReadAccess
                }
            };

            service.Execute(grantRequest);

            RetrieveSharedPrincipalsAndAccessRequest getPermissions = new RetrieveSharedPrincipalsAndAccessRequest()
            {
                Target = contact.ToEntityReference(),
            };

            var permissionsResponse = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(getPermissions);

            // Make sure things are correct before I start changing things
            Assert.Equal(user.Id, permissionsResponse.PrincipalAccesses[0].Principal.Id);
            Assert.Equal(AccessRights.ReadAccess, permissionsResponse.PrincipalAccesses[0].AccessMask);

            ModifyAccessRequest modifyRequest = new ModifyAccessRequest()
            {
                Target          = contact.ToEntityReference(),
                PrincipalAccess = new PrincipalAccess()
                {
                    Principal = user.ToEntityReference(), AccessMask = AccessRights.ReadAccess | AccessRights.DeleteAccess
                }
            };

            service.Execute(modifyRequest);

            permissionsResponse = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(getPermissions);

            // Check permissions
            Assert.Equal(user.Id, permissionsResponse.PrincipalAccesses[0].Principal.Id);
            Assert.Equal(AccessRights.ReadAccess | AccessRights.DeleteAccess, permissionsResponse.PrincipalAccesses[0].AccessMask);
        }
コード例 #3
0
ファイル: CrmRepository.cs プロジェクト: AntoshkaK/MyDSM
        public IEnumerable <PrincipalAccess> GetSharedPrincipals(EntityReference target)
        {
            var req = new RetrieveSharedPrincipalsAndAccessRequest()
            {
                Target = target
            };
            var resp = (RetrieveSharedPrincipalsAndAccessResponse)this.Execute(req);

            return(resp.PrincipalAccesses);
        }
コード例 #4
0
        public void Principal_Granted_Access_Multiple_Times_Only_Appears_Once()
        {
            var context  = new XrmFakedContext();
            var contact1 = new Contact {
                Id = Guid.NewGuid()
            };
            var user1 = new SystemUser {
                Id = Guid.NewGuid()
            };

            context.Initialize(new List <Entity>
            {
                contact1, user1
            });

            var service = context.GetFakedOrganizationService();

            GrantAccessRequest gar1 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar1);

            GrantAccessRequest gar2 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar2);

            RetrieveSharedPrincipalsAndAccessRequest req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact1.ToEntityReference()
            };
            RetrieveSharedPrincipalsAndAccessResponse resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            Assert.Equal(1, resp.PrincipalAccesses.Length);
        }
コード例 #5
0
        /// <summary>
        /// Retrieve all shared principal (user or team) and <c>AccessRights</c> information (such as Read, Write etc).
        /// <para>
        /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.retrievesharedprincipalsandaccessrequest.aspx
        /// </para>
        /// </summary>
        /// <param name="recordId">Record Id</param>
        /// <param name="entityLogicalName">Record's entity logical name</param>
        /// <returns>
        /// <seealso cref="PrincipalAccess"/> list for data
        /// </returns>
        public List <PrincipalAccess> GetSharedPrincipalsAndAccess(Guid recordId, string entityLogicalName)
        {
            ExceptionThrow.IfGuidEmpty(recordId, "recordId");
            ExceptionThrow.IfNullOrEmpty(entityLogicalName, "entityLogicalName");

            List <PrincipalAccess> result = new List <PrincipalAccess>();

            RetrieveSharedPrincipalsAndAccessRequest request = new RetrieveSharedPrincipalsAndAccessRequest()
            {
                Target = new EntityReference(entityLogicalName, recordId)
            };

            var serviceResponse = (RetrieveSharedPrincipalsAndAccessResponse)this.OrganizationService.Execute(request);

            if (serviceResponse != null && serviceResponse.PrincipalAccesses != null && serviceResponse.PrincipalAccesses.Length > 0)
            {
                result = serviceResponse.PrincipalAccesses.ToList();
            }

            return(result);
        }
コード例 #6
0
        private void RetrieveAndDisplayLeadAccess(EntityReference leadReference)
        {
            var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = leadReference
            };

            // The RetrieveSharedPrincipalsAndAccessResponse returns an entity reference
            // that has a LogicalName of "user" when returning access information for a
            // "team."
            var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)
                                 _serviceProxy.Execute(accessRequest);

            Console.WriteLine("The following have the specified granted access to the lead.");
            foreach (var principalAccess in accessResponse.PrincipalAccesses)
            {
                Console.WriteLine("\t{0}:\r\n\t\t{1}",
                                  GetEntityReferenceString(principalAccess.Principal),
                                  principalAccess.AccessMask);
            }
            Console.WriteLine();
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: salmanaashish/Dynamics-SDK
//Contains the data that is needed to retrieve the access rights of the specified security principal (team or user) to the specified record.

        public RetrievePrincipalAccessResponse RetrieveRights(Guid userId, Guid objectId, string entityName)
        {
            try
            {
// Requête d'accès
                var request = new RetrievePrincipalAccessRequest();
                request.Principal = new EntityReference("systemuser", userId);
                request.Target    = new EntityReference(entityName, objectId);

                return((RetrievePrincipalAccessResponse)service.Execute(request));

//Contains the data that is needed to retrieve all security principals (users or teams) that have access to, and access rights for, the specified record.

                var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
                {
                    Target = leadReference
                };

// The RetrieveSharedPrincipalsAndAccessResponse returns an entity reference
// that has a LogicalName of "user" when returning access information for a
// "team."

                var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)
                                     svc.Execute(accessRequest);
                Console.WriteLine("The following have the specified granted access to the lead.");

                foreach (var principalAccess in accessResponse.PrincipalAccesses)
                {
                    Console.WriteLine("\t{0}:\r\n\t\t{1}",
                                      GetEntityReferenceString(principalAccess.Principal),
                                      principalAccess.AccessMask);
                }
                Console.WriteLine();
            }
            catch (Exception error)
            {
                throw new Exception("Error while checking rigths: " + error.Message);
            }
        }
コード例 #8
0
        /// <summary>
        /// Retrieve and display entity access information.
        /// </summary>
        /// <param name="entityReference"></param>
        private static void RetrieveAndDisplayEntityAccess(CrmServiceClient service, EntityReference entityReference)
        {
            var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = entityReference
            };

            // The RetrieveSharedPrincipalsAndAccessResponse returns an entity reference
            // that has a LogicalName of "user" when returning access information for a
            // team.
            var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)
                                 service.Execute(accessRequest);

            Console.WriteLine("The following have the specified granted access to the entity.");

            foreach (var principalAccess in accessResponse.PrincipalAccesses)
            {
                Console.WriteLine("\t{0}:\r\n\t\t{1}",
                                  String.Format("{0} with GUID {1}", principalAccess.Principal.LogicalName,
                                                principalAccess.Principal.Id), principalAccess.AccessMask);
            }
            Console.WriteLine();
        }
コード例 #9
0
ファイル: UserAccess.cs プロジェクト: cesugden/Scripts
        private void RetrieveAndDisplayLeadAccess(EntityReference leadReference)
        {
            //<snippetUserAccess5>
            var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = leadReference
            };
            
            // The RetrieveSharedPrincipalsAndAccessResponse returns an entity reference
            // that has a LogicalName of "user" when returning access information for a
            // "team."
            var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)
                _serviceProxy.Execute(accessRequest);
            Console.WriteLine("The following have the specified granted access to the lead.");
            foreach (var principalAccess in accessResponse.PrincipalAccesses)
            {
                Console.WriteLine("\t{0}:\r\n\t\t{1}",
                    GetEntityReferenceString(principalAccess.Principal),
                    principalAccess.AccessMask);
            }
            Console.WriteLine();
            //</snippetUserAccess5>

        }
        /// <summary>
        /// Demonstrates sharing records by exercising various access messages including:
        /// Grant, Modify, Revoke, RetrievePrincipalAccess, and
        /// RetrievePrincipalsAndAccess.
        /// </summary>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptforDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptforDelete)
        {
            try
            {
                // Connect to the Organization service.
                // The using statement assures that the service proxy will be properly disposed.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // This statement is required to enable early-bound type support.
                    _serviceProxy.EnableProxyTypes();

                    _service = (IOrganizationService)_serviceProxy;

                    CreateRequiredRecords();

                    #region GrantAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    GrantAccessRequest grantRequest = new GrantAccessRequest()
                    {
                        Target          = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal  = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.WriteAccess | AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    GrantAccessResponse grantResponse =
                        (GrantAccessResponse)_service.Execute(grantRequest);

                    Console.Write("Access Granted ");

                    #endregion

                    #region ModifyAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    ModifyAccessRequest modifyRequest = new ModifyAccessRequest()
                    {
                        Target          = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal  = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    ModifyAccessResponse modifyResponse =
                        (ModifyAccessResponse)_service.Execute(modifyRequest);

                    Console.Write("and Modified. ");

                    #endregion

                    #region RetrievePrincipalAccess Message

                    // Create the request object and set the target and principal.
                    RetrievePrincipalAccessRequest retrieveRequest = new RetrievePrincipalAccessRequest()
                    {
                        Target    = new EntityReference(Account.EntityLogicalName, _accountId),
                        Principal = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RetrievePrincipalAccessResponse retrieveResponse =
                        (RetrievePrincipalAccessResponse)_service.Execute(retrieveRequest);

                    Console.Write("Retrieved principal access. ");

                    #endregion

                    #region RetrieveSharedPrincipalsAndAccess Message

                    // Create the request object and set the target.
                    RetrieveSharedPrincipalsAndAccessRequest retrieveSharedRequest =
                        new RetrieveSharedPrincipalsAndAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId)
                    };

                    // Execute the request.
                    RetrieveSharedPrincipalsAndAccessResponse retrieveSharedResponse =
                        (RetrieveSharedPrincipalsAndAccessResponse)_service.Execute(retrieveSharedRequest);

                    Console.Write("Retrieved principals and access. ");

                    #endregion

                    #region RevokeAccess Message

                    // Create the request object and set the target and revokee.
                    RevokeAccessRequest revokeRequest = new RevokeAccessRequest()
                    {
                        Target  = new EntityReference(Account.EntityLogicalName, _accountId),
                        Revokee = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RevokeAccessResponse revokeResponse =
                        (RevokeAccessResponse)_service.Execute(revokeRequest);

                    Console.Write("Revoked Access.");

                    #endregion

                    DeleteRequiredRecords(promptforDelete);
                }
            }

            // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
            catch (FaultException <Microsoft.Xrm.Sdk.OrganizationServiceFault> )
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }
コード例 #11
0
        /// <summary>
        /// Retrieve and display entity access information.
        /// </summary>
        /// <param name="entityReference"></param>
        private void RetrieveAndDisplayEntityAccess(EntityReference entityReference)
        {
            var accessRequest = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = entityReference
            };

            // The RetrieveSharedPrincipalsAndAccessResponse returns an entity reference
            // that has a LogicalName of "user" when returning access information for a
            // team.
            var accessResponse = (RetrieveSharedPrincipalsAndAccessResponse)
                _serviceProxy.Execute(accessRequest);

            Console.WriteLine("The following have the specified granted access to the entity.");

            foreach (var principalAccess in accessResponse.PrincipalAccesses)
            {
                Console.WriteLine("\t{0}:\r\n\t\t{1}",
                    String.Format("{0} with GUID {1}", principalAccess.Principal.LogicalName,
                principalAccess.Principal.Id), principalAccess.AccessMask);
            }
            Console.WriteLine();
        }
コード例 #12
0
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            RetrieveSharedPrincipalsAndAccessRequest req = (RetrieveSharedPrincipalsAndAccessRequest)request;

            return(ctx.AccessRightsRepository.RetrieveSharedPrincipalsAndAccess(req.Target));
        }
コード例 #13
0
        public void RetrieveSharedPrincipalsAndAccess_Test()
        {
            var context  = new XrmFakedContext();
            var contact1 = new Contact {
                Id = Guid.NewGuid()
            };
            var contact2 = new Contact {
                Id = Guid.NewGuid()
            };
            var user1 = new SystemUser {
                Id = Guid.NewGuid()
            };
            var user2 = new SystemUser {
                Id = Guid.NewGuid()
            };
            var user3 = new SystemUser {
                Id = Guid.NewGuid()
            };

            context.Initialize(new List <Entity>
            {
                contact1, user1, contact2, user2, user3
            });

            var service = context.GetFakedOrganizationService();

            GrantAccessRequest gar1 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar1);

            GrantAccessRequest gar2 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.CreateAccess | AccessRights.DeleteAccess | AccessRights.ShareAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact2.ToEntityReference()
            };

            service.Execute(gar2);

            GrantAccessRequest gar3 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.CreateAccess | AccessRights.DeleteAccess | AccessRights.ShareAccess,
                    Principal  = user2.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar3);

            GrantAccessRequest gar4 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user2.ToEntityReference()
                },
                Target = contact2.ToEntityReference()
            };

            service.Execute(gar4);

            RetrieveSharedPrincipalsAndAccessRequest req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact1.ToEntityReference()
            };
            RetrieveSharedPrincipalsAndAccessResponse resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            foreach (PrincipalAccess pa in resp.PrincipalAccesses)
            {
                if (pa.Principal.Id == user1.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user2.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user3.Id)
                {
                    Assert.Equal(AccessRights.None, pa.AccessMask);
                }
            }

            req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact2.ToEntityReference()
            };
            resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            foreach (PrincipalAccess pa in resp.PrincipalAccesses)
            {
                if (pa.Principal.Id == user2.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user1.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user3.Id)
                {
                    Assert.Equal(AccessRights.None, pa.AccessMask);
                }
            }
        }
コード例 #14
0
ファイル: SharingRecords.cs プロジェクト: cesugden/Scripts
        /// <summary>
        /// Demonstrates sharing records by exercising various access messages including:
        /// Grant, Modify, Revoke, RetrievePrincipalAccess, and 
        /// RetrievePrincipalsAndAccess.
        /// </summary>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptforDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptforDelete)
        {
            try
            {
                //<snippetSharingRecords1>
                // Connect to the Organization service. 
                // The using statement assures that the service proxy will be properly disposed.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri,serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // This statement is required to enable early-bound type support.
                    _serviceProxy.EnableProxyTypes();

                    _service = (IOrganizationService)_serviceProxy;

                    CreateRequiredRecords();

                    #region GrantAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    GrantAccessRequest grantRequest = new GrantAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.WriteAccess | AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    GrantAccessResponse grantResponse =
                        (GrantAccessResponse)_service.Execute(grantRequest);

                    Console.Write("Access Granted ");

                    #endregion

                    #region ModifyAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    ModifyAccessRequest modifyRequest = new ModifyAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    ModifyAccessResponse modifyResponse =
                        (ModifyAccessResponse)_service.Execute(modifyRequest);

                    Console.Write("and Modified. ");

                    #endregion

                    #region RetrievePrincipalAccess Message

                    // Create the request object and set the target and principal.
                    RetrievePrincipalAccessRequest retrieveRequest = new RetrievePrincipalAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId),
                        Principal = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RetrievePrincipalAccessResponse retrieveResponse = 
                        (RetrievePrincipalAccessResponse)_service.Execute(retrieveRequest);

                    Console.Write("Retrieved principal access. ");

                    #endregion

                    #region RetrieveSharedPrincipalsAndAccess Message

                    // Create the request object and set the target.
                    RetrieveSharedPrincipalsAndAccessRequest retrieveSharedRequest = 
                        new RetrieveSharedPrincipalsAndAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId)
                    };

                    // Execute the request.
                    RetrieveSharedPrincipalsAndAccessResponse retrieveSharedResponse = 
                        (RetrieveSharedPrincipalsAndAccessResponse)_service.Execute(retrieveSharedRequest);

                    Console.Write("Retrieved principals and access. ");

                    #endregion

                    #region RevokeAccess Message

                    // Create the request object and set the target and revokee.
                    RevokeAccessRequest revokeRequest = new RevokeAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId),
                        Revokee = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RevokeAccessResponse revokeResponse =
                        (RevokeAccessResponse)_service.Execute(revokeRequest);

                    Console.Write("Revoked Access.");

                    #endregion

                    DeleteRequiredRecords(promptforDelete);
                }
                //</snippetSharingRecords1>
            }

            // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }