WIN1@Codename

Codename

シャドウコピーを使ったバックアップの自動化

無印のWindows2008ではファイル単位のバックアップができません。
そこでシャドウコピーの管理コマンド「vssadmin」を利用してファイル単位のバックアップを行うためのコードをかいてみました。

Imports System.Text
Imports System.Text.RegularExpressions

Public Module sample

  Sub Main()
    Dim strDrive As String = "C" 'シャドウコピー取得ドライブ
    Dim strFrom As String = "\test.vhd" 'バックアップ対象ファイル
    Dim strTo As String = "D:\Backup\test.vhd" 'バックアップ先ファイル
    Dim strCommandRes As String = GetCommanRes("/c vssadmin list shadows")
    Dim objArry As ArrayList = GetDateList("作成時刻: (?<Date>\d+/\d+/\d+ \d+:\d+:\d+)\r\n.+\r\n.+\((?<Drive>\w):\).+", strCommandRes, strDrive)
    Dim strFolderPath As String = GetFolderPath(objArry, strDrive)
    Dim strFilePath As String = strFolderPath & strFrom
    My.Computer.FileSystem.CopyFile(strFilePath, strTo, True)
    MsgBox("Backup Done!")
  End Sub

  Private Function GetFolderPath(ByVal objArry As ArrayList, ByVal strDrive As String) As String
    Dim strPath As String = ""
    Dim dteNewest As Date
    For i As Integer = 0 To objArry.Count - 1
      Dim dteUpdate As Date = objArry(i)
      If dteNewest < dteUpdate Then
        dteNewest = dteUpdate
      End If
    Next
    Dim dteGMTUpdate As Date = DateAdd(DateInterval.Hour, -9, dteNewest)
    Dim strGMTUpdate As String = dteGMTUpdate.ToString("yyyy.MM.dd-HH.mm.ss")
    strPath = "\\localhost\" & strDrive & "$\@GMT-" & strGMTUpdate
    Return strPath
  End Function

  Private Function GetDateList(ByVal strRege As String, ByVal strText As String, ByVal strDrive As String) As ArrayList
    Dim objArrayList As New ArrayList
    If strRege <> "" Then
      Dim objRegex As New Regex(strRege)
      Dim objMatch As Match = objRegex.Match(strText, RegexOptions.IgnoreCase)
      While objMatch.Success
        If strDrive = objMatch.Groups("Drive").Value Then
          objArrayList.Add(objMatch.Groups("Date").Value)
          Console.WriteLine(objMatch.Groups("Date").Value)
        End If
        objMatch = objMatch.NextMatch()
      End While
    End If
    Return objArrayList
  End Function

  Private Function GetCommanRes(ByVal strCommand As String) As String
    Dim strRes As String = ""
    Dim objProcessStartInfo As New System.Diagnostics.ProcessStartInfo()
    objProcessStartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
    objProcessStartInfo.RedirectStandardInput = False
    objProcessStartInfo.RedirectStandardOutput = True
    objProcessStartInfo.UseShellExecute = False
    objProcessStartInfo.CreateNoWindow = True
    objProcessStartInfo.Arguments = strCommand
    Dim objProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start(objProcessStartInfo)
    strRes = objProcess.StandardOutput.ReadToEnd
    objProcess.WaitForExit()
    Return strRes
  End Function

End Module

手順としては、vssadminコマンドでシャドウコピーの一覧を取得し、該当ファイルを見つけてコピーしています。
Windows2008R2のファイル単位で設定できる「Windows Server バックアップ」が出るまではこれでやってました。

コメント

復元ポイントへのアクセス

はじめまして。
Windows2008R2 環境で同様の内容をVBScriptで実装してみました。
C$\@GMT-yyyy.MM.dd-HH.mm.ss
への参照が作成されませんでした。
(DirやExplorerでアクセスできません)

Explorerで該当ドライブで右クリック-->以前のバージョンを復元を選んだあとはアクセスできるようになります。

同様のことをコードで実装できるとよいのですが・・・。

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://codename2010.blog11.fc2.com/tb.php/143-64614379
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad