문제

다른 데이터베이스의 일부 데이터를 기반으로 여러 공지 사항을 작성하라는 고객의 요청이 있습니다. 대부분은 충분히 쉬운 것처럼 보이지만 입력 데이터에 지정된 사용자 (로그인)가 새 요소를 작성해야합니다. List Web Services를 사용하여 공지 사항을 추가 할 계획 이었지만 사용자 생성을 올바르게 얻으려면 도용을 피하고 싶습니다. 사칭을 사용하지 않고 올바른 사용자를 제작자로 할당하는 방법이 있습니까?

도움이 되었습니까?

해결책

이것은 당신이 찾고있는 답이 아닐 수도 있지만 SharePoint 서버의 GAC에서 코드가 실행되면 가장 쉽습니다. 많은 사람들이 깨닫지 못하는 암호를 알 필요가 없으므로 이것이 당신이 가장하는 데 가장하고 싶지 않은 이유라고 가정 할 것입니다. 다음은 방법이 있습니다.

SPSITE에 사용하는 일반적인 생성자를 사용하여 SharePoint에 연결하고 적절한 스퍼서 개체를 찾을 수 있습니다. 이렇게하면 해당 스퍼서에 대한 Usertoken 속성을 얻을 수 있습니다. 그런 다음 SPSITE 생성자를 다시 사용해야하지만 SpuserToken을 제공하는 오버로드를 사용하십시오. 그러면 SharePoint에서하는 모든 일은 가장합니다. 높은 특권으로 달릴 필요가 없습니다.

좋아, 이제 말로 말 했으므로 코드를 추측하려고 노력할 것입니다. 그것은 다음과 같아야합니다.

// Just determine the user token for a particular user
SPUserToken userToken = null;
using (SPSite tempSite = new SPSite("http://sharepointurl"))
{
    using (SPWeb tempWeb = tempSite.OpenWeb())
    {
        // I think this next line works, but I'm going from memory
        // I believe the user needs to have already logged into the site at least once
        SPUser user = tempWeb.AllUsers["username"];
        userToken = user.UserToken;
    }
}

// Now do whatever we want impersonating that user
using (SPSite site = new SPSite("http://sharepointurl", userToken))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do whatever you want here
    }
} 

다른 팁

나는 이것을 보관하는 방법이 있다고 생각하지 않습니다.

그러나 아마도이 해결 방법이 도움이 될 수 있습니다. 나는 이것을 결코 테스트하지 않았다는 것을 인정해야한다. 그것은 당신이 당신의 문제를 어떻게 해결할 수 있는지 아이디어 일뿐입니다.

당신은 이것을 시도 할 수 있습니다. 관리자 또는 runwithelevatedPrivileges ()와 함께 새 발표를 만듭니다. 그 후 runwithelevatedPrivileges () 메소드를 다시 사용하고 발표의 실제 제작자가되어야하는 사용자에게 "생성 된"필드를 설정하십시오. 이런 식으로 "편집 된"필드만이 "잘못된"사용자를 표시해야합니다.

나는 이것이 매우 우아한 해결책이 아니라는 것을 알고 있지만 효과가있을 수 있습니다. ;)

방금 내 요구 사항이 실제로 SharePoint에서 감사 트레일을 우회하는 것임을 깨달았습니다.

다른 솔루션을 생각해 냈습니다. 발표 목록에 새 사용자 또는 그룹 필드를 추가하고 광고 사용자 로그온을이 필드에 복사했습니다. 이전에 "생성 된"필드를 사용한 보고서 나보기는 이제 새 필드를 사용해야합니다.

실제 사용자가 발표 목록에서 새로운 요소를 입력하는 상황은 어떻습니까? 로그인 한 사용자로 새 필드를 업데이트하지 않습니다!

글쎄, 내가 생각해 낼 수있는 유일한 해결책은 목록에 ListItem 추가 트리거를 추가하는 것입니다. 새 요소가 추가되면 새 필드에 값이 포함되어 있는지 확인하고 로그인 한 사용자의 ID로 새 필드를 업데이트합니다. 이렇게하면 새 필드에는 항상 유효한 userID가 포함되어야합니다.

나는 이것이 우아한 해결책이 아니라는 것을 알고 있지만, 당분간 내가 생각할 수있는 최고입니다.

답변 코드 주석에서 언급 한 바와 같이, 사용자가 적어도 한 번 사이트를 방문하지 않은 경우 적절한 usertoken을 도출 할 수있는 사용자 메타 데이터가 없습니다.

SharePoint 2010을 사용하면 SPWEB 클래스에서 사용할 수있는 restUser 메소드를 사용하여 사용자 방문을 시뮬레이션 할 수 있습니다 (이 스 니펫은 사용자를 생성하고 프로필도 약간 조정합니다).

SPUser alice = web.EnsureUser(@"MYDOMAIN\alice");
SPList userInfo = web.SiteUserInfoList; //metadata storage of user info

SPListItem item = userInfo.GetItemById(alice.ID);
item["About Me"] = "I am Alice from Mel's Diner";
item.Update();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top