CentOS7 on Hyper-V

Hyper-V on Window10 にCentOS7をインストールした際の作業記録です。

Hyper-V は Windows10 Pro に実装されているものを使用。
・Windows 10 Pro 64bit(10.0.17763 N/A ビルド 17763)
・Core i7-6700HQ、RAM 8,066MB

CentOS7はminimal(http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso)をインストール。


Hyper-Vの有効化(https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v


Hyper-Vマネージャーの起動。

virtmgmt.msc

以下のスペックで仮想マシンを作成。
・第一世代の仮想マシン
・起動メモリ:2048MB(動的メモリ使用)
・ネットワーク:外部ネットワークに接続する仮想スイッチをバインド
・vCPU:2個
・vhdx:64GByte


CentOS7 の .iso を仮想マシンのDVDにマウントし、PowerON。

「Install CentOS7」を選択。


起動中。。。


インストール時に使用する言語に「日本語」を選択し、「続行」。


「!」のついた項目の設定を済ませてね、ということなので、「インストール先(自動パーティションが選択されました)」をクリック。


インストール先ですが、今回はデフォルトのままで。(ディスクは sda で「パーティションを自動構成」)
「完了」をクリック。


「インストールの開始」をクリック。


「ROOTパスワード」の設定と、「ユーザーの作成」を実施。


root のパスワードを設定。
強度が弱いと怒られたけれど、今回はそのまま続行。。。(登録するには「完了」を2回押せ、とのこと・・・)


ユーザーの作成。
今回は、「このユーザーを管理者にする」にもチェック。
チェックすることで、wheel group に登録される。(https://developers.redhat.com/blog/2018/08/15/how-to-enable-sudo-on-rhel/

ちなみに、ユーザー名は32文字以下でspaceを含むことはできない(https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-configuration-progress-menu-x86#sect-account-configuration-user-x86


(そうこうしてるうちに、インストール初期プロセスが終了しているはずなので)「設定完了」をクリック。


後続の設定中。。。


完了しました! とのことなので、「再起動」をクリック。


再起動後(途中でインタラプトしなければ)、ログイン画面が表示されます。

インストール中に作成したユーザでログイン。
(rootでログインしてもいいのだけれど。。)


su – して root ユーザになってみる。


今回はここまでとなります。
ネットワーク等の初期設定は、また備忘録します。





OpenVAS on Kali Linux

OpenVASをKali Linux にインストールして使ってみた際の作業記録です。(2019.4.1 時点)

OpenVAS (http://openvas.org/) – Open Vulnerability Assessment System は、オープンソースの脆弱性評価システムで、Greenbone Networks(https://www.greenbone.net/en/)によって開発・保守されており、GNU GPLの下で、オープンソースとしてコミュニティに提供されています。
2019.4現在、50,000を超える脆弱性テスト(NVTs : Network Vulnerability Tests )がGreenbone Community Feed (GCF) –https://community.greenbone.net/t/about-greenbone-community-feed-gcf/1224 – から提供されています。


!脆弱性診断は疑似攻撃でもあります。第三者の管理する機器やサイトを対象にした場合、不正アクセス禁止法に抵触する場合もありますので、ご注意を。


Kali Linux の導入については、以前の備忘録(http://miz.blue/kali-linux-2019-1a/)を参照ください。


Kali のマニュアル(https://www.kali.org/penetration-testing/openvas-vulnerability-scanning/) を参考に、apt-get でインストール。

# apt-get update
# apt-get dist-upgrade

# apt-get install openvas

インストールが終了したら、セットアップを実行

# openvas-setup

セットアップと共に、最新のモジュールや Network Vulnerability Tests (NVTs) のアップデートが実行されます。
・・・しばらく、時間がかかります。。


セットアップの終了間際に、サービスが起動されます。


setup が終了すれば、サービスが起動するので、そのまま使用できる(はず)。
動作しない場合は、openvas-check-setup で確認を。

セットアップの状態を確認するコマンド。

# openvas-check-setup

確認結果が出力されますので、ErrorやWarning、Suggestがあれば、対応しておきましょう。


その他のOpenVASコマンド。

# openvas-feed-update
# openvas-start
# openvas-stop


ブラウザから、https://127.0.0.1:9392 にアクセス。
(httpsなので、ブラウザによっては証明書の警告が出るけれども、気にせず接続)
※ default では、127.0.0.1 からのアクセスのみ許可されています。外部のブラウザから接続する場合は ↓ うまくいかない。。。

# vim /etc/default/greenbone-security-assistant
# The address the Greenbone Security Assistant will listen on.
#GSA_ADDRESS=127.0.0.1
GSA_ADDRESS=0.0.0.0

以前は(OpenVAS 7 あたり)これで期待する動作をしたのですが、今回は、この設定で openvas-stop/start しても、listen が 127.0.0.1 のままで、どうやっても反映されなかったので、あきらめました。。
ローカルブラウザから https://127.0.0.1:9392 します。。。


Username = admin
なのだけれども、パスワードが不明・・・
(Password = admin もダメだった)
(OpenVAS8 の時は、openvas-setup 実行時のログに、adminのパスワードが表示されていたのだけれども。。。今回のセットアップログからは、発見できず。。。)

以下のコマンドで、admin のパスワードを再設定。

# openvasmd --user=admin --new-password=new_password

ログインすると、ダッシュボード画面が表示されます。


画面上方の「Scans」をクリック。

Scans画面左上の「★」をマウスオーバーして、「New Task」を選択。
(もしくは、★の左横にある、魔法の杖のようなマーク:Task Wizard でも)


「New Task」画面内で、「Scan Targets」を新規登録。(上から3行目、「★」をクリックで、新規ターゲット設定画面に遷移します。IP or ホストネームを登録)


タスクが登録されます。

画面右、Actions欄にある「▶(Start)」をクリックすると、タスクがアクティブになります。
しばらくすると、タスク(診断)が終了。


診断が終了したところ。 左から2列目、Status が Done に。(診断中は、Inprogressで進捗状況が % 表示される)


Doneをクリックすると、観測結果が表示されます。
今回の例では、OpenVAS の脆弱性が観測されました。


脆弱性をクリックすると、詳細や解決策が表示されます。

OpenVASのログインIDとパスワードがdefault value のため、変えなさい、との事。。。
・・・はい、変えさせて頂きます。。。


こんな具合で、脆弱性の診断が行えます。

今回の備忘録は以上です。


Kali Linux 2019.1a

Kali Linux 2019.1a をインストールした際の作業記録です。

Kali Linux (https://www.kali.org/) はペネトレーションテスト(penetration testing:侵入テスト)とセキュリティ監査(security auditing)に特化して作成されたDebianベースのLinuxディストリビューション。

https://docs.kali.org/introduction/what-is-kali-linux

Windows10 Pro(64bit)上のHyper-V(バージョン1809,OSビルド17763.379)に、RAM 2048MByte(動的メモリ有効)、vCPU x 2個 の仮想マシンを作成して、Kali Linuxをインストール。


Kali Linux の .iso を下記からダウンロード。

https://www.kali.org/downloads/

今回は、Kali Linux 64 Bit(Version 2019.1a)を使用。


ダウンロードした .iso を仮想マシンのDVDドライブに挿入して、起動。


Install を選択。


今回は、インストール中に使用する言語を日本語に。


場所は、日本を選択。


キーボードも、日本語。



ホスト名を入力


今回は、ドメイン名は空白で。


root のパスワードを設定。


パーティションの設定。今回は「ディスク全体」を指定。


すべてのファイルを1つのパーティションに。


書き込みを実行。



今回は、ネットワークミラーは使用しない。


MBRにGRUBをインストール。


/dev/sda にブートローダーをインストール。




インストールが完了後、再起動します。そのままインタラプトしなければ、ブートアップ > ログイン画面が表示されます。

root でログイン。


デスクトップ左端の「端末」をクリックして、Terminalを起動。


ネットワークの設定。

デフォルトではDHCPの設定になっているので、下記を参考に、適宜修正。

https://kali.training/topic/configuring-the-network/

https://www.debian.org/doc/manuals/debian-reference/ch05.ja.html


Kali のドキュメント(https://docs.kali.org/documentation)に従い、apt のソースリポジトリを追加します。
(インストール直後の状態だと、/etc/apt/sources.list には有効なエントリーなし)

# vim /etc/apt/sources.list

下記2行を追加。

deb http://http.kali.org/kali kali-rolling main non-free contrib
deb-src http://http.kali.org/kali kali-rolling main non-free contrib

最新の環境にアップグレード

# apt-get update
# apt-get dist-upgrade

・・・しばらくかかる。。。


不要なパッケージを削除。

# apt autoremove

NTPが起動していなかったので、NICTさんの公開NTPサーバー( ntp.nict.jp )と同期するようにして、サービスを開始。

NICT公開NTP FAQ (http://jjy.nict.go.jp/tsp/PubNtp/qa.html)

# vim /etc/ntp.conf

次の行を追加

pool ntp.nict.jp

NTPサービスを起動、OS起動時に自動起動。

# systemctl start ntp
# systemctl enable ntp

確認。

# systemctl status ntp
# ntpq -p

今回は以上となります。




OneDrive for Business に robocopy でバックアップ

OneDrive for Business 上の個人領域に、robocopyでバックアップを定期的に作成してみようと試行錯誤した際の備忘録です。


 一般的なOneDrive for Businessは、ローカルPC上の任意のフォルダ/ファイルを自動的にOneDrive for Business側に同期してくれるみたい(今回初めて利用するので、よくわかってないのですが・・・)なので、本来こんな仕組みは要らないんでは、とも思いますが、いまの仕事で利用しているOneDrive for Business(というかWindows10)には、PC側にOneDrive for Business同期アプリ(groove.exe or onedrive .exe )がインストールされていない(入れてもいけない・・・)ので、都度、手作業でアップロードしています。

 OneDrive側にバックアップを保存するときに、毎度GUIでドラッグもなんなので、robocopy で自動化できないかな、と。

実際に試してみたところ、まあ、動作するにはしたのですが、

  • robocopy /MIR が、常にフルコピーになってしまう。(差分コピーしてくれない・・・。でも /purge は機能する)
  • robocopy /Z が使えない(エラーになる)。(OneDrive側の権限の問題、だと思う)
  • robocopy の実行前に、OneDrive for business にログインして「エクスプローラーで表示」をしないと、UNCパスとして扱えない。

の制限があることが判明しました。 とほほ。。
(/MIR が差分してくれない、のはおそらくOneDrive側のタイムスタンプの扱い – ブラウザからアップロードすると、もとのファイルのタイムスタンプが保持されなくて、アップロード時の日時に置き換わる – が影響しているのでは、と仮定したものの、原因が判明しなかったので、OneDrive相手に/MIRはできないものと割り切ることにしました)

/MIR で差分してくれないので、Dailyでフルバックアップ(・・/MIR がうまく動けば、こんなスクリプトにしなくても・・・)することに。
また、robocopyはUNCパスでないと扱えないので、毎度OneDrive側から「エクスプローラーで表示」をするのが必要で、自動化ってなんだっけ、、、なんですが、、

1)robocopy を Powershell スクリプト(.ps1) に記載して実行。
2).ps1 をWindowsのタスクスケジューラーに登録して、定期的に実行。

を実装して自動バックアップをすることにします。



手順ですが、

1) OneDrive for business の UNCパス を確認する。
ブラウザからログインすると、私の場合、下記のようなURL。

【URL】
https://hogehoge.sharepoint.com/personal/Your_Name/_layouts/20/onedrive.aspx

これをUNCパスで表現すると、以下のように。(ネットワークドライブにマウントすると、UNCパスが判明する)

【UNC】
\\hogehoge.sharepoint.com@SSL\DavWWWRoot\personal\Your_Name\Document

2)  OneDrive for business 側にバックアップ受け入れ用のフォルダを作成。
  例) 99.Backup

3)  PC側に .ps1 ファイル(ページ最下段にサンプルコード)を配置。
  例)D:\01.PSScripts\01.BackupToOneDrive.ps1

4) PC側にrobocopy実行時のログファイルを保管するフォルダを作成。
  例)D:\91.Robocopy_Log

