はじめまして、tnk(ティーエヌケー)です。数字はつけないでください。

現在、AD(ActiveDirectory)やWSUS(ダブルサス・・・「ダブル砂州」と変換されました。砂州が二つ重なっているのでしょうか。渡ってみたいです・・・)の検証をやっております。
ですので今日はその一部を備忘録として残しておきたいと思います。

検証のイメージがわかない人にも雰囲気が伝わればと思います。

ダブル砂州の雰囲気

やりたいこと

CSVファイルからADにユーザーを一括登録する
(ユーザ名/表示名/グループ/パスワードは最低限入れたい)

使用コマンド

  • dsadd
  • csvde
  • Get-ADUser
  • New-ADUser
  • Add-ADGroupMember
このようにユーザーが登録されます。
属性エディターに項目が集約されています(右)。
左はユーザ側、右はグループ側から、グループへの所属状況を確認。このように所属されていれば成功。

なぜこれをやるかというと、新たにADサーバーを構築し、そこにユーザーを100人や200人と登録したいというときに、GUI操作ではユーザーを一人一人新規で作成し、[画像]にあるような多くの項目を一つ一つ埋めていかなければならなくなるわけですが、あいにく私にそのような趣味がないからです。

趣味があってもよいですが、限られた時間の中でミスなくやるのは大変です。

そこで、ユーザー情報をリストしたファイルを予め用意しておき、これをコマンドで一気に流し込もうというわけです。
楽な方法でやるに越したことはありません。
ということで検証しました。

・・・ところがしかし、But!

まだIT経験の浅い人(私)にとって、楽になるはずのこの方法を習得することは必ずしも楽ではないようです。
以下で、Microsoft公式ページや技術ブログをあさりながら検証した軌跡を、かなり端折ってますが4パターンに分けて記しておきたいと思います。

1.dsadd

手始めにこれで1ユーザー入れてみます。事前にtest-groupを作成しておきました。
・コマンド
dsadd user “cn=test1,cn=Users,dc=TNK,dc=local” -pwd 1!test -samid test1 -upn test1@TNK.local -display テスト1 -memberof “cn=test-group,cn=Users,dc=TNK,dc=local”

成功
複数ユーザーでも可能です。

2.ループ処理でcsv参照したdsadd

次に、CSVファイルを用意して2ユーザー入れてみます。
・csv(adduser.csv)
“cn=Users,dc=TNK,dc=local” test1 1!test テスト1 test-group
“cn=Users,dc=TNK,dc=local” test2 2!test テスト2 test-group

・コマンド
for /f “tokens=1-5” %A in (C:\adduser.csv) do dsadd user “cn=%D,%A” -pwd %C -samid %B -upn %B@TNK.local -display %D -memberof “cn=%E,dc=TNK,dc=local”

・結果

dsadd 失敗:cn=テスト1,cn=Users,dc=TNK,dc=local:ディレクトリオブジェクトが見つかりません。:オブジェクトは正常に作成されましたが、作成後の操作中にエラーがありました。

…見つからないそうです。
なぜでしょう。ユーザーは登録されるが、グループに所属しない。

3.csvde

このコマンドでは「パスワードの設定はできない」「アカウントは無効になる」ようです。一応テストします。
・csv(import_test.csv) ※必須属性3つのみ
DN,objectClass,sAMAccountName
“CN=test1,CN=Users,DC=TNK,DC=local”,user,test1
“CN=test2,CN=Users,DC=TNK,DC=local”,user,test2

・コマンド
csvde -i -f import_test.csv

成功

ところが、csvにmemberOf列を追加して実行すると、

属性がセキュリティ アカウント マネージャー (SAM) によって所有されているため、属性にアクセスできません。

と撥ねつけられます。
何なのでしょう。これでもグループに入らない。

4.New-ADUser

次はPowerShellコマンドで試してみます。

csvを用意するため手動でテストユーザーを入れてGet-ADUserで取得。ところが多くの属性にこんな値が入っていました。

Microsoft.ActiveDirectory.Management.ADPropertyValueCollection

