Quantcast
Channel: Windows –俺的備忘録 〜なんかいろいろ〜
Viewing all 50 articles
Browse latest View live

Samba4とrsync、シャドウコピーを用いたファイルのバージョン管理が出来るファイルサーバーの構築

$
0
0

ファイルサーバを利用している環境は多いと思うが、よくあるトラブルがファイルを間違えて上書きや削除してしまい、過去のファイルに戻したい、というもの。
それも、数日や場合によっては数ヶ月前のファイルに戻したいという時もあるだろう。rysncとSamba4、そしてクライアントとしてWindowsのシャドウコピー機能を用いれば、これは実現可能となる。

ディスク容量に余裕が無い状態であればおすすめ出来ないが、もしディスクの容量がものすごく余っている状態なのであれば、ファイルサーバのバックアップも兼ねたバージョン管理ファイルサーバを構築すると良いだろう。
今回は同一ディスク上にファイルサーバでの共有先、rsyncやシャドウコピーで利用するバックアップ先を作成したが、実際に運用するのであれば共有先、バックアップ先は別のディスク・機器で提供するを勧める。
検証環境として、OSはCentOS 7、Samba 4、共有ディレクトリは「/samba/share」、スナップショットのベースディレクトリが「/samba」、スナップショットディレクトリの配置先を「/samba/backup」としている。
スナップショットのベースディレクトリ(shadow:basedir)配下に共有ディレクトリ(path)とスナップショットディレクトリの配置先(shadow:snapdir)を置く必要があるので注意。

なお、今回の作成にあたってはこちらの情報を参考にさせていただいた。感謝!

1.前提となるパッケージのインストール

まずは、前提となるパッケージとしてsamba4とrsyncが必要となる()。
以下のコマンドで、rsync、samba4のインストールを行う。

yum install rsync samba

これで、前提となるパッケージのインストールが出来た。

2.rsyncの設定

さて、次にrsyncでバックアップ(及びスナップショット)の生成を行わせ、cronで自動実行させるようにする。
実際には、以下のようなスクリプトを作成すると良いだろう。

●get_sambasnap.sh

#!/bin/sh

# 変数設定
# バックアップ対象ディレクトリ
SAMBA_DIR=/samba/share
# バックアップ先ディレクトリ
BACKUP_DIR=/samba/backup
# バックアップ先ディレクトリに作成するスナップショットを保有するディレクトリのPATH
SNAPSHOT_DIR=$(TZ=GMT date +@GMT-%Y.%m.%d-%H.%M.%S)
# 最後にバックアップを取得したディレクトリ名を保持しているファイル
LAST_SNAPSHOT_FILE=$BACKUP_DIR/last_snapshot

if [ ! -e $LAST_SNAPSHOT_FILE ]; then
    rsync -av $SAMBA_DIR $BACKUP_DIR/$SNAPSHOT_DIR
    echo $SNAPSHOT_DIR > $LAST_SNAPSHOT_FILE
else
    LAST_SNAPSHOT_DIR=`cat $LAST_SNAPSHOT_FILE`
    rsync -av --delete --link-dest=$BACKUP_DIR/$LAST_SNAPSHOT_DIR $SAMBA_DIR $BACKUP_DIR/$SNAPSHOT_DIR
    echo $SNAPSHOT_DIR > $LAST_SNAPSHOT_FILE
fi

 

上記のスクリプトはあくまでも最低限利用する部分のみ記述しているので、後は環境にあわせて編集してもらいたい。
スクリプトはcrontabで1時間間隔で定期実行させるようにすると良いだろう。

もしバックアップファイルのローテーションをさせるようであれば、スクリプトを以下のようにすると良いだろう。

●get_sambasnap.sh

#!/bin/sh

# 変数設定
# バックアップ対象ディレクトリ
SAMBA_DIR=/samba/share
# バックアップ先ディレクトリ
BACKUP_DIR=/samba/backup
# バックアップ先ディレクトリに作成するスナップショットを保有するディレクトリのPATH
SNAPSHOT_DIR=$(TZ=GMT date +@GMT-%Y.%m.%d-%H.%M.%S)
# 最後にバックアップを取得したディレクトリ名を保持しているファイル
LAST_SNAPSHOT_FILE=$BACKUP_DIR/last_snapshot
# ローテーションを行う日程
ROTATE_DATE=14

# バックアップを実施する
if [ ! -e $LAST_SNAPSHOT_FILE ]; then
    mkdir -p $BACKUP_DIR/$SNAPSHOT_MONTH
    rsync -av $SAMBA_DIR $BACKUP_DIR/$SNAPSHOT_DIR
    echo $SNAPSHOT_DIR > $LAST_SNAPSHOT_FILE
else
    LAST_SNAPSHOT_DIR=`cat $LAST_SNAPSHOT_FILE`
    mkdir -p $BACKUP_DIR/$SNAPSHOT_MONTH
    rsync -av --delete --link-dest=$BACKUP_DIR/$LAST_SNAPSHOT_DIR $SAMBA_DIR $BACKUP_DIR/$SNAPSHOT_DIR
    echo $SNAPSHOT_DIR > $LAST_SNAPSHOT_FILE
fi

# バックアップのローテーションを行う
LIST=`ls -1 $BACKUP_DIR | grep GMT`
for s in $LIST
do
    DEL_SNAPSHOT_DIRDAY=`echo $s | cut -f2 -d"-" | tr -s "." "/" `
    DEL_SNAPSHOT_DIRTIME=`echo $s | cut -f3 -d"-" |  tr -s "." ":"  `
    DEL_SNAPSHOT_DIR=`date -d "$DEL_SNAPSHOT_DIRDAY $DEL_SNAPSHOT_DIRTIME" "+%s"`
    NOW_TIME=`date -d "9 hours $ROTATE_DATE days ago" "+%s"`
    if [ $DEL_SNAPSHOT_DIR -le $NOW_TIME ]; then
        rm -rf $BACKUP_DIR/$s
    fi
done

3.Samba4の設定

最後に、Samba4の設定を行う。
「/etc/samba/smb.conf」の共有ディレクトリの設定で、「shadow: ~」の設定を記述した共有フォルダ「share」の設定を追記する。

●/etc/samba/smb.conf(例)

[share]
        comment = 世代管理ファイルサーバ
        guest account = nobody
        guest ok = Yes
        guest only = yes
        read only = No
        browseable = yes
        writable   = yes
        path = /samba/share
        vfs objects = shadow_copy2
        shadow:basedir = /samba
        shadow:snapdir = /samba/backup
        shadow:sort = desc

 

後は、以下のコマンドでsambaを起動させるだけだ。

systemctl start smb.service
systemctl start nmb.service

 

さて、それでは実際にシャドウコピーが取得されているかどうかを確認してみよう。
対象のディレクトリにアクセスし、ファイルを右クリック > プロパティ > [以前のバージョン]タブを開く。

20150518-000000

20150518-000001

 

確かにシャドウコピーが取得されている事が確認出来た。
なお、Macでこのファイルサーバにアクセスした場合、シャドウコピーの機能は利用出来ない。
そのため、MacとWindowsの混在環境で利用する場合は、スナップショットを記録しているディレクトリを読み取り専用で公開すると良いだろう。

サーバ構築の実例がわかる Samba[実践]入門 (Software Design Plus) サーバ構築の実例がわかる Samba[実践]入門 (Software Design Plus)

サーバ大量構築時のキモ ~WDT(Windows Deployment Toolkit)を用いたWindows Server 2008 R2 自動インストールディスクの作成~

$
0
0

