- PR -

非AD環境の Windows Server 2003 にユーザーアカウントを一括登録する方法

投稿者投稿内容
Yuki
会議室デビュー日: 2005/09/01
投稿数: 15
お住まい・勤務地: Tokyo <-> Tokyo
投稿日時: 2006-11-20 12:20
ADを構築していない環境の Windows Server 2003 へ
全社員分のアカウントを登録することになった為、CSVファイルから
一括で登録する方法を探しております。

下記URLに Windows 2000 Server の一括登録の方法が載っておりましたが
Windows Server 2003 でも同じ方法で出来るのかが確認できませんでした。
Windows Server 2003 のリソースキット付属CDには addusers.exe が
見当たらなかったので、やはり2000と同じやり方ではまずいのでしょうか。

大量のユーザー・アカウントを一括登録する
http://www.atmarkit.co.jp/fwin2k/win2ktips/128addmassuser/128addmassuser.html

addusers.exe を利用する以外のやり方がありましたら、そちらも
教えていただけないでしょうか。
ご助言よろしくお願いいたします。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-11-20 16:15
こんにちは。

たとえば ADSI を使う方法があります。
WinNT Provider を使えばローカルのユーザーやグループを扱うことができます。

IADsUser インターフェースのドキュメントにも目を通しておくと良いと思います。

VBScript でユーザーを登録する例です。
コード:

strComputer = "computername"
strUser = "username"
strPassword = "password"

Set oDomain = GetObject("WinNT://" & strComputer)
Set oUser = oDomain.Create ("user", strUser)
oUser.SetPassword strPassword
oUser.SetInfo



ユーザーをグループに追加する例です。
コード:

strComputer = "computername"
strUser = "username"
strGroup="Users"

Set oGroup = oDomain.GetObject("group", strGroup)
oGroup.Add ("WinNT://" & strComputer & strUser)



いかがでしょうか。

--追記--
ユーザーをグループに追加するコード例が間違っていました。
正しく動作するコードはこちら
コード:

strComputer = "computername"
strUser = "username"
strGroup="Users"

Set oDomain = GetObject("WinNT://" & strComputer)
Set oGroup = oDomain.GetObject("group", strGroup)
oGroup.Add ("WinNT://" & strComputer & "/" & strUser)



_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for Microsoft Office System - Microsoft Office System
(Jul 2006 - Jun 2007)
Hello Another World!

[ メッセージ編集済み 編集者: ue 編集日時 2006-11-22 10:05 ]
Yuki
会議室デビュー日: 2005/09/01
投稿数: 15
お住まい・勤務地: Tokyo <-> Tokyo
投稿日時: 2006-11-20 21:42
ue様、ご意見ありがとうございます。

具体的にコードまで教えていただいて本当に感謝です。
自分のテスト機に実行してみたところ無事にユーザー登録が出来ました。
仮に100ユーザーを一括で登録しようとした場合は記述していただいたコードを
100個くっつけて実行すればいいのでしょうか。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-11-20 22:55
ueです。

引用:

Yukiさんの書き込み (2006-11-20 21:42) より:

仮に100ユーザーを一括で登録しようとした場合は記述していただいたコードを
100個くっつけて実行すればいいのでしょうか。


100個くっつけるのも一つの手ですが、csv ファイルを Script.FileSystemObject を用いて読み込む方法を採れば作業が楽になります。

カンマで区切られた個々の値を取得するには Split 関数 が便利です。

TechNet の Hey, Scripting Guy! にそれっぽい使用例があるので参考にしてください。
テキスト ファイルを 1 行ずつ読み取るのではなくファイル全体を一度に読み取ることはできますか。
テキスト ファイルのすべての空白行を削除する方法はありますか
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
Yuki
会議室デビュー日: 2005/09/01
投稿数: 15
お住まい・勤務地: Tokyo <-> Tokyo
投稿日時: 2006-11-21 18:40
ue様、引き続きのご助言ありがとうございます。

引用:

ueさんの書き込み (2006-11-20 22:55) より:

100個くっつけるのも一つの手ですが、csv ファイルを Script.FileSystemObject を用いて読み込む方法を採れば作業が楽になります。

カンマで区切られた個々の値を取得するには Split 関数 が便利です。

TechNet の Hey, Scripting Guy! にそれっぽい使用例があるので参考にしてください。
テキスト ファイルを 1 行ずつ読み取るのではなくファイル全体を一度に読み取ることはできますか。
テキスト ファイルのすべての空白行を削除する方法はありますか



100個くっつけるのはさすがにスマートじゃないですよね。穴があったら入りたいです。
ue様の意見を基にコードを変えてみたところ、一括登録はうまくいきました。
あとは以下の2点を有効にしたいのですが、何か良い方法はありますでしょうか。
「ユーザーはパスワードを変更できない」
「パスワードを無期限にする」

