SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Berechtigung auf SubWeb setzen

Unbeantwortet Dieser Beitrag hat 8 Antworten

Ohne Rang
13 Beiträge
brain23 erstellt 7 Dez. 2009 11:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Morgen zusammen,

In einem Receiver erstelle ich ein Updater der mir eine Berechtigung auf einem Subweb setzen sollte. Dieser wird aber nur ausgeführt wenn ich im RootWeb ein update auf ein Listitem mache.

Im moment ist mein problem dass ich nicht verstehe wie ich das ganze vom RootWeb ins Subweb updaten kann. gibt es irgendwo beispiele? ich habe nähmlich jetzt ein SPSite , SPWeb und SPListItem

Im ItemUpdating mache ich dann die überprüfung, mein Problem ist jetzt aber dass ich nach dieser überprüfung eine Aktion auslösen muss aber im SubWeb und nicht im RootWeb wo ich mich momentan befinde.

Grüsse

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Dez. 2009 11:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kannst Du vielleicht etwas genauer beschreiben, wo Dein Problem liegt?

An ein beliebiges Web kommst Du entweder über SPSite.AllWebs oder an die einem bestimmten Web untergeordneten über SPWeb.Webs.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
13 Beiträge
brain23 Als Antwort am 7 Dez. 2009 13:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

Vielen Dank für deine Antwort. Ok ich probiere es mal ein wenig genauer zu beschreiben. Anhand eines InfoPath Formular erstelle ich ein Projekt. Beim erstellen des Projekts wird ein SubWeb für dieses Projekt erstellt mit Hilfe eines Webservices. Wenn ich jetzt im RootWeb auf ein Projekt den status von Aktiv auf Inaktiv änderen muss das dazugehörige SubWeb des Projekts auf die Rolle "Lesen" geändert werden. D

Wenn also ein Projekt in der Projektliste des RootWebs auf inaktiv gesetzt wird wird das dazugehörige SubWeb von diesem Projekt anders berechtigt. Im moment habe ich ein Receiver mit einem ItemUpdating. Was ich jetzt eben nicht genau verstehe ist. bei diesem ItemUpdating befinde ich mich ja im RootWeb, wie kann ich jetzt aber sagen er soll das dazugehörige SubWeb auf nur "Lesen" berechtigen?

Gruss und vielen Dank

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Dez. 2009 13:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie oben beschrieben: an das Web kommst Du entweder über RootWeb.Webs oder über RootWeb.Site.AllWebs. Bei dem Web mußt Du dann die RoleAssignments bearbeiten, d.h. die bestehenden berechtigungen entfernen und neue (mit "nur Lesen") hinzufügen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
13 Beiträge
brain23 Als Antwort am 7 Dez. 2009 14:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank, das ganze habe ich mal erstellt

        public override void ItemUpdating(SPItemEventProperties properties)
        {
            // Hole das ListItem mit den "alten" Werten
            _item = properties.ListItem;
            // Hole die AfterProperties / neuen Werte
            SPItemEventDataCollection afterProperties = properties.AfterProperties;

            GetWebInformation(properties);

            if (_item[_item.Fields.GetFieldByInternalName(CustomFieldName.IsActive).Id] != null &&
                afterProperties[CustomFieldName.IsActive] != null)
            {
                string beforeProperty = _item[_item.Fields.GetFieldByInternalName(CustomFieldName.IsActive).Id].ToString();
                string afterProperty = afterProperties[CustomFieldName.IsActive].ToString();

                if (beforeProperty == TestAndDefectTrackerDataModel.IsActive && afterProperty != TestAndDefectTrackerDataModel.IsActive)

                {

....
                }
            }
        }

 

        private void GetWebInformation(SPItemEventProperties properties)
        {
            _currentSite = new SPSite(properties.SiteId);
            _currentWeb = _currentSite.OpenWeb(properties.RelativeWebUrl);

            _projects = new Projects(_currentWeb);
        }

 

Das mit den RoleAssignment ist mir jetzt auch klar, was mir einfach noch sorgen bereitet ist folgendes.  Im Abschnitt wo jetzt drei Punkte stehen muss ich sagen dass er das SPWeb von genau diesem Projekt auf Lesen setzen soll.