以前、Windows Server 2008(Widows 7)でsysprepを利用し、OSのクローンを行う手法について記述したが、今回のこれは応答ファイルを用いてOSのインストールを自動的に行うディスクを作成する、というもの。
CentOSのKickstartUbuntuのPreseedを用いた自動インストールディスクのWindows版のようなものだ。

さて、自動インストールには、sysprepの時と同様に応答ファイルを用いる必要がある。
このため、インストールディスクを作成するためのPCには、別途Windows ADKをインストールしておく必要がある。

今回は、Windows Server 2008 R2の自動インストールディスクの作成を行う。
Windows 7も手法は変わらないので、同じようにディスクの作成は可能だ。

1.応答ファイルの作成

さて、それでは実際に応答ファイルを作成してみよう。sysprep用の応答ファイルの作成と同様に、Windows ADKに含まれているWindows System Image Managerを用いて応答ファイルを作成する。
まずは、Windows Server 2008 R2のディスクからイメージカタログを取得。Windows System Image Managerで読み込みを行う。
[Windows イメージの選択]から、「source」ディレクトリ配下にある応答ファイルを作成するエディションのイメージカタログ(.cfgファイル)を読込む。

20150525-000000

 

次に、Windows System Image Managerの左下から、それぞれの設定値を取り出して設定していく。

1-1.ロケール設定の自動化

20150525_000001

標準のインストール時に表示される、上の画面での設定を自動化するため、応答ファイルに以下の設定を追加する。

設定値:amd64_Microsoft-Windows-International-Core-WinPE_6.1.7600.16385_neutral
構成パス:1 WindowsPE

20150525-000001

  • InputLocale:0411:E0010411
    (Windows インストールの既定の入力ロケールを指定する)
  • SystemLocale:ja-JP
    (Windows インストールの既定のシステム ロケールを指定する)
  • UILanguage:ja-JP
    (Windows インストールの既定の UI 言語を指定する)
  • UILanguageFallBack:ja-JP
    (コンピューターの既定の UI 言語が選択されたイメージに対して部分的にのみローカライズされている場合、使用する言語を指定する)
  • UserLocale:ja-JP
    (Windows インストールの既定のユーザー ロケールを指定する)
  • SetupUILanguage/UILanguage:ja-JP
    (Windows セットアップ時の言語を指定する)

1-2.インストールするエディション選択の自動化

20150525_000003

インストールするエディションの選択画面を表示させないため、応答ファイルに設定を追加する。
このエディションの選択では、インストーラーで保持しているインデックス番号もしくはインデックス名を利用するため、事前に以下のコマンドで確認すると良いだろう。
名前はディスクの種類によって変動することはまず無いだろうが、インデックス番号は変動する可能性があるため、事前に確認することをおすすめする。

dism /Get-WimInfo /WimFile:"D:\sources\install.wim"
C:\Windows\system32>dism /Get-WimInfo /WimFile:"D:\sources\install.wim"

展開イメージのサービスと管理ツール
バージョン: 6.1.7600.16385

イメージの詳細: D:\sources\install.wim

インデックス: 1
名前: Windows Server 2008 R2 SERVERSTANDARD
説明: Windows Server 2008 R2 SERVERSTANDARD
サイズ: 10,740,190,091 バイト

インデックス: 2
名前: Windows Server 2008 R2 SERVERSTANDARDCORE
説明: Windows Server 2008 R2 SERVERSTANDARDCORE
サイズ: 3,695,201,858 バイト

インデックス: 3
名前: Windows Server 2008 R2 SERVERENTERPRISE
説明: Windows Server 2008 R2 SERVERENTERPRISE
サイズ: 10,740,833,321 バイト

インデックス: 4
名前: Windows Server 2008 R2 SERVERENTERPRISECORE
説明: Windows Server 2008 R2 SERVERENTERPRISECORE
サイズ: 3,695,175,939 バイト

インデックス: 5
名前: Windows Server 2008 R2 SERVERDATACENTER
説明: Windows Server 2008 R2 SERVERDATACENTER
サイズ: 10,740,940,492 バイト

インデックス: 6
名前: Windows Server 2008 R2 SERVERDATACENTERCORE
説明: Windows Server 2008 R2 SERVERDATACENTERCORE
サイズ: 3,695,214,106 バイト

インデックス: 7
名前: Windows Server 2008 R2 SERVERWEB
説明: Windows Server 2008 R2 SERVERWEB
サイズ: 10,749,512,194 バイト

インデックス: 8
名前: Windows Server 2008 R2 SERVERWEBCORE
説明: Windows Server 2008 R2 SERVERWEBCORE
サイズ: 3,693,823,080 バイト

操作は正常に完了しました。

C:\Windows\system32>

上記コマンドで得た情報を元に、以下の設定を応答ファイルに記述する。

設定値:amd64_Microsoft-Windows-Setup_6.1.7600.16385_neutral/ImageInstall/OSImage/InstallFrom/MetaData
構成パス:1 WindowsPE

20150526-000000

利用する情報ごとに、以下のように設定を記述する。

●名前(「Windows Server 2008 R2 SERVERSTANDARD」など)でエディションを指定する場合

  • Key:/IMAGE/NAME
  • Value:名前
    (「Windows Server 2008 R2 SERVERSTANDARD」など)

●インデックス番号(「1」など)でエディションを指定する場合

  • Key:/IMAGE/INDEX
  • Value:インデックス番号
    (「1」など)

1-3.EULA(End User License Agreement)設定の自動化

20150525_000005

ライセンス認証の承認を自動化するため、応答ファイルに以下の設定を追加する。

設定値:amd64_Microsoft-Windows-Setup_6.1.7600.16385_neutral/UserData
構成パス:1 WindowsPE

20150526-000001

  • AcceptEula:true

1-4.パーティション設定の自動化

20150525_000007

パーティション設定の自動化を行うため、以下の内容を応答ファイルに記述する。
なお、環境によってパーティションが違う事もあると思うので、そこは読み替えて記述してもらいたい。

20150526-000002

設定値:amd64_Microsoft-Windows-Setup_6.1.7600.16385_neutral/DiskConfiguration/Disk
構成パス:1 WindowsPE

  • DiskID:0
  • WillWipeDisk:true

 

上記設定後、作成中の応答ファイル側で「Disk[DiskID=”0″]/CreatePartitions/」を右クリック > 「新しいCreatePartitionの挿入」を選択し、1つ目のパーティションの設定値を追加する。

20150526-000003

応答ファイルのPATH: DiskConfiguration/Disk[DiskID=”0″]/CreatePartitions/CreatePartition[Order=”1″]

  • Extended:false
  • Order:1
  • Size:100
  • Type:Primary

 

また、「Disk[DiskID=”0″]/ModifyPartitions/」でも右クリック > 「新しいModifyPartitionの挿入」を選択し、1つ目のパーティションの設定値を追加する。

20150526-000004

応答ファイルのPATH: DiskConfiguration/Disk[DiskID=”0″]/ModifyPartitions/ModifyPartition[Order=”1″]

  • Active:true
  • Extended:<空白>
  • Format:NTFS
  • Label:システムで予約済み
  • Letter:<空白>
  • Order:1
  • PartitionID:1
  • TypeID:<空白>

 

次に、「Disk[DiskID=”0″]/CreatePartitions/」を右クリック > 「新しいCreatePartitionの挿入」を選択し、2つ目のパーティションの設定値を追加する。

20150526-000005

応答ファイルのPATH: DiskConfiguration/Disk[DiskID=”0″]/CreatePartitions/CreatePartition[Order=”2″]

  • Extended:true
  • Order:2
  • Size:<空白>
  • Type:Primary

 

