SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

移動ユーザープロファイルを使用して VM Role のユーザープロファイルを永続化

one comment

VM Role にリモートデスクトップでログインした際に使用されるユーザープロファイルはデフォルトでは [C:Users] の下に作成されます。
image

C ドライブの内容ですが、csupload した VHD が使用されるため、非永続領域となります。

今回の投稿では、Azure Drive + 移動ユーザープロファイルを使用して、Azure Storage 上にユーザープロファイルを作成して、ユーザープロファイルの永続化を実施してみたいと思います。


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


まずは、ローカルユーザープロファイルと移動ユーザープロファイルを簡単に確認してみたいと思います。

 

– ローカルユーザープロファイル –

[ローカル ユーザーとグループ] (lusrmgr.msc) から対象ユーザーのプロパティを開き、[プロファイル] タブをクリックすることで対象ユーザーのユーザー プロファイルを場所を確認することができます。
image

 

[プロファイル パス] に値が設定されていないはローカルユーザープロファイルとして設定がされますため、[初回ログオン時][C:Users] にユーザープロファイルが作成されます。

初回ログイン後は、[HKLMSOFTWAREMicrosoftWindows NTCurrentVersionProfileListSID] にレジストリキーが作成され、[ProfileImagePath] にプロファイルのパスが設定されます。
image

指定されているパスにユーザープロファイルのパスとして使用されます。

 

– 移動ユーザープロファイル –

それでは、移動ユーザープロファイルを設定してみたいと思います。
移動ユーザープロファイルを設定するユーザーのプロパティを開いて、[プロファイル パス] に移動ユーザープロファイルを作成するパスを指定します。
image

今回は、[E:%username%] を設定しています。
# 通常使用する場合は、共有フォルダを使用するのが一般的だと思いますが、今回は VM Role での使用を想定していますので、ローカルドライブのパスを指定しています。
%username% を入力するとフォーカスを外したタイミングで設定をしているユーザー名に置換されます。
image

移動ユーザープロファイルを設定した直後は指定したパスには何も作成されていませんが、
image

ログオフをしたタイミングで指定したパスにプロファイルのディレクトリが作成されます。
image

移動ユーザープロファイルを設定しても、レジストリの [ProfileList] の設定値は変更されないのですが、[CentralProfile] という項目が作成されます。
image

移動ユーザープロファイルの動作ですが以下のようになります。
image

ログオフした時にローカルプロファイルの内容が移動ユーザープロファイルとして指定しているパスにコピーがされますので、作業が終了したら必ずログオフをしてプロファイルの内容を固めておく必要があります。
# ログオフを定期的にしないとサーバーの強制終了後にインスタンスが初期化されてしまうと前回ログオフ時のプロファイルの内容になってしまうと思います。

 

■VM Role で移動ユーザープロファイルを使用


それでは、VM Role での移動ユーザープロファイルについて考えていきたいと思います。
プロファイルを Azure Drive 上に配置する必要がありますので構成としては以下のようになります。
image

この構成になるような実装を考えてみます。
VM Role でプロファイルを使用するのはリモートデスクトップの接続に使用するユーザーになると思います。
image

リモートデスクトップ接続用に指定しているユーザーに自動的に移動ユーザープロファイルを設定するような処理を実装してみます。
# ローカルプロファイルではなく [リモート デスクトップ サービスのプロファイル] で設定をしても良いかもしれないですね。

以前から使用している Azure Drive のマウントスクリプトに移動ユーザープロファイルを設定する処理を組み込んでみます。
今回組み込んだ箇所は太字下線にしています。
# 改行している箇所は一行で記述します。

# 必要となるアセンブリの参照
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.StorageClient.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.CloudDrive.dll"
Add-Type -Path "C:Program FilesWindows Azure Integration Componentsv1.3refMicrosoft.WindowsAzure.ServiceRuntime.dll"

# サービスの起動が完了するまで待機
while((Get-Service -Name "Windows Azure Cloud Drive Provider").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Integration Components").Status -ne "Running"){
    Start-Sleep -s 10
}

while((Get-Service -Name "Windows Azure Remote Forwader Service").Status -ne "Running"){
    Start-Sleep -s 10
}

