私は、MINE と THEIRS の 2 つのドメインを持っています。MINE は私のローカル ドメインであり、THEIRS との一方向の信頼関係 (LDAPS ポート 636 を使用) を持っているため、MINE は THEIRS を信頼しますが、THEIRS は MINE を信頼しません。THEIRS のユーザーを MINE のグループに追加し、THEIR のユーザーを MINE ネットワーク上のマシンやアプリケーションにログインさせることができます。信頼は適切に機能しているようです。
WAN 経由の接続をテストするために、小さな .Net アプリケーション (ASP.Net ではない) を作成しています。MINE のグループに THEIRS のユーザーが表示されないアプリが 1 つあります。SharePoint などの他のアプリは問題なく動作します。
PrincipalContext、UserPrincipal、GroupPrincipal などの System.DirectoryServices.AccountManagement オブジェクトで ASP.Net 4 オプションを使用してみました。クイック コード スニペット
PrincipalContext domainContext = GetDomainContext(DomainName, ConnectionPort,
UseSpecifiedCredentials, Credentials);
GroupPrincipal theGroup = GroupPrincipal.FindByIdentity(domainContext,
IdentityType.SamAccountName, GroupName);
PrincipalCollection theUsers = theGroup.Members;
var users = from u in theUsers
select u.Name;
return users.ToArray();
MINEに直接接続すると、すべてうまく機能します。この問題は、THEIRS に接続する際に発生します。LDAPS トラフィックの一方向の信頼がエラーを返しています。
System.DirectoryServices.Protocols.LdapException: The LDAP server is unavailable.
そこで、DirectoryEntry、DirectorySearcher などを使用して .Net 2 のバリエーションに切り替えます。これは、実際には THEIRS ドメインに対して機能します。
List<string> userNames = new List<string>();
string searchString = string.Format("(sAMAccountName={0})", GroupName);
SearchResult result = SearchAD(DomainName, ConnectionPort, searchString);
コードで偽装を使用して、THEIRS ドメインに直接接続できます。
MINE でグループを照会すると、ユーザー アカウントではなく、THEIRS からユーザーの SID が返されます。
The following users are a member of testGroup:
CN=S-1-5-21-....,CN=ForeignSecurityPrincipals,DC=MINE,DC=local
CN=S-1-5-21-....,CN=ForeignSecurityPrincipals,DC=MINE,DC=local
これについても偽装を試み、THEIRS のユーザーとして実行しましたが、うまくいきませんでした。
ユーザーが MINE にいるときに、THEIRS からユーザー情報を取得するにはどうすればよいですか? 上記の CN/SID を取得して、THEIRS ドメインを照会する必要がありますか? .Net 4 の何が欠けていますか?