はじめまして、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
・スクリプト1
・スクリプト2
・スクリプト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
・・・
以上。
メモのような記事になりましたが、参考になれば幸いです。
tnk
最新記事 by tnk (全て見る)
- 1課の技術書_SNMP編 - 2023年4月28日
- 1課の技術書_ネットワーク管理(JP1&SNMP)編 - 2022年10月31日
- 1課の技術書 JP1編 - 2022年5月31日
- 1課の技術書 クラウド編 - 2021年12月20日
- 検証しました - 2020年3月4日