ユーザー(現在ログインしているユーザーではない)が特定のグループのメンバーであるかどうかを確認するにはどうすればよいですか?メンバーではないグループからユーザーを取得しようとすると、SPExceptionが発生するため、nullをチェックすることはできません。
では、この問題をどのように解決しますか。現時点では、SPGroup.Users.XML文字列でユーザー名を検索するか、すべてのグループメンバーを繰り返し処理してログイン名を確認することを考えています。
更新:ユーザーのメンバーシップを確認するための例外処理の使用を避けたいと言うのを忘れました。
これは、LINQを使用して拡張メソッドを作成することで実現しました。 SPGroupはSPPrincipalを継承するため、principal
パラメーターに渡すことができるはずです。
public static bool Contains(this SPRoleAssignmentCollection rac, SPPrincipal principal)
{
XElement racXml = XElement.Parse(rac.Xml);
return racXml.Elements("permission").Any(vw => (int)vw.Attribute("memberid") == principal.ID);
}
public static class SPUserExtension {
public static bool InGroup(this SPUser user, SPGroup group)
{
return user.Groups.Cast<SPGroup>()
.Any(g => g.ID == group.ID);
}
}
}
次に、SPUserオブジェクトで次のメソッドを呼び出します。
SPUser user;
SPGroup group;
//...
bool isMember = user.InGroup(group);
いくつかの方法。 SharePointグループには、グループ所有者のみがメンバーシップの詳細を表示できるようにするか、全員がメンバーシップの詳細を表示できるようにするオプションがあります。すべてが許可されている場合、セキュリティ制限は適用されません。許可されていない場合は、RunWithElevatedPrivilegesを実行し、その中で使用するSPSiteおよびSPWebの新しいインスタンスを取得する必要があります。
以下はオプションであると言われています:
private Boolean isUserInGroup(SPGroup oGroupToTestFor,String sUserLoginName)
{
Boolean bUserIsInGroup = false;
try
{
SPUser x = oGroupToTestFor.Users[sUserLoginName];
bUserIsInGroup = true;
}
catch (SPException)
{
bUserIsInGroup = false;
}
return bUserIsInGroup;
}
別の方法は
private Boolean isUserInGroup(SPGroup oGroupToTestFor, String sUserLoginName)
{
Boolean bUserIsInGroup = false;
SPUser oUser =null;
try{
oUser = SPContext.Current.Web.AllUsers[sUserLoginName];
}
catch{}
if(oUser!=null){
foreach (SPUser item in oGroupToTestFor.Users)
{
if (item.UserToken == oUser.UserToken)
{
bUserIsInGroup = true;
break;
}
}
}
return bUserIsInGroup;
}
RunWithElevatedPrivileges を使用してみましたか?
SPSecurity.RunWithElevatedPrivileges(delegate()
{
//put your code here to get the group and test for the user
});
特定のユーザーが特定のSharePointグループに存在するかどうかを確認する簡単な方法を実装しました。 SPUserオブジェクトにlinqを使用した簡単なステートメント。
bool userExsists = spUser.Groups.Cast<SPGroup>().Any(g => g.Name.ToLower() == spGroup.Name.ToLower());
SharePoint Core Solutions の詳細な投稿を見つけてください。
SPSecurity.RunWith ..を機能させるには、SPSiteまたはSPWebオブジェクト、あるいはその両方の新しいインスタンスが必要であり、コンテキストを使用しないでください。そうしないと機能しません。
使用するSPUserオブジェクトはありますか?その場合は、SPUser.Groupsコレクションを使用できます。