VB.Net: Как отобразить предыдущие версии файла теневого копирования, позволяющие пользователю выбрать один - PullRequest
0 голосов
/ 11 декабря 2011

Я пишу программу восстановления файлов Excel с VB.Net, которая пытается быть удобным местом для сбора и доступа к рекомендуемым Microsoft методам . Если вы интересуетесь моими, вероятно, грязными, заполненными ошибками и нехваткой достаточного кода очистки, то они здесь: http://pastebin.com/v4GgDteY. Кажется, что базовая функциональность работает, хотя я еще не тестировал восстановление таблицы макроса графа.

Мне пришло в голову, что пользователям Vista и Windows 7 может быть полезно, если мне предложат список предыдущих версий файла в моем приложении, если служба теневого копирования включена и есть предыдущие копии. Как мне это сделать?

Я просмотрел множество веб-страниц, но не нашел легкого кода для кроватки. Я предполагаю, что одной из возможностей было бы использовать vssadmin через оболочку, но это довольно громоздко. Я просто хочу отобразить диалоговое окно, подобное списку свойств «Предыдущие версии», и позволить пользователям выбрать одну из предыдущих версий. Я думаю, что я мог бы просто отобразить лист свойств предыдущей версии через оболочку, программно вызвав контекстное меню и «Выбор предыдущих версий», однако я также хочу иметь возможность предложить список для пользователей Vista Home Basic и Premium, которые не У него нет доступа к этой вкладке, хотя, очевидно, предыдущие версии все еще существуют. Кроме того, если это возможно, я бы хотел предложить пользователям XP ту же функциональность, хотя я уверен, что с XP только системные файлы находятся в теневых копиях.

Я посмотрел MSDN в службе теневого копирования и просмотрел все страницы, также я посмотрел AlphaVSS и AlphaFS и все комментарии. Я догадываюсь, что мне нужно использовать AlphaVss и AlphFS и делать следующее?

  1. Узнайте список снимков / точек восстановления, существующих на компьютере.
  2. Смонтируйте эти снимки.
  3. Перейдите в подключенных томах к файлу Excel, который пользователь хочет восстановить, и составьте список этих путей.
  4. Имея под рукой список путей, сравните с какой-нибудь программой сравнения теневые копии файлов с оригиналом.
  5. Вытащите самую младшую или самую старую версию (я не думаю, что это имеет значение) тех теневых копий, которые отличаются от цели восстановления.
  6. Перечислите те версии файлов, которые могут быть разными.

Это кажется громоздким и медленным, но, возможно, это самый быстрый способ сделать что-то. Мне просто нужно какое-то подтверждение, что это путь.

1 Ответ

0 голосов
/ 15 декабря 2011

Я наконец решил пойти дальше и начать кодирование. Пожалуйста, внесите предложения по ускорению кода или что делать с файлами, которые, как выяснилось, отличаются от целевого файла восстановления. Есть ли более простой способ сделать это с AlphaVSS и AlphaFS?

Private Sub Button1_Click_2(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    'Find out the number of vss shadow snapshots (restore 
    'points). All shadows apparently have a linkable path 
    '\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy#,
    'where # is a simple one, two or three digit integer.
    Dim objProcess As New Process()
    objProcess.StartInfo.UseShellExecute = False
    objProcess.StartInfo.RedirectStandardOutput = True
    objProcess.StartInfo.CreateNoWindow = True
    objProcess.StartInfo.RedirectStandardError = True
    objProcess.StartInfo.FileName() = "vssadmin"
    objProcess.StartInfo.Arguments() = "List Shadows"
    objProcess.Start()

    Dim burp As String = objProcess.StandardOutput.ReadToEnd
    Dim strError As String = objProcess.StandardError.ReadToEnd()
    objProcess.WaitForExit()
    Dim xnum As Integer = 0
    Dim counterVariable As Integer = 1
    ' Call Regex.Matches method.
    Dim matches As MatchCollection = Regex.Matches(burp, _
                            "HarddiskVolumeShadowCopy")
    ' Loop over matches.
    For Each m As Match In matches
        xnum = xnum + 1
        'At the max xnum + 1 is the number of shadows that exist
    Next
    objProcess.Close()

    Do
        'Here we make symbolic links to all the shadows, one at a time 
        'and loop through until all shadows are exposed as folders in C:\.
        Dim myProcess As New Process()
        myProcess.StartInfo.FileName = "cmd.exe"
        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.RedirectStandardInput = True
        myProcess.StartInfo.RedirectStandardOutput = True
        myProcess.StartInfo.CreateNoWindow = True
        myProcess.Start()
        Dim myStreamWriter As StreamWriter = myProcess.StandardInput
        myStreamWriter.WriteLine("mklink /d C:\shadow" & counterVariable _
            & " \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy" _
            & counterVariable & "\")
        myStreamWriter.Close()
        myProcess.WaitForExit()
        myProcess.Close()

        ' Here I compare our recovery target file against the shadow copies
        Dim sFile As String = PathTb.Text
        Dim sFileShadowPath As String = "C:\shadow" & _
            counterVariable & DelFromLeft("C:", sFile)
        Dim jingle As New Process()
        jingle.StartInfo.FileName = "cmd.exe"
        jingle.StartInfo.UseShellExecute = False
        jingle.StartInfo.RedirectStandardInput = True
        jingle.StartInfo.RedirectStandardOutput = True
        jingle.StartInfo.CreateNoWindow = True
        jingle.Start()
        Dim jingleWriter As StreamWriter = jingle.StandardInput
        jingleWriter.WriteLine("fc """ & sFile & """ """ _
                               & sFileShadowPath & """")
        jingleWriter.Close()
        jingle.WaitForExit()
        Dim jingleReader As StreamReader = jingle.StandardOutput
        Dim JingleCompOut As String = jingleReader.ReadToEnd
        jingleReader.Close()
        jingle.WaitForExit()
        jingle.Close()
        Dim jingleBoolean As Boolean = JingleCompOut.Contains( _
            "no differences encountered").ToString
        If jingleBoolean = "True" Then
            MsgBox(jingleBoolean)
        Else
            'I haven't decided what to do with the paths of 
            'files that are different from the recovery target.
            MsgBox("No")
        End If

        counterVariable = counterVariable + 1
    Loop Until counterVariable = xnum + 1

End Sub
...