0

私は新しい Web 開発者で、社内のすべての ASP.NET アプリケーションは、SAP システムからユーザー情報を取得して XML ドキュメントとして取得するシステムに依存しています。このシステムには、ユーザー名を挿入して情報を取得するためのテキストボックスが 1 つしかありません。その例: ユーザー名を挿入すると: johnA システムは次の情報を提供します: John Arneson Elli など。

次に、ASP.NET Web ベース アプリケーションでは、このシステムとの接続を行い、そのシステムから特定のユーザー情報を取得するのに役立つ 3 つの C# クラスを使用していました。とにかく、今度はそのシステムを、Active Directory からユーザー情報を取得する新しいシステムに置き換えたいと考えています。

次のコードをサーバーに配置すると、うまく機能するので、従業員がサーバーでこのコードにアクセスすると、すべての情報を示すページが表示されます。私が今やりたいことは、TextBox を配置してユーザーのユーザー名を入力し、このシステムからユーザーのすべての情報を取得することにより、これをすべての開発済みおよび今後新しく開発される Web ベースのアプリケーションで利用することです。では、どうやってそれを行うのですか?

私は初心者で、Google や他の場所でこれを行う方法を見つけることができませんでした。

Active Directory にアクセスするためのクラスの私のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.DirectoryServices;

/// <summary>
/// Summary description for ActiveDirectory
/// </summary>
public class ActiveDirectory
{
    public static string GetPersonData(string id, string datatype)
    {
        //return "x xx xxxx xxx xxx"; //comment this line.
        //Faster performance through Active Directory
        string property = datatype;
        switch (property) //backwards compatibility
        {
            /* case "tel":
                return FindProperty(id, Property.Tel);*/
            case "name":
                return FindProperty(id, Property.Name);
            case "dept":
                return FindProperty(id, Property.Dept);
            case "line":
                return FindProperty(id, Property.Line);
            case "email":
                return FindProperty(id, Property.Email);
            case "id":
                return FindProperty(id, Property.Name);
            default:
                return "";
        }
    }

    //ACTIVE DIRECTORY OPTION.. FOR A BETTER PERFORMANCE
    const string ID = "cn";
    const string NAME = "displayName";
    const string TEL = "telephoneNumber";
    const string DEPT = "department";
    const string LINE = "extensionAttribute3";
    const string UNIT = "extensionAttribute10";
    const string TITLE = "title";
    const string FNAME = "givenName";
    const string MNAME = "initials";
    const string LNAME = "sn";
    const string EMAIL = "mail";
    const string AREA = "extensionAttribute3";
    const string MANAGER = "manager";
    const string ORGCODE = "extensionAttribute10";
    const string DN = "distinguishedName";

    public enum Property
    {
        Name, Tel, Dept, Line, Unit, Title, Fname, Mname, Lname, Email, Manager, OrgCode, DistinguishedName
    }

