メソッドSPUtility.GetPrincipalsInGroup
( MSDN ) を使用できます。
string input
セキュリティ グループの NT アカウント名であるを除いて、すべてのパラメータは自明です。
bool reachedMaxCount;
SPWeb web = SPContext.Current.Web;
int limit = 100;
string group = "Domain\\SecurityGroup";
SPPrincipalInfo[] users = SPUtility.GetPrincipalsInGroup(web, group, limit, out reachedMaxCount);
この方法では、ネストされたセキュリティ グループは解決されないことに注意してください。SPBasePermissions.BrowseUserInfo
さらに、実行ユーザーは、現在の Web でのユーザー情報の参照権限 ( ) を持っている必要があります。
アップデート:
private void ResolveGroup(SPWeb w, string name, List<string> users)
{
foreach (SPPrincipalInfo i in SPUtility.GetPrincipalsInGroup(w, name, 100, out b))
{
if (i.PrincipalType == SPPrincipalType.SecurityGroup)
{
ResolveGroup(w, i.LoginName, users);
}
else
{
users.Add(i.LoginName);
}
}
}
List<string> users = new List<string>();
foreach (SPUser user in SPContext.Current.Web.AllUsers)
{
if (user.IsDomainGroup)
{
ResolveGroup(SPContext.Current.Web, user.LoginName, users);
}
else
{
users.Add(user.LoginName);
}
}
編集:
[...] Active Directory クエリに頼る (このような操作を行うには十分な権限が必要になるため、これは避けたいと思います [...]
もちろんその通りですが、SharePoint は AD も検索する必要があります。そのため、AD への読み取りアクセス権を持つアプリケーション プール サービス アカウントが必要です。つまり、コードをプロセス アカウントに戻して実行すると、AD に対して安全にクエリを実行できるはずです。