2009-03-08 2 views
1

다른 데이터베이스의 일부 데이터를 기반으로 여러 공지 사항을 작성하라는 고객 요청이 있습니다. 대부분은 쉽지만 새로운 요소는 입력 데이터에 지정된 사용자 (로그인)에 의해 작성되어야합니다. 목록 웹 서비스를 사용하여 공지 사항을 추가 할 계획 이었지만 사용자 생성 권한을 얻기 위해 가장을 사용하지 않는 것이 좋습니다. 가장을 사용하지 않고 올바른 사용자를 작성자로 지정하는 방법이 있습니까?특정 사용자의 공지 사항 목록에 요소 추가

답변

2

이 답변은 찾고자하는 답변이 아닐 수도 있지만 SharePoint 서버의 GAC에서 코드를 실행하는 경우 가장 (impersonation)이 매우 쉽습니다. 많은 사람들이 모르는 암호를 알 필요가 없으므로 이것이 내가 가장 (impersonation)을 원하지 않는 이유라고 추측합니다. 방법은 다음과 같습니다.

SPSite에 사용하는 일반적인 생성자를 사용하여 SharePoint에 연결하고 적절한 SPUser 개체를 찾을 수 있습니다. 일단 그렇게하면 해당 SPUser에 대한 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 
    } 
} 
+0

:

는 SharePoint 2010을 사용하면 SPWeb 클래스에서 사용할 수있는 EnsureUser 방법이있는 사용자 방문, (이 코드는 사용자를 생성하고 또한 자신의 프로필을 조금 꼬집는) 시뮬레이션 할 수 있습니다. 나는 그것을 시험해보고 되돌릴 것이다 – Kasper

+0

커크, 나는 기절한다. 제안한 아이디어는 훌륭하지만 처음에는 감사 추적의 유효성이 무효화되어 주요 취약점으로 간주되었습니다. 두 번째 생각에서 나는이 "악용"을 사용하기 위해 적대적인 코드가 어쨌든 시스템의 핵심에 접근해야한다는 것을 깨달았습니다. – Kasper

+0

그래, 나는이 허점이 거기에 있다는 것을 배웠을 때 너무 놀랐다. 말하듯이 코드에는 특정 코드 액세스 보안 수준이 있어야합니다 (물론 GAC가 해당 작업을 수행하므로). 또 하나 흥미로운 것은 SPListItem.SystemUpdate()입니다. –

0

저는 이것을 보관할 방법이 없다고 생각합니다.

그러나이 해결 방법이 도움이 될 수 있습니다. 나는 이것을 결코 시험하지 않았다는 것을 인정해야한다. 그것은 단지 당신이 당신의 문제를 어떻게 풀 수 있을지 생각할 뿐이다.

시도해 볼 수 있습니다. 관리자 또는 RunWithElevatedPrivileges()를 사용하여 새 공지 사항을 작성하십시오. 그런 다음 RunWithElevatedPrivileges() 메서드를 다시 사용하고 발표자의 실제 생성자가되어야하는 사용자에게 "만든 사람"필드를 설정합니다. 이 방법으로 "편집자"필드 만 "잘못된"사용자를 표시해야합니다.

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

0

난 그냥 내 요구 사항은 그래서 나는 확실히 내가 다른 솔루션을 함께했다

:-)이 할 수없는 희망 SharePoint의 감사 추적을 회피하기 위해 실제로 것을 깨달았 새 사용자 또는 그룹 필드를 공지 목록에 추가하고 AD 사용자 로그온을이 필드에 복사하십시오. 이전에 "만든 사람"필드를 사용한 모든 보고서 또는보기는 이제 새 필드를 사용해야합니다.

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

제가 생각해 볼 수있는 유일한 해결책은 ListItem Add 트리거를 목록에 추가하는 것입니다. 새 요소가 추가되면 새 필드에 값이 들어 있는지 확인한 다음 로그인 된 사용자의 ID로 새 필드를 업데이트합니다. 그런 식으로 새로운 필드는 항상 유효한 사용자 ID를 포함해야합니다.

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

0

는 다음 적절한 경우 UserToken을 유도하는에서 사용 가능한 사용자 메타 데이터가 없습니다 : 그것은 무언가 같이해야합니다.그 흥미로운 보이는 지금

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(); 
관련 문제