Domanda

Ho un'icona di nastro personalizzata "Bristrato" implementato su ciascuna libreria di documenti. Un utente normale (I.e. non-admin) può fare clic su questa icona; Quando lo fa, vorrei salvare definitivamente le informazioni sulla libreria dei documenti (ID, nome) da qualche parte. Un amministratore centrale può quindi (tramite una pagina di amministrazione centrale personalizzata) consultare un elenco di tutte le librerie di documenti collocate dagli utenti.

Sto pensando di usare SPPersistedObject per memorizzare le informazioni sulla libreria documenti quando un utente fa clic sull'icona del nastro. Tuttavia, AFAIK questo richiede privilegi di amministrazione agricola, il che significa che gli utenti normali incontreranno un errore quando si fa clic su "Ingrandisci". esegue il codice che scrive che scrive SPPERSISTeDobject con privilegi elevati risolve questo problema o potrebbe ancora verificarsi un errore? Questo è ciò che intendo:

// 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 afferma che RunWithElevatedPrivileges() "viene eseguito nell'identità del pool di applicazione, che ha i privilegi di amministratore della raccolta del sito su tutte le raccolte di siti ospitate da tale pool di applicazioni." È abbastanza per aggiornare SPPersistedObject?

Dovrei ignorare SPPersistedObject.HasAdditionalUpdateAccess per restituire sempre True, o non sarà ancora sufficiente per gli ambienti meno privilegiati? In caso contrario, quali opzioni devo memorizzare tali informazioni diverse da un database personalizzato?

È stato utile?

Soluzione

.

I privilegi elevati non sono sufficienti per scrivere alla configurazione Banca dati. Con privilegi elevati userai il Web Application App Pool Identittytty, che ha solo lettura autorizzazione a il DB di configurazione per impostazione predefinita. Ovviamente l'utente amministratore (che gestisce il centro L'amministratore dovrebbe avere autorizzazioni di lettura e scrittura).

Vedi di più a: http:// joelblogs.co.uk/2010/10/10/10/persististing-configuration-Data-in-SharePoint-2010-With-SppersististeDobject/

SPPersistedObject.HasAdditionalUpdateAccess
.

ha ancora bisogno dell'utente di amministratore non agricole da impersonare all'utente Amministratore Aziendale.

.

Un argomento finale che richiede una certa copertura è la sicurezza. Come descritto In precedenza, l'HOS esiste nel database di configurazione della fattoria. Rigorosamente Parlare esiste per supportare la funzionalità amministrativa comunque ha user oltre questo ambito. Ad esempio, se stiamo costruendo un usanza Timer Job e vogliamo avere la possibilità di inviare compiti al nostro lavoro per il completamento. È molto probabile che queste attività provengano all'interno di un ambito non amministrativo. Forse come il risultato di un utente Facendo clic su un pulsante su un WebPart su qualche altra raccolta di siti. Con Versioni precedenti di Sharepoint, questo semplicemente non è stato possibile. Solo Gli amministratori agricoli potrebbero aggiornare l'HOS. Tuttavia con SharePoint. 2010, è stata effettuata un'aggiunta alla base SPPERSISTEDObject Apre l'HOS ad altri utenti. Per vedere come funziona, possiamo modificare La nostra funzione principale come 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();
        }
    }
}
.

.

Questo codice simula un tentativo da un utente amministratore non fattoria per aggiornare il Hos. Se corriamo, vedremo la seguente eccezione che è il nostro Gotcha numero 3:

System.Security.SecurityException: accesso negato. a Microsoft.SharePoint.administration.sppersististeDobject.baseupdate () a Persistitobjectdemo.mypersisteDebject.update ()

Non sorprendemente, cercando di aggiornare l'HOS utilizzando un utente amministratore non fattoria getta un'eccezione. Tuttavia, se aggiungiamo il seguente codice a Mypersistedobject.cs ed esegui di nuovo il nostro programma, possiamo vedere che il Hos è aggiornato in modo appropriato.

protected override bool HasAdditionalUpdateAccess()
{
    return true;
}
.

.

Certo, in un'applicazione del mondo reale, probabilmente vorremmo aggiungere alcuni Security Checking in questa funzione piuttosto che semplicemente restituire True e permettendo a chiunque di aggiornare il nostro oggetto ma spero che questo illustra il punto sufficientemente.

C'è un altro gotcha per quanto riguarda la sicurezza - quando è SharePoint 2010 installato, per impostazione predefinita Solo l'account Amministratore farm ha letto / scrittura Accesso al database di configurazione. In un'installazione dei privilegi minimi, tutto Le applicazioni Web Altro quindi l'amministrazione centrale, sarà in esecuzione Sotto il loro account di servizio e questi conti non avranno scrittura Accesso al database di configurazione. Di conseguenza, aggiungendo, eliminando e L'aggiornamento degli oggetti nell'HOS non sarà possibile. Anche se sopravvivere HasAdditionalUpdateaccess ci consente un po 'più di controllo su chi può Aggiorna l'HOS, se l'account della pool di app sottostanti non ha il Autorizzazioni di database appropriate che saremo sbloccati carine rapidamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top