SSL とポート 696 を介して Active Directory 操作を実行し、次のテスト コードを使用したいと考えています。
var domain = "server:636";
var domainPath = "DC=x,DC=y,DC=c";
var username = @"abc";
var userSearch = @"abc2";
var password = @"password";
using (var context = new PrincipalContext(ContextType.Domain, domain, domainPath, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer,username,password))
{
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userSearch);
var groups = p.GetGroups(context);
foreach (GroupPrincipal g in groups)
{
Console.WriteLine(g.ToString());
}
}
で例外が発生しp.GetGroups(context)
ます:
Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.COMException" は System.DirectoryServices.dll aufgetreten にあります。
参考情報: Der Server ist nicht funktionstüchtig.
ファイアウォールでチェックした結果、最初の部分は LDAPS と SSL で処理され、getGroups 呼び出しは SSL を使用しない LDAP で処理され、ファイアウォールによってブロックされていることがわかりました。
私も試しました
var groups = p.GetGroups();
と他の多くのバリエーション。しかし、私は問題を理解していません。
編集 20160614 - 回避策:
var entry = (DirectoryEntry)user.GetUnderlyingObject();
int propertyCount = entry.Properties["memberOf"].Count;
for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
{
var dn = (String)entry.Properties["memberOf"][propertyCounter];
var equalsIndex = dn.IndexOf("=", 1, StringComparison.Ordinal);
var commaIndex = dn.IndexOf(",", 1, StringComparison.Ordinal);
if (-1 == equalsIndex)
{
break;
}
var groupName = (dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
var groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, groupName.Replace("\\",""));
// Do something with your groupPricipal
}