상승 된 권한이있는 경우 정상적인 사용자가 SPPersistedObject 설정을 업데이트 할 수 있습니까?

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

문제

각 문서 라이브러리에 배포 된 사용자 정의 리본 아이콘이 있습니다. 정상 (즉, 비 관리자) 사용자는이 아이콘을 클릭 할 수 있습니다. 그가 할 때, 나는 어딘가에 문서 라이브러리 정보 (ID, 이름)를 영구적으로 저장하고 싶습니다. 중앙 관리자는 (사용자 정의 중앙 관리 페이지를 통해) 사용자가 입대하는 모든 문서 라이브러리 목록을 참조하십시오.

사용자가 리본 아이콘을 클릭하면 SPPersistedObject를 사용하여 문서 라이브러리 정보를 저장하는 것에 대해 생각하고 있습니다. 그러나 AFAIK는 팜 Admin 권한이 필요합니다. 즉, "Enniph"를 클릭 할 때 일반 사용자가 오류가 발생할 수 있습니다. 이 문제 가이 문제를 해결하거나 오류가 발생할 수있는 상승 된 권한으로 SPPersistedObject를 쓴 코드를 실행합니다. 이것은 제가 의미하는 것입니다 :

// 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은 RunWithElevatedPrivileges()가 해당 응용 프로그램 풀에서 호스팅되는 모든 사이트 모음에 대한 사이트 모음 관리자 권한이있는 응용 프로그램 풀 ID로 실행된다고 말합니다. SPPersistedObject를 업데이트 할만 큼 충분합니까?

SPPersistedObject.HasAdditionalUpdateAccess가 항상 true를 반환하도록 재정의해야합니다. 그렇지 않으면 아직도 적어도 권한있는 환경에 충분하지 않을 것입니까? 그렇지 않은 경우 사용자 정의 데이터베이스가 아닌 다른 정보를 저장 해야하는 옵션은 무엇입니까?

도움이 되었습니까?

해결책

상승 된 권한은 구성에 쓰기에 충분하지 않습니다. 데이터 베이스. 상승 된 권한으로 웹을 사용합니다 응용 프로그램 앱 풀의 Identity는 허가를 읽습니다. 기본적으로 config db. 물론 관리자 (중앙에서 실행됩니다 관리자는 읽기 및 쓰기 권한이 있어야합니다.

자세히보기 : http : // joelblogs.co.uk/2010/10/10/persisting-configuration-data-in-sharepoint-2010-with-sppersistedObject/

SPPersistedObject.HasAdditionalUpdateAccess
.

는 아직 팜 관리자가 아직 팜 관리자에게 가장 할 필요가 없습니다.

일부 적용 범위가 필요한 최종 주제는 보안이 필요합니다. 설명한대로 이전에 HOS는 팜 구성 데이터베이스에 존재합니다. 엄밀하게 그러나 말하기는 관리 기능을 지원하기 위해 존재합니다 이 범위를 초과하여 사용합니다. 예를 들어, 우리가 사용자 정의를 구축하는 경우 타이머 작업 및 우리는 직업에 업무를 제출할 수있는 능력을 갖고 싶습니다. 완료. 이 작업이 유래 할 가능성이 가장 큽니다 관리 범위가 아닌 범위 내에서. 아마도 사용자의 결과로 다른 사이트 모음에서 웹 파트에서 버튼을 클릭하십시오. 와 이전 버전의 SharePoint의 경우 이것은 단순히 불가능했습니다. 뿐 팜 관리자는 HOS를 업데이트 할 수 있습니다. 그러나 SharePoint 2010 년에는 기본 sppersistedObject가 추가되었습니다. HOS를 다른 사용자에게 열립니다. 이것이 어떻게 작동하는지 보려면 수정할 수 있습니다 우리의 주요 기능은 다음과 같습니다 :

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

이 코드는 팜 아닌 관리자가 아닌 관리자 사용자가 호스. 우리가 이것을 실행하면 우리는 다음과 같은 예외를 볼 수 있습니다. Gotcha 3 번 :

System.Security.SecurityException : 액세스가 거부되었습니다. ...에서 Microsoft.SharePoint.Administration.sppersistedObject.BaseUpdate () AT. persistedObjectDemo.mypersistedObject.Update ()

비 - 팜 관리자 사용자를 사용하여 HO를 업데이트하려고합니다. 예외를 던집니다. 그러나 다음 코드를 추가하는 경우 myPersistedObject.cs 및 우리의 프로그램을 다시 실행하면, 우리는 HOS가 적절하게 업데이트됩니다.

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

물론, 실제 응용 프로그램에서 우리는 아마도 우리는 일부를 추가하고 싶을 것입니다. 단순히 true를 반환하는 것이 아니라이 기능의 보안 검사 그리고 누구나 우리의 물건을 업데이 트를 억제하지만, 포인트를 충분히 설명합니다.

SharePoint가있는 경우 보안과 관련하여 다른 Gotcha가 있습니다. 설치된 2010, 기본적으로 팜 관리 계정 만 읽고 쓰기 구성 데이터베이스에 대한 액세스. 최소 권한 설치에서 웹 응용 프로그램 다른 중앙 관리, 실행 중일 것입니다. 자체 서비스 계정 에서이 계정에서는 글을 쓸 수 없습니다. 구성 데이터베이스에 대한 액세스. 결과적으로, 추가, 삭제 및 HOS에서 객체를 업데이트 할 수 없습니다. 무시 무시하지만 HasAdditionalupDateAccess는 우리가 누가 할 수있는 사람을 조금 더 제어 할 수 있습니다. 기본 앱 풀 계정에 기본 앱 풀 계정이없는 경우 HO 업데이트 적절한 데이터베이스 권한이 예술적으로 unstuck을 올리 나갈 것입니다 빨리.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top