/// <summary>
        /// Get the instance of a Business Data Connectivity entity
        /// </summary>
        /// <param name="site"></param>
        /// <param name="nameSpace"></param>
        /// <param name="entityName"></param>
        /// <param name="entityId"></param>
        /// <returns></returns>
        private static IEntityInstance GetEntityInstance(SPSite site, string nameSpace, string entityName, string entityId)
        {
            //Use the scope of the currently opened site
            SPServiceContext      ctx   = SPServiceContext.GetContext(site);
            SPServiceContextScope scope = new SPServiceContextScope(ctx);

            //Get the BDC service of the local SP farm
            BdcService         service           = SPFarm.Local.Services.GetValue <BdcService>();
            IMetadataCatalog   catalog           = service.GetDatabaseBackedMetadataCatalog(ctx);
            IEntity            entity            = catalog.GetEntity(nameSpace, entityName);
            ILobSystemInstance LobSysteminstance = entity.GetLobSystem().GetLobSystemInstances()[0].Value;
            IEntityInstance    entInstance       = null;

            //Loop through the methods defined in the LOB
            foreach (KeyValuePair <string, IMethod> method in entity.GetMethods())
            {
                IMethodInstance methodInstance = method.Value.GetMethodInstances()[method.Key];
                //Get the Specific Finder method of the LOB
                if (methodInstance.MethodInstanceType == MethodInstanceType.SpecificFinder)
                {
                    //Find the record with the ID from the datasource
                    Microsoft.BusinessData.Runtime.Identity id = new Microsoft.BusinessData.Runtime.Identity(entityId);
                    entInstance = entity.FindSpecific(id, entity.GetLobSystem().GetLobSystemInstances()[0].Value);
                }
            }

            return(entInstance);
        }