    public static DirectoryEntry GetDirectoryEntry() 
    {
        using (((System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
        {
            DirectoryEntry de = new DirectoryEntry(); //DirectoryEntry class encapsulates a node or object in the AD hierarchy
            de.Path = "LDAP://CompanyName.COM";
            de.AuthenticationType = AuthenticationTypes.Delegation;

            return de;
        }
    }

    public static bool UserExists(string username)
    {
        DirectoryEntry de = GetDirectoryEntry();
        DirectorySearcher deSearch = new DirectorySearcher(); //Directory Searcher: It will perform queries against the active directory hierarchy 

        deSearch.SearchRoot = de; //SearchRoot is used to specify where the search starts
        deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))"; //the search retrieves all objects.

        // Create a SearchResultCollection object to hold a collection of SearchResults
        // returned by the FindAll method.
        SearchResultCollection results = deSearch.FindAll();

        return results.Count > 0;
    }
    public static String FindName(String userAccount)
    {
        DirectoryEntry entry = GetDirectoryEntry();
        String account = userAccount.Replace(@"Domain\", "");

        try
        {
            DirectorySearcher search = new DirectorySearcher(entry);
            search.Filter = "(SAMAccountName=" + account + ")";
            search.PropertiesToLoad.Add("displayName");

            SearchResult result = search.FindOne();

            if (result != null)
            {
                return result.Properties["displayname"][0].ToString();
            }
            else
            {
                return "Unknown User";
            }
        }
        catch (Exception ex)
        {
            string debug = ex.Message;

            return debug;
        }
    }

    public static String FindProperty(String userAccount, Property p)
    {
        string property = "";

        //proceed with LDAP search.
        switch (p)
        {
            case Property.Dept:
                property = DEPT;
                break;
            case Property.Email:
                property = EMAIL;
                break;
            case Property.Fname:
                property = FNAME;
                break;
            case Property.Line:
                property = LINE;
                break;
            case Property.Lname:
                property = LNAME;
                break;
            case Property.Mname:
                property = MNAME;
                break;
            case Property.Name:
                property = NAME;
                break;
            case Property.Tel:
                property = TEL;
                break;
            case Property.Title:
                property = TITLE;
                break;
            case Property.Unit:
                property = UNIT;
                break;
            case Property.Manager:
                property = MANAGER;
                break;
            case Property.OrgCode:
                property = ORGCODE;
                break;
            case Property.DistinguishedName:
                property = DN;
                break;
            default:
                return "";

        }

        DirectoryEntry entry = GetDirectoryEntry();
        String account = userAccount.Replace(@"Domain\", "");

        try
        {
            System.Text.Encoding enc = System.Text.Encoding.ASCII;
            DirectorySearcher search = new DirectorySearcher(entry);
            search.Filter = "(&(objectCategory=user)(SAMAccountName=" + account + "))";
            search.PropertiesToLoad.Add(property);

            SearchResult result = search.FindOne();
            search.Dispose();
            entry.Close();
            entry.Dispose();

            if (result != null)
            {
                object value = result.Properties[property][0];
                if (value is System.Byte[])
                    return enc.GetString((byte[])value);
                else
                    return value.ToString();
            }
            else
            {
                return "-";
            }
        }
        catch (Exception ex)
        {
            string debug = ex.Message;

            return "debug";
        }
    }


    public static List<string> FindChildren(string userAccount)
    {
        DirectoryEntry entry = GetDirectoryEntry();
        String account = userAccount.Replace(@"Domain\", "");
        string dn = FindProperty(userAccount, Property.DistinguishedName);
        dn.Replace("*","\\2a");
        dn.Replace("(", "\\28");
        dn.Replace(")", "\\29");
        dn.Replace("\\", "\\5c");
        dn.Replace("NUL", "\\00");
        dn.Replace("/", "\\2f");

        string property = ID;
        List<string> output = new List<string>();
        try
        {
            System.Text.Encoding enc = System.Text.Encoding.ASCII;
            DirectorySearcher search = new DirectorySearcher(entry);
            search.Filter = "(&(objectCategory=user)(manager=" + dn + "))";
            search.PropertiesToLoad.Add(property);

            SearchResultCollection results = search.FindAll();
            search.Dispose();
            entry.Close();
            entry.Dispose();

            if (results != null)
            {
                foreach (SearchResult result in results)
                {
                    object value = result.Properties[property][0];
                    if (value is System.Byte[])
                        output.Add(enc.GetString((byte[])value));
                    else
                        output.Add(value.ToString());
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return output;
    }
    public static string FindOrg(string orgcode, string property)
    {
        DirectoryEntry entry = GetDirectoryEntry();

        try
        {
            System.Text.Encoding enc = System.Text.Encoding.ASCII;
            DirectorySearcher search = new DirectorySearcher(entry);
            search.Filter = "(&(objectCategory=user)(" + ORGCODE + "=" + orgcode + "*))";
            search.PropertiesToLoad.Add(property);

            SearchResult result = search.FindOne();
            search.Dispose();
            entry.Close();
            entry.Dispose();

            if (result != null)
            {
                object value = result.Properties[property][0];
                if (value is System.Byte[])
                    return enc.GetString((byte[])value);
                else
                    return value.ToString();
            }
            else
            {
                return "-";
            }
        }
        catch (Exception ex)
        {
            string debug = ex.Message;

            return "debug";
        }
    }
}

アップデート:

参考までに、上記のクラスはサーバー上にあります。現在、私は新しい Web ベースのアプリケーションを開発しています。この Web ベースのアプリケーションには、ユーザー名を入力するために使用するテキスト ボックスがあります。では、このユーザー名をそのシステムに送信し、そのユーザー情報をこのアプリケーションに取得するにはどうすればよいでしょうか? 例を教えてください。

4

2 に答える 2

1

さて、あなたが本当に必要としているものを理解しましょう。これを実現するための最良の方法は、asp.netWebサービスを使用することです。これは、サーバーで現在実行されているコードを編集する必要があることを意味します。 Asp.net Webサービス
を 検索し、次のリンクを確認してください。MicrosoftWebサービスWebリンクおよびASP.NETWebサービス作成と使用

于 2012-05-13T06:09:07.500 に答える
1

.NET 3.5 以降を使用している場合は、System.DirectoryServices.AccountManagement(S.DS.AM) 名前空間を確認してください。ここでそれについてすべて読んでください:

基本的に、ドメイン コンテキストを定義し、AD でユーザーやグループを簡単に見つけることができます。

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   // do something here....     
}

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

// if found....
if (group != null)
{
   // iterate over members
   foreach (Principal p in group.GetMembers())
   {
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
      // do whatever you need to do to those members
   }
}

新しい S.DS.AM を使用すると、AD でユーザーやグループを簡単に操作できます。

そして、彼の応答で「Nation」が言及したように、これを Web サービス インターフェイスの背後に「隠す」と、あらゆる種類のアプリケーションがコードを呼び出して、Active Directory から必要な情報を取得できます。

于 2012-05-13T07:01:28.293 に答える