5) .ps1 をタスクスケジューラーに登録。
  「ファイルを指定して実行」で「taskschd.msc」を起動して、新しいタスクを作成。
  タスクの「操作」には以下を指定。

【プログラム/スクリプト】
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

【引数の追加】
-ExecutionPolicy RemoteSigned -Windowstyle hidden -File D:\01.PSScripts\01.BackupToOneDrive.ps1

↑ -File で、.ps1 を配置した絶対パスを指定。

そのほか、タスクの「トリガー」や「条件」などは環境に併せて適宜。

スクリプト(.ps1)の中身は以下になります。
(robocopy の実行時に、日時の文字列を含んだバックアップフォルダーとログファイルを作成。 -> バックアップが終了したら、古いフォルダ/ログを削除、する流れです。OneDriveがUNCパスで確認できなかったら、その旨の警告をし、警告/確認に何回か失敗すると終了させるようにしてます)


###
### robocopyでOneDriveにフォルダ/ファイルをコピー
###
### STEP1 : robocopy オプションを変数で指定。
### STEP2 : robocopy の実行。 ターゲットのOneDriveがUNCパスとして認識されていなければ、警告 -> 5回後に終了。
### STEP3 : 古いバックアップフォルダー(OneDrive)とrobocopyのログ(ローカル)を削除。 