示例#2
0
        internal static OutputQueue UserHasAccess(out bool hasAccess, string accountName = null)
        {
            var outputQueue = new OutputQueue();

            hasAccess = false;

            if (string.IsNullOrEmpty(accountName))
            {
                accountName = WindowsIdentity.GetCurrent().Name;
            }

            var mossContext = SPServiceContext.GetContext(SPServiceApplicationProxyGroup.Default, new SPSiteSubscriptionIdentifier(Guid.Empty));

            using (var scope = new SPServiceContextScope(mossContext))
            {
                SPIisWebServiceApplication app = null;
                outputQueue.Add(GetUserProfileApplication(out app));
                if (app != null)
                {
                    var accessControl = app.GetAccessControl();
                    if (accessControl != null)
                    {
                        var accessRules = accessControl.GetAccessRules();

                        foreach (var rule in accessRules)
                        {
                            if (rule.Name.ToUpperInvariant().EndsWith(accountName.ToUpperInvariant(), StringComparison.CurrentCultureIgnoreCase))
                            {
                                hasAccess = rule.AllowedRights == SPIisWebServiceApplicationRights.FullControl;
                                if (hasAccess)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(outputQueue);
        }
示例#3
0
        internal static OutputQueue EnsureUserAccess(string accountName = null)
        {
            var outputQueue = new OutputQueue();

            if (string.IsNullOrEmpty(accountName))
            {
                accountName = WindowsIdentity.GetCurrent().Name;
            }

            var mossContext = SPServiceContext.GetContext(SPServiceApplicationProxyGroup.Default, new SPSiteSubscriptionIdentifier(Guid.Empty));

            using (var scope = new SPServiceContextScope(mossContext))
            {
                SPIisWebServiceApplication app = null;
                outputQueue.Add(GetUserProfileApplication(out app));
                if (app != null)
                {
                    var isAdmin = false;
                    outputQueue.Add(UserIsAdministrator(out isAdmin, accountName));
                    if (!isAdmin)
                    {
                        var aac = app.GetAdministrationAccessControl();
                        aac.AddAccessRule(new SPAclAccessRule <SPCentralAdministrationRights>(new NTAccount(accountName), SPCentralAdministrationRights.FullControl));
                        app.SetAdministrationAccessControl(aac);
                    }

                    var hasAccess = false;
                    outputQueue.Add(UserHasAccess(out hasAccess, accountName));
                    if (!hasAccess)
                    {
                        var ac = app.GetAccessControl();
                        ac.AddAccessRule(new SPAclAccessRule <SPIisWebServiceApplicationRights>(new NTAccount(accountName), SPIisWebServiceApplicationRights.FullControl));
                        app.SetAccessControl(ac);
                    }
                    app.Update();
                }
            }

            return(outputQueue);
        }
示例#4
0
        private static bool ProcessWorkMatterDocuments()
        {
            inProgress = true;
            bool success = false;
            try
            {
                foreach(string libraryName in Settings.Default.LibrariesToProcess)
                {
                    using (SPSite site = new SPSite(ConfigurationManager.AppSettings["SiteUrl"], SPUserToken.SystemAccount))
                    {
                        Console.WriteLine("Successfully connected to site at " + site.Url);
                        using (SPWeb web = site.OpenWeb())
                        {
                            Console.WriteLine("Successfully opened SPWeb at " + web.Url);
                            SPList workMatterDocumentLibrary = web.Lists[libraryName];
                            SPQuery query = new SPQuery();
                            query.ViewXml = Util.GetViewQuery();
                            query.QueryThrottleMode = SPQueryThrottleOption.Override;
                            do
                            {
                                SPListItemCollection items = workMatterDocumentLibrary.GetItems(query);
                                int totalItems = items.Count;
                                Console.WriteLine("Processing items " + (query.ListItemCollectionPosition != null ? query.ListItemCollectionPosition.ToString() : "0") + " to " + query.ListItemCollectionPosition + totalItems);
                                query.ListItemCollectionPosition = items.ListItemCollectionPosition;
                                for (int i = 0; i < items.Count; i++)
                                {
                                    SPListItem item = items[i];

                                    try
                                    {
                                        web.AllowUnsafeUpdates = true;
                                        Records.BypassLocks(item, delegate (SPListItem delegateItem)
                                        {
                                            using (DisabledEventsScope scope = new DisabledEventsScope())
                                            {

                                                SPBusinessDataField field = delegateItem.Fields[Resource.FieldBCSWorkMatterDocument] as SPBusinessDataField;
                                                string documentId = Util.GetDocumentId(delegateItem);
                                                using (SPServiceContextScope ctxScope = new SPServiceContextScope(SPServiceContext.GetContext(site)))
                                                {
                                                    try
                                                    {
                                                        Util.SetBCSField(delegateItem, field, documentId, "GetWorkMatterDocumentBySPID");
                                                        Util.ClearFields(item);
                                                        if (delegateItem.Fields.ContainsField(Resource.FieldBCSWorkMatterDocumentStatus) && delegateItem[Resource.FieldBCSWorkMatterDocumentStatus] != null && delegateItem[Resource.FieldBCSWorkMatterDocumentStatus].ToString() == "Final")
                                                        {
                                                            Util.LockItem(delegateItem);
                                                        }
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        // Swallow the error at this level
                                                    }
                                                }

                                                Console.WriteLine("Document updated. ItemId=" + delegateItem.ID);
                                            }
                                        });
                                    }
                                    catch (Exception ex)
                                    {
                                        Util.LogError("Error updating document: " + ex.Message);
                                        Console.WriteLine("Error updating document: " + ex.Message);
                                    }
                                    finally
                                    {
                                        web.AllowUnsafeUpdates = false;
                                    }
                                }
                            }
                            while (query.ListItemCollectionPosition != null);
                        }
                    }
                }
                success = true;
            }
            catch (Exception ex)
            {
                success = false;
                Util.LogError("Error in ProcessWorkMatterDocuments(): " + ex.Message);
                Console.WriteLine("Error in ProcessWorkMatterDocuments(): " + ex.Message);
            }
            inProgress = false;
            return success;
        }