別のデータベースのデータに基づいて多数のアナウンスを作成するよう顧客から要求されました。ほとんどは簡単に思えますが、新しい要素は入力データで指定されたユーザー (ログイン) によって作成される必要があります。リスト Web サービスを使用してお知らせを追加する予定でしたが、ユーザーの作成権限を取得するために偽装を使用することは避けたいと思います。なりすましを使用せずに正しいユーザーを作成者として割り当てる方法はありますか?
4 に答える
これはあなたが探している答えではないかもしれませんが、SharePoint サーバーの GAC でコードを実行している場合、なりすましは非常に簡単です。多くの人が気付いていないパスワードを知る必要はないので、これがなりすましをしたくない理由であると仮定し続けます。方法は次のとおりです。
SPSite に使用する一般的なコンストラクターを使用して SharePoint に接続し、適切な SPUser オブジェクトを見つけることができます。これを行うと、その SPUser の UserToken プロパティを取得できます。次に、SPSite コンストラクターを再度使用する必要がありますが、SPUserToken を提供するオーバーロードを使用します。その後、SharePoint で行うことはすべて、偽装によって行われます。昇格された権限で実行する必要はありません。
OK、言葉で言ったので、コードを推測してみます。次のようになります。
// 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
}
}
回答のコード コメントで示唆されているように、ユーザーが少なくとも 1 回はサイトにアクセスしていない場合、適切なユーザー トークンを取得するためのユーザー メタデータはありません。
SharePoint 2010 では、SPWeb クラスから利用できる EnsureUser メソッドを使用して、ユーザーの訪問をシミュレートできます (このスニペットはユーザーを作成し、プロファイルを少し調整します)。
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();
私の要件は実際にはSharePointの監査証跡を回避することであることに気付いたので、それができないことを願っています:-)
別の解決策を思いつきました。新しいユーザーまたはグループ フィールドをアナウンス リストに追加し、AD ユーザー ログオンをこのフィールドにコピーしました。以前に「作成者」フィールドを使用していたレポートまたはビューはすべて、新しいフィールドを使用する必要があります。
では実際のユーザーがお知らせリストに新しい要素を入力する状況はどうでしょうか? ログインしたユーザーで新しいフィールドが更新されることはありません。
私が思いついた唯一の解決策は、リストに ListItem Add トリガーを追加することです。新しい要素が追加されると、新しいフィールドに値が含まれているかどうかを確認し、そうでない場合は、ログインしているユーザーの ID で新しいフィールドを更新します。そうすれば、新しいフィールドには常に有効なユーザー ID が含まれているはずです。
これがエレガントな解決策ではないことはわかっていますが、当分の間、私が考えることができる最善の方法です。