SID から NTAccount への変換を行うときは、次のコードを使用します。
DirectorySecurity folder_sec = Directory.GetAccessControl("c:\\test", AccessControlSections.All);
AuthorizationRuleCollection rules = folder_sec.GetAccessRules(true, true, typeof(SecurityIdentifier));
foreach (FileSystemAccessRule rule in rules)
{
SecurityIdentifier sid = new SecurityIdentifier(rule.IdentityReference.Value);
IdentityReference name = sid.Translate(typeof(NTAccount));
string output = name + " | " + sid.tostring();
}
NTAccount
はい、メソッドから fromを取得できることは認識していますがfolder_sec.GetAccessRules
、同じサブルーチン forSecurityIdentifier.Translate
が使用されており、同じバグが発生していることを発見しました。結局のところ、ACL は単なる SID 配列です。
バグは、まったく同じ名前の 2 つのアクティブ ディレクトリ オブジェクト (グループ、ユーザーなど) があるが、2 つの別個のドメイン (サブドメインではなく信頼ドメイン) にある場合、translate
メソッドが間違った NTAccount を返すことです。コードを実行しているマシンが存在するドメインで同じ名前の NTAccount を返すことになります。NTAccount
ドメイン内の別のオブジェクトと同じ名前を共有していない他のドメインから を取得すると、正常に返されます。
domain_frank にあるマシン上にディレクトリがあり、これが ACL であるとします。
- domain_frank\IT チーム
- domain_bob\IT チーム
- domain_frank\Dave
- domain_bob\テッド
上記のコードを実行すると、次のようoutput
になります。
domain_frank\IT Team | S-1-5-21-4000000000-4000000000-2000000000-28480
domain_frank\IT Team | S-1-5-21-1000000000-8000000000-3000000000-81912
domain_frank\Dave | S-1-5-21-4000000000-4000000000-2000000000-86875
domain_bob\Ted | S-1-5-21-1000000000-8000000000-3000000000-96521
Dave という名前のオブジェクトが domain_bob になく、Ted という名前のオブジェクトが domain_frank にないと仮定します。しかし、SID を見ると、ドメイン セクションが完全に異なっていることがはっきりとわかるので、正しいオブジェクトが少なくとも SID の ACL にあることがわかります。ルックアップに関係する何かが壊れています。
その結果、SID を確認し、SID が属するドメインで Active Directory ルックアップを行う独自のアルゴリズムを作成する必要がありました。非常に遅く、完全な痛みです。
これは既知のバグですか?満足のいく解決策はありますか?