「Disk[DiskID=”0″]/ModifyPartitions/」で再度右クリック > 「新しいModifyPartitionの挿入」を選択し、2つ目のパーティションの設定値を追加する。

20150526-000006

応答ファイルのPATH: DiskConfiguration/Disk[DiskID=”0″]/ModifyPartitions/ModifyPartition[Order=”2″]

  • Active:false
  • Extended:<空白>
  • Format:NTFS
  • Label:<空白>
  • Letter:<空白>
  • Order:2
  • PartitionID:2
  • TypeID:<空白>

 

上記設定後、以下の内容を応答ファイルに記述する。

設定値:amd64_Microsoft-Windows-Setup_6.1.7600.16385_neutral\ImageInstall\OSImage\InstallTo
構成パス:1 WindowsPE

20150526-000007

  • DiskID:0
  • PartitionID:2

1-5.管理者パスワード設定の自動化

20150526_000001

インストール完了後、初回ログイン時に管理者パスワードの設定をしなくてもいいよう、以下の設定を応答ファイルに追記する。

設定値:amd64_Microsoft-Windows-Shell-Setup_6.1.7601.17514_neutral\UserAccounts\AdministratorPassword
構成パス:7 oobeSystem

20150526-000008

  • Value:管理者パスワード(平文)

なお、Windows Serverの場合ある程度複雑なパスワード(大文字や数字、記号を含むなど)を設定する必要があるので注意。

2.自動インストールISOファイルの作成

さて、先ほど作成した応答ファイルを利用して、自動インストール用のISOファイルを作成する。
事前に、Windows Server 2008 R2のインストールディスクをISO化しておき、WinRARなどでISOファイルを任意のディレクトリに解凍する。

20150528-000000

 

解凍したディレクトリの直下に、作成した応答ファイルを配置する。
応答ファイルの名称は『AutoUnattend.xml』とする。

20150528-000001

 

最後に、スタートメニューから[Microsoft Windows AIK] > [Deployment ツールのコマンド プロンプト]を開き、以下のコマンドを実行する。

oscdimg -b"C:\program Files\Windows AIK\Tools\PETools\x86\Boot\etfsboot.com" -m -u1 ISO化するディレクトリPATH ISOファイルの出力先PATH

 

これで、自動インストール用のISOファイルが作成出来た。
後はそのインストールディスクから起動させることで、自動的にWindows Server 2008 R2がインストールされる。

20150528_000001

 

現場で役立つ Windows Server 2012 R2 Essentials 構築・運用ガイド (Small Business Support) 現場で役立つ Windows Server 2012 R2 Essentials 構築・運用ガイド (Small Business Support)

サーバ大量構築時のキモ ~Windows Server 2008 R2 自動インストールディスクでインストール完了後にスクリプトの自動実行を設定~

$
0
0

以前、Windows Server 2008 R2の自動インストールディスク(ISO)を作成したが、今回はそのディスクでインストール完了後、自動的にスクリプトを実行させて設定を行わせる方法について記述する。
ここでいう設定とは、筐体のシリアルナンバーに応じてホスト名やIPアドレスを自動的に設定させたり、アプリケーションのサイレントインストールを行わせたりする事。

アプリケーションのインストーラーやスクリプト、事前に配布しておきたいファイルについては、ISOファイルのルートディレクトリ配下に以下のようにディレクトリを作成、そこに配置する。

Sources\$OEM$\$$\SETUP\SCRIPTS\

20150608-000000

上記画面の例では、シリアルナンバーにあわせてホスト名、IPアドレスを設定するバッチファイルを配置している。
で、このフォルダに「SetupComplete.cmd」というバッチファイルを作成し、そこでこれらのスクリプトやインストーラーを実行させている。
このファイルは、Windowsのインストール完了後に、もし存在していたら自動的に実行されるバッチファイルだ。(存在していない場合はそのまま)

このフォルダにあるファイルは、インストール完了後は以下のフォルダに格納される事になる。

%WinDir%\Setup\Scripts\

後は、アプリケーションのインストーラーなり事前に設定したいバッチスクリプトを実行させるよう、「SetupComplete.cmd」を記述すればいい。

絵で見てわかるWindowsインフラの仕組み 絵で見てわかるWindowsインフラの仕組み

リモートデスクトップにパスワード入力無しでログインするバッチファイル

$
0
0

リモートデスクトップを利用する際、ある程度決まったサーバにログインするならば、パスワードの入力をしなくてもログイン出来るようにしたい。
そんな時はWindowsの資格情報を保存して接続する事で対応出来るのだが、セキュリティ上それを出来ないようにしている環境もある。

そんな時は、以下のようなbatchファイルを作成しておくといいだろう。

●RDPログイン.batch

@Echo off
Set SERVER=IPアドレス
Set USERNAME=ユーザ名
Set PASSWORD=パスワード

Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
Start mstsc /v:%SERVER%
Timeout 1
Cmdkey /delete:TERMSRV/%SERVER%

とりあえずパスワード無しでログインするならば、.rdpファイルを作成するよりもこっちの方が色々な環境で使える。
(.rdpファイルの場合、パスワードをハッシュ化(それも各環境ごとに)する必要があるので、共有サーバ上に放置とか出来ないし。)
セキュリティ上よろしくないのはあるけれど、ただの検証機であればこういうのを用意するのもいいと思う。(DBにアクセス可能なサーバへはやめといた方が良いと思うけど。)

ひと目でわかる リモートデスクトップサービス WindowsServer2012版 (TechNet ITプロシリーズ) ひと目でわかる リモートデスクトップサービス WindowsServer2012版 (TechNet ITプロシリーズ)

F1キーで表示されるWindows ヘルプを無効化する

$
0
0

初心者の頃やインターネット接続が出来ない環境ならば役に立つのかも知れないが、多くの人にとって、基本的にWindowsのヘルプ機能というのは煩わしいものだろう。
デスクトップなどで間違えてF1キーを押下した日には、いちいちWindows ヘルプの画面が表示される。うざったい。ということで、無効化してみることにした。

なお、各アプリケーションごとに用意されているヘルプは、この方法では抑制することは出来ない。
あくまでもデスクトップやエクスプローラーなどで表示されるWindows ヘルプの無効化だ。Excelなどのオフィスも個別にヘルプが用意されているので、これらは個々に設定する必要がある。

Windows ヘルプの無効化手順は簡単。
以下のコマンドを実行し、Windowsヘルプの実行ファイルをリネームしてしまうだけだ。

takeown /f "%WINDIR%\HelpPane.exe"
icacls "%WINDIR%\HelpPane.exe" /grant Administrators:F
ren "%WINDIR%\HelpPane.exe" "HelpPane.exe.bak"

 

これで、Windows ヘルプは表示されなくなった。

絵で見てわかるWindowsインフラの仕組み 絵で見てわかるWindowsインフラの仕組み

リモートデスクトップを使う上で覚えておきたいショートカットキー(キーバインド)6個

$
0
0

Windowsサーバを構築、運用しているプロジェクトであれば、リモートデスクトップは必ず使う機能だろう。
今回は、そんなリモートデスクトップを便利に使うためのショートカットキーをまとめてみた。

1.『Alt + Tab』相当のキー

20150627_000000

リモートデスクトップで『Alt + Tab』相当の処理をする場合は、『Alt + PageUp』を用いる。
逆(『Alt + Tab + Shift』相当)は『Alt + PageDown』で行える。

2.『Ctrl + Alt + Delete』相当のキー

20150627_000001

リモートデスクトップで『Ctrl + Alt + Delete』相当の処理をする場合は、『Ctrl + Alt + End』キーを用いる。

3.『Windowsキー』相当のキー

20150627_000003

『Windowsキー』入力相当のキーは、『Alt + Home』キーを用いる。

