Windowsネットワーク構築の方法 (Windows NT 4.0 Server と Windows 9x クライアント)


目次


はじめに

今まで学生用のパソコンには特に大きな制限をせずに運用してきたが様々な問題が生じてきた. そのため,以下のことを主眼として設定の大きな変更を行った.

デスクトップ環境の統一

授業を行う際,デスクトップ環境が同じでないと支障が起きる. このため,デスクトップ環境の統一は重要である. これは,ユーザープロファイルという機能で実現できる.

ユーザーの権限

これはデスクトップ環境にも通じることであるが,ユーザーの権限を制限しないと勝手な変更を加えられてしまう. これは,システムポリシーを利用することで実現できる.

再インストール作業の簡素化

Windowsでは,ある程度使用していると動作が不安定になったり,ウィルスに感染しやすいことなどから,再インストールをしなければならない場合がある. このため,再インストール作業を簡素化することは重要である. これは,PicoBSDによるバックアップ,リストアで解決した.

以下では,考慮すべき点と実際の作業手順でつまずきやすい部分についてまとめたものである.

なお,後半のバックアップとリストアについては,クライアントは DHCP により IP アドレスを取得でき,自由に使える FTP サーバーが存在することを前提としているが,必ずしもその必要はない. また,前半の部分だけでユーザーに勝手なことをさせないという目的は達成できる.

Sambaを用いれば,以下と同じことがより簡単にできる.

Windows 9x のひな形マシンを準備する

元になる Windows 9x のひな形マシンを準備する. 必要なソフトウェアをインストールして設定を全て行っておく. 必要があればパッチなども当てておき,セキュリティホールなどを塞ぐ. 特に,デスクトップやスタートメニューの内容を調整しておく.

準備が出来た段階で,コントロールパネルのパスワードの「ユーザーごとの設定をする」にチェックを入れる. この際,デスクトップとスタートメニューを含めるようにする.

ユーザープロファイルの設定

ユーザープロファイルの注意点

ユーザープロファイルについては,Windows 95 リソースキットに記述があるが,いくつかの点を理解していないと勘違いを起こしやすいと思われる.

上記のことを理解した上で作業に移る.

ホームディレクトリの準備

以下の手順については,Windows NT Server 4.0 オフィシャルマニュアルが参考になる.

  1. Windows NT Server でホームディレクトリとなるフォルダの設定を行う. 例えば,share という名前のフォルダを作成し,共有名を share$ としておく. このとき,$をつけた隠し共有としておく. 隠し共有にしないとユーザーに勝手に変更されてしまう危険性がある. 権限は Administrator とログオンする DomainUser が変更できるように設定しておく.

    ドメインユーザーマネージャーを用いてホームディレクトリを作成した場合,UNIX などとは異なり,Administrator であってもユーザーのホームディレクトリを変更する権限が与えられない. このため,Administrator がユーザーのホームディレクトリを変更できるようにしておかないと苦労することになる.

  2. Windows NT Server でドメインユーザーマネージャーを使用してユーザーの設定を行う. この際,ホームディレクトリを指定することを忘れないようにする. 複数のユーザーを設定する場合,複数のユーザーを選択しておいて,ホームディレクトリのパスに,¥¥SERVER_NAME¥SHARE_DIRECTORY¥%USERNAME% と指定することで一括処理ができる.

  3. 用意した Windows 9x ひな形マシンを使って,ドメインに登録してあるユーザーでログオンし,ログアウトする.

  4. ログオンしたユーザーのホームディレクトリにユーザーの環境(ユーザープロファイル)が保存されているはずである. ここで,ユーザーのレジストリファイル USER.DAT を USER.MAN に変更すると,固定ユーザープロファイルになり,ユーザーのスタートメニューやデスクトップの変更は反映されなくなる. ただし,通常のファイルなどはローカルマシンに作れてしまう.

  5. 全てのユーザー環境を同じにする場合,作成されたユーザープロファイルを全てのユーザーのホームディレクトリにコピーする.

    この際,xcopy コマンドを使うと簡単である. xcopy /e /h hinagata user_name などとすると,hinagata ディレクトリを user_name にコピーしてくれる.

ログオンスクリプトの設定

ログオンスクリプトを用いると,ログオン時にユーザー環境の調整が出来る. ログオンスクリプトは,%SystemRoot%¥system32¥Repl¥Imports¥Scripts に置く. Windows 9x がクライアントの場合,単なるバッチファイルを用意すればよい.

例えば,以下のようなバッチファイルを作成して,ログオンスクリプトとすることができる. これは,¥¥SERVER¥SHARE を D: ドライブとして貸出し,ログオンしたユーザー student01 のデスクトップとスタートメニューを初期化(削除)する. この他にも,net コマンドを用いるといろいろ出来る.

