ユーザアカウントの登録



いろいろ問題も発生したのですが,
ちょっと並べてみましょう。

1.管理者とパスワードサーバの関係修復不可能状態
2.テキストファイルからユーザアカウント読み込み成功
・・・でもパスワードが・・・

3. テキストファイルからユーザアカウント読み込み成功
4.Excelを使ってユーザアカウント読み込みファイルを出力




1.管理者とパスワードサーバの関係修復不可能状態

これは,どういうことかというと・・・「オープンディレクトリアシスタント」でサーバの設定を進めていき,

このようにパスワードサーバを有効にすると,最初に登録した管理者が自動的にパスワードサーバの管理者にもなります。10.2.3以降のX Serverを設定したことのある人は,その旨のメッセージが出るので知っていると思います。
ただ,ある操作をすると,パスワードサーバに関する操作が全くできなくなります。それは何かというと・・・「ワークグループマネージャ」の上で起きます。
「ワークグループマネージャ」で,パスワードサーバの管理者になっているアカウントの「詳細」タブにある「ユーザのパスワードのタイプ」を誤って「パスワードサーバ」から「基本」に変えてしまうと・・・

「パスワードサーバ」に戻すことができなくなります。やろうとすると,確か「権限がない」と言われてしまいます。これはパスワードサーバの管理者はパスワードサーバを使用していなければならないということだと思われます。そのため,「基本」に変更すると管理者不在とされてしまい,パスワードサーバは言うことを聞いてくれなくなるということでしょう。そうなってしまったら,「オープンディレクトリアシスタント」を実行して一度パスワードサーバを無効にしてから再び有効にすれば管理者が登録されて利用できるのでしょうが,他のアカウントのパスワードを設定し直す必要も出てくるかもしれないですね(他のアカウントを登録する前だった上,他のトラブルも抱えていたため再インストールしてしまったので,細かいことは不明です)。最初の登録管理者のアカウントの扱いは,十分な注意が必要です。


2.テキストファイルからユーザアカウント読み込み成功 ・・・でもパスワードが・・・
「管理者ガイド」にはテキストファイルからユーザアカウントを登録する方法が書かれています。そこに,「表計算アプリケーションを使ったりして」ファイルを作成できるというようなことが書かれていたので,では「Excel」を使って作成しようと思ったのですが,とりあえず,読み込みを成功させないといけないので,手書きでファイルを作りました。こんなかんじです。
StandardUserRecord
name:password:1025:20:Name::
すると,「ワークグループマネージャ」での読み込みは成功します。その確認は「<HomeDirectory>/Library/Logs/ImportExport/」というパスの中に保存されている数字の入った長い名前のログファイルをTextEditで開いて見ればわかります。
ユーザ名が「name」,ユーザIDが1025,プライマリグループIDが20,名前が「Name」という情報が読み込まれて,あとホームは記述していないので「ホームはありません」,ログインシェルも記述していないので「デフォルト」という情報で登録されます。しかし,パスワードだけはうまく読み込んでくれません。よく調べてみると,上の例は「password」とプレーンテキストで記述していますが,実は,UNIX Cryptつまり,ハッシュ関数によって暗号化されたものを記述しないといけないということが判明しました。つまり,このままではパスワードを一括登録することはできないのです。
というわけで,当面はそれでもいいかと思って問題は放置されたのでした。

