Question

J'ai dans mon application SharePoint une source externe à laquelle vous devez accéder à 2 parties de mon application

La première partie est une page, où les utilisateurs peuvent rechercher sur un formulaire, les données externes. La deuxième partie est un travail de minuterie qui synchronise des données externes avec certains sites SharePoint.

Pour ce faire, j'ai ajouté le code suivant dans mon constructeur de connexion à l'entité Framework.

Cela fonctionne parfaitement pour la page, mais cela ne fonctionne pas pour le travail de la minuterie.

Comme tout le monde connaît la page d'applications s'exécute dans le contexte du compte d'application Pool, j'ai ajouté ce compte dans l'administrateur de service Secure Store, ainsi que dans l'application cible.

Toutefois, pour le service de minuterie, j'ai vérifié sur Services.MSC et il fonctionne sous le compte agricole, qui devrait déjà avoir des autorisations déjà.

En vérifiant certains postes, je lis que le service de minuterie est exécuté sous SharePoint \ System, mais ce n'est pas un compte, je ne peux pas accorder l'accès à, il est indiqué que le compte n'existe pas.

The specified user or domain group was not found.  or Claim is null on the resolved pickerentity.

Je dois être capable que mon travail de minuterie lit ces données.

/// <summary>
        /// Gets the database server and database name from the property bag
        /// </summary>
        /// <returns></returns>
        public static string GetDMSConnectionStringFromSecureStore()
        {
            var entityBuilder = new EntityConnectionStringBuilder();
            try
            {
                const string providerName = "System.Data.SqlClient";
                var dic = GetCredentialsFromSecureApp(Constants.SecureStore.ApplicationId);
                var serverName = string.Empty;
                var databaseName = string.Empty;
                var databaseUserName = string.Empty;
                var databasePassword = string.Empty;

                foreach (var item in dic)
                {
                    if (item.Key == Constants.SecureStore.DatabaseServerField)
                    {
                        serverName = item.Value;
                    }
                    if (item.Key == Constants.SecureStore.DatabaseNameField)
                    {
                        databaseName = item.Value;
                    }
                    if (item.Key == Constants.SecureStore.UserNameField)
                    {
                        databaseUserName = item.Value;
                    }
                    if (item.Key == Constants.SecureStore.PasswordField)
                    {
                        databasePassword = item.Value;
                    }
                }

                // Initialize the connection string builder for the underlying provider.
                var sqlBuilder = new SqlConnectionStringBuilder
                {
                    DataSource = serverName,
                    InitialCatalog = databaseName,
                    UserID = databaseUserName,
                    Password = databasePassword
                };

                // Build the SqlConnection connection string.
                var providerString = sqlBuilder.ToString();

                // Initialize the EntityConnectionStringBuilder.
                entityBuilder.Provider = providerName;
                entityBuilder.ProviderConnectionString = providerString;
                entityBuilder.Metadata = @"res://*/DMSModel.csdl|res://*/DMSModel.ssdl|res://*/DMSModel.msl";
            }
            catch (Exception ex)
            {
                LoggingService.LogError(LoggingCategory.Security, ex);
            }

            return entityBuilder.ToString();
        }

        private static SecureString CreateSecureString(string unsecureString)
        {
            var secureString = new SecureString();
            foreach (var c in unsecureString/*.ToCharArray()*/)
            {
                secureString.AppendChar(c);
            }
            return secureString;
        }

        public static SPSite GetCentralAdminSite()
        {
            var adminWebApp = SPAdministrationWebApplication.Local;
            if (adminWebApp == null)
            {
                throw new InvalidProgramException("Unable to get the admin web app");
            }

            SPSite adminSite;
            var adminSiteUri = adminWebApp.GetResponseUri(SPUrlZone.Default);
            if (adminSiteUri != null)
            {
                adminSite = adminWebApp.Sites[adminSiteUri.AbsoluteUri];
            }
            else
            {
                throw new InvalidProgramException("Unable to get Central Admin Site.");
            }

            return adminSite;
        }

        private static string GetStringFromSecureString(SecureString secStr)
        {
            if (secStr != null)
            {
                var pPlainText = IntPtr.Zero;
                try
                {
                    pPlainText = Marshal.SecureStringToBSTR(secStr);
                    return Marshal.PtrToStringBSTR(pPlainText);
                }
                finally
                {
                    if (pPlainText != IntPtr.Zero)
                    {
                        Marshal.FreeBSTR(pPlainText);
                    }
                }
            }

            return null;
        }

Était-ce utile?

La solution

The SharePoint System Account is the farm account. A quick way to identify this is in Central Admin. Goto Security > Configure Service Accounts. Select Farm Account. It will display which account is being used. Ensure that account has the appropriate permissions to the secure store entry.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top