2013-12-09 21 views
10

当社は、様々な理由のためにActiveDirectoryを使用しています。その1つは、Outlookの連絡先とユーザーのログインIDを処理することです。Outlookが表示しているのと同じemployeeID属性値を抽出するにはどうすればよいですか?

私はユーザーIDでログインして検出すると、抽出されたログインIDを使用してActive Directoryを検索するプログラムを書かれています。 Active Directoryから取得した情報は、データベースに格納されます。ここで

私はActiveDirectoryの情報データを引っ張るために使用されるコードです:何らかの理由

Dim enTry As DirectoryEntry = _ 
    New DirectoryEntry("LDAP://myCOMPANY/DC=myCOMPANY,DC=myCOMPANY,DC=com") 

Dim mySearcher As DirectorySearcher = New DirectorySearcher(enTry) 
mySearcher.Filter = "(&(objectClass=user)(anr=" & thisUser & "))" 
'thisUser is the variable holding the Windows ID that is accessing the ASPX page 


mySearcher.PropertiesToLoad.Add("employeeID") 'just in case I need to do this. 

Dim resEnt As SearchResult 

Try 
    For Each resEnt In mySearcher.FindAll() 

    Dim fullname As String = resEnt.GetDirectoryEntry.Properties.Item("cn").Value 
    'fullname will always pull the right information 

    Dim e_id As String = resEnt.GetDirectoryEntry.Properties.Item("employeeID").Value 
    'e_id will sometimes be NOTHING, sometimes will contain an ID that 
    ' is different from the one displayed in Outlook Contact Information 
    ' and sometimes it will be matching the employeeID listed in Outlook info 

Catch ex as Exception 
    Log("Failed to pull AD data: " & ex.Message) 
End Try 

、一部のユーザーは、自分の社員コードフィールドの値を持たない、といくつかは持っています。

Outlookで閲覧する場合しかし、すべてのユーザーが、社員コードの値を表示します。

私はあなたが私が通過していますかを理解するために、次の画像を設計しました。 画像は2つのセクション、各ケースの区画に分割されています。

==============================================ケース1で==========

、従業員が自分のIDを使用してWindowsにログインしている:xms33808

Outlookは彼の従業員IDは16078

Outlookのショーであることを示しています彼の電子メールエイリアスがxms33808

ASP.Netのコマンドウィンドウは、その彼の従業員を示していることIDは======================================真

されていない、xms33808です================

============================== =========================ケース2

を、従業員はIDを使用してWindowsにログインしている:25163

をOutlookは彼の従業員IDは、25163

であることを示していますOutlookは自分の電子メールエイリアスがMutawaAAB

であることを示しています。ASP.Netコマンドウィンドウには、彼のemployeeIDがNOTHINGであることが示されています。

============================================== =========

私の質問は:どのように私は、Outlookが表示されているのと同じ社員コード値情報を抽出することができますか?

Case 1: employeeID is different from ASP.Net than Outlook Case 2: employeeID is found in Outlook, but Nothing in ASP.Net

+0

非常に奇妙です - あなたはセカンダリADサーバーを持っていませんか? –

+0

@DarkcatStudiosいいえ.1台のADサーバーのみ。しかし、他のものがあるかどうかをどうすれば確認できますか?私はITの人間の介入を経ないといけないのですか? – Ahmad

答えて

0

私は最終的に従業員IDを保持している属性を見つけました。ここでは、同じ質問への答えをお探しの方に

は属性の名前です:

extensionattribute2

私はこれに出くわした方法は、検索エントリが保持しているすべての属性値をプリントアウトすることです結果..

For Each resEnt In mySearcher.FindAll() 
    Debug.Print("The properties of the " + resEnt.GetDirectoryEntry().Name + " are :") 
     For Each singleAttribute As String In DirectCast(resEnt.Properties, ResultPropertyCollection).PropertyNames 
      Debug.Print(singleAttribute & Convert.ToString(" = ")) 
      For Each singleValue As [Object] In DirectCast(resEnt.Properties, ResultPropertyCollection)(singleAttribute) 
       Debug.Print(vbTab + singleValue.ToString) 
      Next 
     Next 
Next 

そしてIは

..出力を調べて、次 extensionattribute2にプリントアウトバッジ番号を発見

employeeIDまたはstaffIDまたはBadgeNumberなどと呼ばれるプロパティの名前が非常に奇妙です。

その後、Samaアカウントだけでなく、extensionattribute2も検索するようにActive Directoryを検索するコードを変更しました。各従業員は一意のIDを持っているためです。

Dim LookFor As String = "25163" 
Dim mySearcher As DirectorySearcher = New DirectorySearcher(enTry) 

mySearcher.Filter = "(&(| (anr=" & LookFor & ")" & _ 
         "(extensionattribute2=" & LookFor & "))" & _ 
         "(objectCategory=Person)(objectClass=user))" 
1

は、.NET 3.5またはあなたがLDAPなどよりもはるかに簡単であるとして、次を使用することができる上に使用している場合...

特定のユーザーの詳細情報を取得するにはSystem.DirectoryServices.AccountManagement

のための参照とImportsステートメントを追加します。

Dim objPC As PrincipalContext = Nothing 
Dim objADUser As UserPrincipal = Nothing 
Try 
    objPC = New PrincipalContext(ContextType.Domain, "YourDomain") 
    objADUser = UserPrincipal.FindByIdentity(objPC, "NetworkLogin") 
Catch ex As Exception 
End Try 

は、現在ログオンしているユーザーの詳細を取得するに

Dim objADUser As UserPrincipal = Nothing 
Try 
    objADUser = UserPrincipal.Current 
Catch ex As Exception 
End Try 

することができますオブジェクトobjADUserに問い合わせて、

などの詳細を取得します。
objADUser.VoiceTelephoneNumber 
objADUser.EmailAddress 
objADUser.EmployeeNumber and many others..... 
+0

Bo TXは以下のように記述しています。あなたはemployeeNumberを使用し、employeeIDは使用しないでください.ADから詳細を探す方法を選択します。 – Mych

+1

'objADUser.EmployeeNumber'は、' EmployeeNumber'が 'objADUser'の有効な属性またはメンバー/プロパティではないため、コードエディタにエラーを生成させました。しかし、 'EmployeeId'はです。 – Ahmad

+0

Ahmad ....あなたは正しいです...私はどこからEmployeeNumberを取得したのかわかりません – Mych

1

「employeeNumber」という紛らわしい同様のAD属性があります。 Outlookが実際にこのプロパティを使用してディスプレイに表示されている可能性はありますか?

OutlookコンタクトカードのこのMicrosoftサポートページでは、「employeeID」は使用できるフィールドではありません。ただし、 'employeeNumber'はです。

http://support.microsoft.com/kb/981022

希望これは、少なくとも、あなたのトラブルシューティング作業を進めることができます。

+0

私は 'resEnt.GetDirectoryEntry.Properties.Item(" employeeNumber ")の内容を調べようとしました。両方の場合には何もありません – Ahmad

+0

Exchange管理者と調整する必要があるようです。彼らは、このフィールドがどこにどのように表示されているのかを確認できるはずです。 –

0

Exchange Serverに接続して必要なデータを照会し、xmlから必要な情報を解析するのが最善の方法です。

+0

ADサーバーからのXML応答を表示するにはどうすればよいですか? – Ahmad

+0

ADサーバーはu xmlを与えません.xmlはExchange Serverに対して行われた要求の応答です。この方法では、ADからのデータの解析ではなく、より安全になります。 –

関連する問題