3. テキストファイルからユーザアカウント読み込み成功
パスワードサーバを使用しているときにはプレーンテキストでパスワードを記述して読み込ませることが可能だということが,10.2.3の英語版「管理者ガイド」に書いてあるということを聞きつけて,再び,テキストファイルからユーザアカウントをきちんと読み込ませることに挑戦することにしました。
そこで,手書きで下のようなファイルを作りました。
0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 8 dsAttrTypeStandard:RecordName dsAttrTypeStandard:AuthMethod dsAttrTypeStandard:Password dsAttrTypeStandard:UniqueID dsAttrTypeStandard:PrimaryGroupID dsAttrTypeStandard:Comment dsAttrTypeStandard:RealName dsAttrTypeStandard:UserShell
name1:dsAuthMethodStandard¥:dsAuthClearText :password1:1026:20:comment:Name01:/dev/null
name2:dsAuthMethodStandard¥:dsAuthClearText :password2:1027:20:comment:Name02:/dev/null
すると,読み込みは成功します。しかし,「ワークグループマネージャ」でアカウントを見ると,name1しか登録されていません。ログファイルを見ても,name1しか読み込みに成功していないのです。
ちなみにユーザ名が「name1」,パスワードのタイプは「パスワードサーバ」(「dsAuthMethodStandard\:dsAuthClearText」の部分で指定していると考えてください。ここの文字列は固定です。),パスワードは「password1」,ユーザIDが1026,プライマリグループIDが20,コメントが「comment」,名前が「Name01」,ログインシェルが「なし」という情報が読み込まれて登録されるはずです。
しかし,よく調べてみると,ログインシェルがおかしいのです。「ワークグループマネージャ」で詳細タグを見てみると,ログインシェルが「/dev/null name2」となっているではありませんか。どうも一人目と二人目のアカウントデータの切れ目を認識していないようなのです。
ここから試行錯誤を繰り返したわけですが,長くなるので省略します。結論としては,Jeditを使ってみてやっとわかったのですが(それまでTextEditしか使っていなかったのです),改行コードとしてMacの標準であるCR(キャリッジリターン)のみが入っていたためにこれを改行として認識していなかったようなのです。UNIXの標準では改行コードはLF(ラインフィード)のみ,Windowsの標準ではCR+LFとなっているわけですが,CRをLFに置き換えてやると,正常に二人分のアカウントを読み込んでくれたのです。気づいてみれば「なるほど」ですが,気づくまでは時間がかかりました。

4.Excelを使ってユーザアカウント読み込みファイルを出力
ユーザアカウントの読み込みがなんとかうまくできるようになりましたので,当初の計画通り,Excelを使って読み込みファイルを出力させようと考えました。もちろん,VBA(VisualBasic for Application)を使いました。1枚のシートを使います。このシートを「アカウント情報記述用」として使って,1行目に属性を入れ,2行目以降に各アカウント情報を記入すると,VBAでテキストファイルを出力してくれるという便利な物を作ってみました。例えば,

このようにsheet1に入力しておきます。そして,下のようなVBAのsubプロシージャを作成します。

Public Sub MakeTextFile()
 Sheets("sheet1").Activate
 m = MsgBox("デスクトップ上にdata.txtというファイルを作成します。よろしいですか。", 1, "確認")
 If m = 2 Then Exit Sub
 fn = FreeFile
 Open "data.txt" For Output As #fn
 Print #fn, "0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users ";
 x = 1
 st = Empty
 Do Until ActiveSheet.Cells(1, x).Value = Empty
  st = st & "dsAttrTypeStandard:" & ActiveSheet.Cells(1, x).Value & " "
  If x = 1 Then st = st & "dsAttrTypeStandard:AuthMethod "
  x = x + 1
 Loop
 Print #fn, x & " " & st & Chr(10);
 y = 2
 x = x - 1
 Do Until ActiveSheet.Cells(y, "A").Value = Empty
  st = Empty
  For i = 1 To x
   st = st & ActiveSheet.Cells(y, i).Value
   If Not i = x Then st = st & ":"
   If i = 1 Then st = st & "dsAuthMethodStandard\:dsAuthClearText:"
  Next
 Print #fn, st & Chr(10);
 y = y + 1
 Loop
 Close
End Sub

これを実行すると,デスクトップに次のような内容のテキストファイル「data.txt」が作成されます。(同じファイル名がすでに存在しても上書きされてしまいます。)
0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 8 dsAttrTypeStandard:RecordName dsAttrTypeStandard:AuthMethod dsAttrTypeStandard:Password dsAttrTypeStandard:UniqueID dsAttrTypeStandard:PrimaryGroupID dsAttrTypeStandard:Comment dsAttrTypeStandard:RealName dsAttrTypeStandard:UserShell
name1:dsAuthMethodStandard\:dsAuthClearText:password1:1026:20:comment:Name01:/dev/null
name2:dsAuthMethodStandard\:dsAuthClearText:password2:1027:20:comment:Name02:/dev/null

もちろん改行コードはLFになっています。(Jeditで確認するとわかります。)
あとは,「ワークグループマネージャ」で「サーバ」メニューから「読み込み...」を選び,レコードフォーマットを「ファイルのレコード定義を使う」として読み込むとユーザアカウントが作成されることが確認できます。

ここではMicrosoft Excel v.Xを使っていますが,VBAの知識が少しないとこれは難しいかもしれません。ここで紹介したプロシージャでは,シートに属性を増やすと自動的にレコード定義が生成されるようになっています。分かる人には分かってもらえるかと思うのですが・・・。




戻る