@ECHO OFF
ECHO ログオンスクリプトの実行中
NET USE D: ¥¥SERVER¥SHARE > NULL
DELTREE /Y "C:¥WINDOWS¥Profiles¥student01¥デスクトップ" > NUL
DELTREE /Y "C:¥WINDOWS¥Profiles¥student01¥スタート メニュー" > NUL
ECHO 終了しました

ドメインユーザーマネージャーを用いて,ユーザーに実行させたいログオンスクリプトを指定する. この際,%SystemRoot%¥system32¥Repl¥Imports¥Scripts¥start.bat という名前だった場合,start.bat とだけ書けばよい.

システムポリシーの設定

システムポリシーエディタを用いることで,ユーザーの権限を制限できる. Windows 9x 用のシステムポリシーエディタはWindowsのCD-ROMからインストールしておく.

新規作成を選び,必要な設定を行う. 設定が終わったら,config.pol という名前で保存する. これを,%SystemRoot%¥system32¥Repl¥Imports¥Scripts¥config.pol として置いておくと,ユーザーがログオンした際にシステムポリシーが適用される.

ユーザーがログオンしない場合(最初のログオンでキャンセルボタンを押した場合)に備えて,クライアントコンピュータの制限を強くしておくというのも一つの方法である. 例えば,デスクトップアイコンの表示をしない,プログラムを使えなくするなどの方法も考えられる.


再インストールの簡素化 (PicoBSD を利用したバックアップとリストア)

FreeBSD をフロッピー1枚で動かす試みとして PicoBSD がある. これを用いれば,フロッピー1枚で起動しバックアップとリストアを行うシステムが簡単に構築できる.

すでに UNIX のコマンドに関しては一通り理解していることを前提にしているので,細かい点の説明は省く. かなりの部分を フロッピーディスク1枚で行うシステムバックアップ を参考としている.

PicoBSD を作る

PicoBSD は,現在の FreeBSD のソースツリーに取り込まれている. また,ソースのほとんどが必要になるため,全てのソースを展開しておく. PC-9801 用の PicoBSD(98) もオフィシャルではないがパッチがあるため,簡単に作成できるようになっている. ここでは,FreeBSD 3.5.1-RELEASE を元に話を進める.

/usr/src/release/picobsd に元になるものが用意されている. ここでは,netcustom にコピー (cp -pR net custom) して使うことにする.

一度うまく動くか試すために,/usr/src/release/picobsd/build に移動し,./build custom として実行してみる. ダイアログボックスが出てくるので質問に答える.

うまく動くことが確認できたら,実際に必要な環境に応じて変更を加える. /usr/src/release/picobsd/custom 内の修正するファイルを挙げておく.

PICOBSD

kernel 構築用のファイルなので,使いたいデバイスなどに漏れが無いように設定する.

コメント内の以下の部分が様々な値を決めているので注意すること.

#PicoBSD        4096    init    4096            32768
crunch1/crunch.conf

組み込むコマンドを指定するファイル. 必要に応じて,ライブラリの指定も行う. また,SSH のような標準でないコマンドの場合は注意が必要である.

Makefile.mfs

デバイスファイルの作成や必要なファイルのコピーなどに用いる.

floppy.tree/etc のファイル

起動時に実行される rc などのファイルを設定する. 詳しく知りたい場合は,/usr/src/release/picobsd/mfs_tree/etc/rc も参照のこと.

以下に例を示す. ここでは,ネットワークカードとして DEC と Intel のもの,DHCP, SSH, fetch などを組み込んだ. また,日本語に対応させるための MSDOS_LC_JAPAN も指定してある.

PICOBSD
#Line starting with #PicoBSD contains PicoBSD build parameters
#marker         def_sz  init    MFS_inodes      floppy_inodes
#PicoBSD        4096    init    4096            32768
machine		"i386"
cpu		"I586_CPU"
cpu		"I686_CPU"
ident		PICOBSD
maxusers	10
options		INET			#InterNETworking
options		FFS			#Berkeley Fast Filesystem
options		FFS_ROOT		#FFS usable as root device [keep this!]
options		MFS			#Memory Filesystem
options		MFS_ROOT		#MFS as root
options		MSDOSFS			#MSDOS Filesystem
options		MSDOSFS_LC_JAPAN	#MSDOS Filesystem
options		"CD9660"		#ISO 9660 Filesystem
options		"COMPAT_43"		#Compatible with BSD 4.3 [KEEP THIS!]
options		USERCONFIG		#boot -c editor
options		VISUAL_USERCONFIG	#visual boot -c editor
options		PCI_QUIET
options		NO_LKM
config		kernel	root on fd0a
controller	isa0
controller	pci0
controller	fdc0	at isa? port "IO_FD1" bio irq 6 drq 2
disk		fd0	at fdc0 drive 0
options		"CMD640"	# work around CMD640 chip deficiency
controller	wdc0	at isa? port "IO_WD1" bio irq 14
disk		wd0	at wdc0 drive 0
disk		wd1	at wdc0 drive 1
controller	wdc1	at isa? port "IO_WD2" bio irq 15
disk		wd2	at wdc1 drive 0
disk		wd3	at wdc1 drive 1
options		ATAPI		#Enable ATAPI support for IDE bus
options		ATAPI_STATIC	#Don't do it as an LKM
device		acd0	#IDE CD-ROM
controller	atkbdc0	at isa? port IO_KBD tty
device		atkbd0	at isa? tty irq 1
device		vga0	at isa? port ? conflicts
device		sc0	at isa? tty
device		npx0	at isa? port IO_NPX irq 13
device de0              # DEC/Intel DC21x4x (``Tulip'')
device fxp0             # Intel EtherExpress PRO/100B (82557, 82558)
device vr0
device rl0
pseudo-device	loop
pseudo-device	ether
pseudo-device	pty	16
pseudo-device	bpf	4

