问题
All -
I am using WSS 3.0. Currently, HR will upload an employee's internal company resume to a document library on our site, but for privacy reasons, we must then restrict access to that document library, which forces users to then go through HR each time they want to update their resume.
My thought is to create a list with attachments enabled that allows users to only view/edit their own items, and then give HR permission to manage all entries. This works with the exception that HR will need to create the initial list item and attach the resume, which means the list item will be "created by {hr}" and not visible/editable by the end user whose resume is attached.
Any ideas on how I can either allow HR to modify the "created by" field on upload so end users will see and can edit their resume, or go about this in a different way?
Thanks!
回答1:
Create a document library to hold the resume's. Then give the HR department (SharePoint User group) "read / write all" permissions on the library, the give everyone else read / write your own" rights. Create a Content Type called "Resume" based on the out-of-the-box Document content type. Then add a field that contains the Employee (SPUser field) whom the resume concerns to the content type (and any other fields required, i.e. name, address etc.). Have HR fill this in correctly when creating the listitem (make the fields required).
Then, write a itemeventreceiver bound to the content type you just created and override the ItemUpdated event.
The code would be something like the following:
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();
}
}
}
});
}
you can bind the ItemEventReceiver using a FeatureReceiver to the content type like so:
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();
回答2:
Why not just use a document library for the resumes? (instead of a list w/ attachments.) You can give HR full read/write to all documents within, and the owner of the resume will have contribute permissions to only their own resume.
回答3:
I found a way to change the Created By field using SharePoint Designer to create a workflow.
- Create a dummy field in your list with an easy-to-spot name, e.g. XYZZY. Make it a "person or group" field.
- In SharePoint Designer, create a Workflow for your list. Allow manual start and start automatically when new item is created.
- Actions -> Set Field in Current Item -> Set XYZZY to the field in your list that contains the user account you want to put into Created By.
- Click Finish
- Now, open your workflow .xoml file with Notepad. Replace "XYZZY" with "Author". Save the .xoml file.
- Open the workflow in Designer. Click Finish so that it reprocesses with the new code.
- Delete the dummy field from the list.
- Run the workflow on each existing item in your list. New items will self-correct automatically.
回答4:
With a custom upload screen you could change the context of the current user before doing the upload. It requires looking up the user token using something like the following (these are snippets of working code with error handling and other stuff removed). Note that EnsureUser will require that the current user basically be an admin/owner.
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;
}
回答5:
I had a similar situation (migration into sharepoint) where I had to add a file with the admin user to a doc library and then "change" the users. I did it like this, might help you somewhat:
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();
来源:https://stackoverflow.com/questions/1014215/sharepoint-wss-modify-created-by-field