SharePoint / WSS:変更“作成者”フィールド?
-
06-07-2019 - |
質問
すべて-
WSS 3.0を使用しています。現在、人事部は従業員の社内の履歴書を当社のサイトのドキュメントライブラリにアップロードしますが、プライバシー上の理由から、そのドキュメントライブラリへのアクセスを制限する必要があります。
ユーザーが自分のアイテムのみを表示/編集できる添付ファイルを有効にしてリストを作成し、すべてのエントリを管理するためのHR権限を付与することを考えています。これは、HRが最初のリストアイテムを作成して履歴書を添付する必要があるという例外を除いて機能します。つまり、リストアイテムは「{hr}」によって「作成」されます。履歴書が添付されているエンドユーザーは表示/編集できません。
HRが" created by"を変更できるようにする方法に関するアイデアエンドユーザーが履歴書を表示して編集できるようにアップロードのフィールドを使用しますか、または別の方法でこれを実行しますか?
ありがとう!
解決
履歴書を保持するドキュメントライブラリを作成します。次に、人事部門(SharePointユーザーグループ)に「すべて読み取り/書き込み」を与えます。ライブラリのアクセス許可、他のすべてのユーザーに自分の読み取り/書き込みを許可する」権利。 「再開」というコンテンツタイプを作成します。すぐに使用可能なドキュメントコンテンツタイプに基づきます。次に、履歴書がコンテンツタイプに関係する従業員(SPUserフィールド)を含むフィールド(およびその他の必要なフィールド、つまり名前、住所など)を追加します。リストアイテムを作成するときに、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();
}
}
}
});
}
FeatureReceiverを使用して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を使用して[作成者]フィールドを変更し、ワークフローを作成する方法を見つけました。
- リストに、見つけやすい名前でダミーフィールドを作成します。 XYZZY。 「個人またはグループ」にするフィールド。
- SharePoint Designerで、リストのワークフローを作成します。手動での起動を許可し、新しいアイテムが作成されたときに自動的に起動します。
- アクション->現在のアイテムのフィールドを設定-> XYZZYを、作成者に含めるユーザーアカウントを含むリスト内のフィールドに設定します。
- [完了]をクリック
- ここで、メモ帳でワークフローの.xomlファイルを開きます。 「XYZZY」を置き換えます; " Author"で。 .xomlファイルを保存します。
- Designerでワークフローを開きます。 [完了]をクリックして、新しいコードで再処理します。
- リストからダミーフィールドを削除します。
- リスト内の既存の各アイテムでワークフローを実行します。新しいアイテムは自動的に自動修正されます。
カスタムアップロード画面を使用すると、アップロードを行う前に現在のユーザーのコンテキストを変更できます。次のようなものを使用してユーザートークンを検索する必要があります(これらは、エラー処理およびその他のものが削除された作業コードのスニペットです)。 EnsureUserでは、基本的に現在のユーザーが管理者/所有者である必要があることに注意してください。
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への移行)で、adminユーザーのファイルをドキュメントライブラリに追加してから「変更」する必要がありました。ユーザー。私はこのようにしました、あなたをいくらか助けるかもしれません:
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();