###########
###### Step1 : Define robocopy paramerters.
######

### コピー元の指定
$SrcDir = “D:\”
### $SrcDir = $env:USERPROFILE\Desktop

### コピー先の指定
$NowDate = Get-Date -Format “yyyyMMdd_HHmmss”
$OneDrive_Private = “\\hogehoge.sharepoint.com@SSL\DavWWWRoot\personal\Your_Name\Documents\”
$BKFolder = “99.Backup\”
$DstDir = $OneDrive_Private + $BKFolder + $NowDate

### コピー対象【外】のファイル/フォルダを指定
$ExcludeFiles = “desktop.ini”
$ExcludeDir = “`$RECYCLE.BIN”, “System Volume Information”, “91.Robocopy_Log”

### robocopy のログファイル
$LogDir = “D:\91.Robocopy_Log\”
$LogFile = $LogDir + ‘robocopy’ + ‘_’ + $NowDate + ‘.log’

### ファイルコピーに失敗した際のリトライ
$Retry = 2
$RetryWaitTime = 30

######
###### Step1: END
###########


###########
###### Step2 : Execute robocopy.
######

$Stoploop = $false
[int]$Retrycount = “0”
$STEP3 = $false

While ($Stoploop -eq $false) {
	### OneDriveのUNCパスを確認
	switch (Test-Path $OneDrive_Private) {
		### パスが確認できたら、robocopyを実行
		“True” {
			New-Item -ItemType Directory -Path $DstDir
			robocopy $SrcDir $DstDir /E /R:$Retry /W:$RetryWaitTime /XF $ExcludeFiles /XD $ExcludeDir /LOG:$LogFile /NP /Z
			$Stoploop = $true
			$STEP3 = $true
		}
		### UNCパスが確認できない場合、警告のポップアップを表示
		“False” {
			if ($Retrycount -gt 4) {
				### MessageBox の表示
				### MessageBox クラスを含む.NET Frameworkライブラリをロード(毎回は不要?)
				Add-Type -Assembly System.Windows.Forms
				$MBTitle = “(失敗)OneDriveへの自動バックアップ”
				$MBText1 = “OneDriveへの接続が確認できませんでした。”
				$MBText2 = “リトライに5回失敗したため、自動バックアップ処理を終了します。”
				$MBText3 = “(再度実行したい場合は、OS再起動をしてください)”
				[System.Windows.Forms.MessageBox]::Show(“$MBText1`n$MBText2`n$MBText3”, $MBTitle)
				Start-Sleep -Seconds 900 ### 900sec = 15min
				$Stoploop = $true
			}
			else {
				$Retrycount = $Retrycount + 1
				### MessageBox の表示
				### MessageBox クラスを含む.NET Frameworkライブラリをロード(毎回は不要?)
				Add-Type -Assembly System.Windows.Forms
				$MBTitle = “(失敗)OneDriveへの自動バックアップ”
				$MBText1 = “OneDriveへの接続が確認できませんでした。”
				$MBText2 = “自動バックアップをするには、OneDriveにログインして、「エクスプローラーで表示」を実行してください。”
				$MBText3 = ” はい : 15分後に再試行します。”
				$MBText4 = ” いいえ : 処理を停止します。”
				$MBInput = [System.Windows.Forms.MessageBox]::Show(“$MBText1`n$MBText2`n$MBText3`n$MBText4”, $MBTitle , “YesNo”)

				switch ($MBInput) {
						‘Yes’ {
						Start-Sleep -Seconds 900 ### 15分
						}
						‘No’ {
						$Stoploop = $true
						}
					}
				}
		}
	}
}

