1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【第9回】Azureで社内システム再現(オンプレ編)|ADからSQLへ社員情報を自動連携する

Last updated at Posted at 2025-04-14

概要

「Azureで社内システム再現(オンプレ編)」では、
Azure の IaaS サービスを使って簡単な社内システムを再現します。

機能としては、社員番号を入力して検索ボタンを押すと、
対応する名前を表示するだけのシンプルなものです。

※詳しい全体構成については、【第0回】Azureで社内システム再現(オンプレ編)|構成図と動作の流れ で紹介しています。


システム構成(今回の対象範囲)

azure_onpre_joutai_連携_タスクスケジュール.png

上図の赤枠で囲った部分が、今回の記事で扱う範囲です。

この記事では、Active Directory から取得した社員情報を SQL Server に格納し、
それを定期的に自動で更新する仕組みを構築します。

具体的には、以下の作業を行います:

  • PowerShell で AD から社員情報(社員番号・名前)を CSV 形式で抽出するスクリプトを作成

  • PowerShell で CSV ファイルを SQL Server にインポートするスクリプトを作成

  • 上記 2 つのスクリプトを、タスクスケジューラで定期実行できるように設定

最終的に、社員情報が毎日自動で更新されるようにします。


Active Directory 上の社員情報について

本記事では、Active Directory に登録されているユーザー情報のうち、
社員番号と名前を SQL Server に連携させる仕組みを構築していきます。

しかし、Active Directory の標準プロパティには「社員番号」に該当する属性が存在しないため、
今回は代替として、説明(description) 属性に社員番号を登録する方針としています。

事前に、employees というOUに対して、以下のような PowerShell スクリプトを使用して
複数のユーザーを一括で作成しました。

社員の名前と社員番号をセットで Name と description に設定しています。
スクリーンショット 2025-03-27 21.24.45.png

作成されたユーザーは、Active Directory の GUI 管理ツールからも以下のように確認できます。
説明 欄に社員番号が正しく入力されていることがわかります。
スクリーンショット 2025-03-27 21.25.32.png


PowerShell で AD ユーザー情報を CSV に出力する

以下の PowerShell スクリプトを使用して、Active Directory に登録されたユーザー情報(社員番号と名前)を CSV ファイルとして出力します。

# 1. 出力先のCSVファイルを指定
$outputPath = "C:\temp\employee_data.csv"

# 2. Active DirectoryのOUを指定(OU=employees,DC=domain,DC=local)
$ou = "OU=employees,DC=domain,DC=local"

# 3. OU=employees に所属するユーザーを取得(description=社員番号)
$users = Get-ADUser -SearchBase $ou -Filter * -Properties description

# 4. 必要な情報だけ抽出(名前と社員番号)
$employeeData = $users | Where-Object { $_.Description } | ForEach-Object {
    [PSCustomObject]@{
        employee_id = $_.Description
        name        = $_.Name
    }
}

# 5. CSVに出力(UTF8)
$employeeData | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8

Write-Host "CSV出力が完了しました:$outputPath"

スクリプトの解説

  • 出力ファイルのパスを指定
    出力結果を保存する CSV ファイルの場所(C:\temp\employee_data.csv)を変数に設定します。

  • 対象のOUを指定
    社員ユーザーが登録されている OU(今回は employees)を対象にします。

  • ユーザー情報を取得
    Get-ADUser を使って、指定した OU 内のすべてのユーザーを取得し、description 属性(=社員番号)も含めて取り出します。

  • 必要な情報だけ整形
    Name(氏名)と Description(社員番号)を抽出し、PSCustomObject で employee_id と name に変換します。

  • CSV形式で保存
    抽出したデータを UTF-8 エンコーディングで CSV ファイルとして保存します。

スクリプト実行結果の確認

以下は、スクリプト実行後に出力された結果です。

スクリーンショット 2025-04-08 12.45.51.png

あらかじめ指定していた C:\temp\employee_data.csv に、CSVファイルが正しく出力されていることを確認できました。

スクリーンショット 2025-04-08 12.45.57.png

CSVファイルの中には、社員番号(employee_id)と氏名(name)が意図通りの形式で出力されていました。


PowerShell で CSV を SQL Server に取り込む

以下の PowerShell スクリプトを使用して、CSVファイル(社員番号と名前)を SQL Server に取り込みます。

# =============================
# CSV → SQLインポート処理 + ログ記録
# =============================

# ログの記録を開始
$logPath = "C:\temp\ad_sql_sync_log.txt"
Start-Transcript -Path $logPath -Append