4.リモートデスクトップのフルスクリーンモード⇔ウィンドウモードを切り替える

リモートデスクトップのフルスクリーンモード⇔ウィンドウモードを切り替えるには、『Ctrl + Alt + Pause』キーを用いる。

5.リモートデスクトップ先でウィンドウメニューを表示する

20150627_000004

リモートデスクトップ先でウィンドウメニューを表示(『Alt + Space』相当)を表示させるには、『Alt + Delete』キーを用いる。

6.スクリーンショットを取得する

リモートデスクトップ上でスクリーンショットを取得(『PrintScreenキー』相当)する場合は、『Ctrl + Alt + -(テンキーのマイナスキー)』を用いる。
『Alt + PrintScreenキー』相当の処理をする場合は、『Ctrl + Alt + +(テンキーのプラスキー)』を利用する。

どちらも、テンキーのものでないと動作しないので注意。

ひと目でわかる リモートデスクトップサービス WindowsServer2012版 (TechNet ITプロシリーズ) ひと目でわかる リモートデスクトップサービス WindowsServer2012版 (TechNet ITプロシリーズ)

Windowsでファイル名・フォルダ名の一括置換を行う

$
0
0

UNIX、Linuxと同様に、Windowsでもファイル名やフォルダ名を一括で置換したいときがある。
そんな時はどうすればよいのか?

1.コマンドプロンプトから置換を行う

非常に限定的な用途(拡張子をtxtからbatに変換する等)であれば、コマンドプロンプトからrenコマンドを使うと良いだろう。

ren リネーム前 リネーム後

20150704-000000

 

ただ、このコマンドでちゃんとした置換(たとえば、「TEST」というキーワードを「A」と変える)は難しい。
というのも、普通にコマンドを実行すると、以下の画像のようになってしまうからだ。

20150704_000001

 

手軽ではあるのだが、ちゃんとした置換であれば別の手段を取りたい所だ。

2.PowerShellから置換を行う

やはりrenコマンドを用いるよりは、PowerShellを用いる方が応用が効く。
以下のようにコマンドを実行することで、一括でファイル名を置換することができる。

Get-ChildItem <対象PATH> | Rename-Item -NewName { $_.Name -replace '置換したい単語','置換後の単語' }

20150704-000002

 

Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ) Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ)

サーバ大量構築時のキモ ~Windows 8.1/Windows Server 2012 R2のSysprepで使える応答ファイルを作成する~

$
0
0

Windowsでクローン元のイメージを作る方法として、Sysprep等で利用する応答ファイルは欠かせないものだ。
今回は、Windows 8.1 / Windows Server 2012 R2で、そのSysprepを自動化させることの出来る応答ファイルを作成する。

Windows 8.1/Windows Server 2012 R2用の応答ファイルを作成する際には、以下について注意したい。

  • Windows 8.1 / Windows Server 2008 R2で応答ファイルを作成する場合、Windows 7 / Windows Server 2008 R2のツール『Windows AIK』ではなく、『Windows ADK』を利用する必要が有る
  • 応答ファイルを作成するマシンは、出来る限り32bit版のOSを使うこと

2つ目の理由だが、これは応答ファイルを作成する際に前提となるカタログファイル、これを『Windows ADK』で作成する際、作業マシンが32bit版だと32bit/64bit版のカタログファイルを作成できるのだが、64bit版のマシンを使っていると64bit版のカタログファイルしか作成出来ないからだ。
作成できないアーキテクチャの応答ファイルを作成しようとすると、以下のようなエラーが出力される。

WS000013

 

このため、応答ファイルを作成するマシンは、32bit/64bitどちらのカタログファイルも作成できる32bit版のOSを使う方がいい。

1.『Windows ADK』のインストール

まず最初に、応答ファイルを作成するためのツールである『Windows ADK』をインストールする。
こちらから『adksetup.exe』をダウンロードして、インストール先のPCで実行する。

インストーラー実行後、マネージャーでインストール先を指定するので、そのまま次へ。

WS000000

 

「カスタマーエクスペリエンス向上プログラムへの参加」については、デフォルト(向上しない)のまま次へ。

WS000001

 

使用許諾契約は「同意する」を押下して次へ進む。

WS000002

 

「インストールを行う機能」については、「Deployment Tools」にチェックが入っている事を確認して「インストール」を選択する。

WS000003

 

後はインストーラーが走るので、終了まで待つだけだ。
インストール完了後、以下のウィンドウが表示される。

WS000005

 

2.カタログファイルの作成

さて、応答ファイルの作成ツールがインストールされたら、次は応答ファイルを作成する際に読み込まれる『カタログファイル』の作成を行う。
スタートメニューから[Windows システム イメージ マネージャー]を選択して起動する。

WS000006

 

「Windows システム イメージ マネージャ」が動作する。
操作方法は「Windows AIK」のものと変わらない。

で、Windows 7 /Windows Server 2008 R2と違い、8 / 2012 R2ではディスク内にカタログファイルが用意されていないため、「Windows ADK」をインストールしたマシンでカタログファイルを作成する必要がある。
インストールディスクをWindows ADKをインストールした作業用端末に挿入し、「\sources\install.wim」を適当なディレクトリにコピーする。(容量が大きいので注意)

コピー完了後、[ファイル] > [Windows イメージの選択]を選択する。

WS000022

 

先ほどコピーした「install.wim」を選択する。

WS000023

 

[イメージの選択]ウィンドウが表示されるので、カタログファイルを作成するイメージを選択する。
画面はWindows 8.1 or 8.1 proのもの。

WS000024

 

以下の画面が表示されるので、カタログファイルを作成するために「はい」を選択する。

WS000025

 

カタログファイルの作成処理が開始するので、終了するまで待つ。
(結構時間が掛かる)

WS000026

 

無事カタログファイルが出来上がると、以下の画面のように応答ファイルの作成が出来るようになっている。

WS000027

 

3.応答ファイルを作成する

さて、それでは実際に応答ファイルを作成していこう。
今回はWindows 8.1で応答ファイルを作成するが、カーネルはWindows Server 2012 R2も同じものを利用している。そのため、Windows Server 2012 R2でも、同じ項目を設定してあげれば応答ファイルとして動作する。

ここでは、Sysprepやカスタムディスクを作成し自動インストールを行う際に設定するであろう項目を記述していく。
応答ファイルの設定項目については、こちらの情報を参考に、以下のように作成していく。

構成PATH コンポーネント 設定値
 1.Windows PE  (amd64 or x86)_Microsoft-Windows-International-Core-WinPE_neutral  InputLocale = ja-JP
 SystemLocale = ja-JP
 UILanguage = ja-JP
 UILanguageFallback =  ja-JP
 UserLocale = ja-JP
 (amd64 or x86)_Microsoft-Windows-International-Core-WinPE_neutral\SetupUILanguage  UILanguage = ja-JP
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration  WillShowUI = OnError
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration\Disk  DiskID = 0
 WillWipeDisk = true
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration\Disk\CreatePartitions\CreatePartition  Order = 1
 Size = 300
 Type = Primary
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration\Disk\CreatePartitions\CreatePartition  Extend = true
 Order = 2
 Type = Primary
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration\Disk\CreatePartitions\ModifyPartition  Active = true
 Format = NTFS
 Label = System
 Order = 1
 PartitionID = 1
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\DiskConfiguration_neutral\DiskConfiguration\Disk\CreatePartitions\ModifyPartition  Format = NTFS
 Label = Windows
 Order = 2
 PartitionID = 2
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\ImageInstall\OSImage  InstallToAvailablePartition = false
 WillShowUI = OnError
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\ImageInstall\OSImage\InstallTo  DiskID = 0
 PartitionID = 2
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\UserData  AcceptEula = true
 (amd64 or x86)_Microsoft-Windows-Setup_neutral\UserData\ProductKey  Key = <product key>
 WillShowUI = OnError
 7 oobeSystem  (amd64 or x86)_Microsoft-Windows-Deployment_neutral\Reseal  ForceShutdownNow = false
 Mode = Audit
 (amd64 or x86)_Microsoft-Windows-Shell-Setup_neutral\OOBE  HideEULAPage = true
 ProtectYourPC = 3

 