何なんでしょうか。Select-Objectで@{L=”memberof”; E={$_.memberof}}とやると値は表示されていましたが。
とりあえず以下でテストします。

・csv(test4_2.csv)
CanonicalName,CN,DisplayName,DistinguishedName,MemberOf,Name,ObjectCategory,ObjectClass,PrimaryGroup,primaryGroupID,SamAccountName,UserPrincipalName,Password
TNK.local/Users/test4,test4,test4,”CN=test4,CN=Users,DC=TNK,DC=local”,”CN=test-group,CN=Users,DC=TNK,DC=local”,test4,”CN=Person,CN=Schema,CN=Configuration,DC=TNK,DC=local”,user,”CN=Domain Users,CN=Users,DC=TNK,DC=local”,513,test4,test4@TNK.local,test4#

・コマンド
Import-Csv “C:\Users\Administrator.TNK\test4_2.csv” | %{New-ADUser -Name $_.DisplayName -DisplayName $_.DisplayName -UserPrincipalName $_.UserPrincipalName -sAMAccountName $_.Name -AccountPassword (ConvertTo-SecureString -AsPlainText $_.Password -Force) -ChangePasswordAtLogon $false -Enabled $true -PasswordNeverExpires $true}

成功

しかし、このコマンドに$_.memberof -memberof を追加しても入らないようです。
先ほど上でやったのと同様の理由かもしれません。この属性名ではだめそうです。

次は別の方法でテスト。今度はスクリプトを作ります。csvの属性も一部変わってます。

・csv(ADUserAccout.csv)
Path,description,name,sAMAccountName,userPrincipalName,givenName,displayName,AccountPassword,ADGroup1,ADGroup2,ADGroup3
“CN=Users,DC=TNK,DC=local”,testes1′,test001,test001,,,test001,test1#,test-group,,
“CN=Users,DC=TNK,DC=local”,testes2′,test002,test002,,,test002,test2#,test-group,test-group2,
“CN=Users,DC=TNK,DC=local”,,test003,test003,test003@TNK.local,test003,test003,test3#,,,営業部Gr

Excelではこんな感じです(ADUserAccout.csv)

・スクリプト1

ユーザー登録用スクリプト

・スクリプト2

スクリプト1で登録したユーザーをグループに所属させるスクリプト

・スクリプト1⇒2と順に実行

これでうまくいきました。

登録されています

Write-Output(出力するメッセージ)は条件で分けていないので、失敗しても全部成功した雰囲気を醸し出してしまいます。エラーが出れば一目瞭然なので良いですが。

csvdeで取得したcsvからPowerShellコマンドで流し込むことも想定して、こんな手順でやりました。
・DN⇒Pathに換えて最下層(CN=test001)削除
・グループとパスワード列を追加
・いらない属性を消す前にスクリプト1を実行し、エラーの出た属性をスクリプトから消していった結果残ったもの↓を残す
Path,description,name,sAMAccountName,userPrincipalName,givenName,displayName,AccountPassword,ADGroup

csvdeとPowerShellコマンドで名前の異なる属性がいくつかありましたが使わない項目です。
・badPwdCount ⇒ BadLogonCount
・badPasswordTime ⇒ LastBadPasswordAttempt
・lastLogonTimestamp ⇒ LastLogonDate

検証はここまで。

知らないもの、調べ足りないものが、わんさか登場してきました。
LDAP属性
SAMロジック
パラメータの定義
System.String 型/~型
ProxyAddresses
ExtensionAttribute
SPN・UPN
自動変数
ConvertTo-SecureString
Microsoft.ActiveDirectory.Management.ADPropertyValueCollection
・・・

以上。
メモのような記事になりましたが、参考になれば幸いです。

The following two tabs change content below.

tnk

2018年よりITの仕事を始める。Windows関連の運用と構築を経験する傍らLinuxも勉強中。 中野区在住。好きな動物はカルガモ。 日に浴していたいと願いながらも室内で仕事をしています。 技術情報も載せていけたらと思います。

最新記事 by tnk (全て見る)