kintone アプリから Active Directory ユーザーアカウントを自動作成する

目次

はじめに

この記事ではkintoneを通じて、Active Directory(AD)のユーザーアカウントを自動作成するしくみを紹介します。
Windows Serverで定期実行されるPowerShellスクリプトがkintoneアプリからユーザー情報を読み込み、ADユーザーアカウントを自動作成するというものです。

想定する読者

  • Active Directoryを活用している方
  • kintoneを活用した自動化に興味がある方
  • システム管理者の方

利用するツールとしくみ

まずは、kintoneアプリにレコードを登録するだけで、外部のシステムで適切なタスクが自動実行されるしくみを想像してみてください。
さらにその実行結果がkintoneアプリに自動でフィードバックされるとします。便利そうですよね?

外部のシステムとしてWindows Serverを想定します。
そして実行したいタスクをPowerShellスクリプトで実装するとしましょう。もしもPowerShell用のkintone SDKがあると話は簡単なのですが、残念ながらありません。
kintone REST APIを使うという選択肢もありますが、ここではcli-kintoneを使います。
cli-kintone(kintoneコマンドラインツール)についての詳細はこちらを確認してください。
はじめようcli-kintone

主なツールは次のとおりです。

  • PowerShellのコマンドレット

    • Import-CSV: CSVファイルからPowerShellオブジェクトを生成する。
    • Export-CSV: PowerShellオブジェクトからCSVファイルを生成する。
  • cli-kintoneのサブコマンド

    • record import: CSVファイルをkintoneアプリのレコード情報として インポートする。
    • record export: kintoneアプリのレコード情報をCSV形式で エクスポートする。

これらを下図のように組み合わせることにより、ユーザーがPowerShellオブジェクトをCSVファイル経由でkintoneアプリに入出力できます。
つまり、PowerShellスクリプトでkintoneアプリのレコード情報を読み書きする処理を記述できます。

Active Directory ユーザーアカウントの自動作成

ここから、ADのユーザーアカウントを自動作成するしくみを紹介します。
このTipsの実装には、cybozu.com共通管理のシステム管理者権限が必要です。

kintoneの構成

ユーザー情報アプリとログアプリを用意します。
各アプリの役割と、フィールドを簡単に説明します。

ユーザー情報アプリ
  • ユーザー情報(ユーザー名、初期パスワード、表示名)を格納します。
  • 状態を表すためのフィールドが2種類あります。
    使い方は 状態遷移で説明します。
フィールド名 フィールドコード 種類 備考
レコード番号 RecordNumber レコード番号
ユーザー名 Name 文字列(1行)
初期パスワード Password 文字列(1行)
表示名 DisplayName 文字列(1行)
ステータス Status ドロップダウン 処理全体の状態を表します。
設定する値:計画中、実施中、完了
AD User Check_AD_User チェックボックス ADユーザーアカウント作成処理が正常に完了されたかどうかを表します。ADユーザーアカウント作成以外の別の処理がある場合は、違うフィールドを追加してください。
設定する値:Done
ログアプリ
  • PowerShellスクリプトのエラーログを格納します。
フィールド名 フィールドコード 種類 備考
レコード番号 RecordNumber レコード番号
ステータス Status 文字列(1行) ログの状態を表します
詳細 Details 文字列(複数行) ログの詳細を表します

Windows Serverの構成

  • Windows Serverでは、タスクスケジューラでPowerShellスクリプトを定期実行します。
cli-kintone

事前にcli-kintoneの インストールが必要です。

PowerShellスクリプト

PowerShellスクリプトでは次の処理を行います。

  1. ユーザー情報取得:ユーザー情報アプリから取得します。
  2. ユーザーアカウント作成:取得した情報を元にし、ADユーザーアカウントを作成します。
  3. 結果のレスポンス:実行結果の情報をユーザー情報アプリにフィードバックします。
  4. ログ登録:実行時に発生したエラーログをログアプリへ登録します。

動作環境

次の環境で動作確認済みです。
なおOSにバンドルされているPowerShell5.1では動作しません。
PowerShell 7.4.xが必要です。

項目 バージョン 備考
OS Windows Server 2019
PowerShell 7.4.3 PowerShell ドキュメント (External link)
cli-kintone 1.11.0 kintoneコマンドラインツール

cli-kintoneの配置場所

C:\opt\cli-kintone\バージョン番号\cli-kintone.exeに配置します。
バージョン毎にフォルダーを用意する方式です。

例:1.11.0の場合:C:\opt\cli-kintone\1.11.0\cli-kintone.exe

スクリプトのファイル構成

