Pode SPPersistedObject definições de ser atualizados por usuários normais se executou com privilégios elevados?

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/93794

Pergunta

Eu tenho uma faixa de opções personalizada ícone "Inscrever" implantado para cada biblioteca de documentos.Normal (i.e.não-admin) o usuário pode clicar neste ícone;quando ele faz, eu gostaria de salvar permanentemente o documento de informação de biblioteca (ID, nome) em algum lugar.Uma central de administração pode, em seguida, (através de um personalizado página administração central) ver uma lista de todas as bibliotecas de documentos inscrito pelos usuários.

Eu estou pensando em usar SPPersistedObject para armazenar o documento de informação de biblioteca quando um usuário clica no ícone de fita.No entanto, afaik isso requer privilégios de administrador de farm, o que significa que usuários normais encontrar um erro quando clicar em "Inscrever-se". Seria a execução do código que escreve SPPersistedObject com privilégios elevados resolver este problema, ou poderia um erro ainda ocorrer?Isso é o que eu quero dizer:

// Execute this code when a ribbon icon is clicked by a normal user
SPSecurity.RunWithElevatedPrivileges(delegate()
{
    // Write DocumentLibrary Id and Name to some custom SPPersistedObject
});

MSDN diz que RunWithElevatedPrivileges() "é executado sob a identidade de Pool de Aplicativo, que tem privilégios de administrador de conjunto de sites em todos os conjuntos de sites hospedados por esse pool de aplicativos." Isto é suficiente para a atualização SPPersistedObject?

Devo substituir SPPersistedObject.HasAdditionalUpdateAccess para sempre retornar true, ou seria isto ainda não ser o suficiente para, pelo menos, privilégios de ambientes?Se não, quais as opções que eu tenho para armazenar tais informações de um banco de dados personalizado?

Foi útil?

Solução

Privilégios elevados, não é suficiente para gravar a configuração de banco de dados.Com privilégios elevados, você vai usar a web aplicação do pool de aplicativos do identitty, que tem apenas permissão de leitura para o banco de dados de configuração por padrão.Do curso de administração de usuário (que executa a central admin deve ter permissões de leitura e gravação).

Veja mais em: http://joelblogs.co.uk/2010/10/10/persisting-configuration-data-in-sharepoint-2010-with-sppersistedobject/

SPPersistedObject.HasAdditionalUpdateAccess

ainda precisa não farm de usuário admin para ser representado a fazenda de usuário admin.

Um último tópico que requer a cobertura de alguns é a segurança.Como descrito anteriormente, o HOS existe no banco de dados de configuração do farm.Estritamente falar que existe para dar suporte à funcionalidade administrativa no entanto, ele tem usos para além deste âmbito.Por exemplo, se estamos a construir um personalizado o trabalho de timer e queremos ter a capacidade de enviar tarefas para o nosso trabalho para a conclusão.É mais provável que estas tarefas serão formados dentro de um sistema não-âmbito administrativo.Possivelmente como resultado de um usuário clicando em um botão em uma webpart em alguns outros sites.Com em versões anteriores do SharePoint, isso simplesmente não era possível.Apenas os administradores de farm pode atualizar o HOS.No entanto com o SharePoint De 2010, um acréscimo tem sido feito à base SPPersistedObject que abre o HOS para outros usuários.Para ver como isso funciona, podemos modificar nossa Principal função como segue:

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace PersistedObjectDemo
{
    internal class Program
    {
        private const int LOGON_TYPE_INTERACTIVE = 2;
        private const int LOGON_TYPE_PROVIDER_DEFAULT = 0;

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern bool LogonUser(string userName, string domain, string password, int logonType,
                                            int logonProvider, ref IntPtr accessToken);

        private static void Main(string[] args)
        {
            try
            {
                IntPtr accessToken = IntPtr.Zero;
                if (LogonUser("non-farm-admin-username", "your-domain-name", "your-password", LOGON_TYPE_INTERACTIVE,
                              LOGON_TYPE_PROVIDER_DEFAULT, ref accessToken))
                {
                    using (var identity = new WindowsIdentity(accessToken))
                    {
                        using (identity.Impersonate())
                        {
                            MyPersistedObject obj = MyPersistedObject.Local;
                   //delete existing object and recreate to keep things simple
                            obj.Delete();
                            obj = MyPersistedObject.Local;
                            obj.Foo = "Some updated value";
                            obj.Update();
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                Console.Write(ex);
            }

            Console.WriteLine("Press return to exit");
            Console.ReadLine();
        }
    }
}

Este código simula uma tentativa por parte de um não-agrícola usuário administrador para atualizar o HOS.Se fizermos isso, vamos ver o seguinte exceção que é a nossa pegadinha do número 3:

Do sistema.Segurança.SecurityException:Acesso negado.no A Microsoft.SharePoint.Administração.SPPersistedObject.BaseUpdate() em PersistedObjectDemo.MyPersistedObject.Update()

Sem surpresa, a tentar actualizar o HOS usando um non-farm usuário admin lança uma exceção.No entanto, se adicionar o seguinte código para MyPersistedObject.cs e executar o nosso programa novamente, podemos ver que o HOS está atualizado corretamente.

protected override bool HasAdditionalUpdateAccess()
{
    return true;
}

É claro que, em uma aplicação do mundo real, nós provavelmente deseja adicionar alguns verificação de segurança em esta função, em vez de simplesmente retornar verdadeiro e permitindo que qualquer pessoa para atualização de nosso objeto, mas espero que este ilustra o ponto suficientemente.

Há uma outra pegadinha com relação à segurança, quando o SharePoint é 2010 instalado, por padrão, somente a fazenda conta de administrador tem de leitura/gravação o acesso ao banco de dados de configuração.Em um privilégio mínimo de instalação, todos os aplicativos da web, em seguida, outras Administração Central, será executado sob a sua própria conta de serviço, e que essas contas não vai ter de escrever o acesso ao banco de dados de configuração.Consequentemente, a adição, exclusão e atualizando objetos no HOS não será possível.Embora substituindo HasAdditionalUpdateAccess permite-nos um pouco mais de controle sobre quem pode atualizar o HOS, tratando-se de um aplicativo conta do pool de não ter a apropriado permissões de banco de dados vamos a desagregar-se muito rapidamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top