3

Active Directory に保存されているユーザーの名前を一連の資格情報から解決するための簡単なアプリケーションを作成したいと考えています。一部のアプリケーションはユーザー ID のみを提供するため、エンド ユーザーが Active Directory ユーザーとグループ MMC スナップインを起動することを期待するのは無理があります。

入力は "MYCORP\a_user" のようなものになり、AD に保存されている場合、出力は "Dave Smith" になります。

これをテスト ドメインとマルチ フォレスト環境で実行できるようにしたいと考えています。

誰かがこれを行うサンプルを提供できますか? 電話番号などの AD からの他の属性の取得は、同じパターンに従いますか?

ターゲット プラットフォーム: .NET 2.0 以降。

4

3 に答える 3

3

認証クラスから取得した、使用するコードは次のとおりです。

string[] strUserName = username.Split("\\".ToCharArray());
using (var entry = new DirectoryEntry("LDAP://" + ADServer, ADServiceDomain + "\\" + ADServiceAccount, ADServicePassword))
using (var ds = new DirectorySearcher(entry, "sAMAccountName=" + strUserName[1])) {
  ds.SearchScope = SearchScope.Subtree;
  SearchResult result = ds.FindOne();
  string fullname = result.Properties["displayName"][0].ToString();
}

System.DirectoryServices は最悪です。ご覧のとおり、最も基本的なことを実行するためにさえ、途方もない量のコードが必要です。フロー制御に例外を使用する必要のないユーザー認証方法があればいいのにと思います。

于 2009-01-02T16:55:14.607 に答える
2

C# で Active Directory を操作するのは少し面倒です。確かに 3.5 では役立つ新しいクラスがいくつか追加されていますが、純粋な生産性のために、Powershell と Quest のActive Directory 用の無料の PowerShell コマンドを使用するの が好きです。この場合、コードは次のようになります。

get-qaduser userid | select PhoneNumber,DisplayName

これを C# プログラムの一部として実行する必要がある場合は、それも実行できます。

    public static IEnumerable<PSObject> Invoke(string script, params object[] input)
    {
        IList errors = null;
        using (var run = new RunspaceInvoke())
        {
            var psResults = run.Invoke(script, input, out errors);
            if (errors != null && errors.Count > 0)
                Debug.WriteLine(errors.Count);
            foreach (PSObject res in psResults)
                yield return res;
        }
    }
    PSObject psUser = POSHelp.Invoke(
        @"add-pssnapin Quest.ActiveRoles.ADManagement
        ($userid) = $input | % { $_ }
        get-qaduser $userid", "auserid").Single();
     Debug.WriteLine(psUser.Properties["DisplayName"].Value);

Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll への参照を追加します。

于 2009-01-02T18:24:04.147 に答える
0

プロパティ「DisplayName」をロードするDirectorySearcherを参照してください。

于 2009-01-02T16:42:45.677 に答える