Pregunta

Tengo en mi aplicación de SharePoint una fuente externa que debe acceder en 2 partes de mi aplicación

La primera parte es una página, donde los usuarios pueden buscar en un formulario, los datos externos. La segunda parte es un trabajo de temporizador que sincroniza los datos externos con algunos sitios de SharePoint.

Para hacerlo, agregué el siguiente código en mi constructor de conexión de marco de entidades.

Funciona perfecto para la página, pero no funciona para el trabajo del temporizador.

Como todos saben que la página de la aplicación se ejecuta en el contexto de la cuenta de la aplicación Poool, agregué esa cuenta en el administrador de servicios de tienda segura, y también en la aplicación de destino.

Sin embargo, para el servicio del temporizador, lo registré en Servicios.msc y se ejecuta bajo la cuenta de la granja, que ya debería tener permisos.

Al verificar algunas publicaciones, leí que el servicio del temporizador se ejecuta en SharePoint \ System, pero esta no es una cuenta en la que puedo otorgar acceso, dice que la cuenta no existe.

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

Necesito poder poder que mi trabajo de temporizador lea ese DATOS.

/// <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;
        }

¿Fue útil?

Solución

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.

Licenciado bajo: CC-BY-SA con atribución
scroll top