# Azure Storag に接続するための接続文字列をサービスモデルで定義した設定から取得
$connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))
while (!$?) {
    $connection = [Microsoft.WindowsAzure.CloudStorageAccount]::Parse([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("StorageConnectionString"))
}

# Azure Storage に接続
$account = New-Object Microsoft.WindowsAzure.CloudStorageAccount( $connection.Credentials, $false)

# ローカルストレージに Azure Drive 用のキャッシュディレクトリを作成
# GetLocalResource で指定しているのは、サービス定義ファイル (csdef) で指定した LocalStorage の設定値
$localstorage = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetLocalResource("AzureLocalStorage")
[Microsoft.WindowsAzure.StorageClient.CloudDrive]::InitializeCache($localstorage.RootPath + "cache", $localstorage.MaximumSizeInMegabytes)

# Azure Drive として、VHD をマウント
$clouddrive = [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountCloudDriveExtensions]::CreateCloudDrive($account, "$($account.BlobEndpoint)persistent/$([Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id).vhd")
$driveletter = $clouddrive.Mount(100, [Microsoft.WindowsAzure.StorageClient.DriveMountOptions]::None)

# ユーザーのプロファイルを移動ユーザープロファイルとして設定
$remoteuser = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountUsername")
$user = [ADSI]"WinNT://./$($remoteuser)"
$user.Profile = "$($driveletter)$($remoteuser)"
$user.Setinfo()

# プロセスを維持するためキー入力要求を発生
$host.UI.RawUI.ReadKey()

VM Role の構成情報から、リモートデスクトップ接続に使用しているユーザーを取得して、Azure Drive としてマウントしているドライブレターをプロファイルとして設定をしています。

このスクリプトをタスクスケジューラーでシステムの起動時に実行するように設定することでインスタンス起動時に設定されているリモートデスクトップ用のユーザーのプロファイルを移動ユーザープロファイルとして設定することが可能です。

■Sysprep 時の SID 変更によるセキュリティ設定の変更について


トレーニングキットの手順で VM Role のインスタンスの準備を実施すると VM Role は一般化 (generalize) された状態で Sysprep が実行されます。
image

generalize で Sysprep を実行することでコンピューターの SID が変更されます。
image

SID はユーザーのセキュリティ情報にも使用されているため、generalize を使用して Sysprep を実行するとユーザーのセキュリティにも影響が出ます。
image
ユーザーの SID が変更されるため、同一の名称のユーザーを作成しても異なるユーザー (同姓同名の別名) として識別されることになります。

移動ユーザープロファイルのフォルダセキュリティを確認してみます。
Sysprep 前はこのようなセキュリティ設定となっていますが、
image

Sysprep 後はセキュリティを見ることができなくなっています。
image

移動ユーザープロファイルの保存先にアクセスできる権限がなくなっていますのでイベントビューアーにも以下のエラーが出力され、移動ユーザープロファイルが使用できていないことが確認できます。
image

 

■移動ユーザーププロファイルのアクセス権を緩和した時の挙動


Sysprep 後は SID が変わりますので、移動ユーザープロファイルの指定先からプロファイルをコピーすることができなくなります。

セキュリティを緩和するために [everyone] フルコントロールの権限や、
image

[移動プロファイル フォルダーのユーザー所有権を確認しない] のグループポリシーを設定して、アクセス権を緩和させてみたとします。
image

これらの設定をすると、アクセス権はかなり緩い状態のものが設定されるのですが、Sysprep を一般化で実行しても移動ユーザープロファイルが使用できずに、[ログオン] → [即時ログオフ] という状態になってしまいました…。

 

■まとめ


いろいろと長く書いてしまいましたのでユーザープロファイルを永続化するための設定をまとめて見たいと思います。

  1. Azure Drive でマウントしたドライブを作成する
  2. 移動ユーザープロファイルを使用してプロファイルを永続化したいユーザーは Azure Drive をプロファイルのパスとして指定
  3. Sysprep は一般化しない状態で実施する (/generalize は使用しない)

この 3 つの設定をすることで永続化したユーザープロファイルを作成することが出来そうです。
# Sysprep を実行していない VM Role のイメージだとうまくリモートデスクトップで接続ができないのですよね…。

Sysprep を一般化しないで実行した場合の影響については別でまとめたいな~と思っています。

プロファイルを永続化してどうするかは、まぁ使い方次第ということで・…。

Written by masayuki.ozawa

2月 11th, 2011 at 7:11 pm

Posted in Windows Azure

Tagged with ,

One Response to '移動ユーザープロファイルを使用して VM Role のユーザープロファイルを永続化'

Subscribe to comments with RSS or TrackBack to '移動ユーザープロファイルを使用して VM Role のユーザープロファイルを永続化'.

  1. […] をマウントするのが良いのですが、私はコーディングが苦手なので、今までの投稿で使用していた PowerShell にマウント → […]

Leave a Reply

*