私はADの検索方法を理解しましたが、検索結果を得るためには正確な検索が必要です。私は正確にすることはできません。 問題は、電話番号に基づいてユーザーを検索しなければならないということです。ユーザーが入力したとおりの形式で書かれます。 私の入力は常にMSISDNです。数字だけです。間に空白や余分な文字はありません。ADのフィールドは単純ですが、それだけです。wildcarts/regexpを使ってADでユーザーを検索していますか?
どのようにすべてのユーザーを取得せずにこのような番号を検索し、ソフトウェアでスキャンを行うことができますか。
たとえば、私はフィールド "mobile"と "telephoneNumber"を見ています。
ADの数字は、たとえば「+45 12 34 56 78」または「(555)1234」とすることができますが、後者は有効なMSISDNとしてはほとんど当てはまりませんが、アイデアは同じです。あらゆる種類の狂気コンピュータの視点から見たものです。 すべてのユーザーを検索すると、すべての非数字を削除するだけでMSISDNを生成できますが、数字を見つける必要があるたびにAD全体をダンプするとEnterpriseがうまくいくのではないかと疑います。
サンプルコード:
String domain = "example.com";
String msisdn = "4512345678";
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
DirectorySearcher ds = new DirectorySearcher(ctx.ConnectedServer);
ds.Filter = String.Format("(mobile={0})", msisdn);
ds.PropertiesToLoad.Add("cn");
ds.PropertiesToLoad.Add("sn");
ds.PropertiesToLoad.Add("name");
ds.PropertiesToLoad.Add("mail");
ds.PropertiesToLoad.Add("mobile");
ds.PropertiesToLoad.Add("telephoneNumber");
foreach (SearchResult de in ds.FindAll())
{
Console.WriteLine("");
foreach (String key in de.Properties.PropertyNames)
{
Console.WriteLine("{0}: {1}", key.PadRight(30, '.'), de.Properties[key].Count);
int i = 1;
foreach (String prop in de.Properties[key])
{
Console.WriteLine("{0}: {1}", (String.Format("[{0}]", (i++)).PadLeft(30, ' ')), prop);
}
}
Console.WriteLine("");
}
1つのオプションは、検索文字列を解析し、各桁の間でワイルドカード文字を挿入することです。 MSISDN 4512345678は検索文字列「* 4 * 5 * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 *」になります。 * 5 * 6 * 7 * 8 *) "となります。しかし、私が毎秒数百人を送り始めると、システム管理者に首を絞めてもらい、さらに悪いことに、非常に短い順序で呼吸させることになるでしょう。 –