crunch1/crunch.conf

srcdirs /usr/src/bin
srcdirs /usr/src/sbin/i386
srcdirs /usr/src/sbin
srcdirs /usr/src/usr.bin
srcdirs /usr/src/gnu/usr.bin
srcdirs /usr/src/usr.sbin
srcdirs /usr/src/libexec
srcdirs ../../tinyware
srcdirs /usr/ports/security/ssh/work
progs sh test echo hostname ln login getty stty
progs w msg kget reboot
progs init ifconfig df sps ns vm cat
progs cp rm mknod chmod chown mkdir ls
progs sysctl pwd_mkdb dev_mkdb
progs mount mount_msdos umount
progs dd disklabel fdisk newfs newfs_msdos
progs kill mount_std
progs pwd more
progs passwd date dhclient route
progs mount_cd9660 ping traceroute
progs ssh tar grep sed find fetch
progs minigzip
ln minigzip gzip
ln test [
ln sh -sh
ln sps ps
ln msg dmesg
ln ns netstat
ln chown chgrp
libs -lncurses -lmytinfo -lipx -lz -lpcap -lalias -lwrap
libs -ledit -lutil -lmd -lcrypt -lmp -lgmp -lm -lkvm
libs -lgnuregex -lftpio

Makefile.mfs

MY_DEVS= std tun2 cuaa0 cuaa1 cuaa2 vty10 fd0 wd0 pty0 bpf0 bpf1 bpf2 bpf3

.include "../build/Makefile.mfs"

all: copy

copy:
        cp /sbin/dhclient-script ${DESTDIR}/stand/

SSH 組み込みの注意点

ports を利用する方法が簡単なので紹介しておく.

  1. /usr/ports/security/ssh に移動し,make を実行する.

  2. /usr/ports/security/ssh/work に移動し,ln -s ssh-1.2.27 ssh を実行する.

  3. /usr/ports/security/ssh/work/ssh に移動し,Makefile を修正する. OBJS = $(SSH_OBJS)SSH_OBJS の後ろの行に加えておく.

  4. 念のため,/usr/ports/security/ssh/work/ssh/gmp-2.0.2-ssh-2 に移動し,configuremake を実行する. 同様に,/usr/ports/security/ssh/work/ssh/zlib-1.0.4 でも,make をしておく.

  5. crunch1/crunch.confprogs ssh を加えて,./build customをする.

日本語の扱い

Windows では日本語のファイル名が使われているため,MSDOSFS にパッチ(MSDOSFS japanese patch for FreeBSD)をあてることが必要である.

バックアップ

ひな形マシンを PicoBSD のフロッピーで起動し,以下のようにしてバックアップを取った.

mount_msdos -L ja_JP.EUC -l /dev/wd0s1 /mnt
cd /mnt
tar -zcvf - -T /tmp/list | ssh -l user_name host_name "cat > backup_file"

ここで,/tmp/list にバックアップするファイル名を列挙(WIN386.SWP などをバックアップするのは無駄)しておいた.

/tmp/listの中身

IO.SYS
MSDOS.SYS
WINDOWS
Program Files
…

また,バックアップする際に SSH を用いている.

おおよそ,20分程度でバックアップは終了したが,これは環境によるので一概には言えない.

レストアの準備

レジストリの書き換え

レストアの際,マシンごとの固有の設定をどのようにするかが問題となる. 基本的には,レジストリに格納されているので,必要な部分をマシン名などで検索し,レジストリエディタ (regedit.exe) で書き出しておく.

以下に示すのは,レジストリエディタから書き出したものの例. この中で,@HOGEHOGE@ の部分をマシン固有の情報で置き換えればよい.


REGEDIT4

[HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥Services¥MSNP32¥NetworkProvider]
"AuthenticatingAgent"="@DOMAIN@"

[HKEY_LOCAL_MACHINE¥Network¥Logon]
"username"="@NAME@"

[HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥control¥ComputerName¥ComputerName]
"ComputerName"="@NAME@"

[HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥control¥Print¥Printers¥Canon LASER
SHOT LBP-430]
"Port"="@PRINTER@"

[HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥Services¥VxD¥VNETSUP]
"ComputerName"="@NAME@"
"Workgroup"="@DOMAIN@"

次に,以下のようなファイルを用意しておく.


192.168.1.1 pc01 ¥¥SERVER¥PRINTER01
192.168.1.2 pc02 ¥¥SERVER¥PRINTER01
192.168.1.3 pc03 ¥¥SERVER¥PRINTER02
192.168.1.4 pc04 ¥¥SERVER¥PRINTER02
192.168.1.5 pc05 ¥¥SERVER¥PRINTER03
…

このファイルをもとに,レストアの際に書き換える方法を採用した. このためのシェルスクリプトを作成しておくと便利. grepsed などを利用すれば簡単だろう. 環境により異なるので手順の説明だけをする.

  1. DHCP で動いているため,/var/db/dhclient.leases に情報がある. この中から IP アドレスを抜き出す.

    dhclient のオプション -D を用いるともっと簡単な気がする.

  2. 設定を書いておいたファイルを読み込み,IP アドレスが一致する行を抽出する.

  3. 書かれている情報に従ってレジストリの変更を行ったものをファイルとして書き出す.

ここでは,C:¥WINDOWS¥REGIST.REG という名前で保存したことにする.

場合によるが,C:¥WINDOWS¥WIN.INI の内容も書き換えが必要である. これも同様の方法で出来るだろう.

手間を減らすためにはネットワーク共有をするものは全てログオンスクリプトで処理する方がよいだろう. ログオンスクリプトを用いると変更があった場合でもサーバーに置いてあるスクリプトを変更するだけで済む.

レジストリ変更のタイミング

実際のレジストリ変更のタイミングは,regedit.exe にバグがある Windows 95 とバグが修正されていると思われる Windows 95 OSR2 以降では異なるため注意が必要である.

Windows 95 のレジストリの反映方法

本来ならば,DOSコマンドとして,REGEDIT REGIST.REG などとすれば読み込んでくれるはずであるが,Windows 95 の初期バージョンにはバグがあるらしく上手くいかない.

そこで,GUIモードで処理を行う. 手作業で読み込ませてもよい(作成したレジストリファイルをダブルクリックして再起動)が面倒なので,バックアップを取る前に以下のような細工をしておくと便利かも.

  1. システムポリシーエディタでレジストリを開く.

  2. 「ローカルコンピュータ」をダブルクリックし,「システム」の中の「一度だけ実行」にチェックを入れ「表示」ボタンをクリックする.

  3. 出てきたダイアロブボックスの「追加」をクリックする.

  4. 追加するアイテムに regist などの適当な名前を付ける. 追加するアイテムの値には,C:¥WINDOWS¥REGEDIT.EXE C:¥WINDOWS¥REGIST.REG のように読み込むファイル名とともに記述する.

これで起動時に自動的にレジストリの内容が読み込まれ,再起動すれば変更が反映される.

Windows 95 OSR2 以降のレジストリの反映方法

こちらは簡単である.

AUTOEXEC.BAT に以下のように書き加えた後でバックアップする.


IF NOT EXIST C:¥WINDOWS¥REGIST.REG GOTO NEXT
C:¥WINDOWS¥REGEDIT.EXE C:¥WINDOWS¥REGIST.REG
DEL C:¥WINDOWS¥REGIST.REG
:NEXT

これで,Windows が起動する前にレジストリの内容を反映させられるので,再起動の必要はなくなる.

レストア

PicoBSD のフロッピーで起動し,以下のように実行した. URL は FTP サーバーに置いたバックアップファイルのものである.

mount_msdos -L ja_JP.EUC -l /dev/wd0s1 /mnt
fetch -q -o - URL | tar -zxvf - -C /mnt

当然,一斉に行えばネットワークのスピードが落ちるので,適当な台数で行った方がよい.

ファイルの展開が終わったら,前記のレジストリ更新用ファイル(C:¥WINDOWS¥REGIST.REG)の作成を行う.

再起動

再起動を行い,Windows を起動し,設定が上手くいったかを確かめる.

どの程度手間が減るか?

50台程度の再インストールでは,ファイルの転送時間が一番かかるが,それでも1台が20分程度(約300MB程度のファイル転送)で終わるため,同時に5台ずつ実行して約3時間といったところである. 以前,4人で作業して丸一日かかっていたことを思えば相当の時間節約である.


参考文献


[戻る]