ベースフォルダーの配下にファイルとフォルダーを配置します。

項目 備考
C:\opt\add-ad-user ベースフォルダー
C:\opt\add-ad-user\add-ad-user.ps1 スクリプトファイル
C:\opt\add-ad-user\conf.ps1 設定ファイル
C:\opt\add-ad-user\lib.ps1 ライブラリーファイル
C:\opt\add-ad-user\csv CSV ファイル出力先フォルダー
C:\opt\add-ad-user\log ログファイル出力先フォルダー

タスクスケジューラの設定

add-ad-user.ps1を実行するためのタスクを登録します。
タスクのプロパティの[操作]には次のとおり設定します。

項目
プログラム/スクリプト pwsh.exe
引数の追加 -Command ".\add-ad-user.ps1"
開始 C:\opt\add-ad-user

スクリプト

メインスクリプト(add-ad-user.ps1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest

. .\conf.ps1

$command_name = Split-Path -Leaf $PSCommandPath

try {
    Select-User -Condition $query_AD_User -CSV $query_AD_User_csv

    $user = Import-CSV $query_AD_User_csv

    $user | ForEach-Object {
        Start-Sleep -Seconds 1

        Add-ADUser `
            -Name $_.Name `
            -Password $_.Password `
            -DisplayName $_.DisplayName

        $result = [Result]::New()
        $result.RecordNumber = $_.RecordNumber
        $result.Status = "完了"
        $result.Check_AD_User = "Done"

        Register-Result `
            -Result $result `
            -CSV (${result_AD_User_csv} + "." + $_.RecordNumber + ".csv")
    }
} catch {
    $log = [Log]::New()
    $log.Status = "$command_name : Error"
    $log.Details = Out-String -InputObject $Error

    Register-Log -Log $log -CSV $log_AD_User_csv
} finally {
    Out-File -FilePath $log_AD_User -InputObject $Error -Encoding UTF8
}
スクリプトの解説
  • try
    • ユーザー情報アプリから条件にマッチするレコードを取得します。
    • ADユーザーアカウントを作成します。
    • 作成結果の情報をユーザー情報アプリに登録します。
  • catch
    • エラー情報をログアプリに登録します。
  • finally
    • エラー情報をログファイルに出力します。
設定ファイル(conf.ps1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#
# common
#
$base_dir  = "C:\opt\add-ad-user\"
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$date      = Get-Date -Format "yyyy-MM-dd"

#
# csv
#
$csv_dir = $base_dir + "csv\"

$query_AD_User_csv  = $csv_dir + "query_AD_User"  + ".${timestamp}.csv"
$result_AD_User_csv = $csv_dir + "result_AD_User" + ".${timestamp}.csv"

#
# log
#
$log_dir = $base_dir + "log\"

$log_AD_User     = $log_dir + "AD_User"     + ".${timestamp}.log"
$log_AD_User_csv = $csv_dir + "log_AD_User" + ".${timestamp}.csv"

#
# cli-kintone
#
$cli_kintone     = "C:\opt\cli-kintone\1.11.0\cli-kintone.exe"
$cli_kintone_log = $log_dir + "cli-kintone" + ".${date}.log"

$base_url  = "https://example.com"
$app       = "UserSampleId"
$api_token = "UserSampleToken"
$encoding  = "utf8"
$fields    = "RecordNumber,Name,Password,DisplayName,Status,Check_AD_User"

$query_AD_User = '"Status in (\"実施中\") and Check_AD_User in (\"\")"'
$order_by      = '"RecordNumber asc"'

$update_key = "RecordNumber"

$log_app       = "LogSampleId"
$log_api_token = "LogSampleToken"

#
# AD
#
$AD_domain    = "ad.example.org"
$AD_user_path = "OU=User,DC=ad,DC=example,DC=org"

. .\lib.ps1
スクリプトの解説

次の変数の値は例示のための架空の値です。

  • $base_urlkintoneのベースURL
  • $appユーザー情報アプリのアプリID
  • $api_tokenユーザー情報アプリのAPIトークン(アクセス権:レコード閲覧/編集/レコード追加)
  • $log_appログアプリのアプリID
  • $log_api_tokenログアプリのAPIトークン(アクセス権:レコード閲覧/編集/レコード追加)
  • $AD_domain
  • $AD_user_path
ライブラリーファイル(lib.ps1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function Select-User {
    Param (
        [string] $condition,
        [string] $csv
    )

    $command = @(
        "$cli_kintone record export"
        "--base-url $base_url"
        "--app $app"
        "--api-token $api_token"
        "--encoding $encoding"
        "--fields $fields"
        "--condition $condition"
        "--order-by $order_by"
        "> $csv"
        "2>> $cli_kintone_log"
    ) -join " "

    & cmd.exe /s /c "$command"
}

class Result {
    [string] $RecordNumber
    [string] $Status
    [string] $Check_AD_User
}

function Register-Result {
    Param (
        [Result] $result,
        [string] $csv
    )

    $command = @(
        "$cli_kintone record import"
        "--base-url $base_url"
        "--app $app"
        "--api-token $api_token"
        "--encoding $encoding"
        "--file-path $csv"
        "--update-key $update_key"
        ">> $cli_kintone_log 2>&1"
    ) -join " "

    $result | Export-Csv -Path $csv -Encoding UTF8 -NoTypeInformation
    & cmd.exe /c $command
}

class Log {
    [string] $Status
    [string] $Details
}

function Register-Log {
    Param (
        [Log] $log,
        [string] $csv
    )

    $command = @(
        "$cli_kintone record import"
        "--base-url $base_url"
        "--app $log_app"
        "--api-token $log_api_token"
        "--encoding $encoding"
        "--file-path $csv"
        ">> $cli_kintone_log 2>&1"
    ) -join " "

    $log | Export-Csv -Path $csv -Encoding UTF8 -NoTypeInformation
    & cmd.exe /c $command
}

function Add-ADUser {
    Param (
        [string] $name,
        [string] $password,
        [string] $displayname
    )

    $upn = $name + "@" + $AD_domain
    $path = $AD_user_path

    New-ADUser `
        -Name $name `
        -DisplayName $displayname `
        -UserPrincipalName $upn `
        -Path $path `
        -ChangePasswordAtLogon $false `
        -PasswordNeverExpires $true `
        -AccountPassword (ConvertTo-SecureString -AsPlainText $password -Force) `
        -Enabled $true `
        -Verbose
}
スクリプトの解説
  • Select-User関数
    • ユーザー情報アプリから条件にマッチするレコードを取得し、CSVファイルにエクスポートします。
  • Resultクラス
    • Add-ADUser関数の実行結果の情報を格納するためのPowerShellオブジェクトのひな型です。
  • Register-Result関数
    • Add-ADUser関数の実行結果の情報をユーザー情報アプリに登録します。
  • Logクラス
    • スクリプトの実行時に発生したエラー情報を格納するためのPowerShellオブジェクトのひな型です。
  • Register-Log関数
    • スクリプトの実行時に発生した情報をログアプリへ登録します。
  • Add-ADUser関数
    • 内部で New-ADUser (External link) コマンドレットを実行することにより、ADユーザーアカウントを作成します。

動作の確認方法

  1. ユーザー情報アプリにレコードを登録します。デフォルトのステータスは「計画中」です。
  2. レコードのステータスを「実施中」に変更します。
  3. レコードのステータスが「完了」になるまで待ちます。

状態遷移

kintoneの構成のとおり、ユーザー情報アプリには状態を表すためのフィールドが2種類あります。

  • ステータス
  • AD User

下記では4名分のユーザー情報からADユーザーアカウントを自動作成する場合を例として説明します。
以降の画面では、 条件書式プラグインでステータスを装飾しています。

ステータス: 計画中

kintoneアプリにユーザー情報のレコードを登録する際に設定する初期ステータスです。
ステータスが「計画中」のレコードは、スクリプトが実行されても処理の対象になりません。

ステータス: 実施中

ADユーザーアカウントの作成を許可する際に設定するステータスです。
ステータスが「実施中」のレコードは、スクリプトが実行されると処理の対象になります。

ステータス: 完了

スクリプト実行されてADユーザーアカウントが正常に作成されると、対象レコードの[AD User]フィールド(チェックボックス)が自動でONになります。 併せてステータスが自動で「完了」になります。
ステータスが「完了」のレコードは、処理の対象になりません。

自動作成されたADユーザーアカウントが実際に存在することを確認します。

1
2
3
4
5
6
7
PS> @("tsuna", "kintoki", "sadamitsu", "suetake") | ForEach-Object { Get-ADUser -Identity $_ -Properties * } | Format-Table Name, DisplayName
Name      DisplayName
----      -----------
tsuna     渡辺綱
kintoki   坂田金時
sadamitsu 碓井貞光
suetake   卜部季武

おわりに

ADユーザーアカウントの自動作成を例としてそのしくみを紹介しました。
利用する側はkintoneアプリに情報を登録して待つだけという手軽さが長所です。
このしくみは他にも応用が効くかと思いますので、参考にしてみてください。

information

このTipsは、2024年7月版kintoneで動作を確認しています。