######
###### Step2 : END
###########


###########
###### Step3 : Delete an old robocopy-Logs, and BackUped Items on OneDrive.
######

$DeleteTime = “-14400”
### $DeleteTime = “-n”; n is minutes.
### 10日 = 14400 (= 60min * 24hour * 10days)

if ($STEP3 -eq $true) {
	Get-ChildItem $LogDir |
	Where-Object {
	$_.CreationTime -lt (Get-Date).AddMinutes($DeleteTime)
	} |
	foreach {
	Remove-Item -Recurse -Force $_.FullName
	}

	Get-ChildItem -Force -Path ($OneDrive_Private + $BKFolder) |
	Where-Object {
	$_.CreationTime -lt (Get-Date).AddMinutes($DeleteTime)
	} |
	foreach {
	Remove-Item -Recurse -Force $_.FullName
	}
	}
else {
exit
}

######
###### Step3 : END
###########

Windows Sysinternals

Windows Sysinternals  (https://technet.microsoft.com/ja-jp/sysinternals/bb842062.aspx)を忘れないように、備忘録です ^^;

このページには、Windows OS の運用・管理で役にたつMicrosoft製のツールがたくさん紹介されています。
このブログでも、 bginfo (http://miz.blue/bginfo/) を使った時の情報を記しましたが、bginfo以外にもこれらのツールを使ってみた際には、随時ここで備忘録したいと思います (^^)

 

 

Active Directory ユーザ(と移動フォルダなども一緒に)削除スクリプト

Active Directory のユーザと、移動プロファイルなどの関連するフォルダを併せて削除する用の PowerShell スクリプト を作成したので、その記録です。

以前の備忘録(ADユーザーの一括登録 その②) と対に作成したものです。

 


前回のADユーザ登録スクリプトでは .csv を読み込み 一括でユーザ作成するタイプでしたが、今回はユーザーのID( ↓ Name の部分)を入力して、1ユーザづつ削除するタイプのスクリプトにしてます。

 


 

ADユーザを削除する PowerShell スクリプト(.ps1)と、それを実行する用のショートカット(.ps1 を直接実行してもよいのですが、処理結果が流れてしまうので、-noexit で実行する) を 「C:\11.AD_User_Delete」 に設置。

 

ファイル 「01.~ 」 の ショートカットのリンク先は以下のようになってます。

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit C:\11.AD_User_Delete\11.AD-User-Delete.ps1

 


この 「01. ~」 を右クリックして 「管理者として実行」 すると、

↑ こんなふうにユーザIDの入力を求められるので、IDを入力すると削除処理が実行されます。
(個人フォルダ、移動プロファイル/フォルダリダイレクト ともに、ユーザIDから始まるフォルダ名になっているので、ここで入力された値をキーに削除処理を実行してます。)

 

削除の .ps1 の中身は以下です。
移動プロファイルの削除方法やパスなどはスクリプト内からご確認を。 ><

<###
 
    このスクリプトについて:
    
    ADユーザと関連するディレクトリを削除するスクリプトです。
 
    STEP001: 削除するユーザーのIDを入力。
    STEP002: 個人フォルダ、移動プロファイル、フォルダリダイレクト を削除
 
    【更新履歴】
    2016.10.21   新規作成   o'miz
 
###>
 
 
<###
    STEP 001. ADユーザ名の入力と該当ユーザの削除
###>
 
### ユーザ名の入力
$DeleteADUser = Read-Host "削除するユーザのIDを入力してください"
 
### 入力されたユーザーの存在確認。最初にNULLを代入しておく。一致するユーザがいたらそのIDを代入。
$ExistUser = $NULL
$ExistUser = Get-ADUser $DeleteADUser
 
### ユーザーIDが存在しなかった場合(NULL のままだったら)
if ($ExistUser -eq $NULL)
{
    Write-Warning "存在しないユーザIDです。 処理を中断します。"
    exit
 
### 存在した場合(NULLでなかったら)は Remove-ADUser を実行
}
else
{
    Write-Host ...
    Write-Host ...
    ### 削除の最終確認。
    $DeleteChoice = Read-Host "削除してよろしいですか?(y/n)"

    ### y or n で処理を分岐。(ちなみに Switch は 大文字/小文字を区別しません)
    Switch ($DeleteChoice) 
    {
        ### y が入力されたら削除を実行
        "y" 
        {
            Get-ADUser $DeleteADUser |
            Remove-ADUser -Confirm:$false
            
            Write-Host ...
            Write-Host ...
            Write-Host "$DeleteADUser を削除しました。" -ForegroundColor Cyan
            Write-Host "続いて個人フォルダとユーザープロファイルを削除します。" -ForegroundColor Cyan
        }
        ### n だったら処理を中止。
        "n" 
        {
            Write-Host ...
            Write-Host ...
            Write-Error "処理を中止します。"
            Exit
        }
        ### 上記以外の入力だったら。
        default
        {
            Write-Host ...
            Write-Host ...
            Write-Host "y / n のどちらでもないため、処理を中断します。"
            Exit        
        }
    }
}
 
 
 
<###
    STEP 002. 個人フォルダ、フォルダーリダイレクト、移動ユーザプロファイル の削除
###>
 
 
<### 
    STEP002-1. 個人フォルダの削除
###>

### 個人フォルダのパスを指定
$DeletePrivateFolder = "\\hogehoge.local\share\個人用フォルダ\$DeleteADUser"
 
### 個人フォルダが存在していたら Try を実行
if (Test-Path -Path $DeletePrivateFolder*) 
{
    ### 個人フォルダを Remove-Item
    Try 
    {
        Write-Host ...
        Write-Host ...
        Write-Host "個人フォルダ $DeletePrivateFolder を削除します。" -ForegroundColor Cyan
     
        Remove-Item $DeletePrivateFolder* -Recurse -Force -ErrorAction Stop

    ### 個人フォルダの Remove-Item に例外が発生したら Catch を実行 
    }
    Catch
    {
        Write-Host ...
        Write-Warning "個人フォルダ $DeletePrivateFolder の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で個人フォルダを削除してください。"
    }
 
### 個人フォルダが存在していなかったら。
}
else
{
    Write-Warning "個人フォルダが見つかりません。"
    Write-Warning "手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
 
}
 

<### 
    STEP002-2. 移動プロファイルの削除
###>

### 移動プロファイルのパスを指定
$DeleteUserProfile = "\\hogehoge.local\UserProfiles$\$DeleteADUser"+".V2"
 
### 移動プロファイルが存在していたら Try を実行
if (Test-Path -Path $DeleteUserProfile) 
{
    ### 移動プロファイルの所有権を Administrator にしてから Remove-Item
    Try 
    {
        Write-Host ...
        Write-Host ...
        Write-Host ("ユーザーの移動プロファイル $DeleteUserProfile を削除します。")  -ForegroundColor Cyan
 
        ### フォルダの所有権をAdministratorに変更
        ### takeown /f $DeleteUserProfile /a /r /d Y
        $Cmd_Takeown01 = "takeown.exe"
        $Args_Takeown01 = "/f $DeleteUserProfile /a /r /d Y"
        ### -Wait でコマンドの終了を待つ
        Start-Process $Cmd_Takeown01 $Args_Takeown01 -Wait

        ### Administrator にアクセス権を付与
        ### icacls $DeleteUserProfile /grant Administrators:F /t
        $Cmd_icacls01 = "icacls.exe"
        $Args_icacls01 = "$DeleteUserProfile /grant Administrators:F /t"
        ### -Wait でコマンドの終了を待つ
        Start-Process $Cmd_icacls01 $Args_icacls01 -Wait
 
        Remove-Item $DeleteUserProfile -Recurse -Force -ErrorAction Stop
     
    ### 移動プロファイルの Remove-Item で例外が出たら Catch を実行
    }
    Catch
    {
        Write-Host ...
        Write-Warning "ユーザーの移動プロファイル $DeleteUserProfile の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で削除してください。"
        Write-Host "続行するには何かキーを押してください..."
        [Console]::ReadKey() |
        Out-Null
    }  
}
else
{
    Write-Warning "移動プロファイルが見つかりませんでした。 手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
 
}
 
 
<### 
    STEP002-3. フォルダリダイレクトの削除
###>

### フォルダリダイレクトのパスを指定
$DeleteFolderRidirect = "\\hogehoge.local\FolderRedirect$\$DeleteADUser"
 
### フォルダリダイレクトが存在していたら Try を実行
if (Test-Path -Path $DeleteFolderRidirect) 
{
    ### Administrator に所有させてから Remove-Item
    Try 
    {
        Write-host ...
        Write-host ...
        Write-host ("ユーザーのプロファイル(フォルダリダイレクト) $DeleteFolderRidirect を削除します。") -ForegroundColor Cyan
 
        ### フォルダの所有権をAdministratorに変更
        ### takeown /f $DeleteFolderRidirect /a /r /d Y
        $Cmd_Takeown02 = "takeown.exe"
        $Args_Takeown02 = "/f $DeleteFolderRidirect /a /r /d Y"
        Start-Process $Cmd_Takeown02 $Args_Takeown02 -Wait

        ### Administrator にアクセス権を付与
        ### icacls $DeleteFolderRidirect /grant Administrators:F /t
        $Cmd_icacls02 = "icacls.exe"
        $Args_icacls02 = "$DeleteFolderRidirect /grant Administrators:F /t"
        Start-Process $Cmd_icacls02 $Args_icacls02 -Wait
 
        Remove-Item $DeleteFolderRidirect -Recurse -Force -ErrorAction Stop
 
    ### Remove-Item で例外が発生したら Catch を実行
    }
    Catch
    {
        Write-Host ...
        Write-Warning "ユーザーのプロファイル(フォルダリダイレクト) $DeleteFolderRidirect の削除に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error -ForegroundColor Red
        Write-Host "手動で削除してください。"
        Write-Host "続行するには何かキーを押してください..."
        [Console]::ReadKey() |
        Out-Null
    }
}
else
{
    Write-Warning "フォルダリダイレクトが見つかりませんでした。手動でフォルダ検索と削除を実行してください。"
    Write-Host "続行するには何かキーを押してください..."
    [Console]::ReadKey() |
    Out-Null
}

 

今回の備忘録は以上です。

 

 

Windows Update クライアントのリセット

WSUS 配下のクライアントPCのうちの1台(Windows Server 2012 R2)が、いつまでたっても報告を上げてこない & アップデートしない ようになってしまったので、Windows Update クライアントの情報をリセットした際の備忘録です。

とは言っても、technet ( Windows Update クライアントの情報をクリアにする手順 )に乗ってる手順をそのまんま実行したら治ったっていうだけなんですが。。。

wuauclt コマンドのオプションも気になったので、調べた結果も併せて備忘録します(最後のほうに)。

 


 

1) 自動更新サービスとBITSの停止

コマンドプロンプト or PowerShell を管理者権限で起動して、以下のコマンドを実行。

net stop wuauserv
net stop bits

 

 

2) Software Distribution フォルダーのリネーム