try {
    # CSVファイルのパス
    $csvPath = "C:\temp\employee_data.csv"

    # SQL Server接続情報
    $server = "DB-VM1"
    $database = "EmployeeDB"
    $table = "employee_data"

    # 接続文字列(Windows認証)
    $connectionString = "Server=$server;Database=$database;Integrated Security=True;"
    $connection = New-Object System.Data.SqlClient.SqlConnection
    $connection.ConnectionString = $connectionString
    $connection.Open()

    Write-Host "SQL Serverに接続しました。"

    # ① 既存データの削除
    $deleteCommand = $connection.CreateCommand()
    $deleteCommand.CommandText = "DELETE FROM $table"
    $deleteCommand.ExecuteNonQuery()
    Write-Host "既存データを削除しました。"

    # ② CSVの読み込み
    if (Test-Path $csvPath) {
        $csvData = Import-Csv -Path $csvPath
        Write-Host "CSVファイルを読み込みました:$csvPath"

        # ③ データ挿入
        foreach ($row in $csvData) {
            $employeeId = $row.employee_id
            $name = $row.name

            if (-not [string]::IsNullOrWhiteSpace($employeeId) -and -not [string]::IsNullOrWhiteSpace($name)) {
                $insertQuery = "INSERT INTO $table (employee_id, name) VALUES ('$employeeId', N'$name')"
                $command = $connection.CreateCommand()
                $command.CommandText = $insertQuery
                $command.ExecuteNonQuery()
                Write-Host "INSERT成功:$employeeId / $name"
            } else {
                Write-Warning "スキップ:不完全なデータ(社員番号または名前が空)"
            }
        }

        Write-Host "全データをインポートしました。"
    }
    else {
        Write-Error "CSVファイルが存在しません:$csvPath"
    }

    $connection.Close()
    Write-Host "SQL接続を終了しました。"
}
catch {
    Write-Error "エラーが発生しました:$($_.Exception.Message)"
}
finally {
    # ログの記録を終了
    Stop-Transcript
}

スクリプトの解説

  • CSVファイルの読み込み
     C:\temp\employee_data.csv に保存された社員情報(employee_id, name)を読み込みます。

  • SQL Serverへの接続
     Windows認証を使用して、DB-VM1 上の EmployeeDB に接続します。

  • 既存データの削除
     毎回最新の状態にするため、テーブル内のデータを全件削除します。

  • データの挿入
     CSVの各行を1件ずつ INSERT。


スクリプト実行結果の確認

PowerShell スクリプトから SQL Server に接続しようとしたところ、以下のような接続エラーが発生しました。

スクリーンショット 2025-04-08 12.49.33.png

SQL Server に接続しようとしたけど、サーバーが見つからないか、アクセスできなかったという内容。

Test-NetConnection による接続確認(失敗)

まず、AD-VM1 から DB-VM1 に対してポート 1433 の接続確認を行ったところ、失敗しました。名前解決は成功しているが、ポート 1433 への TCP 接続は失敗している状態です。

スクリーンショット 2025-03-29 11.45.33.png

netstat でポートのリッスン状態を確認(未リッスン)

DB-VM1 上で netstat を実行しても、ポート 1433 のリッスン状態が確認できませんでした。SQL Server 側でポート 1433 が開いていない可能性が高い。。
スクリーンショット 2025-03-29 11.44.33.png

SQL Server 構成マネージャーで確認したところ、TCP/IP が無効化されていた

SQL Server の構成マネージャーを開いてみると、TCP/IP がデフォルトで無効になっていることがわかりました。
スクリーンショット 2025-03-29 11.51.00.png

そのため、TCP/IP の設定を開いて、各 IP アドレスに対して「有効=はい」に変更します。
スクリーンショット 2025-03-29 11.46.38.png
有効になりました。
スクリーンショット 2025-03-29 11.51.25.png
ポートがリッスン状態になりました。
スクリーンショット 2025-03-29 11.52.14.png

ファイアウォールに受信ルールを追加

次に、ファイアウォールの受信規則を確認したところ、ポート 1433(SQL Server の既定ポート)に関するルールが存在しませんでした。

そのため、自分で受信規則を追加しました。
スクリーンショット 2025-03-29 12.02.18.png

再度 Test-NetConnection を実行したところ、
TcpTestSucceeded が True になり、ポート 1433 が正常に開通していることを確認できました。
スクリーンショット 2025-03-29 11.59.24.png

スクリプトを再度実行した結果

PowerShellスクリプトを再度実行し、
SQL Server 上の employee_data テーブルの中身を確認しました。

SELECT * FROM employee_data; を実行すると、社員番号と氏名が問題なくインポートされていることが確認できました。

スクリーンショット 2025-03-29 12.03.03.png

タスクスケジューラで定期実行を自動化

最後に、作成した2つの PowerShell スクリプトをWindows タスクスケジューラに登録し、
毎日自動で実行されるように設定しました。


Export_Employee_CSV_From_AD

Active Directory から社員情報を CSV に出力するスクリプトです。
このタスクは 毎日 2:00 に実行されるように設定しています。
スクリーンショット 2025-04-08 13.54.16.png

Sync_EmployeeCSV_to_SQL

CSV から SQL Server にデータを取り込むスクリプトです。
こちらは 毎日 2:30 に実行するように設定しています。
スクリーンショット 2025-04-08 13.55.03.png

これで、Active Directory 上の社員情報が
毎日自動で SQL Server に反映される仕組みが完成しました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?