応答ファイルの作成ができたら、上部メニューの[ファイル] > [応答ファイルを保存] で保存する。

WS000029

 

これで応答ファイルが完成した。
後は、この応答ファイルを利用してsysprepを自動化したり、自動インストールディスクを作成すればいい。

 

Microsoft Windows 8.1 最新版 [Windows 8.1 Update 適用済みパッケージ] Microsoft Windows 8.1 最新版 [Windows 8.1 Update 適用済みパッケージ]

サーバ大量構築時のキモ ~Windows 8.1/Windows Server 2012 R2でSysprepを実行する~

$
0
0

今回は、前回作成した応答ファイルを利用してsysprepを実行する。
といっても、特に難しい事はしない。

クローン元のマシンで、以下のコマンドを実行すればいいだけだ。

C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown /quiet /unattend:C:\Untitled.xml

 

20150710_000006

 

後は、再起動したら自動的に設定等が削除されイメージが一般化される。

絵で見てわかるWindowsインフラの仕組み 絵で見てわかるWindowsインフラの仕組み

Windowsのコマンドプロンプトで日付ディレクトリを作成する

$
0
0

バックアップや既存のサーバへの設定変更時のファイル保管など、日付名のディレクトリというのは良く利用されると思う。
今回は、そんな日付ディレクトリをコマンドプロンプト上で一行で生成する。

コマンドプロンプトから日付ディレクトリをワンライナーで生成する場合は、以下のようにコマンドを実行すると良いだろう。

for /f "tokens=1-3 delims=/" %a in ("%date%") do mkdir "%a%b%c"

20150730-000001

 

※以下でも作成可能でした。正直、上のクソ面倒くさいやり方よりも、こっちでやってもらった方が…

mkdir %date:/=%
cmd.exe /c md "%1/%%DATE%%"
絵で見てわかるWindowsインフラの仕組み 絵で見てわかるWindowsインフラの仕組み

PowerShellで対象URLのステータス(200,404etc…)を取得する

$
0
0

仕事で、PowerShellから対象URLのステータス状態(200とか404とか)を取得する必要があったので、その備忘。
PowerShellでその辺りの情報を取得する場合は、以下のように記述する。

$url = "対象URL"
[System.Net.HttpWebRequest]$REQUEST = [System.Net.WebRequest]::Create($url)
$RESPONSE = $REQUEST.GetResponse()
$RESPONSE.Close()
[int]$RESPONSE.StatusCode

対象URLの所は、適当に引数等を指定してスクリプト化すると良いだろう。

動くサンプルで学べる Windows PowerShell コマンド&スクリプティングガイド PowerShell 4.0対応 動くサンプルで学べる Windows PowerShell コマンド&スクリプティングガイド PowerShell 4.0対応

ログイン先を選択して自動ログインを行うTeratermマクロ(鍵認証対応版)

$
0
0

先日作成したPythonスクリプトで鍵認証対応させたので、Teratermマクロでもやってみる。

1.SSHAutoLogin.ttl

変更点としては、こちらの内容に鍵認証を加えただけだ。

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;  Filename : SSHAutoLogin.ttl
;  Description : SSH Auto login - host selection listbox from host.list
;  Author : Blacknon
;  Created : 2015/01/18
;  Modified : 2015/11/10
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
;;-------------------------------------------------------
;; 接続時の基本的な情報を設定する
;;-------------------------------------------------------
;; ホストに関する情報をもつファイル「host.list」の場所を設定する
 HOST_FILE = "host.list"
 
;; ログイン時に実行させるコマンドの情報をもつファイル「command.list」の場所を設定する
 COMMAND_FILE = "command.list"
 
;; ログ作成用ディレクトリの情報を取得する
 Getdir CurrentDir
 LOG_DIR_PATH = CurrentDir
 Strconcat LOG_DIR_PATH '\log\'
 
;;-------------------------------------------------------
;; ホスト選択画面を作成する
;;-------------------------------------------------------
;; ホストファイルの行数を取得する
 Fileopen HOST_LIST HOST_FILE 0
 i = 0
 While
     Filereadln HOST_LIST LIST_LINE
 
    ;;ファイル読み込みの終了処理
     If result = 1 Break
 
    ;; 空白行を無視する
     Strlen LIST_LINE
     If result = 0 continue
 
    ;; 「#」から始まる行をコメントとして無視
     Strmatch LIST_LINE '^#'
     If result &amp;lt;&amp;gt; 0 continue
 
     i=i+1
 EndWhile
 
;; 配列を作成
 Strdim HOST_NAME i
 Strdim HOST_IP i
 Strdim KEY_FILE i
 Strdim HOST_USER i
 Strdim HOST_PASS i
 Strdim HOST_ROOT_USER i
 Strdim HOST_ROOT_PASS i
 Strdim HOST_SUDO_FLAG i
 
;; ホストに関する情報をホストファイルから取得する
 Fileopen HOST_LIST HOST_FILE 0
 i = 0
 While
     Filereadln HOST_LIST LIST_LINE
 
    ;;ファイル読み込みの終了処理
     If result = 1 Break
 
    ;; 空白行を無視する
     Strlen LIST_LINE
     If result = 0 continue
 
    ;; 「#」から始まる行をコメントとして無視
     Strmatch LIST_LINE '^#'
     If result &amp;lt;&amp;gt; 0 continue
 
    ;;ホストに関する情報を各変数へ代入する
     Strsplit LIST_LINE ','
     HOST_NAME[i]      = Groupmatchstr1
     HOST_IP[i]        = Groupmatchstr2
     KEY_FILE[i]       = Groupmatchstr3
     HOST_ROOT_USER[i] = Groupmatchstr4
     HOST_ROOT_PASS[i] = Groupmatchstr5
     HOST_USER[i]      = Groupmatchstr6
     HOST_PASS[i]      = Groupmatchstr7
     HOST_SUDO_FLAG[i] = Groupmatchstr8
 
     i=i+1
 Endwhile
 
;; ホスト選択画面を表示させる
 listbox 'ログインするホストを選択してください' 'ホスト選択' HOST_NAME
 
;;-------------------------------------------------------
;; 選択されたホストにログインを行う
;;-------------------------------------------------------
;; ホスト選択画面で選択されたホストの情報を変数に代入する
 If result &amp;gt;= 0 then
     HOST_CONNECT_NAME      = HOST_NAME[result]
     HOST_CONNECT_IP        = HOST_IP[result]
     HOST_CONNECT_KEY_FILE  = KEY_FILE[result]
     HOST_CONNECT_ROOT_USER = HOST_ROOT_USER[result]
     HOST_CONNECT_ROOT_PASS = HOST_ROOT_PASS[result]
     HOST_CONNECT_USER      = HOST_USER[result]
     HOST_CONNECT_PASS      = HOST_PASS[result]
     HOST_CONNECT_SUDO_FLAG = HOST_SUDO_FLAG[result]
 Else
     End
 Endif
 
