문제

모두 -

WSS 3.0을 사용하고 있습니다. 현재 HR은 직원의 내부 회사 이력서를 당사 사이트의 문서 라이브러리에 업로드 할 것이지만 개인 정보 보호상의 이유로 인해 해당 문서 라이브러리에 대한 액세스를 제한하여 사용자가 이력서를 업데이트 할 때마다 HR을 통과해야합니다.

내 생각은 사용자가 자신의 항목을보고/편집 할 수있는 첨부 파일이있는 목록을 작성한 다음 HR이 모든 항목을 관리 할 수있는 권한을 부여하는 것입니다. 이는 HR이 초기 목록 항목을 생성하고 이력서를 첨부해야한다는 점을 제외하고는 작동합니다. 즉, 목록 항목은 "{hr}에 의해 만들어지고"이력서가 첨부 된 최종 사용자가 표시/편집 할 수 없음을 의미합니다.

HR이 업로드시 "생성 된"필드를 수정하여 최종 사용자가 이력서를보고 편집 할 수 있도록 "생성"필드를 수정할 수있는 방법에 대한 아이디어가 있습니까?

감사!

도움이 되었습니까?

해결책

이력서를 보유 할 문서 라이브러리를 만듭니다. 그런 다음 HR 부서 (SharePoint User Group)에게 "읽기 / 쓰기"라이브러리의 권한을 읽고, 다른 모든 사람이 자신의 자신의 권한을 읽거나 쓰십시오. 박스 문서 콘텐츠 유형. 그런 다음 이력서가 컨텐츠 유형 (및 필요한 다른 필드, 즉 이름, 주소 등)이 포함 된 직원 (Spuser Field)이 포함 된 필드를 추가하십시오. ListItem을 만들 때 HR을 올바르게 채우도록하십시오. (필드를 필요로합니다).

그런 다음 방금 만든 컨텐츠 유형에 바인딩 된 ItemEventReceiver를 작성하고 ItemUpdated 이벤트를 무시합니다.

코드는 다음과 같습니다.

public override void ItemUpdated(SPItemEventProperties properties)
{
  SPSecurity.RunWithElevatedPrivileges(delegate
  {
    using (SPWeb web = properties.OpenWeb())
    {
       web.AllowUnsafeUpdates = true; 
       var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId);
       if (item != null)
       {
         if (item.Fields.ContainsField("Employee"))
         {
           item["Author"] = item["Employee"]; 
           // Author is the internal name of the Created by field, 
           // always use Internal Names!
           DisableEventFiring();
           item.SystemUpdate();
           EnableEventFiring();
         }
       }
     }
   });
}

Featureseceiver를 사용하여 itemeventreceiver를 다음과 같은 컨텐츠 유형에 바인딩 할 수 있습니다.

SPContentType docCt = web.ContentTypes[new SPContentTypeId("CONTENTYPE ID GOES HERE")];
docCt.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=TOKEN", "FULLY QUALIFIED CLASSNAME");
docCt.Update();

다른 팁

이력서에 문서 라이브러리를 사용하지 않는 이유는 무엇입니까? (첨부 파일이있는 목록 대신) 내의 모든 문서에 HR을 전체 읽기/ 쓰기를 제공 할 수 있으며 이력서의 소유자는 자신의 이력서에만 권한을 부여합니다.

SharePoint Designer를 사용하여 워크 플로우를 만들기 위해 Field By Field를 변경하는 방법을 찾았습니다.

  1. 스포트하기 쉬운 이름 (예 : Xyzzy)으로 목록에 더미 필드를 만듭니다. "사람 또는 그룹"필드로 만드십시오.
  2. SharePoint Designer에서 목록에 대한 워크 플로를 만듭니다. 새 항목이 생성되면 수동 시작 및 자동으로 시작하십시오.
  3. actions-> 현재 항목의 필드 설정 -> 생성하려는 사용자 계정이 포함 된 목록의 필드로 Xyzzy를 설정하십시오.
  4. 완료를 클릭하십시오
  5. 이제 메모장으로 워크 플로 .XOML 파일을 엽니 다. "Xyzzy"를 "저자"로 바꾸십시오. .xoml 파일을 저장하십시오.
  6. 디자이너에서 워크 플로우를 엽니 다. 새 코드로 재 처리되도록 마감을 클릭하십시오.
  7. 목록에서 더미 필드를 삭제하십시오.
  8. 목록의 각 기존 항목에서 워크 플로를 실행하십시오. 새로운 항목은 자동으로 자체적으로 교정됩니다.

사용자 정의 업로드 화면을 사용하면 업로드를 수행하기 전에 현재 사용자의 컨텍스트를 변경할 수 있습니다. 다음과 같은 것을 사용하여 사용자 토큰을 찾아야합니다 (오류 처리 및 기타 물건이 제거 된 작업 코드 스 니펫입니다). 보장자는 현재 사용자가 기본적으로 관리자/소유자 여야합니다.

using (SPSite site = GetImpersonatedSite(runAsUser))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do stuff here
    }
}

private SPSite GetImpersonatedSite(string username)
{
    user = SPContext.Current.Web.EnsureUser(username);
    SPSite site = new SPSite(SPContext.Current.Web.Url, user.UserToken);
    return site;
}

비슷한 상황 (SharePoint로의 마이그레이션)이 있었는데, 여기서 관리자와 함께 Doc 라이브러리에 파일을 추가 한 다음 사용자를 "변경"해야했습니다. 나는 이렇게했는데, 당신이 다소 도움이 될 수 있습니다 :

using (var root = site.RootWeb)
 {
   var users = root.SiteUsers;
   var user = users["domain\username"];
   file.Item[SPBuiltInFieldId.Created_x0020_By] = user.ID;
   file.Item[SPBuiltInFieldId.Modified_x0020_By] = user.ID;
   file.Item.UpdateOverwriteVersion();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top