PowerShell でドメインユーザー連続作成 ~ aduser 編 ~

前回の While ステートメントに、実際にドメインユーザーを作成するコマンドレット" New-ADUser "を一行書き足すことで、「ドメインユーザー連続作成」ができるようになります。

 

 

ただドメインユーザーアカウントを一つ作成するだけでしたら、" new-aduser <ユーザー名> " だけでも可能です。

そのため、二つの変数 $L = import-csv samplelist.csv , $C = 0 を定義した直後に " new-aduser ($L[$C]).name " を実行した場合、「aaa」をユーザー名とするドメインユーザーが作成されます。

しかし、この状態ではパスワードが設定されていないのは当然として、ユーザーアカウント自体も「無効」となっています。

作成と同時にアカウントを「有効」とするためには、" -Enabled $true " というオプションが必要です。

" net user <ユーザー名> /add /domain " コマンドで作成したユーザーアカウントであれば、特にオプションを付けずとも最初から有効なのですが。

 

 

ドメインユーザーの作成と同時にパスワードも設定するには、" -AccountPassword " というオプションを用います。

しかし、" -AccountPassword ($L[$C]).password " という記述で CSV ファイルからパスワードを読み込もうとしても、失敗してしまいます。

どうやら、「ごく普通の文字列(プレーンテキスト)」はパスワードとして扱えず、「SecureString」というセキュリティ的に保護された文字列である必要があるようです。

CSV から読み込んだ文字列を「SecureString」に変換するためには " ConvertTo-SecureString " というコマンドレットも併用しなくてはいけないので、実際のドメインユーザー作成コマンドレットは下記のようになります。

" New-ADUser ($L[$C]).name -AccountPassword (ConvertTo-SecureString -asplaintext ($L[$C]).password -force) -Enabled $true"

この一行を While ステートメントに組み込んで繰り返し実行することで、CSV に記述された全ユーザーが作成され、同じく CSV に記述されたパスワードを用いてドメイン内のコンピューターにログオン出来るようになります。

 

 

なお、上記コマンドレットにより作成されたドメインユーザーは、「姓」「名」「表示名」「ユーザー ログオン名」が設定されておらず、「ユーザー ログオン名(Windows 2000 より前)」だけが、指定したユーザー名により設定されている状態です。

そのユーザー名でログオンすること自体に支障は無いのですが、必要に応じてオプションを付与し、適宜設定するようにしてください。

 

 

" new-aduser "、" ConvertTo-SecureString " コマンドレットについての詳細は、下記 URL を参照してください。

New-ADUser

http://technet.microsoft.com/ja-jp/library/ee617253(en-us).aspx

 

ConvertTo-SecureString

http://technet.microsoft.com/en-us/library/hh849818.aspx

PowerShell でドメインユーザー連続作成 ~ While 編 ~

前回は、CSV ファイルから任意の位置(列,行)の情報を読み込むところまでやりました。

今回はその「」がテーマです。

" ($L[0]).name " の [0] の部分が「行」を表すわけですが、これを 0 -> 1 -> 2 とカウントアップさせながら、同じ処理(ドメインユーザー作成)を繰り返し行わせる方法を解説します。

 

 

まず、パラメーター(変数)として扱う「行」を、「$C」とします。

最初に " $C = 0 " と定めておけば、 " ($L[$C]).name " の結果として「aaa」を得る事が出来ます。

 

 

次に、$C をカウントアップ(処理を 1 回行うごとに、1 ずつ増加)させながら繰り返し処理するために、While ステートメントを用います。

基本構文は「 While  (繰り返す条件)  {繰り返し実行したいコマンドレット}  」です。

 

 

(繰り返す条件) は、今回の場合「$C が 2 以下の場合」となります。

つまり、CSV ファイルのユーザーリストを 1 行目 -> 2 行目 -> 3 行目 と順に読み込んで処理し、処理するたびにカウントアップした $C が「3」に達したらそれ以降は処理せず、終了します。

これは、" ($C -le 2) " と記述します。

あるいは、「$C が  3 より小さい場合」を意味する " ($C -lt 3) " でも同様の結果となります。

 

 

次に {繰り返し実行したいコマンドレット} ですが、ここは二段構成となります。

一つ目は、本来の目的である「ドメインユーザーの作成」です。これについては次回以降詳述します。

二つ目が、「$C のカウントアップ」です。こちらは、" $C++ " ないし" $C = $C+1 " と記述します。

これにより、ドメインユーザーを一人作り終えた直後に「$C」がカウントアップされるため、次の処理ではCSV ファイルの一つ下の行のデータが読み込まれます。

 

 

これまでのところをまとめると、こうなります。

$L = import-csv samplelist.csv

$C = 0

while ($C -le 2)

{

<ドメインユーザー作成コマンドレット>

$C++

}

 

 