コマンドプロンプト を管理者権限で起動して、以下のコマンドを実行。

 ren %systemroot%\SoftwareDistribution SoftwareDistribution.old

※ PowerShell だと %systemroot% を理解してくれない・・・

↓ リネームされました。

ちなみに、各種ログもこのフォルダ配下にあるので、具合悪いときなどは中身を確認すると手がかりがあるかも。

 

3) BITS のジョブを削除

コマンドプロンプト を管理者権限で起動して、以下のコマンドを実行。

del %ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr0.dat
del %ALLUSERSPROFILE%\Microsoft\Network\Downloader\qmgr1.dat

↓ 削除する前はこんなんです。

 

 

4) 自動更新サービスとBITSの開始

net start bits
net start wuauserv

 

 

5) 更新プログラムの検出

 wuauclt /detectnow

 

これで目出度く治ってくれました。 ^^)

 


 

ところで、wuauclt コマンド(@2012R2)ってヘルプが出てこないので、どんなオプションが使えるのか気になったので調べてみました。

 strings.exe C:\Windows\System32\wuauclt.exe > C:\99.work\wuauclt_strings.txt && C:\99.work\wuauclt_strings.txt

strings.exe は Windows Sysinternals  から入手できます。

出力された .txt の中身をみる限り、下記のようなオプションがあるようです(オプションの説明はありませんが・・・)。

