SPListItem(ファイル付き)をあるサイトコレクションから別のサイトコレクションにコピーしようとしています。これを行うには、次のようなファイルを作成します。
var archiveFile = newsArchive.Lists[listName].RootFolder.Files.Add(originalItem.File.Name, originalItem.File.OpenBinary());
var archiveItem = archiveFile.Item;
私が書いたユーティリティメソッドを使用して、新しいアイテムのすべてのフィールド値を元のアイテムに対応するように設定します。
Utilities.PopulateListItemMetadata(....)
重要なのは、これはAuthorフィールドを永続化しないということです。
たとえば、次のように、考えられるあらゆる方法でAuthorフィールドを明示的に設定してみました。
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user.ID + ";#" + user.LoginName;
archiveItem.Update();
そしてそのように
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user;
archiveItem.Update();
ただし、SPListItem.Update()メソッドが呼び出されるとすぐに、archiveItem["Author"]フィールドはsharepoint\systemに戻ります。私はここで少し途方に暮れています、これはうまくいくはずです。
PSSPListItem.GetUser メソッドは拡張メソッドです
PPSコードはタイマージョブから実行されています...
編集:コンテンツタイプに新しいフィールドを追加し、元のアイテムの作成者を反映するようにそのフィールドを設定することで、もう少し掘り下げましたが、それも設定されていません。ただし、web.EnsureUser(username)は正しいユーザーを返します。これは変なのか、それとも何なのか!?!