コード:

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\test\test.csv", ForReading)

strText = objTextFile.ReadAll
objTextFile.Close

arrNewUser = Split(strText, vbCrLf)

For Each strNewUser In arrNewUser
If Len(strNewUser) > 0 Then

arrData = Split(strNewUser, ",")
strComputer = arrData(0)
strUser = arrData(1)
strPassword = arrData(2)

Set oDomain = GetObject("WinNT://" & strComputer)
Set oUser = oDomain.Create ("user", strUser)
oUser.SetPassword strPassword
oUser.SetInfo

End If
Next



また、グループへの一括登録は「このメンバは存在しないため、ローカルグループに追加したり、ローカルグループに削除したりすることができませんでした。」
というエラーが返ってきました。
22行目とのことなので oGroup.Add ("WinNT://" & strComputer & strUser) が
問題なのだと思うのですが、どこか書き方が悪かったのでしょうか。

コード:

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\test\test.csv", ForReading)

strText = objTextFile.ReadAll
objTextFile.Close

arrNewUser = Split(strText, vbCrLf)

For Each strNewUser In arrNewUser
If Len(strNewUser) > 0 Then

arrData = Split(strNewUser, ",")
strComputer = arrData(0)
strUser = arrData(1)
strGroup = arrData(3)

Set oDomain = GetObject("WinNT://" & strComputer)
Set oGroup = oDomain.GetObject("group", strGroup)
oGroup.Add ("WinNT://" & strComputer & strUser)

End If
Next


ご助言のほう、よろしくお願いいたします。

[ メッセージ編集済み 編集者: Yuki 編集日時 2006-11-21 18:46 ]
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-11-22 10:02
ueです。

引用:

Yukiさんの書き込み (2006-11-21 18:40) より:

あとは以下の2点を有効にしたいのですが、何か良い方法はありますでしょうか。
「ユーザーはパスワードを変更できない」
「パスワードを無期限にする」


「ユーザーはパスワードを変更できない」は WinNT Custom User Properties の userFlags 属性を使って有効にできます。
userFlags に ADS_USER_FLAG_ENUM 列挙体から ADS_UF_PASSWD_CANT_CHANGE 定数をセットしてください。十進数なら 64 です。
コード:
oUser.Put "userFlags", 64



「パスワードを無期限にする」は userFlags に 同じくADS_USER_FLAG_ENUM 列挙体から ADS_UF_DONT_EXPIRE_PASSWD 定数をセットしてください。十進数なら 65536 です。
コード:
oUser.Put "userFlags", 65536



引用:

Yukiさんの書き込み (2006-11-21 18:40) より:

また、グループへの一括登録は「このメンバは存在しないため、ローカルグループに追加したり、ローカルグループに削除したりすることができませんでした。」
というエラーが返ってきました。
22行目とのことなので oGroup.Add ("WinNT://" & strComputer & strUser) が
問題なのだと思うのですが、どこか書き方が悪かったのでしょうか。


私のコード例が間違っていました。失礼しました。
動作するコードはこのようになります。
コード:
strComputer = "computername"
strUser = "username"
strGroup="Users"

Set oDomain = GetObject("WinNT://" & strComputer)
Set oGroup = oDomain.GetObject("group", strGroup)
oGroup.Add ("WinNT://" & strComputer & "/" & strUser)



いかがでしょうか。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
Yuki
会議室デビュー日: 2005/09/01
投稿数: 15
お住まい・勤務地: Tokyo <-> Tokyo
投稿日時: 2006-11-22 13:05
ue様、お付き合いくださってありがとうございます。

引用:

ueさんの書き込み (2006-11-22 10:02) より:

「ユーザーはパスワードを変更できない」は WinNT Custom User Properties の userFlags 属性を使って有効にできます。
userFlags に ADS_USER_FLAG_ENUM 列挙体から ADS_UF_PASSWD_CANT_CHANGE 定数をセットしてください。十進数なら 64 です。
コード:
oUser.Put "userFlags", 64



「パスワードを無期限にする」は userFlags に 同じくADS_USER_FLAG_ENUM 列挙体から ADS_UF_DONT_EXPIRE_PASSWD 定数をセットしてください。十進数なら 65536 です。
コード:
oUser.Put "userFlags", 65536




この2つのコードを繋げて一緒に実行すると、後のコードで上書きしているようでしたので
ue様のご助言を基に少し書き方を変えてみたところうまくいきました。

引用:

私のコード例が間違っていました。失礼しました。
動作するコードはこのようになります。
コード:
strComputer = "computername"
strUser = "username"
strGroup="Users"

Set oDomain = GetObject("WinNT://" & strComputer)
Set oGroup = oDomain.GetObject("group", strGroup)
oGroup.Add ("WinNT://" & strComputer & "/" & strUser)




