久々にパソコンを組んでみた(そしてドはまりしまくった・・・)
”お一人様用”ファイル共有サーバ兼ダイナミックDNSの更新用兼受信専用メールサーバ兼・・・とにかくその他諸々あって24時間365日電源を入れっぱなしにしていた我が家のデスクトップPC(自作)が、昨年暮れに急にダウンしてしまった。まぁ、ブラック企業もホワイトに見えるぐらいの「24時間働けますか?」を数年強いた結果なので、よく頑張ったと言えば頑張ったのだが、かなり焦った。当時は転職活動真っ最中だったのだが、履歴書や職務経歴書のデータがこのPCに保管してあり、バックアップ先のNASも不調でバックアップが取れていなくて(←ヲイ)冗談抜きで「ヤバい」を数百回唱えるほど焦った。とりあえず、しつこく電源を入れたら何とかPCが起動してきたので、速攻で転職関連データのバックアップを取ったことは言うまでもない。
閑話休題。
前振りがながくなったが、そんなこんなでPCの取り替えが必要となったのだが、何かと忙しくて入れ替えに取りかかるまでに実に4ヶ月近くかかってしまったが、念願叶って転職先も決まり、有休消化に入ったタイミングでの作業となったと。
閑話休題(と書いて「それはさておき」と読むらしい)
このPCは連続稼働こそさせているものの、用途的にはそんなにハイスペックである必要もないので、予算控えめでそこそこのスペックのパーツを調達。
構成はこんな感じ。
- マザーボード ... ASUS PRIME Z390-P
- CPU ... Intel Core i3 9100
- メモリ ... CFD W4U3200CM-8G(8GB×2枚組)
- HDD ... 東芝 DT01ACA100(1TB)+SEAGATE ST6000DM003(6TB)
- 光学ドライブ ... ASUS DRW-24D5MT(DVDマルチドライブ)
- 電源ユニット ... 玄人工房 KRPW-L5-400W/80+
あと、ねじとか細々した部品を加えて6万円ちょっと。ケースは今のPCのを流用。ちなみにケースは前面パネルに今は無き「フロッピーディスク」用の穴が空いている、相当年季の入った代物(記憶が正しければ、20年前後は使い続けているはず)だが、今時のマザーボードでも問題なく取り付けられる。パソコン関連の規格は数年で変わることも少なくない(しかも互換性がない場合も結構ある)のだが、ことマザーボードの規格(フォームファクタ)に関しては20年以上前から変わっていないのが凄いというかありがたい。話が逸れたが今回はメモリとHDD(データ保管用)の容量重視の構成なので、ケース以外はほぼ「全とっかえ」だと思えば値段的にはまあこんなものかと。入れ替え前のPCは、メモリ5GBでWin10+VMWare上でWin2008Serverを稼働させ、データ用のHDDも500GBだったので、これでもスペック的には十分と言える。
で、組み立て。
パソコンの組み立て自体は慣れているし、構成がシンプルなこともあって至って順調に進み、鼻歌交じりで1時間ちょっとで終了。だが、ここからがドはまりの始まりになろうとは、その時は想像だにしていなかった。ということで、ここからは今回はまった内容のオンパレードで。
【トラブルその1:電源入れても何も表示されないんですけど・・・】
いや、そのまんまです。電源を入れても画面上には何も表示されず、虚しくファンが回り続けるだけ。一応、マザーボードはピカピカ光っているのだが(何で最近のマザーボードはどうでもいいところがあんなに光るのかね?)。
マザーボードをよく見ると、メモリの近くにある「Mem_LED」というLEDが点灯したままになっていた。マニュアルによると、このマザーボードでは適合性が低いメモリを装着するとメモリを適合させる調整を行ってくれる機能があり、調整中はこのLEDが点灯するとのことなのだが、一晩放置してもLEDが消える気配がない。で、メモリを装着するスロットを変えてみたりしても症状は変わらない。メモリを取り外して電源を入れると、明らかにエラーと分かるビープ音が出たのでマザーボード自体は正常に機能しているみたい・・・となると問題はメモリか?と思いながらも代わりのメモリが手元にないので、パーツを買ったショップに持ち込んで見てもらうことに。
ショップでメモリを借りて装着してみたところ、正常にシステムが起動した。で、手持ちのメモリをショップのパソコンに装着してみたら、こちらも正常にメモリが認識された。ということは・・・自作パソコンの鬼門とも言える「相性」ということになる。
「あー、こりゃメモリ買い換えかな、結構出費が痛いな、こんなことならショップの交換保証を付けとけばよかったな」などと考えていたのだが、ふと思いついたことがあったので店員さんに聞いてみた「これってBIOSをバージョンアップしたら解消したりしないですかね?」と。というのも、パーツを買った時に対応してくれた店員さんが「多分大丈夫だとは思いますけど、何か問題があったらBIOSを上げて下さいね」と言っていたのが気になっていたからで、元々OSのセットアップ前にBIOSのバージョンアップをするつもりでダウンロードしたBIOSを入れたUSBメモリは手元に持っていた。そこで再びショップのメモリとモニタ、キーボードを借りてBIOSをバージョンアップしたところ・・・事象が解消した!
今回はたまたま近場のショップでパーツを買ったので持ち込みで問題を解決できたが、通販で買ってたらアウトだったな・・・と思いつつ、ともあれ余計な出費が抑えられてよかった。
【トラブルその2:あれ、OSのビルドが古い・・・?】
そんなこんなで無事システムも起動したので、前もって準備しておいたWin10のインストールメディアからOSをインストール。インストール自体はスムーズに進んだのだが・・・インストール後の画面が何かおかしい。サインイン画面を見た時に違和感があったのだが、スタートメニューを見て確信に変わった。あれ?何かバージョンが古い?
で、「winver」でバージョンを見ると、何と「1511」と表示されている。作成したメディアは「1909」のはずなのに・・・何で???
【トラブルその3:怪奇?固定IPにするとインターネットに接続できなくなる】
OSセットアップ直後は無線LANルータから拾ったIPアドレスになっていて普通にインターネットに接続できていたのだが、IPアドレスを固定(前のPCで使っていたアドレス)に変更した途端にインターネットに接続できなくなってしまった。しかも、同一ネット内の他の機器への通信はできるのに、デフォルトゲートウェイであるFortiGateにだけ通信できない。その時点でARP関連のトラブルかな?とは思っていたが、前のPCが起動しなくなってから相当な時間が経過しているし、ARPキャッシュが残っているはずはないだろうと思って別のPCからFortiGateのARPテーブルを覗いてみると・・・明らかに今のPCのMACアドレスと違うMACアドレスがARPテーブルに登録されていた。FortiGateのARPキャッシュから該当のエントリを削除することで正常に通信ができるようになった。
と、ここで話が終わればめでたしめでたしなのだが、ARPに関しては実はここにもう一つの落とし穴があったことに気づくのはもう少し先のことだった・・・
【トラブルその4:デジタルライセンス、認証できません!(想定はしていたけど)】
もともと前のPCは、Windows7から無償アップグレードでWindows10にアップグレードしたものなのだが、無償アップグレードしたPCのマザーボードを交換した場合のライセンス認証については、ネットで調べても諸説ある。曰く、
- 事前にMicrosoftアカウントにライセンスを紐付けておけば、新しいPCでもライセンスは引き継がれる
- 認証に失敗しても、最悪MSのサポートに電話すれば認証してもらえる
- バージョンアップ前のOSのプロダクトキーがあれば認証は通る
あたりだろうか。
いつかマザーボードを交換することは想像していたので、一応前のPCでMicrosoftアカウントに紐付いたデジタルライセンスを登録しておいたのだが、残念ながら新しいPCでMicrosoftアカウントにサインインして登録されたPCを指定しても認証はできなかった。前にMSに電話で事情(Win7からアップグレードしたPCだが、故障したのでマザーボードを入れ替える必要がある。MSアカウントにはライセンスが紐付いている。Win7のプロダクトキーはもう手元にないかもしれない)を話して確認したら「ライセンス認証できます」って回答だったのに・・・。で、MSのサポートに電話してみると、営業時間外とのこと。17時ちょっと前ぐらいだったと思うが、コロナの影響で営業時間を短縮しているのだろうか・・・
まあライセンス認証は翌日対応でもいいか、とは思ったのだが、幸い、以前使っていたWindows7のパッケージが見つかったのでプロダクトキーを入れてみると、すんなりと認証が通った。なので「MSサポートに電話をすれば認証してもらえる」かどうかは分からずじまいだが、少なくともバージョンアップ前のOSのプロダクトキーを入力すれば認証が通ることは分かった。
【トラブルその4:え?Wake On LANってデフォルトで有効じゃないの?】
これは単純に自分のミス(というか確認不足)なのだが、このマザーボードではデフォルトではWake On LAN(WOL)が「無効」になっていた。セットアップの際にOSをシャットダウンした後もLANポートのLEDがパカパカ点滅していたので、てっきりWOLは有効だと思っていたのだが。
【トラブルその5:LANではできるのにVPNだとできないWOL】
BIOSの設定を変更してWOLができるようになったので、早速テストしてみた。すると、Wi-Fiで接続した状態のスマホからはWOLができるのに、同じスマホでVPN経由でWOLを行おうとするとウンともスンとも言わない。ちなみに同じスマホから、自宅にある別のPCに対してはVPN経由でWOLができるし、LTE+VPNで接続したPCからもやはりWOLができないので、問題はVPN経由でのみWOLができないということになる。
あれ?そういえばVPN経由のWOLって、どうやって目的のホストを見つけるんだっけ、と考えてようやくARPに思い至り、FortiGateのARPキャッシュを見ると、このPCのエントリが登録されていなかった。で、静的にARPを登録しようとFortiGateの静的ARPテーブルを確認すると・・・前のPCのエントリがしっかりと登録されていたorz...。そりゃVPN経由でいくら頑張っても前のPCを探しに行くからWOLはできないわな。と言う訳で静的ARPテーブルを書き換えて無事解決。
実はVPN経由でのWOLについては、以前に自ら「Fortigateを設定してみた(その4・VPNでWOL!)」という記事でしっかりとやり方を書いていたのだが、完全に頭から抜けていたりする。てへぺろ!
今回はパーツの相性問題(になるのかな?)とか、マザーボードを交換した時のWindowsのライセンス認証とか、初めて経験することがいくつかあったので、今まで数多くこなしてきたパソコンの組み立てに比べると結構苦労した。その甲斐あって、ようやく完成した新PCは今のところ快調に動作している。まあ「終わり良ければすべて良し」ということで。
おしまい。
VMWareでWindows95を作ってみた・後編
これは懐古厨がVMWare Player上でWindows95をインストールする物語である。
ちなみに蚕(かいこ)は成長すると「カイコガ」という「蛾」になる。で、サナギの時に繭をアレしてコレすると絹糸を作ることができるのだそうな。別に知らなくても生活には困らない雑学的なアレ。
閑話休題・・・・
さて、前回でVMWare Player上でWindows95が動く環境を構築できた。まあ、今更Windows95を実用で使うことも少ないだろうから、「OSコレクション」的な意味合いでは前回の状態でも十分なのだが、今回はもう少しだけ手を加えてみることにする。
1.VMWare Toolsのインストール
VMWareがサポートするゲストOSには、それぞれそのOS用の「VMWare Tools」と呼ばれるソフトウェアが用意されている。これをインストールすることにより、ホストOSとゲストOSの親和性が高まったり、ゲストOSのパフォーマンスが向上したりという効能が得られる。Linux OSの場合は若干の手順が必要になるが、Windows OSの場合はウィザードに従って(と言っても普通はデフォルトのまま進めていくだけ)お手軽にインストールができる。
と言うことで、VMWare Toolsのインストールを行う。
VMWare Playerの「Player」メニューをクリック(この時、マウスカーソルがゲストOS=今回の場合はWindows95=にある場合は、「Ctrl」+「Alt」キーを押すとマウスカーソルがホストOS=Windows95の「外」=へ出られる)し、「管理」-「VMWare Toolsのインストール」をクリックする。
しばらくすると、自動起動でVMWare Toolsのインストールウィザードが起動してくる。OSによっては自動起動の選択メニューが表示されることもあるが、この場合は「Setup.exeの実行」を選択すればよい。なお、自動起動しない場合は、「マイ コンピュータ」からVMWare Playerのインストールメディアがマウントされたドライブ(通常は下図のようにDドライブ)をダブルクリックしてやればインストールウィザードが実行される。
あとは「次へ」でウィザードを進めていけばよい。特に必要がなければ、「標準セットアップ」で問題ない。
Windows95の場合、下図のように「最新のヘルプエンジンがインストールされていない」と表示されることがあるが、その場合は「はい」を選択すればよい。もっとも、VMWare Toolsでヘルプを表示する必要があるかは定かではないが・・・
Windows95の場合は、インストール終了時に注意!
他のWindowsOSでは、VMWare Toolsのインストールが完了したら、「再起動しますか?」の質問に「はい」と答えてゲストOSの再起動を行うのだが、Windows95の場合はここでビデオドライバのインストールを行う。なので、VMWare Toolsのインストール終了直後に「再起動しますか?」と聞かれても、ここで「はい」を選択しないこと。
「完了」ボタンを押すと「再起動しますか?」と聞いてくるが、ここで「はい」を押さないこと。
画面が狭いので分かりづらいが、「再起動しますか?」のポップアップに隠れるように「install.txt」というテキスト文書がメモ帳で表示されている。再起動する前にこの手順に従ってビデオドライバをインストールする。余談だが、ビデオドライバのインストール自体は手順さえ知っていれば再起動後でも問題なく行えるが、手間を考えるとここで素直にインストールを行っておいた方がいい。
2.ビデオドライバのインストール
と言う訳で、「install.txt」に従ってビデオドライバをインストールしていく。
「install.txt」は何故か部分的に英文で書かれているが、手順としては次の通りとなる。
まず、デスクトップ上の何もないところを右クリックしてメニューを出し、「プロパティ」をクリックする。
下図のような「画面のプロパティ」が表示されるので、この中の「ディスプレイの詳細」タブをクリックすると下図の状態になっていると思う。「デスクトップ領域(解像度)」は「640×480(ドット)」で「カラーパレット」は「16色」。これは俗に「VGA」と呼ばれる状態であることを意味する。思いっきり余談になるが、VGAはどんなPCでも標準で備えているので、グラフィックドライバ絡みのトラブルで画面が表示されなくなったりOSが起動しなくなった場合でもVGAモードであればOSを起動できることが多い(ので、トラブルシューティングに利用されることが多い)。
話を本筋に戻すが、この状態では解像度が低く、表示できる色数も非常に少ないので、VMWare用のディスプレイドライバをインストールする。
下図の画面の「詳細プロパティ」ボタンをクリックする。
「ディスプレイの詳細プロパティ」が表示される。「アダプタ」タブの表示を見ると「スタンダード PCI グラフィックス アダプタ (VGA)」と表示されている。つまり、今のディスプレイアダプタは標準のVGA用のアダプタということだ。ちなみに「スタンダード」と表示されているように、このドライバはOSが標準で持っているドライバで、PCにどんな高性能なディスプレイカードが搭載されていても、それ用のデバイスドライバをインストールするまではこのモードで動作する。
ここで、右側の「変更」ボタンを押してドライバを変更する。
今回はVMWare Toolsが用意したドライバをインストールする。「install.txt」に書かれていたように、「デバイスの選択」画面の右下にある「ディスク使用」ボタンをクリックする。
「ファイルを開く」ダイアログが表示されるので、ここから「install.txe」に記載されているように「C:\Program Files\VMWare\VMWare Tools\Drivers\video」のフォルダを辿っていく(下図のように)。が、当時のOSを知らない人はここで迷うかもしれない。
ここで余談だが、今時のWindows OSでは当たり前のように長いファイル/フォルダ名(ロングファイルネーム=LFN)が使えるが、WindowsでLFNをサポートするようになったのはWindows95からだ。ではその前はどうなっていたかというと、
ファイル名(最大8文字)+「.(ドット)」+「拡張子(最大3文字)」でファイルやフォルダ(当時は「ディレクトリ」と呼ばれていた)名を付けることしか出来なかった。いわゆる「8.3形式」とか、LFNの対義語的に「ショートファイルネーム=SFN)と呼ばれていた形式で、SFNでは文字数の制約の他に、途中で空白を入れられない等、LFNに比べると随分と制約があった。それはさておき、Windows95でLFNが使えるようになったからといって、SFN形式を廃止してしまうと過去のファイルシステムとの互換性が損なわれるため、Windows95以降のOSでは一つのファイル(またはフォルダ)に対してLFNとSFNの2つの形式の名前を持つことになった(正確に表現するなら、Windows95のLFNは従来のファイルシステムを拡張してLFNに対応させたものである)。
実例を挙げると、LFNの「Program Files」はSFNでは「PROGRA~1」と表現される。たとえば同じドライブに「Program Files」と「Program Files(x86)」が存在する場合は、それぞれのSFNは「PROGRA~1」と「PROGRA~2」のようになる。ちなみに最新のWindowsであるWindows10でも、ファイルやフォルダにはSFNも持っている。例えばコマンドプロンプトで「dir /x」と入力してみると、LFNとSFNが並んで表示される(元々8.3形式で収まる名前のファイルやフォルダについてはSFNは表示されない)。余談ついでだが、Windows10で例えばエクスプローラのアドレスバーに「C:\Progra~1」と入力すると、ちゃんと「C:\Program Files」が表示される。
話がファイル名を巡る歴史に傾いたが、Windows95では表示部分がまだ完全にLFNに対応しきれていない部分があり、それがもとで下図のような状態となっている。ともあれ、SFNがどのようなものか理解できれば、フォルダを辿っていくのは難しくない。
目的のフォルダにたどり着くと、「vmx_svga.inf」というファイルがあるので、これを選択して「OK」ボタンを押す。後は元来た道を「OK」ボタンを押しながら戻っていき、最終的に「画面のプロパティ」を「OK」ボタンで閉じた後にOSを再起動する。
OSの再起動が完了し、再度ログオンすると、画面の解像度や色数を変更することができるようになる。
3.サウンドドライバのインストール
画面が綺麗で広くなったので、ついでに音も鳴らせるようにしてみよう。と言うことで、サウンドドライバをインストールする。
VMWare Player上にインストールしたWindows95が使用するサウンドドライバは、「SoundBlaster」のドライバなのだが、これはWindows95にもVMWare Toolsにも入っていないので、外部から持ってくる必要がある。前編で紹介した方法(作業用ディスク経由でファイルをコピー)などでWindows95にファイルをコピーする。コピーするファイルは「ES1373」でググるとダウンロード先が見つかると思うので、入手方法の詳細は割愛する。ここで一つだけ注意点を挙げると、ダウンロードした「ES1373.exe」は圧縮ファイルなので、実行するといくつかのファイルが展開される。なのでデスクトップ辺りに適当なフォルダを作成してそこに「ES1373.exe」を置き、ここでファイルを実行するとよい。デスクトップ上で「ES1373.exe」を実行すると、デスクトップがファイルだらけになるので・・・
「ES1373.exe」を実行すると、コマンドプロンプトのような画面(MS-DOSウインドウ)が表示されて何やら英文が表示されるが、これは「ファイルを展開してもいいか?」という質問なので「Y」キーを押して先へすすむ。終わった後にMS-DOSウインドウが表示されたまま残るが、これは「×」ボタンで閉じてよい。
ファイルを展開すると、4つほどファイルが増える。その中にある「Sw.exe」をダブルクリックして実行する。「Sw.exe」も圧縮ファイルで、「ES1373.exe」と同様に展開してもよいか聞いてくるので「Y」で展開する。
下図のようにフォルダの中が大分賑やかになったと思う。この中に「Setup.exe」があるので、これを実行してサウンドドライバをインストールする。
インストールはデフォルト状態で次へと進んでいけば完了する。
インストールが完了すると、OSの再起動を確認されるので、OSを再起動する。
OSを再起動すると、必要なドライバがインストールされていく。
続けて、自動的にインストーラーが実行される。どうやらこちらがサウンドドライバーの本体のようだが、これも指示通りにインストールする。
インストールが終わったら、OSを再起動する。
ドライバのインストールが完了した後でWindows95を起動してログオンすると、スタートアップのサウンドが再生されるはずだ。
今回取り上げた3つの手順は、いずれもやってもやらなくてもOSの動作自体に問題はないし、もっとも、冒頭あたりで触れたように、今時Windows95が必要とされることも(全くとは言わないが)ないだろうから、今回の一連の記事はどちらかというと「趣味」寄りな話になる。が、昔のOSもそれはそれで「味わい」があるので、興味があればお試しあれ。
おわり。
VMWareでWindows95を作ってみた・中編
【前回のあらすじ】
オラ、なんだかムラムラしてきたぞ!!!!
「ドラゴンボール」の孫悟空が子作り前にそんなことを叫んだかは定かではないが、それはこの際どうでもいい。このお話は悟空の子作りとはまったく関係のない、VMWare Player上でWindows95の仮想マシンを作る話なのだから。で、前回はWindows95のインストール実行までたどり着いたので、その続きから。
のっけから何やら英語のメッセージが表示されるが、ここでは「セットアップ前にパフォーマンスチェックなどを行いますよ」と言っているので、必要がなければESCキーを押してスキップすればいい。まあ、そんなに時間はかからないものの、わざわざチェックする必要もないと思うが。
次に進んでいくと、キーボードレイアウトを選択するよう求められる。日本語キーボードを使っている場合は、キーボード上の「半角/全角|漢字」キーを押して「Half/Full(Kanji)」を選択する。
で、ここからはGUI画面に切り替わる。詳細な手順は割愛するが、ただOSを入れるだけであれば基本的にそのまま次へ次へと進めていけばいい。ちなみに「セットアップには、約30分から1時間かかります。」と表示されているが、これは当時のPCのスペックでの話。当時はPCの基本性能もさることながらCD-ROMの読み込み速度もそんなに速くなかったり、場合によってはフロッピーディスク数十枚(Windows95には「フロッピーディスク版」というのが存在した)を差し替えながらインストールした(しかもフロッピーディスクの読み込み速度は当時のCD-ROMよりも更に遅い)のでその程度の時間はかかったが、今時のPCでなら数分程度で終わる。こんなところにも、20年の歳月の長さを感じたりする。
セットアップの途中で、「起動ディスク」を作成するか聞いてくるが、今回は「いいえ」を選択する。ちなみに「はい」を選択すると、フロッピーディスクに起動ディスクと呼ばれるDOSもどきのOSが起動するディスクを作成する。
そんなこんなでセットアップの中盤まで終了。
セットアップは「まだ終わりじゃないぞ、もうちょっとだけ続くんじゃ」の状態で、一度マシンを再起動する。
OSが再起動すると、このような表示が出てOSがハングアップする。
ちなみに下図では文字化けをしているが、環境によっては
「デバイス IOS を初期化中 :
Windows 保護エラーです。コンピュータを再起動してください。」
とか
「デバイス IOS の初期化に失敗しました。Windows 保護エラーです。コンピュータを再起動してください。 」
というメッセージが日本語で表示される。下図はどうやら前者のメッセージらしい。
メッセージが日本語か英語で表示されていればいいのだが、上図のように文字化けすると何が何やら分からない。とりあえず「VMWare Windows95 IOS」あたりでググってみる。
原因としては、Windows95では2.1GHzを超える高速なCPU上でOSが起動出来ないというバグが存在しているため。ああ、そういえばそんなトラブルがあったっけ。Windows3.1やWindows98等、他のWindowsでは問題なく動作するのに、何でWindows95だけなんだろう?
考えても仕方がないので、対処する。
対処法としては、「高速CPUパッチ」などと呼ばれるドライバを適用することで、やり方は「Windows95 高速CPU」あたりでググればでてくる。
今回は、バッファローが提供している「WAITFIX.VXD」というドライバをダウンロードして使うことにした。
方法は、ダウンロードした「WAITFIX.VXD」を、Windows95のインストールされたドライブの「C:\Windows\System」フォルダにコピーし、「C:\WIndows」フォルダにある「System.ini」というファイルを編集する。
まずはダウンロードした「WAITFIX.VXD」ファイルをコピーする必要がある。これは前回の記事でやった
・「WAITFIX.VXD」を「作業用ディスク」に「作業用仮想OS」経由でファイルを格納した後
・作業用ディスクをWindows95の仮想マシンに追加して
・Windows95の仮想マシンをDOSのISOイメージから起動し
・COPYコマンドでコピーする
という方法でコピーできる。今回は話の流れの都合上、このタイミングで作業用PCに「WAITFIX.VXD」ファイルを格納しているが、勿論Windows95のインストール前にこのファイルを作業用ディスクに格納しておいても問題はない(というかその方が面倒が少ない)。
コピーが終わったら、仮想マシンを普通に再起動する。
この段階では、まだ対処が完了していないので再び先程のエラーメッセージが表示されるので、ここでもう一回仮想マシンを「リセット」で再起動する。
すると今度は下図のようなメニューが表示されるので、ここで「5. Command prompt only」を選択してENTERキーを押す。
すると、Windowsの「コマンドプロンプト」のような(というかそのまんまだが)画面に切り替わる。
次に、「C:\Windows」フォルダにある「System.ini」というテキストファイルを編集するのだが、コマンドプロンプトには「メモ帳」のようなグラフィカルなテキストエディタがない。
そこで、「edit c:\windows\system.ini」と入力してENTERキーを押す。
下図が「EDIT」というテキストエディタの画面になる。
操作はすべてキーボードで行う。
「↓」キーを押して「[386Enh]」というセクションまでたどり着いたら、そのセクションの一番下に
device=waitfix.vxd
と入力する(下図のように)。なお、今回使用したパッチが「WAITFIX.VXD」なので今回はこのような記述をしているが、前述のようにいわゆる「高速化パッチ」は他にも存在するので、この辺りは適宜読み替えてもらいたい。
その後、「Alt」キー→「F」キー→「X」キーの順番でキーを押すと、「ファイルの保存」メッセージが表示されるので「Y」キーを押して保存して終了する。まあ、この辺りの操作はメモ帳をキーボードで操作する時と同じなのだが。
この後、仮想マシンをリセットすると、Windows95のセットアップの続きが実行されるはずだ。
で、最終的に下図の画面まで到達したら、再起動してOSのセットアップが完了となる。
再起動すると、Windows95のロゴ画面が表示され、その後下図のようなログイン画面が表示される。
もっとも、ネットワークで共有ファイルを参照する等の使い方をしない限り、この画面はほとんど「認証」の用を為さないのだが・・・。知らない人もいるかもしれないので補足しておくと、ここで「キャンセル」を押しても普通にデスクトップが表示される。一応、ここで入力したユーザ名毎に「プロファイル」は作成されるのだが、今時のWindowsOSのように「他人のプロファイルにはアクセスできない」訳でもなく、ぶっちゃけ「なんちゃってセキュリティ」だったりする。
それはさておき、これでようやくWindows95が使えるようになった訳だが、もう少しマシな物に仕上げるため、あと一手間二手間ほど掛けてみる。が、それは次回に。
つづく。
VMWareでWindows95を作ってみた・前編
いつもの如く前置きはそのぐらいにして、ここからが本題。なお、この記事で使用しているVMWare Playerはバージョン7.xで、現在ダウンロードできる「VMWare Workstation」と画面や挙動が異なる可能性があるのでその点はご容赦願いたい。
今時のPC用のOSは、ほぼ間違いなくCD(DVD)-ROMブートによるインストール方式になっているので真っさらなPCにインストールするのも非常に楽なのだが、Windows95当時のOSはCD-ROMブートが出来なかったので、別の方法でインストールする必要がある。
オリジナルのWindows95の場合は、まずフロッピーディスク(最近はフロッピーディスクを知らない人も少なくないらしい。ジェネレーションギャップだね)からMS-DOSもどきのOSを起動してCD-ROMドライブを認識させた後、CD-ROMに格納されているSetup.exeを実行することでOSのインストールが始まる仕組みになっていた。つまり、PCを起動させてCD-ROMが読み込める状態にするために別のOSが必要だったということ。ちなみにMS-DOSやWindows95の起動ディスクのOS(実態はほとんどMS-DOSなのだが)では、CD-ROMドライブの自動認識などという便利な仕組みは存在しない。ではどうやってCD-ROMを使えるようにしたかと言えば、デバイスドライバの読み込み設定を司るファイルを手動で編集するという、ちょっと玄人っぽい作業が必要になる。ぶっちゃけ「プラグアンドプレイ?何それおいしいの?」という世界の話だったのだ。
で、当然ながらVMWare Playerで新規にWindows95をインストールしようとした場合、空の仮想マシン(仮想ハードディスク)しか存在しない訳で、CD-ROMブートができる今時のOSでは必要ない手順を踏む必要がある。あ、この記事ではWindows95のインストールメディアを持っていることが前提なので、持っていない人はヤフオクとかを探してみておくんなさい。
考えなければならないことは大きく分けて2つ。
まず一つ目は、真っさらな仮想マシン上でどうやってOSを起動するか。もう一つは、Windows95のインストールメディアをどうやって認識させるか。
一つ目のOS起動については、ネット上にブート可能なPC用のDOSのISOイメージがあるので、その手のイメージをダウンロードしてきて使うのが手っ取り早い。ただし、怪しいサイトから怪しいOSをダウンロードすると余計な物まで拾ってくることになるので、その辺は要注意ということで。
問題は二つ目のWindows95のインストールメディアの認識のさせ方。前述の通り、DOSのような古いOSではCD-ROMドライブを自動で認識しない(これはVMWare Player上の仮想マシンであっても変わらない)ので、CD-ROMのインストールメディアを直接読み込ませるのは現実的ではない。ということで、今回はこんな方法を使ってみた。
その方法というのは、一言で言えば「空の仮想ディスクを作成して仮想マシンに増設する」というもの。VMWare Playerのような仮想化環境の場合、物理PCで言うところのハードディスクは仮想ディスクと呼ばれるファイルで構成される。VMWare Playerの場合は拡張子が「.vmdk」のファイルがそれにあたる。で、増設したハードディスクにWindows95のインストールファイルなどを入れておくことによって、DOSで起動した仮想マシンからセットアップを実行することが可能になる。やり方としてはあまりスマートではないと思うし、ベストな方法だとは思っていないが、まあこういうやり方もあるよ、ということで。
それはさておき、この方法を実行するためには、空の仮想ディスクをフォーマットし、そこにWindows95のインストールファイルなどをコピーするためのOSが入った仮想マシンが必要となる。必要な要件としては、「FAT形式のディスクを扱える」ことと「CD-ROMの読み取りが可能」なことと「ホストOSからゲストOSへのファイルコピー(フォルダ共有)またはゲストOSからネットワークへのアクセスができること」の3つ(ちなみにホストOSのフォルダを共有してそこを介してファイルコピーを行う場合は、2番目の要件は不要になる)で、手っ取り早いのはWindows系のOS(XP以降)の仮想マシンを準備すること。この記事では正規版のWindows10を使用しているが、ぶっちゃけマイクロソフトのサイトからダウンロード可能な評価版でも(Microsoftアカウントを作成する手間を惜しまなければ)問題ない。
ここでは、既に作業用の仮想マシンが出来上がっている前提で話を進めていく。
まずは空の仮想マシンの作成から。
VMWare Playerを起動して(仮想マシンはシャットダウンした状態で)作業用の仮想マシンの「仮想マシンの設定の編集」を開く。仮想マシンを構成するハードウェアが表示されるので、この画面で「追加」ボタンを押す。「ユーザーアカウント制御」の警告が表示されたら「はい」で先へ進む。
ここではハードディスクを追加したいので、追加するハードウェアの一覧からハードディスクを選択する。
ディスクタイプは「(推奨)」となっているもので問題ないのでそのまま次へ。
今回はハードディスクを新規に作成するので「仮想ディスクの新規作成」を選択して次へ。
作成する仮想ディスクのサイズを指定する。ここで注意が必要なのは、MS-DOS等の昔のOSでは、認識可能なディスク容量がかなり小さいので、とりあえず2GBを指定しておく(MS-DOS6.xの場合の上限値)。その辺りの詳しい話に興味があれば、「容量の壁」などのキーワードでググってみるとよい。
あと、今回作成するハードディスクの取り回しのしやすさを考慮して、ここでは「仮想ディスクを単一ファイルとして格納」を選択する(デフォルトは「仮想ディスクを複数のファイルに分割」)。
仮想ディスクのファイル名と格納場所を指定。今回は分かりやすく「workdisk.vmdk」という名前にした。「完了」ボタンを押すと、仮想ディスクが作成される。
「新規ハードディスク」として2GBのハードディスクが追加されていることが分かる。これで作業用OSへのハードディスクを増設が完了したので、「OK」ボタンを押して仮想マシン設定画面を閉じる。
ちなみに出来上がった仮想ディスクはこんな感じ。作成したばかりの状態だとサイズがかなり小さいが、使っていくうちに指定した容量を上限として拡張していく。
準備ができたので、作業用OSを起動する。
作業用OSを起動したら、OSのディスク管理ツール(Windows10等の場合は「コンピューターの管理」-「ディスクの管理」)を使って、追加した仮想ディスクを使える状態にする。ざっくりと流れを説明していくと、
まずディスクのパーティションスタイルは「MBR」を選択する。
今回はパーティションを区切る必要がないので、全ての容量を1つのパーティションとする。
ここが重要なのだが、パーティションのフォーマットは必ず「FAT」を選択する。MS-DOSやWindows95では、NTFS形式のディスクにアクセスすることができない。これでディスクをフォーマットすると、とりあえず「器」となる作業用ディスク(以降、このディスクを「作業用ディスク」と表記する)の準備が完了する。
作業用ディスクの準備ができたら、その中にWindows95のインストールファイルなどの必要なファイルをコピーする。コピーが完了したら、作業用OSをシャットダウンする。シャットダウンが完了したら、VMWare Playerを再度起動する(仮想マシンは起動しない)。VMWare Playerが起動したら、作業用仮想マシンの設定画面を開き、追加したハードディスクをクリックして「削除」ボタンを押す。これによって作業用仮想マシンから作業用ディスクが切り離される(物理的に作業用ディスクのファイルが削除される訳ではない)。
次にWindows95をインストールするための仮想マシンの作成を行う。
VMWare Playerの画面上にある「新規仮想マシンの作成」リンクをクリックする。
今回はCD-ROMブートやISOイメージからのOSインストーラーのブートができないので、「後でOSをインストール」を選択する。
インストールするOSの種類とバージョンを選択。ここで選択したOSによって、OSインストール後にインストールする「VMWare Tools」が変わってくるので、インストールするOSのバージョンを指定する必要がある。
「仮想マシン名」はVMWare Playerのメイン画面の一覧に表示される名前なので、後で見て分かる名前なら何でも構わない。場所はお好みで。
ここはデフォルト値で特に問題はない。
ハードウェアのカスタマイズは後で行えるので、ここはそのまま「完了」ボタンを押す。これで空の仮想マシンが出来上がる。
仮想マシンが出来上がったので、仮想マシンの設定を行う。
作成した仮想マシンを選択して、「仮想マシン設定の編集」リンクをクリックする。
ここではDOSのISOイメージから仮想マシンが起動するように、CD/DVD(IDE)にDOSのISOイメージファイルを指定する。ここでの作業の目的は、DOSを起動してWindows95をインストールする(Cドライブとなる)ハードディスクのパーティション作成とフォーマットを行うことにあるため、ここではまだ作業ディスクを接続しない(このタイミングで作業ディスクを接続すると、作業ディスクがCドライブとなってしまうため)。設定が完了したら、仮想マシンを起動する。
すると、下図のようなエラーが表示されて先へ進まない。
メッセージを見ると、どうやらCPU辺りが怪しそうなので、CPUの設定を変えてみる。
と言うことで、再び「仮想マシン設定の編集」を行う。
CPU関連の設定なので、デバイスの一覧から「プロセッサ」を選択して設定を変更してみる。
色々試してみたところ、「Intel VT-x/EPT または AMD-V/RVI を仮想化」にチェックを入れるとOSが起動した。
で、こんな感じでDOSが起動する。何か表示されているメッセージを見ると、このDOSではCD-ROMのデバイスドライバの読み込みがされていてCD-ROMが使えそうな感じだけど、CD-ROMドライブとして定義されている「R」ドライブにアクセスしてみたところ、仮想マシン設定で指定したDOSのISOイメージと思われるものが表示されたので、どうやらこの環境ではCD-ROMは使えないらしい。CD-ROMが使えていれば作業用ディスクを作成する手間が省けると思ったんだが・・・・ま、いっか。
余談ついでにもう一つ。今回使用したDOSもそうだが、(多分)大抵のDOSは起動時には日本語対応していない。それは単に日本語の表示ができないというだけではなく、キーボードレイアウトも英語キーボードの配列になるということを意味する。なので、アルファベットや数字の入力は問題ないが、記号を入力する際は日本語キーボードとキーアサインが異なる。例えば「*(アスタリスク)」はShiftキー+「8」キーとか、「~(チルダ)」はShiftキー+「半角/全角・漢字」キーとか。
ちなみにこの状態でCドライブにアクセスしようとしても、仮想ディスクがまだ真っさらな状態なので、当然ながらアクセスできない。
なのでディスクを使える状態にする。
DOSの場合は「fdisk」というプログラムを使って行う。
fdiskが起動したら、「1」と入力してパーティションを作成する。
さらに次の表示で「1」と入力してプライマリパーティションを作成する。
ここは「Y」と入力。これでプライマリパーティションが作成される。
あと、仮想マシンを起動してしばらくすると、ウィンドウ下部に「VMWare Toolsのインストール」がうんたらというメッセージが表示されるが、どのみちDOSにはVMWare Toolsはインストールするつもりもない(そもそもできない?)のでこのメッセージはそのまま放っておく。鬱陶しかったら「後で通知」ボタンを押せば消せる。
プライマリパーティションが出来たので、次はパーティションのフォーマットだ、と思っていたら、何か「DOSのシステムディスクが入っていないよ」的なメッセージが表示されている。何でだろ?前にインストールした時はこんなの出なかったのに・・・・。まあ、とりあえず再起動してみるか。
で、仮想マシンを再起動したら・・・「Operating System Not Found」の表示が。何度試してもDOSのISOから起動する気配がない。
なのでブートオーダーを確認してみることにする。
仮想マシンウィンドウの中(黒い部分)をクリックして仮想マシンの操作が出来るようにした状態で「Ctrl+Alt+Ins(VMWare Playerではこれが「Ctrl+Alt+Del」の代わりになる」を押して仮想マシンを再起動し、下図のように「VMWare」の画面が表示されている間に「ESC」キーを押す(ちなみにこの画面の表示時間はそれほど長くないので、かなり手早く操作を行う必要がある。ちなみにSSD環境だと一瞬しか表示されないので)。
成功すると、ブートメニューが表示される。
なるほど、DOSのISOイメージはCD-ROM扱いとなっていて、起動順序がハードディスクより下にあるので、OSが入っていない仮想ディスクからシステムを起動しようとしていた訳ね。
ということで、下矢印キーで「3.CD-ROM Drive」を選択してEnterキーを押すと、ISOイメージからDOSが起動した。やれやれ・・・
DOSが起動したら、「format」コマンドをつかって仮想ディスクをフォーマットする。
「format c:」で、警告が表示されるので「y」を入力してディスクをフォーマット。
フォーマットが終わると、Cドライブにアクセスできるようになる。
今はまだ何も入っていない。
これでCドライブの準備ができたので、作業ディスクを接続するために一度仮想マシンをシャットダウンする。
「Ctrl+Alt」キーを押して仮想マシンの「外側」に出て、VMWare Toolsのメニューバーから下図のように「ゲストをシャットダウン」を選択する。
確認のメッセージが表示されるが、そもそも物理環境のMS-DOSでも「シャットダウン」という操作はなく、終了する時はPCの電源を切るだけなので、ここは「はい」を押して問題ない。
パワーオフが完了したら、VMWare Playerを起動して、Windows95用仮想マシンの「仮想マシン設定の編集」リンクをクリックする。ここでやることは、作業ディスクを仮想マシンに追加すること。手順は最初にWindows10に作業ディスクを追加した時と同じ方法なので詳細は割愛するが、注意点だけ記載する。
ディスクタイプは「IDE(推奨)」を選択する。
今回は既に存在する仮想ディスクを使用するので「既存の仮想ディスクを使用」を選択する。その後にディスクの選択画面が表示されるので、作成した作業ディスクを指定する。
下図の問い合わせに関しては、「既存の形式を保持」を選択しておく。「変換」を選択するとどうなるかは試していないので不明なので、無難な選択ということで。
これで作業ディスクが仮想マシンに追加されたので、「仮想マシン設定」画面を「OK」ボタンで閉じて仮想マシンを起動する。起動すると先程と同じようにそのままではOS(DOS)が起動してこないので、ブートメニューからCD-ROMを選択してDOSを起動する。
作業ディスクはDドライブになるので、Dドライブに移動してWindows95のインストールファイルが格納されているディレクトリに移動し、そこで「setup.exe」を起動する。
これでようやくWindows95のインストールが始まるのだが、まだ先は長い・・・・
つづく。
ポータブルBDドライブを買い換えてみた
1年半程前にBuffalo製のポータブルBlu-rayドライブが安かったので買ってみたのだが、
・本体のサイズが今時のドライブに比べると大きめで、ノートPCと一緒に持ち歩くのに不便
・USB 2.0接続だからか、同じ倍速を謳っているデスクトップ用のドライブに比べて随分と遅い
(後日談:購入後にUSB3.0接続とUSB2.0接続で同じDVDを読み込んでみたところ、速度は変わらなかった)
などの理由で、USB 3.0接続で薄型のドライブを物色していたところ、I-O DATAのドライブが丁度手頃な価格(某家電量販店のWeb販売で、クーポンを使って6,000円台前半)で販売されていたので、それを購入してみた。
ちなみに昨今の低価格のドライブは、価格を抑えるためということもあってか、ソフトウェア(ライティングソフト、再生ソフトなど)が付属していないことが多い。まあ、それはそれで、以前使っていたドライブのソフトをそのまま使えば済む話なので問題ない・・・と思っていたのだが、これがドツボにはまることになろうとは、購入時には思いもよらなかった。
で、何がドツボにはまったかと言うと、既存の再生ソフト(Buffaloのドライブに付いていたPowerDVD10)でBlu-rayディスクを再生しようとすると、
のようなエラーが表示され、Blu-rayディスクの再生ができない。なんてこった!DVDの再生は問題なかったので、ドライブの問題ではないと思われる。
で、とりあえず、ポップアップに表示されている「BD Advisorツール」とやらで確認すべく、ツールをダウンロード&インストールしてチェックしてみる。
ツールでは、このPCではBDに「対応」と出ているのだが、それでも実際にはBDの再生ができない。なのに何で?ということで、いつもの如くググってみると、「PowerDVDの設定でAero関連の設定を変更するとBDが再生出来るようになる」という情報があったので、試してみた。
上図のように設定を変更してみたが、一向にエラーは解消されない。
ポップアップでは「グラフィックドライバーの互換性がない」とのことだったので、PCのメーカーサイトを参照してみると、グラフィックドライバのアップデートがあった。何でも「安定性が向上する」らしい。ということで、これをダウンロードして適用してみたが、結果は変わらず。さて、どうしたものか・・・・。
で、ダメ元でもう一回ググってみると、Bufferloのサイトにバンドル版のPowerDVD10用のパッチがあることが判明した。説明を読むと、これを適用するとPowerDVD12にアップグレードするとのこと。更に、変更内容として「Intel HD Graphics 530に対応」と記載してある(ちなみにこのPCに搭載されているGPUはIntel HD Graphics 520)。これはもしかしたら、と思ってダウンロード&インストールしてみた。
インストールしたPowerDVD12を起動し、BDを再生しようとすると「AACSキーの有効期限が切れている」というメッセージが表示される。ここまではPowerDVD10の時と同じなので、アップデートをダウンロードして適用する。
その上でBDの再生を行うと・・・エラーなく再生できた!
ということで、問題解決。
まあ、今回は幸いにしてアップデートプログラムが存在して、それを適用することで事なきを得たが、安いからと言って添付ソフトなしのドライブを購入すると、こういうことも起こりうる。場合によっては追加でソフトを購入して、却って高くつく可能性もある(正直、たまたまBuffaloのサイトに行き当たらなかったら、明日にでも最新版の再生ソフトを買いに行っていたかもしれない)。
【ということで、今回の教訓】
ソフトが添付されていないハードウェアを購入する場合(他のソフトを流用する場合)、トラブルに遭遇する可能性も覚悟すべし。自力で対応できる自信がなければ、最初からソフトが付いたハードを購入した方が賢明。
おしまい。
スリムタイプLANケーブルのコネクタを付け替えてみた
以前、とある作業でLANケーブルが必要となったので、近所の家電量販店でスリムタイプのLANケーブル(Cat6対応)を購入した。で、作業が終わった後は特にそのケーブルは必要なかったので部屋に転がしておいたのだが、最近別件でLANケーブルが必要になってこのケーブルを引っ張り出して来たら、片側のコネクタ近辺が重量物で圧迫されていて、内部で断線してるっぽい挙動を示した(LAN内のPCに対するPingで抜けが少々発生した)ので、圧迫されていた部分から先のケーブルをちょん切ってコネクタを付け替えることにした。
ということで、交換用のコネクタを調達。ケーブルがCat6対応なので、必然的にCat6対応のコネクタを選ぶ訳だが(ちなみに、Cat5e用のコネクタでも使えなくはないが、性能がCat5e相当に落ちる)、Cat5e用のコネクタが10個で400円そこそこなのに対してCat6用のコネクタは10個で1,000円弱。何でこんなに値段の差があるんだと思いつつも、まあ仕方ないなということでCat6用のコネクタ(単線、ヨリ線両用タイプ)を購入した。
で、早速コネクタの交換をすることにした。LANコネクタの交換自体は何度もやっているので、楽勝だと思っていたのだが・・・・
まずはケーブルの不良箇所をケーブルカッターでバッサリとちょん切る。で、ちょん切ったケーブルから芯線を出すために、ケーブルの被膜を剝く。そこまではいつも通りの手順。で、Cat6ケーブルの場合は、ケーブル内部に十字型のセパレーター(「十字フィラー」と呼ばれるもの)が付いているので、芯線の部分の十字フィラーを切り落とす手順が追加される。
話は前後するが、LANケーブルの構造を大雑把に説明すると、被膜で覆われたケーブルの内部には、4対8本の細いケーブル(芯線)が入っている。この芯線の1本1本を両端のコネクタの端子に接続することで通信が可能になる。
話を戻そう。芯線を引っ張り出してみると、通常のLANケーブル(いわゆる「スタンダードタイプ」とか呼ばれているもの)に比べて芯線が極端に細い。どのぐらい細いかというと、
写真を2枚載せてみたが、どちらもスタンダードタイプのケーブル(コネクタにカバーが付いていない方)とスリムタイプのケーブル(コネクタにカバーが付いている方)の芯線の状態を写した物になる。見ての通り、スリムタイプのケーブルはスタンダードタイプのケーブルよりも一回りは細い。
一抹の不安を覚えつつも、とりあえず通常の手順でコネクタを付けてみた。コネクタの取り付け自体は、慣れていればそれ程難しい作業ではない。ということで、とりあえずコネクタの取り付けは一応終わったので、導通確認を行うためケーブルの両端をケーブルテスターに接続してテスターを動作させてみると・・・・8つのコネクタの内、2つが完全に接続不良を起こしていた。残りの6本についても、接続が不安定で、明らかに配線不良だと分かった。
おそらく、市販のLANコネクタは通常サイズの芯線に合わせて作られているので、スリムタイプのような極端に細い芯線だとコネクタの端子に芯線が上手く接触しないことがあるのだろうと思う。兎にも角にも、作業は失敗したということだ。スリムタイプLANケーブル用のコネクタという物も探した限りでは見当たらないので、勿体ないがこのケーブルはもう使い物にならない。多分二度と日の目を見ることはないだろう。ま、家電量販店のポイントで購入したケーブル(要はタダ)だったのがせめてもの救いだが・・・
【今回の一連の作業で得た教訓】
特別な理由がない限り、スリムタイプとかフラットタイプのようなケーブルは選ばない方が賢明
おしまい。
Windows10でサインイン、サインアウト、シャットダウン時のサウンドを鳴らしてみた
その方法は、「ローカルグループポリシー」を使用するもので、これによってサインイン、サインアウト、シャットダウン時にスクリプトを実行できる。そのためにサウンド(WAVファイル)を再生するスクリプトを作成する必要はあるが。なお、「ローカルグループポリシーエディター」は「Professional」以上のエディションにしか入っていないので、「Home」などの下位のエディションでは実施できない(外部からローカルグループポリシーエディターを持ってくればHomeでも使えるような情報もあるが、真偽の程は定かではない)。
前置きはそのぐらいにして、まずはスクリプトの作成から。
前述のグループポリシーエディターで使用できるスクリプトとしては、Windows Script Host(WSH)に対応したもの(VBScriptなど)かPowerShellがあるが、今回はPowerShellで作成することにした。
スクリプトの要件としては、
・コマンドラインパラメータで「ログオン」「ログオフ」「シャットダウン」を指定できること
・各イベントに対応した、現在Windowsに設定されているサウンドを取得できること
・前述で取得したサウンドを再生できること
の3つ。これらを満たすスクリプトを作成していく。
まず前準備として、上記2番目の要件である「各イベントに対応した、現在Windowsに設定されているサウンドを取得」する方法を知る必要がある。設定自体はレジストリに格納されていて、格納場所は
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\(イベント名)\.Current
になる。この中の「(規定)」に設定された値が、そのイベントに割り当てられたイベントサウンドになる。
今回使う「(イベント名)」は次の通り。
・サインイン ... WindowsLogon
・サインアウト ... WindowsLogoff
・シャットダウン ... SystemExit
前準備もできたところで、スクリプトの作成に取りかかる。
【コマンドライン引数の取得】
今回作成するスクリプトは、各イベントに対応したサウンドを再生するというものなので、それぞれのイベント名を引数として与えることにする。(ちょっと余談)この記事を読んで頂いている方の多くはプログラミングの心得があると思うので、そういう方には「釈迦に説法」だが、「とりあえずログオン用のプログラムを作って、それをコピーしてログオフ用、シャットダウン用のプログラムを作る(=合計3つのプログラムを作る)」的なやり方でも目的は果たせるが、それをやるといざ修正が発生した場合にすべてのプログラムに手を入れなければならなくなるので、「同じ処理をするプログラムは1つだけ作成して、動作の異なる部分はパラメータ(引数)で制御する」というのが「効率の良い」プログラミングの基本的な考え方になる。
話が横道に逸れたが、PowerShellではコマンドライン引数は「$Args[]」という配列に格納される。
配列の添え字は「0」から始まり、0が1番目の引数、1が2番目の引数・・・となる。今回は引数は一つだけなので、決め打ちで「$Args[0]」の値を取得する。引数としては、レジストリキーの値をそのまま使うことにして、「WindowsLogon」「WindowsLogoff」「SystemExit」の3つを想定している。
実際のプログラムはこんな感じ。
$EventName = $Args[0]
Switch ($EventName){
"WindowsLogon"{}
"WindowsLogoff"{}
"SystemExit"{}
Default
{$EventName = ".Default"}
}
まず1行目で1番目のコマンドライン引数を取得して「$EventName」という名前の変数に代入している。
次の「Switch ($EventName)」で始まるブロック(「{」から「}」までのブロック)は、必須という訳ではないが、想定外の引数が与えられた場合を考慮して入れてある(PowerShellのエラー回避のために、誤った引数が与えられた場合に対する何らかの処理は入れておいた方がいい)。引数が「WindowsLogon」「WindowsLogoff」「SystemExit」以外の場合(「Default」の部分)、「.Default(既定のサウンド=一般の警告音)」を指定したと見なすようにしている。正しい引数が与えられた場合は「{}」として、ここでは何も処理を行わない。
参考までに、PowerShellの「Switch」文では、文字列の比較はデフォルトでは大文字/小文字の区別はないので、例えば「windowslogon」というようにすべて小文字で引数を与えても問題なく文字列を判別する。
余談だが、個人的には上記のエラー回避処理は100点満点の対応とは思っていない。今回はコマンドライン引数が3種類しかないという前提なので「ま、いっか」とお手軽な方法を取ったが、もしこれが100種類とかになったらこのやり方ではかなり効率が悪い。他の方法としては、とりあえずコマンドライン引数はそのまま取得しておいて、レジストリの値を取得する時にエラー(指定されたイベントがなければエラーになるはずなので)をキャッチして、エラーだったら改めて「.Default」の値を取得し直す対応なども考えられるので、そこはケースバイケースで臨機応変に対応すれば良いかと。今回のやり方は、あくまでも「方法の一つ」に過ぎない。
次に、与えられた引数を元に、レジストリの位置を特定する。
$RegPath = "HKCU:\AppEvents\Schemes\Apps\.Default\" + $EventName + "\.Current"
これは単純に文字列を連結して、「$RegPath」という変数に格納しているだけ。
ちなみに、「HKEY_CURRENT__USER」はPowerShellでは「HKCU:」と記述する。また、文字列の連結には「+」を用いる。上記の処理で、例えば与えられた引数が「WindowsLogon」の場合には「$RegPath」の値は
HKCU:\AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current
となる。
【レジストリの値の取得】
次に、指定されたレジストリキーの中身を取得する。
$Sound = Get-ItemProperty -Path $RegPath -Name "(Default)"
$SoundPath = $Sound."(Default)"
1行目の処理を実行すると、下記のような感じの値が変数「$Sound」に格納される
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\WindowsLogon
PSChildName : .Current
PSDrive : HKCU
PSProvider : Microsoft.PowerShell.Core\Registry
(default) : C:\Windows\media\Windows Logon Sound.wav
これは変数「$RegPath」で指定したレジストリキーの内容なのだが、要は指定したレジストリキーの配下全ての値が取得される。
そこで2行目で必要な値を取得する。
必要なのは、「(既定)」の値(「(default)」で示される値)のみなので、2行目のような処理を記述することによって、必要な値のみが出力される。これを「$SoundPath」という名前の変数に代入する。これで目的のサウンドファイルのパスを取得できた。
確認のため、変数「$SoundPath」の値を表示してみる。
echo $SoundPath
「echo」命令を使うことで、続く文字列をコンソールに表示することができる。これも「釈迦に説法」かもだが、この手のスクリプトの場合、ちゃんと想定した動作をしているかどうかが外部から分かりづらいので、スクリプト作成時には要所要所にこのような出力処理をいれて確認するとよい。
【サウンドの再生】
最後に、前述の処理で取得したパスのファイル(WAVファイル)を再生する。
$SoundPlayerObj = New-Object Media.SoundPlayer($SoundPath)
$SoundPlayerObj.PlaySync()
1行目で.NET Frameworkの「Media.SoundPlayer」クラスのオブジェクトを作成して変数「$SoundPlayerObj」に代入している。平たく言えば「サウンドを再生する準備ができた」ということ。
2行目で実際にサウンドを再生している。サウンドの再生には、「Play()」メソッドと「PlaySync()」メソッドがあるが、違いは前者はサウンドの再生が終わるまで次の処理を待たない(なので、サウンド再生中に次の処理が実行されて、サウンドの再生が中断される可能性がある)のに対して、後者はサウンドの再生が完了するまで処理を待つ。今回は、「Play()」メソッドを使うと上手くサウンドが再生されなかったので、「PlaySync()」メソッドを使っている。
スクリプトはここまで。
完成したスクリプトはこんな感じになる。
# コマンドライン引数を取得
$EventName = $Args[0]
# 想定外の引数が与えられた場合を考慮した対応
Switch ($EventName){
"WindowsLogon"{}
"WindowsLogoff"{}
"SystemExit"{}
Default
{$EventName = ".Default"}
}
# レジストリのパス名を生成
$RegPath = "HKCU:\AppEvents\Schemes\Apps\.Default\" + $EventName + "\.Current"
# 指定されたレジストリの内容を取得する
$Sound = Get-ItemProperty -Path $RegPath -Name "(Default)"
# 上記で取得したレジストリ値から、必要なキーの値を取得する
$SoundPath = $Sound."(Default)"
# 確認用(別になくても動作に影響はない)
echo $SoundPath
# WAVサウンドを再生
$SoundPlayerObj = New-Object Media.SoundPlayer($SoundPath)
$SoundPlayerObj.PlaySync()
スクリプトの作成が終わったら、適当な名前で保存する。なお、PowerShellスクリプトの拡張子は「.ps1」にすること。今回は「PlaySystemSound.ps1」という名前で保存した。
スクリプトができたので、ちゃんと動くかテストをしてみる。そのためにPowerShellのコンソールを起動する。
PowerShellのコンソールの起動方法は2つある。
一つは、スタートメニューから起動する方法、もう一つは、コマンドプロンプトから起動する方法だ。
まずは、スタートメニューから起動する方法。
次に、コマンドプロンプトから起動する方法。
コマンドプロンプトを起動して、「powershell」と入力すると、プロンプトの先頭に「PS」が付く。これでPowerShellが使えるようになる。
画面の見た目は違うが、どちらの方法でもできることに変わりはない。
では、実際にスクリプトを実行してみる。
初めてPowerShellのスクリプトを実行すると、次のようなエラーが表示される。
初期状態では、PowerShellの実行が許可されていないため、このようなエラーが表示される。「Get-ExecutionPolicy」と入力してみると「Restricted」となっているはずだ。
そのため、初回のみ以下のコマンドを実行してPowerShellの実行を許可する必要がある。「コマンドプロンプト(管理者)」を起動して、ここからPowerShellを起動後、下記のコマンドを入力する。
Set-ExecutionPolicy RemoteSigned
これによって、PowerShellスクリプトの実行が可能になる。
なお、「Set-ExecutionPolicy RemoteSigned」を入力した後に、
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"):
というメッセージが表示される場合は、「Y」またはEnterキーを押すことで実行許可状態になる。
念のため「Get-ExecutionPolicy」と入力してみて「RemoteSigned」と表示されていればOKだ。
この状態で、スクリプトを実行してみる。
スクリプトに問題がなければ、指定したイベントのサウンドが再生されるはずだ(もちろん、レジストリに登録された場所にWAVファイルが存在することが前提だが)。ちなみに上図の「PlaySystemSound.ps1」の1回目の実行時にあえてコマンドライン引数を入れずに実行しているが、ちゃんとデフォルトのサウンド(「一般の警告音」)が再生されていることが分かる。
これでスクリプトは完成したので、次に「ローカルグループポリシーエディター」にスクリプトを登録する。
「ローカルグループポリシーエディター」を起動するには、コマンドプロンプトまたは「ファイル名を指定して実行」にて「gpedit.msc」と入力する。
サインインとサインアウト時に実行するスクリプトは、左側のペインの「ユーザーの構成」→「Windowsの設定」→「スクリプト(ログオン/ログオフ)」にて指定する。
シャットダウン時に実行するスクリプトは、左側のペインの「コンピューターの構成」→「Windowsの設定」→「スクリプト(スタートアップ/シャットダウン)」にて指定する。
右側のペインの該当項目をダブルクリックすると、下図のウィンドウが表示される。なお、以下の例ではシャットダウンのスクリプト設定を例にしているが、ログオン、ログオフも同じ手順で実行する。
今回はPowerShellのスクリプトを実行するので、上図ウィンドウの「PowerShell スクリプト」タブをクリック後、「追加」ボタンを押す。ちなみに間違って「スクリプト」タブ側にPowerShellスクリプトを登録すると、正しく実行されないのはもちろんのこと、場合によっては(エラーリトライを繰り返しているのか)制御が戻ってくるまでに相当待たされることになるので注意。
スクリプト名(スクリプトの実行パス)および、スクリプトのパラメーター(コマンドライン引数)を入力して「OK」ボタンを押すと、下図のようにスクリプトが追加される。
最後に、「OK」ボタンを押して設定を保存する。
同様の設定を「ログオン」「ログオフ」に対しても行う。
これで、Windowsのサインイン/サインアウト/シャットダウン時に、現在システムに設定されているイベントサウンドが再生されるようになった・・・はずなのだが、ここで一つ問題が。
サインインとサインアウトのサウンドは問題なく再生されるのだが、シャットダウン時にはサインアウト用のサウンドが再生されてシャットダウン用のサウンドが再生されない。サインアウト用のサウンドが再生されるのは何となく理解できる(シャットダウン時には最初にサインアウトしてからシステムをシャットダウンしているだろうから)のだが、シャットダウン時のサウンドが再生されない理由が分からない。推測するに、シャットダウンが早すぎてサインアウト時のサウンドを再生し終わった時点でシャットダウンが完了してしまっているのではないかと思うが、確証はない。
とりあえず、個人的な目的としてはサインイン時とシャットダウン時のサウンドさえ再生されれば問題ない(ログオフなど滅多にしない)ので、サインアウト用スクリプトのコマンドライン引数も「SystemExit」にすることで凌ぐことにした。あくまでも「応急処置」的な対応だが、多分「恒久対応」化してしまうのだろう・・・。ま、いっか。
おしまい。