続く

PowerShell でドメインユーザー連続作成 ~ CSV 編 ~

CSV 形式のユーザーリストを元に、PowerShell を用い、Active Directory に複数のユーザーを一度に作成する方法を考えてみました。

なお、全ての操作は、ドメインコントローラー・メンバーサーバーともに Windows Server 2008 R2 SP1 の環境で行っています。

 

 

この作業のためには、PowerShell の3つの機能を組み合わせます。

[1]   CSV 形式のファイルから、指定した位置 (列,行) の情報を読み込む

[2]   [1] で読み込んだ情報を使い、ドメインユーザーを作成する

[3]   CSV の最終行まで、[1],[2] の作業を順番に繰り返す

 

 

第一回の今回は、[1] について記述します。(次回はいったん [3] に飛び、最後に [2] をやる予定です。)

 

 

まず、作成する 3 ユーザーの名前とパスワードのリスト「samplelist.csv」を、下記のように記述します。

※ 先頭行はフィールド名のため、全 4 行となります。

--------<ココカラ>--------

name,password

aaa,bbb

123,456

大畑,fk-01g

--------<ココマデ>--------

 

 

PowerShell で CSV ファイルを読み込む場合、import-csv コマンドレットを用います。

CSV ファイルがカレントディレクトリにある場合は、" import-csv  samplelist.csv " です。

しかし・・・

CSV ファイルを日本語版 Windows の「メモ帳」で作成していた場合、保存時の文字コードは既定で Shift-JIS であるため、PowerShell 上では「大畑」の二文字が文字化けしてしまいます。

この現象は、ファイルを保存する際に文字コードとして Unicode を選択することで回避可能です。

あるいは、 " get-content samplelist.csv > unicode.csv " といったコマンドレットにより、Unicode 形式の別ファイルに変換することも可能です。

 

 

リストの中身全体を正しく読み込めたところで、次は列と行を指定して特定のデータを読み取ります。

まず、リスト全体を読み込むコマンドレットを、変数「$L」として扱えるようにします。

" $L = import-csv  samplelist.csv "

こうすることで、" $L " を実行するだけでリストの中身を読み込めるようになります。

 

 

それから、name 列 のデータ部 1 行目、つまり「aaa」だけを抽出します。

これは " ($L[0]).name " で出来ます。

どうやら、データ部の 1 行目を、PowerShell 的には「0」行目として扱っているようなので、" ($L[1]).name " だと、結果は「123」になってしまいます。

大畑氏のパスワードを表示するには、" ($L[2]).password " です。

 

 

続く

フェールオーバー クラスタリング「再起動期間」の意味

Windows Server 2008 R2 SP1 のフェールオーバー クラスタリング環境で確認したことを、備忘録代わりに書き留めておきます。

 

 

クラスター上の各リソースには、

再起動期間 (既定値:15 分)

◆ 指定期間内での再起動の試行回数(既定値:1 回)

という二つの設定値が有ります。

設定は、リソースのプロパティ画面の「ポリシー」タブ内で行います。

同じグループ内でも、リソース毎に異なる値を設定可能です。

 

 

上記既定値の意味は、「リソースが " 失敗 " 状態になった場合は再起動を試みるが、15 分以内に 2 回目の " 失敗 " 状態となった場合は、もう再起動を試みない。」というものです。

この「 15 分」という再起動期間が、どのようにカウントされるのかが気になったので、実際に検証してみました。

なお、再起動を試みない場合にフェールオーバーするか否かは、他の設定項目によって変わります。(既定ではフェールオーバーする設定となっています。)

 

 

まず、検証用の設定値に変更します。

◆ 再起動期間  ( 4 分

◆ 指定期間内での再起動の試行回数( 2 回

その上で、「このリソースのエラーをシミュレーションする」でわざと " 失敗 " 状態にしてみます。

(この機能は、リソースを右クリックして表示されるメニューの、「その他のアクション」の中に有ります。)

[ 0 分 00 秒 ]  一回目の失敗。すぐ再起動し、オンライン状態に戻る。

[ 3 分 30 秒 ]  二回目の失敗。すぐ再起動し、オンライン状態に戻る。

[ 4 分 30 秒 ]  三回目の失敗。すぐ再起動し、オンライン状態に戻る。フェールオーバーせず。

=> 最初の失敗から 4 分以上経過しているので、想定通りです。

[ 5 分 30 秒 ]  四回目の失敗。すぐ再起動し、オンライン状態に戻る。フェールオーバーせず。

=> 二回目の失敗から数えた場合、4分経過していないうちに三回目の失敗が起きたことになります。

 

 

以上の結果から、一回目の失敗から 4 分経過した時点で、失敗カウントはゼロ回にリセットされていると考えられます。

決して「直近 4 分以内で何回目の失敗か」という数え方ではないようです。