;; ログイン用のユーザーが定義されているか確認する
 Strlen HOST_CONNECT_USER
 If result &amp;lt;&amp;gt; 0 Then
     SSH_CONNECT_USER        = HOST_CONNECT_USER
     SSH_CONNECT_PASS        = HOST_CONNECT_PASS
 Else
     SSH_CONNECT_USER        = HOST_CONNECT_ROOT_USER
     SSH_CONNECT_PASS        = HOST_CONNECT_ROOT_PASS
 Endif
 
;; SSH接続コマンドを作成する
 COMMAND = HOST_CONNECT_IP
 Strconcat COMMAND ':22 /ssh /2 /user='
 Strconcat COMMAND SSH_CONNECT_USER
 
 Strlen SSH_CONNECT_PASS
 If result &amp;lt;&amp;gt; 0 Then
     Strconcat COMMAND ' /passwd='
     Strconcat COMMAND SSH_CONNECT_PASS
 Endif
 
 Strlen HOST_CONNECT_KEY_FILE
 If result &amp;lt;&amp;gt; 0 Then
     Strconcat COMMAND ' /auth=publickey'
     Strconcat COMMAND ' /keyfile='
     Strconcat COMMAND HOST_CONNECT_KEY_FILE
 Else
     Strconcat COMMAND ' /auth=password'
 Endif
 
 
;; SSH接続を行う
 Connect COMMAND
 
;;-------------------------------------------------------
;; ログの記録を開始する
;;-------------------------------------------------------
;; ログ名に利用する日付情報を取得する
 Getdate Str_Getdate
 Strcopy Str_Getdate 1 4 Str_Year
 Strcopy Str_Getdate 6 2 Str_Mon
 Strcopy Str_Getdate 9 2 Str_Day
 
;; ログ名に利用する時刻情報を取得する
 Gettime Str_Gettime
 Strcopy Str_Gettime 1 2 Str_Hour
 Strcopy Str_Gettime 4 2 Str_Min
 Strcopy Str_Gettime 7 2 Str_Sec
 
;; ログ名を生成する
 LOG_PATH = LOG_DIR_PATH
 Strconcat LOG_PATH Str_Year
 Strconcat LOG_PATH Str_Mon
 Strconcat LOG_PATH Str_Day
 Strconcat LOG_PATH '_'
 Strconcat LOG_PATH Str_Hour
 Strconcat LOG_PATH Str_Min
 Strconcat LOG_PATH Str_Sec
 Strconcat LOG_PATH '_'
 Strconcat LOG_PATH HOST_CONNECT_NAME
 Strconcat LOG_PATH '.log'
 
;; 現在記録しているログの情報を取得する
 Loginfo NOW_LOG_PATH
 
;; 現在ログが記録されていた場合、マクロで規定したフォルダに移動する
 If result &amp;lt;&amp;gt; -1 Then
     ;; 一度ログの記録を停止する
      Logclose
 
     ;; 取得されていたログをマクロで規定した場所にコピーする
      Filecopy NOW_LOG_PATH LOG_PATH
 
     ;; 取得されていたログを削除する
      Filedelete NOW_LOG_PATH
 Endif
 
;; ログの記録を開始する
 Logopen LOG_PATH 0 1 1 1
 
;;-------------------------------------------------------
;; Command.listの内容を実行させる
;;-------------------------------------------------------
;; host.listでログインユーザの設定がされていたか確認する
 Strlen HOST_CONNECT_USER
 If result &amp;lt;&amp;gt; 0 Then
      Wait '$' '#'
      Sendln ''
 
      Wait '$' '#'
      Sendln '#rootユーザーにスイッチする'
 
     ;; 「sudo su -」でスイッチする必要がある場合
      Strlen HOST_CONNECT_SUDO_FLAG
      If Result &amp;gt; 0 Then
          Wait '$' '#'
          Sendln 'sudo su -'
 
          Wait ':'
          Sendln SSH_CONNECT_PASS
      Else
          Wait '$' '#'
          Sendln 'su -'
 
          Wait ':'
          Sendln HOST_CONNECT_ROOT_PASS
      Endif
 Endif
 Wait '$' '#'
 Sendln ''
 
;; Command.listを読み込む
 Fileopen COMMAND_LIST COMMAND_FILE 0
 While 1
      Filereadln COMMAND_LIST COMMAND_LIST_LINE
      If RESULT = 1 Break
 
      Flushrecv
      Wait '$' '#'
      Sendln COMMAND_LIST_LINE
 Endwhile
 Fileclose COMMAND_LIST
End

2.host.list

host.listについては、Pythonスクリプトと同じものを使用するので割愛。
command.listについても改修前のものをそのまま使用する。

たった2日でわかるLinuxサーバーCentOS7.0対応 たった2日でわかるLinuxサーバーCentOS7.0対応

Windows(PowerShell)でプログラムをnohupのようにバックグラウンド実行させる

$
0
0

だいぶ前に、Windows上でnohupのようにプログラムをバックグラウンド実行させられないか調べた事があった。
Windowsでnohup相当の処理を行わせるには、『-AsJob』パラメーターを利用するか、PowerShellに用意されている『Start-Job』コマンドを利用する。
コマンドによっては「-AsJob」はサポートしていないので、基本的に『Start-Job』で対応する事が多そうだ。

Start-Jobコマンドは、基本的に以下のように実行する。

Start-Job -ScriptBlock { 実行コマンド }

もしくは

Start-Job { & 実行コマンド }

 

Windows PowerShell実践システム管理ガイド 第2版 Windows PowerShell実践システム管理ガイド 第2版

PowerShellでリストボックスを使ったリモートデスクトップ(RDP)自動接続スクリプト

$
0
0

今までに、SSHでの選択型の自動ログインについてはTeratermマクロPythonのスクリプトを作ってみたりしたが、そういえばRDPの接続ではやってないなぁ…
と思ったので、簡素なものではあるがPowerShellで作ってみた。

まぁ、転職するので今後Windowsサーバを仕事で使うことがあるのやら不明だけど。
次のクライアントMacだし。

作りは、ホストのIPアドレスやらユーザ、パスワードを記述した「host.list」とスクリプト本体である「RDP_CONNECT.ps1」の2つ。
同じディレクトリ配下においておく。

1.host.list

「host.list」については、今まで書いたTeratermマクロなどと同じく、以下のようにカンマ区切りで作成している。
Azureなどへの接続でポート番号を指定する必要がある場合は、IPアドレスの後ろに普通に記述する。

●host.list

# HOST_NAME, HOST_IP, HOST_USER, HOST_PASS
テスト1,172.28.0.1,test,test
テスト2,172.28.0.2,test,test
テスト3,172.28.0.3,test,test
テスト4,172.28.0.4:4444,test,test
テスト5,172.28.0.5,test,test
テスト6,172.28.0.6:6666,test,test
テスト7,172.28.0.7,test,test

2.RDP_CONNECT.ps1

スクリプト本体。
リストボックスの作成部分についてはこちらを参考に、RDPの接続部分についてはこれをまんま使った。

●RDP_CONNECT.ps1