ありがとうございます。このコードでうまく登録ができました。


ue様のご助言を基に作成した以下のコードで、CSVからユーザー登録、グループへの登録を
一括して行うことができました。


CSVレイアウト
Computername,Username,Password,Group

コード:
Const ForReading = 1
Const ADS_UF_PASSWD_CANT_CHANGE = &H0040
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
    ("c:\test\test.csv", ForReading)

strText = objTextFile.ReadAll
objTextFile.Close

arrNewUser = Split(strText, vbCrLf)

For Each strNewUser In arrNewUser
    If Len(strNewUser) > 0 Then

       arrData = Split(strNewUser, ",")
       strComputer = arrData(0)
       strUser = arrData(1)
       strPassword = arrData(2)
       strGroup = arrData(3)

       Set oDomain = GetObject("WinNT://" & strComputer)
       Set oUser = oDomain.Create ("user", strUser)
       oUser.SetPassword strPassword
       oUser.SetInfo
       Set oGroup = oDomain.GetObject("group", strGroup)
       oGroup.Add ("WinNT://" & strComputer & "/" & strUser)
       oUser.SetInfo
       'ユーザーはパスワードを変更できない on
       If Not oUser.UserFlags And ADS_UF_PASSWD_CANT_CHANGE Then
          objPasswordNoChangeFlag = oUser.UserFlags XOR ADS_UF_PASSWD_CANT_CHANGE
          oUser.Put "userFlags", objPasswordNoChangeFlag 
          oUser.SetInfo
       End If
       'アカウントのパスワードを無期限にする on
       If Not oUser.UserFlags And ADS_UF_DONT_EXPIRE_PASSWD Then
          objDontExpirePasswordFlag = oUser.UserFlags XOR ADS_UF_DONT_EXPIRE_PASSWD
          oUser.Put "userFlags", objDontExpirePasswordFlag
          oUser.SetInfo
       End If
    End If
Next


「ユーザーはパスワードを変更できない」「アカウントのパスワードを無期限にする」以外の
設定については以下のURLを参考にするといいと思います。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/dec04/hey1202.mspx

ue様、最後までお付き合いくださって本当にありがとうございました。
Yuki
会議室デビュー日: 2005/09/01
投稿数: 15
お住まい・勤務地: Tokyo <-> Tokyo
投稿日時: 2006-11-22 13:36
後からフルネーム、説明も一括登録したくなったので少し追加してみました。
グループも2つ登録できるようにしてみました。
大した変更ではありませんが、誰かしらの参考になればと思います。

CSVレイアウト
Computername,Username,Password,FullName,Description,Group1,Group2

コード:

Const ForReading = 1
Const ADS_UF_PASSWD_CANT_CHANGE = &H0040
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\test\test.csv", ForReading)

strText = objTextFile.ReadAll
objTextFile.Close

arrNewUser = Split(strText, vbCrLf)

For Each strNewUser In arrNewUser
If Len(strNewUser) > 0 Then

arrData = Split(strNewUser, ",")
strComputer = arrData(0)
strUser = arrData(1)
strPassword = arrData(2)
strFullName = arrData(3)
strDescription = arrData(4)
strGroup1 = arrData(5)
strGroup2 = arrData(6)

Set oDomain = GetObject("WinNT://" & strComputer)
Set oUser = oDomain.Create ("user", strUser)
oUser.SetPassword strPassword
'フルネーム
oUser.FullName = strFullName
'説明
oUser.Description = strDescription
oUser.SetInfo
'グループ1へ登録
Set oGroup1 = oDomain.GetObject("group", strGroup1)
oGroup1.Add ("WinNT://" & strComputer & "/" & strUser)
'グループ2へ登録
If Len(strGroup2) > 0 Then
Set oGroup2 = oDomain.GetObject("group", strGroup2)
oGroup2.Add ("WinNT://" & strComputer & "/" & strUser)
End If
oUser.SetInfo
If Not oUser.UserFlags And ADS_UF_PASSWD_CANT_CHANGE Then
objPasswordNoChangeFlag = oUser.UserFlags XOR ADS_UF_PASSWD_CANT_CHANGE
oUser.Put "userFlags", objPasswordNoChangeFlag
oUser.SetInfo
End If
If Not oUser.UserFlags And ADS_UF_DONT_EXPIRE_PASSWD Then
objDontExpirePasswordFlag = oUser.UserFlags XOR ADS_UF_DONT_EXPIRE_PASSWD
oUser.Put "userFlags", objDontExpirePasswordFlag
oUser.SetInfo
End If
End If
Next



[ メッセージ編集済み 編集者: Yuki 編集日時 2006-11-22 13:45 ]

スキルアップ/キャリアアップ(JOB@IT)