Active Directory 絡みってどちらかというと開発系ってよりインフラ系のような気もしますが、そんなことは気にせずにと。
Active Directory 絡みのアプリを作る時は、まぁ何といっても System.DirectoryServices アセンブリを参照する必要がありますね。
このアセンブリには 2つの名前空間があります。
1つは System.DirectoryServices 名前空間。ここには Active Directory 内のデータ(ユーザ、グループ、コンピュータなどのオブジェクト)をカプセル化する DirectoryEntry クラスや、クエリを実行する DirectorySearcher クラスなどがあります。
もう 1つは System.DirectoryServices.ActiveDirectory 名前空間。ここにはドメインやサイトなどを表すクラスがあって、これらの管理タスクを自動化するために使用されます。
今日はドメイン・サイト関連のネタを書くことにします。
まずはお約束でドメインとサイトの図。(クリックすると新しいウィンドウで拡大図が表示されます。)
さっき「管理タスクを自動化するために使用される」と書きましたが、管理タスクってのは管理ツールにある次の 3つです。(管理者じゃないとなかなか触る機会がないと思いますが・・・)
・ActiveDirectory ユーザーとコンピュータ
・ActiveDirectory サイトとサービス
・ActiveDirectory ドメインと信頼関係
今回は静的なプロパティやメソッドを提供する DirectoryAccess クラスをクラスライブラリとして作ってみました。(Windows アプリ用)
プライベートフィールド
Private Shared _pcName, _domainName, _ldapRoot As String 'PC名, ドメイン名, ルートのLDAPパス
Private Shared _domLogon, _isDC As Boolean 'ドメインにログオンしているかどうか, ドメインコントローラかどうか
パブリック プロパティ
Public Shared ReadOnly Property DomainName As String ‘ActiveDirectoryドメイン名を取得
Get
If _pcName Is Nothing Then
Call SetData() 'データを設定
End If
Return _domainName
End Get
End Property
Public Shared ReadOnly Property IsDomainController As Boolean ‘ドメインコントローラかどうかを取得
Get
If _pcName Is Nothing Then
Call SetData() 'データを設定
End If
Return _isDC
End Get
End Property
Public Shared ReadOnly Property IsLogonDomain As Boolean ‘ドメインにログオンしているかどうかを取得
Get
If _pcName Is Nothing Then
Call SetData() 'データを設定
End If
Return _domLogon
End Get
End Property
Public Shared ReadOnly Property LdapRootPath As String ‘ドメインのルートのLDAPパスを取得
Get
If _pcName Is Nothing Then
Call SetData() 'データを設定
End If
Return _ldapRoot
End Get
End Property
パブリック メソッド
Public Shared Function GetDomain() As Domain ‘ドメインを取得
Dim context As New DirectoryContext(DirectoryContextType.Domain)
Return Domain.GetDomain(context)
End Function
Public Shared Function PathToCn(ldapPath As String) As String ‘指定したLDAPパスの名前(オブジェクト名)を取得
If ldapPath Is Nothing Then
Throw New ArgumentNullException("ldapPath")
End If
Dim spos = ldapPath.IndexOf("="c) + 1
If spos = 0 Then
Return ldapPath
End If
Dim epos = ldapPath.IndexOf(","c)
If epos > 0 Then
Return ldapPath.Substring(spos, epos - spos)
Else
Return ldapPath.Substring(spos)
End If
End Function
プライベート メソッド
Private Shared Sub SetData() ‘データを設定
_pcName = Environment.MachineName
_domLogon = (String.Compare(_pcName, Environment.UserDomainName, True) <> 0)
If _domLogon Then
Call SetDomainInfo() 'ドメイン関連情報を設定
Else
_domainName = String.Empty
_ldapRoot = String.Format("WinNT://{0}", _pcName)
End If
End Sub
Private Shared Sub SetDomainInfo() ‘ドメイン関連情報を設定
Try
Using domain = GetDomain() 'ドメインを取得
Dim dcName As String
_domainName = domain.Name
_ldapRoot = String.Format("LDAP://DC={0}", _domainName.Replace(".", ",DC="))
For Each dc As DomainController In domain.DomainControllers
dcName = dc.Name.Substring(0, dc.Name.IndexOf("."c))
If String.Compare(dcName, _pcName, True) = 0 Then
_isDC = True
Return
End If
Next
End Using
Catch ex As Exception
‘例外処理
End Try
End Sub
実はドメインの情報を取ってくるだけなら GetDomain メソッドだけで充分です。アプリを作る上で条件が必要なのでそれ以外のプロパティやメソッドを実装しただけです。(抜粋ですが)
長くなってしまったのでドメイン情報の詳細については次回ということで。
おまけ
Excel で 左のセルを現在のセルにコピーする時は Ctrl + R。(Range.FillRight メソッドに相当)