################
# - Function - #
################
function ListBox($FOREACH_HOST_LIST)
{
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "RDP自動接続"
    $objForm.Size = New-Object System.Drawing.Size(300,200)
    $objForm.StartPosition = "CenterScreen"

    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
        {$x=$objListBox.SelectedIndex;$objForm.Close()}})
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
        {$objForm.Close()}})

    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$x=$objListBox.SelectedIndex;$objForm.Close()})
    $objForm.Controls.Add($OKButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(150,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click({$objForm.Close()})
    $objForm.Controls.Add($CancelButton)

    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(10,20)
    $objLabel.Size = New-Object System.Drawing.Size(280,20)
    $objLabel.Text = "接続先のコンピュータを選択してください:"
    $objForm.Controls.Add($objLabel) 

    $objListBox = New-Object System.Windows.Forms.ListBox
    $objListBox.Location = New-Object System.Drawing.Size(10,40)
    $objListBox.Size = New-Object System.Drawing.Size(260,20)
    $objListBox.Height = 80

    Foreach($i in $FOREACH_HOST_LIST) {
        [void] $objListBox.Items.Add($i)
        }

    $objForm.Controls.Add($objListBox)
    $objForm.Topmost = $True
    $objForm.Add_Shown({$objForm.Activate()})
    [void] $objForm.ShowDialog()

    $x
    }

function RDPConnect($CONNECT_IP, $CONNECT_USER, $CONNECT_PASS)
{
    # Cmdkey用に、接続先情報にポート番号が指定されている場合は除外する
    $CMDKEY_CONNECT_IP = $CONNECT_IP | %{ $_.Split(":")[0]}

    Cmdkey.exe /generic:TERMSRV/"$CMDKEY_CONNECT_IP" /user:"$CONNECT_USER" /pass:"$CONNECT_PASS"
    Start mstsc /v:$CONNECT_IP
    Timeout 5
    Cmdkey.exe /delete:TERMSRV/$CMDKEY_CONNECT_IP
}

############
# - Main - #
############

# 『host.list』PATH取得
$SCRIPT_PATH = Split-Path $myInvocation.MyCommand.path
$LIST_FILE = Join-Path $SCRIPT_PATH "host.list"

# 空配列の作成
$HOST_NAME_LIST = @()
$HOST_IP_LIST   = @()
$HOST_USER_LIST = @()
$HOST_PASS_LIST = @()

# 『host.list』読込み
Foreach ($i in Get-Content $LIST_FILE) {
    # 空行・コメント行を無視する
    If (($i -eq "") -Or ($i.substring(0,1) -eq "#")) {
        Continue
        }

    # 変数へ代入
    $HOST_NAME      = $i | %{ $_.Split(",")[0]}
    $HOST_IP        = $i | %{ $_.Split(",")[1]}
    $HOST_USER      = $i | %{ $_.Split(",")[2]}
    $HOST_PASS      = $i | %{ $_.Split(",")[3]}

    # 配列へ代入
    $HOST_NAME_LIST = $HOST_NAME_LIST + $HOST_NAME
    $HOST_IP_LIST   = $HOST_IP_LIST + $HOST_IP
    $HOST_USER_LIST = $HOST_USER_LIST + $HOST_USER
    $HOST_PASS_LIST = $HOST_PASS_LIST + $HOST_PASS
    }

# リストボックスを呼び出し、SeletedIndexを取得する
$SELECT_INDEX_NO = ListBox($HOST_NAME_LIST)

# 何も選択しなかった場合は処理を終了する
If ($SELECT_INDEX_NO -eq $null) {
    exit
    }

# RDP接続を行う
RDPConnect $HOST_IP_LIST[$SELECT_INDEX_NO] `
           $HOST_USER_LIST[$SELECT_INDEX_NO] `
           $HOST_PASS_LIST[$SELECT_INDEX_NO]

 

念のため、ファイルはここにあげておいた。

動くサンプルで学べる Windows PowerShell コマンド&スクリプティングガイド PowerShell 4.0対応 動くサンプルで学べる Windows PowerShell コマンド&スクリプティングガイド PowerShell 4.0対応

WindowsでLinux/UNIXのtouchコマンド相当(0Byteのファイル作成)の処理

$
0
0

Windowsでサンプルファイル(0Byteのファイルを20個くらい)を作成する事になったので、Linuxでいうtouchコマンドに当たるコマンドについて調べてみた。
といっても、別にタイムスタンプ変える事は考えず、単に空ファイル作成するだけなのだが。

コマンドプロンプトとPowerShell、それぞれで0Byteのファイルを作るコマンドは以下のようだ。

コマンドプロンプトで作成する

コマンドプロンプトで0Byteのファイルを作成する場合は、以下のようにnul(Linuxでいう/dev/null)をコピーして作成する方法がある。

copy nul 作成するファイル名(PATH)

20160116_000001

PowerShellで作成する

PowerShellで0Byteのファイルを作成する場合は、以下のように「New-Item」コマンドレットを用いる方法がある。

New-Item -ItemType file 作成するファイル名(PATH)

20160116_000002

 

後は、これらをfor文で回すだけだ。

 


【OS別】パスワード用文字列生成コマンド

$
0
0

最近、よくパスワードを新規で作成することがあったので、各OS別にパスワードに使えるランダムな文字列を生成してくれるコマンドを調べてみることにした。

1.Linux

RHEL/Debian系ともにpwgenコマンドでランダムなパスワード文字列が生成可能だ。
入ってない場合は、yum/apt-getでインストールできる。

オプション無しで実行すると、8桁の英数字を大量に出力してくれる。

pwgen
[root@test-node ~]# pwgen
XeituY4O ceeT0boo Taelu0oo EiKu3aev Oog6ma0u Vaedee0u wu7ri7Ah Ithee6Zu
hai3ThiP Book4she ea2Choa0 hohz5Oor ra3Tepee aikoQu0U Aib8Peel aiW7oobi
gaeBa8qu io9Eighu ief3UaXe aihi0Fei zaeNg6ie ahKow9ze Hif5lo2j Iu7aicee
Ohghae7e eel6uuLo lei2Oewo ahoP2wei wiejeeP5 EGhi8shi aecaiN4a cieZaex2
Chak7yei Iod3wieX ia4TeiV2 Tewey9za quai9uuJ aish9ooR EipahPh0 vec3Roon
ieNga5pu aezuoc6D thirei2O seleeW5n ood9pohD lees2Sae Chei9Ahg hoh5ahXa
aiche4Ei au7Oi5so wah4uk0I IePh0Aet bieR5aeG iuquai6O sohfeiB3 ue2raiBu
aeGaeP6s io0haeC1 PhooDe6k ceiR4shi Fea8Aiwa TeiD6cha za1Lootu eiGha4wi
Maa5leeR ooCh5uno iuF6Peix aedaev6H Rah6ieY4 ooth4Bai ooz2Ohka qui6Eech
IePh0Euj ohxahR0m ooraiVi7 oh1cei2O paike6Ch ca7Thaim aiXie1wo AhCh1Ohz
mieShuy7 Ier6rae3 mie9aeX5 Muubie1c Aechait3 Eph1shoo wu8haeSh huiP5Rie
da1Jaewa ma4ugh4S xainee4B Eec7iero Aihae5ch Mooc8aem phoo8Eer Yoocoo9x
Aipeig8b eiWahb2I ahp8ReiD vie8ooPi Ohph4cuD Ac9neiTe uW1ohw0m Aepi7mee
Thohg6eo Aij0aixi xeech6UP Aht9iech cho6aiDi Ja4juoJ3 iShuqu5p Ohtei7tu
sheeKet9 yoKa6pee iG0quu5u yi5eiBus lee8keeK eiMeim6a ho2Iv3ai xuzeiR7y
Ulee2pah em3Toigh Uhi5okie Oomei1ul quieTh2A kauB1aiC Aifaeya5 evu2gi6O
xo5Zaiki yahD6pu3 raY1ne2c Kie6quoc Lah0ogh8 iMoo5iex ASh8quee ae2ey2Vo
iez4zeiF oar6ieTo Laup1Gee phuD6Cho Yoese2ea Eefe7sai ie9Eije8 iph2Shuo
pheheeT5 yae8Aiv5 Ahsil0Af Ahlooc1e cheV6ohs RahPhei0 jeYo6vef Iev0Uan6
ieKee8de AeS7sai6 eingaeN2 Aengae3U Ju5jah4u aiW9ai2d Ahfae3oo sho1Aimo

 

これだと少々扱いにくいので、引数や以下のようなオプションを組み合わせてパスワードを生成すると良いだろう。

pwgen パスワード桁数 出力個数
  • -y … 記号付きパスワードを生成する
  • -0 … パスワードに数字を含めない
  • -A … 大文字無しにする
  • -s … 完全にランダムな文字列を生成する

 

強度の高いパスワードを生成するなら、以下のようにコマンドを実行すると良いだろう。

[root@test-node ~]# pwgen 16 1 -sy
$.h8cdQ05y="BYH~
pwgen 16 1 -ys

2.MacOS X

MacOS Xでも、Linux同様pwgenコマンドが利用出来る。
利用方法は同一のため割愛する。

 

3.Windows

Windowsでパスワードを自動生成する場合は、どうもスマートなコマンドが無いようだ。
なのでこちらを参考に、以下のようにPowerShellで実行すると良いだろう。

Add-Type -AssemblyName System.Web;[System.Web.Security.Membership]::GeneratePassword(パスワード桁数,$specialchar)
PS C:\Users\USER> Add-Type -AssemblyName System.Web;[System.Web.Security.Membership]::GeneratePassword(8,$specialchar)
r]ln0NJA

 

