すべては、私がMS Sharepointへのアクセスを配布しているという事実から始まりました。 従業員からのアプリケーションでは、せいぜい、アカウントが入ってくるだけで、最悪の場合、「私と私のボス」のようなものを書くことができました。 最初は気になりましたが、私は本当の管理者のように感じて、そのようなアプリケーションを不注意なユーザーに送り返し、すべてをやり直すようにしました。 それは怒った手紙と電話の山に変わりました。 Active Directory-ADの略語がロシア語の「地獄」と一致するのは偶然ではないかとさえ思い始めました。 その結果、世界をより良く変える必要があることに気づき、Active Directoryに保存されているものと、それを使用してアクセスやその他の便利なものを自動的に配布する方法を詳細に検討することにしました。
従業員に関する会社情報は、2つの場所に保存されます。
- Active Directory
- Oracleデータベース
Oracleでは一意性が維持され、ADを介してアクセスが許可されます。 従業員ごとに複数のアカウントが存在する場合があります。 アカウントで従業員を一意に識別する必要がありました。
この問題の解決策は、社内で積極的に使用されている多くのユーティリティおよびソフトウェア製品で発見され、複製されました。 最もよく使用されるユーティリティの1つは、従業員情報取得プログラムです。 彼女はさまざまな基準に従って1人または複数の従業員を検索し、Active DirectoryとOracleのデータを組み合わせて、それらに関する最も完全な情報を提供します。 特に人気があるのは、データベースに保存されている従業員の写真です。
また、Active DirectoryとOracleだけでなくMS Sharepointとの統合も注目に値します。 ソリューションのおかげで、SharepointポータルのページでActive Directoryからユーザーのグループにすばやくアクセスできるようになり、さまざまな理由でそれを残したユーザーを削除できるアプリケーションが登場しました。
この問題は2つの方法で解決されました。
- 1人の従業員に関する情報-OracleのDBMS_LDAP
- 使用可能なすべてのレコードを圧縮し、Active Directoryの内容を確認するために、C#コードを使用しました
C#を使用する場合、次のことを考慮してください(System.DirectoryServices.dllライブラリ):
- FindSearch()関数がすべてのレコードを返すようにするには、DirectorySearcher.PageSizeプロパティを0以外にする必要があります。
- DirectorySearcherインスタンスでDispose()を呼び出してください。
返された結果のレコードの最大数を設定するDirectorySearcher.SizeLimitプロパティもあります。 デフォルトでは0です。つまり、サーバーからこの値を取得します。 通常、サーバーの値は1000です。SizeLimitプロパティを操作して、関数の結果( リンク )がどのように変化するかを確認できます。
上記のリンクには、yiledを使用するコードの例があります。これは.NETの観点からはより正確ですが、アルゴリズムを説明するために以下の例では使用しませんでした。
コード例:
- DBMS_LDAP Oracle
function GetDataByUser(userAccount VARCHAR2) return VARCHAR2 is l_ldap_host VARCHAR2(256) := 'host'; l_ldap_port VARCHAR2(256) := 'port'; l_ldap_user VARCHAR2(256) := 'user'; l_ldap_passwd VARCHAR2(256) := 'password'; l_ldap_base VARCHAR2(256) := 'ldap_path'; l_retval PLS_INTEGER; l_session DBMS_LDAP.session; l_attrs DBMS_LDAP.string_collection; l_message DBMS_LDAP.message; l_entry DBMS_LDAP.message; l_attr_name VARCHAR2(256); l_ber_element DBMS_LDAP.ber_element; l_vals DBMS_LDAP.string_collection; ret VARCHAR2(256); begin DBMS_LDAP.USE_EXCEPTION := TRUE; l_session := DBMS_LDAP.init(hostname => l_ldap_host,portnum => l_ldap_port); l_retval := DBMS_LDAP.simple_bind_s(ld => l_session,dn => l_ldap_user,passwd => l_ldap_passwd); l_attrs(1) := 'postalcode'; l_retval := DBMS_LDAP.search_s(ld => l_session,base => l_ldap_base,scope => DBMS_LDAP.SCOPE_SUBTREE,filter => '(&(objectClass=user)(cn=' ||userAccount || ')(mail=*))',attrs => l_attrs,attronly => 0,res => l_message); IF DBMS_LDAP.count_entries(ld => l_session, msg => l_message) > 0 THEN l_entry := DBMS_LDAP.first_entry(ld => l_session,msg => l_message); l_attr_name := DBMS_LDAP.first_attribute(ld => l_session, ldapentry => l_entry, ber_elem => l_ber_element); l_vals := DBMS_LDAP.get_values (ld => l_session, ldapentry => l_entry, attr => l_attr_name); ret := l_vals(0); END IF; l_retval := DBMS_LDAP.unbind_s(ld => l_session); return ret; end GetDataByUser;
- C#
static void Main(string[] args) { var listDict = ActiveDirectoryTraversal(); var d = listDict[0]; } private static List<Dictionary<string, object>> ActiveDirectoryTraversal() { List<Dictionary<string, object>> ret = null; var dep = new DirectoryEntry(); dep.AuthenticationType = AuthenticationTypes.FastBind; dep.Path = "LDAP://yourpath"; using(DirectorySearcher ds = new DirectorySearcher(dep)) { ds.Filter = "(&(objectClass=user))"; //ds.SizeLimit = 5; ds.PageSize = 100; using (SearchResultCollection results = ds.FindAll()) { var e = results.Count; if (results != null && results.Count > 0) { ret = SaveData(results); } } } dep.Close(); return ret; } private static List<Dictionary<string, object>> SaveData(SearchResultCollection results) { var ret = new List<Dictionary<string, object>>(); for (int i = 0; i < results.Count; i++) { var res = results[i]; var dict = new Dictionary<string, object>(); foreach (var e in res.Properties.PropertyNames) { if (!dict.ContainsKey(e.ToString())) dict.Add(e.ToString(), res.Properties[e.ToString()][0]); } ret.Add(dict); } return ret; }
結論:
Active Directoryを操作し、Oracleデータベースから直接Active Directoryにアクセスできることにより、私が勤務する部門のプログラマーの作業が大幅に簡素化されました。 最初に、実験のために、Active Directoryのコンテンツをデータベーステーブルにアップロードしました。 その後、驚いたことに、このテーブルで機能する一連のストアドプロシージャを発見しました。 開発者は彼女に目を向け、DBMS_LDAPパッケージを理解するのが面倒だと判明しました。 この前例により、Active Directoryの操作方法の例を示し、例を挙げたいと思いました。