/DemoUI
/BeginInteractiveOSUpgrade
/InstallOSUpgrade
/IdleShutdownNow
/ShowOptions
/ShowCheckForUpdates
/ShowWUAutoScan
/UpdateNow
/SelfUpdateUnmanaged
/SelfUpdateManaged
/CloseWindowsUpdate
/ShowWindowsUpdate
/ShowWU
/ResetEulas
/ResetAuthorization
/ShowSettingsDialog
/RunHandlerComServer
/ReportNow
/DetectNow

 

今回の備忘録は以上です。

 

 

Active Directory ユーザーの一括登録 その②

前回の 備忘録 ( .csv ファイルにADユーザーの情報を記載して、PowerShell の New-ADUser コマンド で一括作成 ) の続きになります。

今回は、登録するユーザ用の個人フォルダを併せて作成したかったので、 New-ADUser した後に New-Item でフォルダを作成する PowerShell スクリプト にしました。

 


 

1)  ユーザ情報の入った .csv を 「 C:\99.work\new_user.csv 」 としてファイルを設置。( .csv の中身については、前回の備忘録 を参照ください。)
※ このあとのスクリプトを実行することで、new_user.csv は new_user-YYYYMMDD-HHMMSS.csv にリネームするようにしています。(残っちゃうと事故の元なので)

 

2)  スクリプト ( と実行用のショートカット ) を 「 C:\10.AD_User_Create\ 」 に置く。

↑ このフォルダの中身はこんなです。
00a. と 00b. はファイル名通りで、中身は 0 byte です。

ファイル「10.AD-User-Add.ps1」 が、 New-ADUser して New-Item して .csv をリネームする用のスクリプトファイル、

ファイル 「01.これを右クリックで管理者として実行すると10.が実行されます。」 は 「10.AD-User-Add.ps1」 を実行するためのショートカットで、 
ファイル名の通り、「01.~」 を右クリックして管理者として実行すると、「10.~」 が起動されて .csv に記載したユーザがADに登録されて、個人用フォルダが作成されます。

直接  「 10.~.ps1 」 を実行してもよいのですが、その場合処理結果が流れてしまう(画面が閉じてしまう)ので、powershell.exe から -noexit オプションで実行する様にショートカットを作成してます。

ファイル 「01.これを右クリックで管理者として実行すると10.が実行されます。」 の中身は、

ショートカットのリンク先は下記になります。

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit C:\10.AD_User_Create\10.AD-User-Add.ps1

 

 

「10.AD-User-Add.ps1」の中身は ↓ こんなんです。

 <###
    このスクリプトについて:
    .csv ファイルの情報を元に Active Directory のユーザを追加します。

    !事前に STEP 001 の .csv 作成を忘れずに!

    STEP 001 = なんとかして、.csv を作成
    STEP 002 = ADユーザの作成、個人フォルダの作成、.csv をリネームして保管

    【更新履歴】
      2016.10.14 新規作成 o'miz
###>


<###
    STEP 001. 【事前準備】登録するユーザーのリスト(*.csv)を作成します。

    作成したら、↓ ここに置いてください。

    C:\99.work\new_user.csv

###>



<###
    STEP 002. ADユーザーの作成と、個人フォルダの作成

    ※ ユーザーの初期パスワードは Himitsu@1234 です。

###>


### C:\99.work\new_user.csv の存在確認

$csv_path =  "C:\99.work\new_user.csv"
$csv_exist = (Test-Path -Path $csv_path)