パスワード解析 完全版 パスワード解析 完全版

PowerShellからDatadogにイベントを通知する

$
0
0

LinuxのコンソールなどからコマンドでDatadogのDashboardとかを編集したり、イベントの通知をする場合はDatadogpyなどを用いれば良いのだが、Windows Server上からコマンドで実行させたい事があった。
で、結論としてはDatadogではRestAPIが用意されているので、PowerShellでそれ経由で処理させれば良い。

●datadog-sample.ps1

# ----------------------
# Datadog Powershellイベント通知スクリプト(Sample)
# ----------------------

$url_base = "https://app.datadoghq.com/"
$api_key = 'APIキー'
$app_key = 'APPキー'

$http_method = "POST"
$url_signature = "api/v1/events"
$currenttime = (Get-Date -date ((get-date).ToUniversalTime()) -UFormat %s) -Replace("[,\.]\d*", "")
$parameters = "{
    `"title`":`"PowerShell テスト`",
    `"text`":`"PowerShellでのDatadog通知テスト`",
    `"priority`": `"normal`",
    `"alert_type`": `"warning`"
    }"

$url = $url_base + $url_signature + "?api_key=$api_key" + "&" + "application_key=$app_key"
$http_request = New-Object -ComObject Msxml2.XMLHTTP
$http_request.open($http_method, $url, $false)
$http_request.setRequestHeader("Content-type", "application/json")
$http_request.setRequestHeader("Connection", "close")
$http_request.send($parameters)
$http_request.status
$http_request.responseText

 

イベント以外もRestAPIから操作可能なので、bashなどのサンプルを参考にPowerShellに書き直していけば良い。

Windows PowerShell逆引きハンドブック Windows PowerShell逆引きハンドブック

PowerShellでAzure Blob StorageのSnapshotを取得する

$
0
0

仕事でAzure Blob Storageをいじってるのだけど、ポータル画面からだとスナップショットの取得ができなそうなので、PowerShellから取ってみる事にした。

残念ながら、コンテナ単位でSnapshotを取得する事は出来ないようで、オブジェクト単位での取得をする必要があるようだ。

# Blob Storageに関する情報
# StorageAccountName: Blobアカウント名
# StorageAccountKey : Blobアクセスキー
# ContainerName : Blobコンテナ名
# BlobName : Blob名
$StorageAccountName = "Blobアカウント名"
$StorageAccountKey = "Blobアクセスキー=="
$ContainerName = "コンテナ名"
$Ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey

# コンテナ情報を取得する
$BlobsContainer = Get-AzureStorageBlob -Context $Ctx -Container $ContainerName

# foreachでコンテナ内の必要なBlob(今回はvhd)に対しスナップショットを取得する
foreach($Blob in $BlobsContainer) {
    if((!$Blob.ICloudBlob.IsSnapshot) -and ($Blob.Name.EndsWith("vhd"))){
        # スナップショットの取得を行う
        $snap = $blob.ICloudBlob.CreateSnapshot()
        # 指定したBlobのスナップショットを確認する
        Get-AzureStorageBlob –Context $Ctx -Prefix $Blob.Name -Container $ContainerName  | Where-Object  { $_.ICloudBlob.IsSnapshot -and $_.Name -eq $Blob.Name }
    }
}

 

スナップショットの取得条件は環境に合わせて書き換えてもらえれば良いだろう。

 

Windows PowerShellクックブック Windows PowerShellクックブック

Proxmox VE 4.1上の仮想マシンにVirtIO Driverを適用してみた ~Windows 10編~

$
0
0

以前、Proxmox VE 3.1でWindows 7に対して行った処理だが、Proxmox VE 4.1上にWindows 10を入れたので同様の方法でVirtIO Driverを適用していく。
VirtIO Driverは、乱暴な言い方をしてしまえばKVM用のVMware Toolsのようなもので、仮想マシンにインストールすることでパフォーマンスを改善したりすることができるものだ。

まずはISOファイルのダウンロード。
以下からダウンロードしてくる。

ダウンロードしてきたISOファイルを、対象の仮想マシンが読み込めるストレージに上げる。
アップロードの流れは前回と同じなので割愛。

ISOファイルアップロード後、ディスプレイを「Spice」、NICを「VirtIO」に切り替え、ISOファイルをマウントさせてVMを起動させる。

20160508_154036000000

 

これでVirtIO Driverの適用が完了。
相変わらず手順が面倒だけど、まぁいいか。

Microsoft Windows 10 Home (32bit/64bit 日本語版) [オンラインコード]【新価格版】 Microsoft Windows 10 Home (32bit/64bit 日本語版) [オンラインコード]【新価格版】

Windows 10で「デスクトップの背景として設定」を右クリックメニュー(コンテキストメニュー)から削除する

$
0
0

家のPCをWindows 10に切り替えたので、Windows 7/8.1などでもやっていた画像ファイルを右クリックした時に出てくるメニューから「デスクトップの背景として設定」を削除する設定を行うことにした。

20160508_172238000001

 

1.コマンドプロンプトから設定する

コマンドプロンプトからregコマンドを利用して設定する場合、以下のコマンドを実行してやればよい。

reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.bmp\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.dib\Shell\setdesktopwallpaper  /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.gif\Shell\setdesktopwallpaper  /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.jfif\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.jpe\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.jpeg\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.jpg\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.png\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.tif\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.tiff\Shell\setdesktopwallpaper /f
reg delete HKEY_CLASSES_ROOT\SystemFileAssociations\.wdp\Shell\setdesktopwallpaper /f

2.レジストリエディタから設定する

レジストリエディタから操作する場合は、以下のキーを削除してやれば良い。

HKEY_CLASSES_ROOT\SystemFileAssociations\.bmp\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.dib\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.gif\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.jfif\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.jpe\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.jpeg\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.jpg\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.png\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.tif\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.tiff\Shell\setdesktopwallpaper
HKEY_CLASSES_ROOT\SystemFileAssociations\.wdp\Shell\setdesktopwallpaper

 

20160508_172630000001

どちらの方法でも、メニューから削除できる。

 

Microsoft Windows 10 Home (32bit/64bit 日本語版 USBフラッシュドライブ)【旧価格版】 Microsoft Windows 10 Home (32bit/64bit 日本語版 USBフラッシュドライブ)【旧価格版】
Viewing all 50 articles
Browse latest View live