Peut SPPersistedObject des paramètres mis à jour par les utilisateurs normaux si couru avec des privilèges élevés?

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

Question

J'ai un ruban personnalisé icône "Inscription" déployé sur chaque document de la bibliothèque.Un normal (c'est à direnon administrateur) l'utilisateur peut cliquer sur cette icône;quand il le fait, je voudrais enregistrer durablement la bibliothèque de documents d'information (ID, nom) quelque part.Une centrale admin peut (via une centrale personnalisés admin de la page) pour voir une liste de toutes les bibliothèques de documents prévus par les utilisateurs.

Je suis en train de réfléchir à l'aide de SPPersistedObject pour stocker le document informations de la bibliothèque lorsqu'un utilisateur clique sur l'icône de ruban.Cependant, autant que je sache, cela nécessite de la ferme des privilèges d'administrateur, ce qui signifie que les utilisateurs peuvent rencontrer une erreur lorsque vous cliquez sur "Inscrire". Serait à l'exécution du code qui écrit SPPersistedObject avec des privilèges élevés résoudre ce problème, ou une erreur encore se produire?C'est ce que je veux dire:

// 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 dit que RunWithElevatedPrivileges() "s'exécute sous l'identité du Pool d'Applications, qui a site de collecte des privilèges d'administrateur sur toutes les collections de sites hébergés par ce pool d'applications." Est-ce suffisant pour mettre à jour SPPersistedObject?

Dois-je remplacer SPPersistedObject.HasAdditionalUpdateAccess retourne toujours true, ou serait-ce encore ne pas être suffisant pour les moins milieux privilégiés?Si non, quelles options dois-je stocker ces informations d'une autre que d'une base de données personnalisée?

Était-ce utile?

La solution

Des privilèges élevés n'est pas assez pour écrire à la configuration la base de données.Avec des privilèges élevés, vous allez utiliser le web application application de la piscine identitty, qui ne dispose que d'une autorisation de lecture pour la base de données de configuration par défaut.Bien sûr utilisateur admin (qui fonctionne avec la centrale administrateur doit avoir la lecture et l'écriture).

En savoir plus: http://joelblogs.co.uk/2010/10/10/persisting-configuration-data-in-sharepoint-2010-with-sppersistedobject/

SPPersistedObject.HasAdditionalUpdateAccess

encore besoin de la non agricoles utilisateur admin pour être représenté à la ferme de l'utilisateur administrateur.

Un dernier sujet qui nécessite une certaine couverture est la sécurité.Comme décrit plus tôt, le HOS existe dans la configuration de batterie de serveurs de base de données.Strictement parlant, il existe pour prendre en charge les fonctionnalités administratives toutefois, il a des utilisations au-delà de ce champ d'application.Par exemple, si nous construisons un personnalisé travail du minuteur et nous voulons avoir la possibilité de soumettre des tâches de notre travail pour l'achèvement.Il est plus probable que ces tâches ne sont dans une étendue d'administration.Peut-être à la suite d'un utilisateur en cliquant sur un bouton sur une webpart sur une autre collection de sites.Avec les versions précédentes de SharePoint, ce n'était tout simplement pas possible.Seulement administrateurs de batterie de serveurs à mettre à jour l'OS.Cependant avec SharePoint En 2010, un ajout a été fait à la base SPPersistedObject que ouvre le HOS à d'autres utilisateurs.Pour voir comment cela fonctionne, nous pouvons modifier notre fonction Principale comme suit:

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();
        }
    }
}

Ce code permet de simuler une tentative par un non ferme utilisateur admin mise à jour le HOS.Si nous courons, nous allons voir l'exception de ce qui est notre gotcha nombre de 3:

Système.De sécurité.SecurityException:Accès refusé.au Microsoft.SharePoint.De l'Administration.SPPersistedObject.BaseUpdate() à PersistedObjectDemo.MyPersistedObject.Mise à jour()

Sans surprise, la mise à jour de l'OS à l'aide d'un non-agricoles de l'utilisateur administrateur lève une exception.Cependant, si nous ajoutons le code suivant MyPersistedObject.cs et exécuter notre programme de nouveau, nous pouvons voir que la HOS est mis à jour en conséquence.

protected override bool HasAdditionalUpdateAccess()
{
    return true;
}

Bien sûr, dans une application réelle, nous aurions probablement voulez ajouter un peu de le contrôle de sécurité dans cette fonction, plutôt que de simplement retourner true et qui permet à chacun de mettre à jour notre objet, mais j'espère que ce illustre le point suffisamment.

Il y a un autre piège à l'égard de la sécurité – lors de la SharePoint est 2010 est installé, par défaut, seule la ferme compte admin a lire/écrire l'accès à la config de base de données.Dans une moindre privilège de l'installation, tous les les applications web, puis d'autres de l'Administration Centrale, sera exécuté en vertu de leur propre compte de service et de ces comptes n'auront pas écrire l'accès à la config de base de données.Par conséquent, l'ajout, la suppression et mise à jour des objets dans l'OS ne sera pas possible.Bien que primordial HasAdditionalUpdateAccess nous permet un peu plus de contrôle sur qui peut mise à jour de l'OS, si le sous-jacent application de la piscine n'est pas le approprié autorisations de base de données, nous allons à se décoller assez rapidement.

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