### C:\99.work\new_user.csv が存在した場合は、ADユーザ作成 & 個人フォルダの作成を行う
if($csv_exist -eq $true) 
{

    ### 例外を catch するために $ErrorActionPreference自動変数の値を stop に設定
    $ErrorActionPreference = "stop"

    ### ADユーザー作成
    Try 
    {
        ### Get-Content でユーザ一覧の .csv ファイルを読み取って、
        Get-Content $csv_path |
        ### ConvertFrom-Csv に渡して、
        ConvertFrom-Csv |
        ### ForEach-Object(= % )で New-ADUserを繰り返し(.csv の末尾のエントリーまで)実行します。
        %
        {
        New-ADUser $_.Name -Surname $_.Surname -GivenName $_.GivenName -DisplayName $_.DisplayName -UserPrincipalName $_.UserPrincipalName -AccountPassword (ConvertTo-SecureString "Himitsu@1234" -AsPlainText -Force) -ProfilePath \\hogehoge.local\Profile$\UserProfiles$\%username% -Path "OU=test,DC=hogehoge,DC=local" -Enabled $true -ChangePasswordAtLogon $true -HomeDrive O: -HomeDirectory \\hogehoge.local\Share\共有フォルダ
        } |
        Out-Null

        Write-Output ""
        Write-Output "================================"
        Write-Output "下記のADユーザーを登録しました。"
        Write-Output ""
        Get-Content $csv_path |
        ConvertFrom-Csv |
        %
        {
        $_.Name + "    " + $_.DisplayName
        } |
        %
        {
        Write-Output "$_"
        }
    ### Try の処理が失敗したら。
    }
    Catch
    {
        Write-Output ""
        Write-Output "ユーザー作成に失敗しました。"
        ### 直前に発生した例外($Error[0])を表示
        Write-Host $Error
        Write-Output ""
        Exit
    }


    ### 個人フォルダの作成:
    ### .csv の Name と DisplayName を読み取って結合して、個人フォルダを作成
    Write-Output ""
    Write-Output ""
    Write-Output ""
    Write-Output "================================"
    Write-Output ""
    Write-Output "個人フォルダを作成します。"

    Get-Content $csv_path |
    ConvertFrom-Csv |
    %
    {
    $_.Name + "_" + $_.DisplayName
    } |
    %
    {
    New-Item "\\hogehoge.local\Share\共有フォルダ\$_" -type directory
    }


    ### new_user.csv をリネームします。
    ### 残っとくと紛らわしいので。

    ### 日付の取得
    $NowDate = Get-Date -Format "yyyyMMdd_HHmmss"

    Move-Item $csv_path C:\99.work\new_user-$NowDate.csv

    Write-Output ""
    Write-Output ""
    Write-Output ""
    Write-Output "================================"
    Write-Output ""
    Write-Output "C:\99.work\new_user.csv を C:\99.work\new_user-$NowDate.csv にリネームしました。(残ると紛らわしいので)"

###  C:\99.work\new_user.csv が存在しなかった場合
}
else
{
    Write-Output ""
    Write-Output " 登録ファイル(C:\99.work\new_user.csv) がありません。"
    Write-Output ""
}

↑ 個人用フォルダのACLは特に操作していない (親ディレクトリのを継承) してますので、変更が必要な場合は別途設定します。

 


ユーザ作成(と個人フォルダの作成)に成功すると、このように出力されます。

 

ファイル「new_user.csv」 が存在しない場合は、このように表示されます。

 

既にアカウントが存在する場合は、

 

その他のエラーが発生した場合は、こんな感じでエラーが出ますので、

 

それぞれ、適宜対応を。

 


今回の備忘録は以上です。

 

 

 

Hyper-V 上の仮想マシン(Linux)の複製

Hyper-V @ 2012R2 上の Linux(CentOS) 仮想マシンを複製した際の作業記録です。

稼働中のものと同じ Linux仮想マシン(ただし、host名、IPアドレスは異なる)を作りたかったので、すでに稼働している仮想マシンを エクスポート > インポート(コピー) して作成しました。

コピー元の仮想マシンを ” devmiz01 ” 、複製後(コピー後)の仮想マシンを ” devmiz02 ” とします。
devmiz0* の OS は CentOS 6.8 です。

 

① コピー元となる仮想マシンをエクスポートします。

エクスポートが終わったら、エクスポートフォルダ内の 仮想HDD と構成ファイルを編集しておきます。(しなくても動作に問題はないですが、コピー元と名前が同じになるのでややこしい)

・  .vhdx ファイル名を新規仮想マシンの名称に変更。

 

・ Virtual Machines ディレクトリ下の仮想マシン構成ファイルを編集し、

” devmiz01 ” となっている箇所を ” devmiz02 ” に変更。 (以下の2箇所 ←環境によって下記以外にも旧マシン名が記載されている場合があるので、旧マシン名は一括して置換します)

・ vhdx ファイルパス  ( <controller0> <drive0> の <pathname> の箇所 )

・ 仮想マシン名 (<properties> の <name> の箇所)

 

② エクスポートした仮想マシンをインポートします。

 

「仮想マシンをコピーする(新しい一意なIDを作成する)」 を選択。

 

③ ” devmiz02 ” を起動する前に、仮想マシンからネットワークアダプターを外しておきます。 (「仮想スイッチ = 接続されていません」 にする)

 

静的MACアドレス(Linuxの場合、MACアドレスが変わると ethX の設定も変わってしまうので、静的MAC で運用しています) も、コピー元の値になっているので、新しいMACアドレスに変更しておきます。

 

 

④ ネットワークアダプターが外れた状態で仮想マシンを起動し、ホスト名、IPアドレスを変更します。

・ ホスト名は、/etc/sysconfig/network、 /etc/hosts を修正。

・ IP アドレスは、/etc/sysconfig/network-scripts/ifcfg-eth0 を修正。
 ※ IPもだけど、HWADDR  (or MACADDR) も新しい MAC アドレスに変更。

・ /etc/udev/rules.d/70-persistent-net.rules に古いMACアドレスと新しいMACアドレスの 2つのエントリーがある(はず)ので、どちらもコメントアウトしておく。

