'
' 移動プロファイル初期化スクリプト
'
' 古いプロファイルは、Profile.YYMMDDHHMMSS にリネームされます。
'
' @author Jun Futagawa (Integsystem Corporation)
' @license Apache License, Version 2.0

' オブジェクトの生成
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objEnv = objShell.environment("Process")

' プロファイルのリネーム用に現在の日時を取得
nowTime = Now
profilePostfix = Year(nowTime) _
	& Right("0" & Month(nowTime), 2) _
	& Right("0" & Day(nowTime), 2) _
	& Right("0" & Hour(nowTime), 2) _
	& Right("0" & Minute(nowTime), 2) _
	& Right("0" & Second(nowTime), 2)

' 実行確認メッセージ
confirmMessage = "プロファイルを初期化します。実行して良い場合は 「OK」 を押してください。" & vbCrLf _
	& "実行すると自動的にログオフされ、ログオンし直すとプロファイルが初期化されています。" & vbCrLf _
	& vbCrLf _
	& "動作のおかしくなったアプリケーションは、多くの場合プロファイルを初期化することで復旧します。" & vbCrLf _
	& "実行すると主に次のデータが初期化されます。必要なファイルは ** 必ず ** バックアップを取ってから実行してください。" & vbCrLf _
	& vbCrLf _
	& "・Windows エクスプローラの設定" & vbCrLf _
	& "・タスクバー設定" & vbCrLf _
	& "・レジストリに保存されたアプリケーション設定" & vbCrLf _
	& "・壁紙" & vbCrLf _
	& "・Internet Explorerのお気に入り" & vbCrLf _
	& vbCrLf _
	& "古いプロファイルは、[ファイルサーバのパスを記入]." & profilePostfix & " に保存されますが、後から回収出来ないデータも含まれています。" & vbCrLf _
	& vbCrLf _
	& "複数回実行しても正常にプロファイルが初期化されない場合は、[管理者の居場所を記入] までお知らせください。"

confirmStatus = MsgBox(confirmMessage, vbOKCancel, "プロファイル初期化実行確認")
If confirmStatus = vbOK Then
	' 環境変数の取得
	computerName = objEnv.item("COMPUTERNAME")
	userName = objEnv.item("USERNAME")
	userDomain = objEnv.item("USERDOMAIN")

	' WMI名前空間の取得
	WMINameSpace = "winmgmts:\\" & computerName & "\root\cimv2"
	Set objWMIService = GetObject(WMINameSpace)

	' WMIユーザオブジェクトの取得
	queryAccount = "Win32_UserAccount.Name='" _
		& userName & "',Domain='" & userDomain & "'"
	Set objAccount = objWMIService.Get (queryAccount)

	' ユーザの SID 文字列取得(UserPreference 値設定に必要)
	userSID = objAccount.SID

	' 現在のレジストリ CentralProfile 値を元にバックアップ保存先パス作成
	registoryPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" _
		& userSID & "\CentralProfile"
	currentProfilePath = objShell.RegRead(registoryPath)
	newProfilePath = currentProfilePath & "." & profilePostfix
	' Wscript.Echo currentProfilePath
	' Wscript.Echo newProfilePath

	If objFSO.FolderExists(currentProfilePath) Then
		' 現在サーバ上にある移動プロファイルを移動
		Set currentProfileFolder = objFSO.GetFolder(currentProfilePath)
		currentProfileFolder.Move(newProfilePath)
		' レジストリ CentralProfile 値の設定
		objShell.RegWrite registoryPath, newProfilePath
	End If

	' ログオフを実行
	Const SHUTDOWN = 1
	Const FORCE_LOGOFF = 4
	strComputer = "."
	Set objWMIService = GetObject("winmgmts:" _
		& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
	Set colOperatingSystems = objWMIService.ExecQuery _
		("SELECT * FROM Win32_OperatingSystem")
	For Each objOperatingSystem in colOperatingSystems
		ObjOperatingSystem.Win32Shutdown(FORCE_LOGOFF)
	Next

End If
