Active Directoryのユーザー情報を取得したい

目次

はじめに

それなりの規模の会社様ではActive Directoryでユーザーの管理をされているのではないでしょうか?最近ではEntra IDとIntuneですべての管理される会社様も一定数出てきてますが、まだまだActive Directoryに依存している会社様は多いと思います。Active Directoryのユーザーは会社に所属するユーザーになりますので、当然入退社処理が発生します。入退社処理は人事部門が極秘に持っているものであり、Active Directoryを管理する情報システム部門には入退社日の当日にしか情報が出てこず、入退社日当日に今すぐ対応してくれと言われることも良くある話と思います。

Active Directoryのユーザー情報は、ドメインのユーザーであれば管理者権限を持たない一般ユーザーであったとしても情報を取得することは可能です。つまり、既存の情報を取得する、入退社情報を入力する、登録情報をアップロードするまでは人事部がやってもらえる仕組みを作ってしまえば、入退社の極秘情報がいつ出てきても情報システム部門では夜間のタスク実行などで自動化処理が可能になります。

実装構成図

世の中にはActive Directoryのユーザーやグループを管理するためのサポートがついたツールがありますので、この記事みたいに独自に作成することはお勧めしてません。トラブルが起きたときに誰も対応できないなどの問題が起こる場合があります。

前提条件

Active Directoryの設計次第でVBAは変更が必要になります。汎用的なソースコードにはどうしてもならないため、Active DirectoryおよびVBAのある程度知識がある方向けの記事となります。

Excel VBAを使って処理を行いますので、VBA実行が許可された環境でご利用をお願いいたします。

【準備する環境】

  • ドメイン参加済みのパソコン
  • Domain Usersグループに所属するユーザー
  • Excel(マクロ有効可能な環境)

ActiveDirectoryからユーザー情報を取得する

まずはActiveDirectoryユーザーのどの情報が必要かを整理しましょう。

代表的な属性値を参考までに記載します。その他属性についてはこの辺りをご参考にしていただければと思います。

ActiveDirectoryユーザーのGUI上表示属性値
sn
givenName
表示名displayName
説明description
事業所physicalDeliveryOfficeName
電話番号telephoneNumber
メールアドレスmail
WebページwWWHomePage
co
郵便番号postalCode
都道府県st
市区町村l
私書箱postOfficeBox
番地streetAddress
ユーザーログオン名userPrincipalName
ユーザーログオン名(Windows2000より前)sAMAccountName

Excelでの事前準備

最初にExcelでデータを取得した時の表示部分を作成します。一旦イメージを貼っておきますが、必要な情報に合わせて修正してください。

表示名は姓と名を関数で結合しています。例:=D5&” “&E5
姓と名の間が全角スペースだったり、半角スペースだったり統一されないことを避けるための措置です。

Excelフォーマット

今回はADOを使って情報を取得する前提としています。まず最初に利用するExcelファイルでライブラリを追加していただく必要があります。今回追加するライブラリは以下の通りです。この記事では不要なものも追加している可能性があります。この先編集されたリストをエクスポートする記事で利用するものになります。

  • Microsoft ActiveX Data Objects 6.1 Library
  • Active DS TypeLibrary
  • Microsoft Scripting Runtime
  • Microsoft Forms 2.0 Object Library

ユーザーリストを取得するためのVBA

下記にサンプルコードを貼っておきます。各社様の環境に合わせて修正して使ってください。

Private Sub 情報取得_Click()

Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim i As Long

Set con = CreateObject("ADODB.Connection")
Set cmd = CreateObject("ADODB.Command")
con.Provider = "ADSDSOObject"
con.Open "ADs Provider"
Set cmd.ActiveConnection = con

cmd.Properties("Page Size") = 1000
cmd.Properties("Searchscope") = 2

'ユーザ情報取得
Set rs = con.Execute( _
            "<LDAP://ou=00000,dc=engineer-base,dc=local>;" _
            & "(objectCategory=user);sAMAccountName,cn,sn,givenName,mail,title,department,physicalDeliveryOfficeName,l;subtree")

i = 5
Do Until rs.EOF
    On Error Resume Next
    Cells(i, 2) = rs.Fields(0).Value
    Cells(i, 4) = rs.Fields(2).Value
    Cells(i, 5) = rs.Fields(3).Value
    Cells(i, 6) = rs.Fields(4).Value
    Cells(i, 7) = rs.Fields(5).Value
    Cells(i, 8) = rs.Fields(6).Value
    rs.MoveNext
    i = i + 1
    On Error GoTo 0
Loop

Set rs = Nothing
Set com = Nothing
Set cmd = Nothing

End Sub

まとめ

この方法は一般ユーザーの権限で実行可能である点が一番のメリットです。ITリテラシーのそこまで高くない人事部のメンバーでもExcel上でユーザー情報を追加・編集などは容易に対応できるものと思います。この後、作られたExcelのリストからCSVをサーバーにアップロードする処理とアップロードされたCSVをタスクスケジューラーを使ってAcrtive Directory のユーザーを登録・変更・削除する処理を書くことで、なんちゃって自動化が完成します。

どうしても会社を説得できなかった場合を除いてサポート付きのツールを契約しましょう。この記事みて参考にしていただけるのはありがたいですが、誰も仕様がわからない闇のツールが爆誕する可能性があります。

弊社では、サービスの新規導入、設計変更や運用のご支援を行っております。サービス提供ご希望のお客様は下記よりお問い合せください

この記事を書いた人

大塚 英正のアバター 大塚 英正 エンジニア

主にMicrosoft365とGoogle Workspaceの販売と導入をやっています。

目次