修正完了後、仮想マシンをシャットダウンする。

 

⑤ 仮想マシンにネットワークアダプターを接続し、起動する。

 

以上で、IP(とMACアドレス)とホスト名が異なる以外は、中身が “devmiz01 ” と同じの ” devmiz02 ” が完成です。

 

 

 

Hyper-V 仮想マシン エクスポートの自動化

Hyer-V @ Windows Server 2012R2 で仮想マシンのエクスポートを自動化した際の作業記録です。

PowerShell の Export-VM コマンドレット で仮想マシンをエクスポート、併せて古いエクスポートは削除する、の動作をするPowerShell スクリプトを作成して、このスクリプトを Windows のタスクスケジュラーから毎日起動して実行する、といった運用です。

 

PowerShell スクリプトは ↓ こんなものを作ってみました。

<###
    このスクリプトについて:

    仮想マシンをエクスポートする処理を行います。
    (併せて、古いエクスポートを削除します)

    このシェルはタスクスケジューラーによって毎日 AM 2:00 に起動されます。


    STEP1: 仮想マシンをエクスポート
    STEP2: 古いエクスポートを削除
###>



<### 
    【STEP 1】
    仮想マシンを下記パスにエクスポートする
        E:\Daily_ExportedVM\<日付>\
###>

### 日付の取得
$NowDate = Get-Date -Format "yyyyMMdd_HHmmss"

### エクスポート対象の仮想マシンの指定
$TragetVM01 = "devmiz01"
$TragetVM02 = "hogehoge"

### エクスポート先のパスを指定
$ExportPath = "E:\Daily_ExportedVM\$NowDate\"

### Exportの成功 or 失敗の判断を STEP2(古いフォルダの削除)でするための変数($CheckCode)を定義
### 最初に0(=成功)を代入しておく。(失敗を検知したら 1 が代入される)
$CheckCode = 0


### コマンドエラー時に Try-Catch の Catch 部分が実行されるように、デフォルトパラメータを Stopに変更
$ErrorActionPreference = "stop"


### TargetVM01のエクスポート
### try-catch を使って、エラー発生時の処理を実装(catch内がエラー時のアクション)
Try {
    ### 仮想マシンのエクスポートを実行
    Export-VM -Name $TragetVM01 -Path $ExportPath -ErrorVariable ExportError01 |
    Out-Null   ### Out-Null することで Export-VM が終了するのを待つ。

### Export-VM がエラーになったら、エラー内容をファイルに出力して、$CheckCode に 1を代入
}Catch{

    ### エラーを このファイルに出力→ E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt 
    echo $ExportError01 | 
    Out-File E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt

    ### エラーの場合は変数 'CheckCode'に 1 を代入(0以外の代入でSTEP2の際に中止ルーチンに移行)
    $CheckCode = 1

}
Out-Null


### TargetVM02のエクスポート
### try-catch を使って、エラー発生時の処理を実装(catch内がエラー時のアクション)

Try {
    ### 仮想マシンのエクスポートを実行
    Export-VM -Name $TragetVM02 -Path $ExportPath -ErrorVariable ExportError02 |
    Out-Null   ### Out-Null することで Export-VM が終了するのを待つ。

### Export-VM がエラーになったら、エラー内容をファイルに出力して、$CheckCode に 1を代入
}Catch{

    ### エラーを このファイルに出力→ E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt 
    echo $ExportError02 | 
    Out-File E:\Daily_ExportedVM\ExportErrorCode-$TragetVM02-$NowDate.txt

    ### エラーの場合は変数 'CheckCode'に 1 を代入(0以外の代入でSTEP2の際に中止ルーチンに移行)
    $CheckCode = 1

}
Out-Null



<### 
    【STEP 2】
    古いエクスポートの削除
    2世代(過去2日分)のこす ← HDDの使用状況を見ながら調整

    $DeleteTime で経過時間を指定。
    $DeleteTime = "-n"  n(分/min)。 n分前を指定するので、マイナスをつける
    2日 = 2880min (60min * 24hour * 2day)
    3日 = 4320min (60min * 24hour * 3day)
    10日 = 14400min (60min * 24hour * 10day)
###>
#$DeleteTime = "-5"       ### 5分経過(テスト用)
$DeleteTime = "-4320"   ### 3日 ← 4320だと3日前のが残っちゃうので、4300 とかちょっと減らしておくのがいいかも。


### Export-VM が例外処理で停止していなければ($CheckCode = 0)、古いフォルダの削除実施
if ( $CheckCode -eq 0 ) {
    ### 対象フォルダ配下のリストを取得
    Get-ChildItem E:\Daily_ExportedVM |
    ### 作成されてから $DeleteTime の値を超過したフォルダ・ファイルを選択/抽出
    Where-Object {
    $_.CreationTime -lt (Get-Date).AddMinutes($DeleteTime)
    } |
    ### 対象を絶対パスに変換し、削除
    foreach {
        Remove-Item -Recurse -Force $_.FullName
    }
### $Code != 0 であれば(1が代入されていれば)処理を中止。
} else {
    exit
}

 

↑ このスクリプトを 「 C:\02.Daily_VM_Export_Shell\Daily_VM_Export.ps1 」 という名前で保存。

 

このスクリプトが毎日 AM 2:00 に実行されるように、タスクスケジューラーに登録。
↓ 登録はこんなんにしました。

 

 

操作の中身は、

 

「プログラム/スクリプト」

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

「引数の追加」

 -Command "C:\02.Daily_VM_Export_Shell\Daily_VM_Export.ps1"

「開始」

 C:\02.Daily_VM_Export_Shell

 

 

今回の備忘録は以上です。