Mti _currentSite.RootWeb.Webs[ muss ich eine GUID mitgeben. Das wäre ja die GUID von meinem Subweb wo ich anders berechtigen will. Was muss ich jetzt machen damit ich genau weiss welche GUID ich ihm da mitgeben soll?

Gruss

 

 

 

Ohne Rang
13 Beiträge
brain23 Als Antwort am 7 Dez. 2009 14:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank, das ganze habe ich mal erstellt

        public override void ItemUpdating(SPItemEventProperties properties)
        {
            // Hole das ListItem mit den "alten" Werten
            _item = properties.ListItem;
            // Hole die AfterProperties / neuen Werte
            SPItemEventDataCollection afterProperties = properties.AfterProperties;

            GetWebInformation(properties);

            if (_item[_item.Fields.GetFieldByInternalName(CustomFieldName.IsActive).Id] != null &&
                afterProperties[CustomFieldName.IsActive] != null)
            {
                string beforeProperty = _item[_item.Fields.GetFieldByInternalName(CustomFieldName.IsActive).Id].ToString();
                string afterProperty = afterProperties[CustomFieldName.IsActive].ToString();

                if (beforeProperty == MyResource.IsActive && afterProperty != MyResource.IsActive)

                {

....
                }
            }
        }

 

        private void GetWebInformation(SPItemEventProperties properties)
        {
            _currentSite = new SPSite(properties.SiteId);
            _currentWeb = _currentSite.OpenWeb(properties.RelativeWebUrl);

            _projects = new Projects(_currentWeb);
        }

 

Das mit den RoleAssignment ist mir jetzt auch klar, was mir einfach noch sorgen bereitet ist folgendes.  Im Abschnitt wo jetzt drei Punkte stehen muss ich sagen dass er das SPWeb von genau diesem Projekt auf Lesen setzen soll.

Mti _currentSite.RootWeb.Webs[ muss ich eine GUID mitgeben. Das wäre ja die GUID von meinem Subweb wo ich anders berechtigen will. Was muss ich jetzt machen damit ich genau weiss welche GUID ich ihm da mitgeben soll?

Gruss

 

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Dez. 2009 14:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Naja, irgendwoher mußt Du natürlich wissen, welches Web zu welchem Item gehört. Woher Du diese Information nimmst, bleibt Dir überlassen. Am Besten Du speicherst das in einem zusätzlichen (versteckten) Feld. Das kann dann entweder die GUID oder die URL sein.

Übrigens ist Dein Code IMHO nicht schön und vor allem nicht sehr performant. Das wirkt sich hier auch für den Benutzer aus, weil Du im synchronen Ereignis "ItemUpdating" bist. Wenn Du das Update nicht abbrechen möchtest, dann solltest Du auf das asynchrone "ItemUpdated" wechseln, dann merkt der Benutzer das nicht.

Anmerkungen:
- in GetWebInformation erzeugst Du sowohl SPSite als auch SPWeb-Instanzen. Die solltest Du immer disposen oder noch besser using verwenden.
- Du hast mehrfach solche Konstrukte _item[_item.Fields.GetFieldByInternalName(CustomFieldName.IsActive).Id], bei denen Collections nach einem einzigen Element durchsucht werden. So etwas solltest Du immer zwischenspeichern:
SPField field = _item.Fields.GetFieldByInternalName(CustomFieldName.IsActive);
object itemValue = _item[field.Id];
usw.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
13 Beiträge
brain23 Als Antwort am 7 Dez. 2009 15:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

Hab ich das richtig verstanden.... wenn ich diesen Event an meiner Liste anhänge die im RootWeb ist dan ist bei mir ja _currentWeb das RootWeb.

Das würde heissen dieser Code ist bei mir noch falsch da ich da eben nicht das RootWeb holen muss sondern das SubWeb? Anahnd von _currentWeb und _projects müsste ich jetzt mein SubWeb herausfinden und bei den RoleAssignment diesen benutzen anstelle von _currentWeb? Sonst würde ich die Berechtigungen ja immer nur im Web Setzen wo ich diesen Event auslöse. Un in meinem Fall wäre es das RootWeb

 

        private void GetWebInformation(SPItemEventProperties properties)
        {
            using (SPSite site = new SPSite(properties.SiteId))
            {
                using (SPWeb subWeb = _currentSite.OpenWeb(properties.RelativeWebUrl))
                {
                    _currentSite = site;
                    _currentWeb = subWeb;
                    _projects = new Projects(_currentWeb);
                }
            }
        }

 

Vielen Dank für deine Hilfe!!

Gruss

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 7 Dez. 2009 15:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, das siehst Du völlig richtig.

Mir ist da übrigens noch etwas eingefallen: der EventReceiver läuft im Kontext desjenigen, der ihn ausgelöst hat. Dieser Account braucht dann natürlich entsprechende Rechte, damit er überhaupt die Berechtigungen verändern darf. Wenn Du das umgehen willst, dann schau Dir SPSecurity.RunWithElevatedPriviledges an.

Viele Grüße
Andi
af @ evocom de
Blog