Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Volume Shadow Copy Service (https://www.delphipraxis.net/182752-volume-shadow-copy-service.html)

Hobbycoder 24. Apr 2017 13:07

AW: Volume Shadow Copy Service
 
ich brauche das nicht in eine Klasse packen, weil es da ja schon drin ist.

vss_util.pas

Ein großer Teil der VssToolkit.pas ist doch auswerten der Kommandozeilenparameter.
Letztlich benötigt du lediglich

Initialize()
GatherWriterMetadata
GatherWriterStatus
ListWriterStatus
ListWriteMetadata
QuerySnapshotSet
QuerySnapshotProperties
DeleteAllSnapshots
DeleteSnapshotSet
DeleteSnapshot
CreateSnapshotSet


Das sind die Methoden aus der vss_util, die du auch im Source von VssToolkit viederfindest.
Dort sind doch alle Funktionen schön in einer Case-Anweisung demonstriert.

kopernikus 1. Jun 2017 12:17

AW: Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nachfolgend ein Update mit einigen Fehlerkorrekturen und Ergänzungen.

kopernikus 8. Jul 2017 12:58

AW: Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier ein Beispiel, wie man die VSS-Routinen in ein eigenes Programm einbinden kann:
Code:
...
    procedure ShowVssStatus (const AStatus : string);
    begin
      ...
      end;
...
    VssThread:=CreateVssThread(Drive,true);
    with VssThread do begin
      LogFilename:=TempDir+'VssLog.txt';
      WriteLog:=true;
      OnStatusMessage:=ShowVssStatus;
      Resume;
      WriteLineToLog('Creating a Volume Shadow Copy: '+DateTimeToStr(Now));
      repeat
        Sleep(1);
        Application.ProcessMessages;
        until Done;
      if Success then begin
        SaveBackupComponentsDocument(TempDir+'VssBackupDoc.xml');
        SourceDrv:=ShadowDeviceName;
        end
      else begin
        WriteLineToLog(sLineBreak+'Snapshot creation failed');
        FreeAndNil(VssThread);
        SourceDrv:=Drive;
        end;
      end;
...
// Backup or similar action
...
  if assigned(VssThread) then begin
    try
      VssThread.DeleteShadowCopy;
    finally
      FreeAndNil(VssThread);
      end;
    end;
...
Im Anhang gibt es außerdem eine aktualisierte Version des Programms.

LTE5 24. Jan 2018 16:36

AW: Volume Shadow Copy Service
 
Wie verwendet man diese Unit wenn man eine Datei kopieren möchte die gesperrt und in Benutzung ist? Oder ist vss für sowas gar nicht gedacht.

himitsu 24. Jan 2018 17:15

AW: Volume Shadow Copy Service
 
Wenn VSS diese Datei aufbekommt, während sie gesperrt/geöffnet ist, dann hättest du eventuell eine halbe/korrupte Datei.

Im Allgemeinen macht man mit VSS die Dateien das Volume vorher auf, wobei eine "Kopie" ("Session" in DB-Sprache) erzeugt wird, mit der man weiterarbeitet.
Werden Dateien währenddessen nun geöffnet/geändert, dann erstellt der VSS-FilterTreiber von diesen Dateien eine Kopie, mit dener die Andere weitergearbeiten, während in der VSS-Session du in Ruhe mit dem alten Datei-Stand weiterarbeiten kannst.

Es gibt auch Transacted-Dateifunktionen (ala MSDN-Library durchsuchenCreateFileTransacted) wo man sowas statt auf Volume-Ebene für einzelne Dateien machen kann.


Eventuell hilft auch die alte Backup-API.
https://msdn.microsoft.com/en-us/lib.../aa362512.aspx
(spaßig ist nur, dass man dort die Dateien im Roh-Format bekommt, wenn sie verschlüsselt/komprimiert/sparsed sind)

LTE5 24. Jan 2018 17:21

AW: Volume Shadow Copy Service
 
Verstehe ich das richtig dass wenn man den Code oben von kopernikus nimmt, in einen TTHread packt, den Thread erzeugt und dann eine gesperrte Datei kopieren möchte, diese gesperrte Datei aus der Shadow Copy kopiert wird welches angelegt wurde? Verwendet man dann trotzdem die ganz normalen WinAPI Aufrufe wie CopyFile?

KHJ 24. Jan 2018 19:01

AW: Volume Shadow Copy Service
 
Vielleicht hilft auch das weiter: http://www.rathlev-home.de/sources/delphi.html#unitsdx

LTE5 24. Jan 2018 20:03

AW: Volume Shadow Copy Service
 
Wie es aussieht verstehe ich das nicht. Ich rufe
Code:
VsToolkit.exe C:\
auf und dann?

LTE5 29. Jan 2018 17:17

AW: Volume Shadow Copy Service
 
Zitat:

Zitat von kopernikus (Beitrag 1376272)
Hier ein Beispiel, wie man die VSS-Routinen in ein eigenes Programm einbinden kann:
Code:
...
    procedure ShowVssStatus (const AStatus : string);
    begin
      ...
      end;
...
    VssThread:=CreateVssThread(Drive,true);
    with VssThread do begin
      LogFilename:=TempDir+'VssLog.txt';
      WriteLog:=true;
      OnStatusMessage:=ShowVssStatus;
      Resume;
      WriteLineToLog('Creating a Volume Shadow Copy: '+DateTimeToStr(Now));
      repeat
        Sleep(1);
        Application.ProcessMessages;
        until Done;
      if Success then begin
        SaveBackupComponentsDocument(TempDir+'VssBackupDoc.xml');
        SourceDrv:=ShadowDeviceName;
        end
      else begin
        WriteLineToLog(sLineBreak+'Snapshot creation failed');
        FreeAndNil(VssThread);
        SourceDrv:=Drive;
        end;
      end;
...
// Backup or similar action
...
  if assigned(VssThread) then begin
    try
      VssThread.DeleteShadowCopy;
    finally
      FreeAndNil(VssThread);
      end;
    end;
...
Im Anhang gibt es außerdem eine aktualisierte Version des Programms.


Zitat:

Creating shadow set {{02A915B5-D34E-4420-A566-FB8D1DFF32CE}} ...
Add volumes to snapshot set ...
- Adding volume [??] to the shadow set...
ERROR : COM call "TVolumeShadowCopy.AddToSnapshotSet:VssBackupCompo nents.AddToSnapshotSet" failed.
- Returned HRESULT = $80070057
- Error text: Falscher Parameter
ERROR : TVolumeShadowCopy.AddToSnapshotSet:VssBackupCompon ents.AddToSnapshotSet (Falscher Parameter)

Snapshot creation failed
Warum funktioniert das nicht?
C reicht als Drive nicht. Muss C:\ sein. Funktioniert jetzt.

Eine Frage zur Funktion noch. Ich habe nur Delphi Starter. Wenn ich eine 32 Bit-Anwendung mit dem VSS erstelle, kann ich das auch auf einem 64 Bit Windows benutzen oder muss ich dafür erst Delphi Pro haben?

Hobbycoder 9. Mai 2018 18:10

AW: Volume Shadow Copy Service
 
Ist das Thema noch aktiv?

habe nämlich zur Zeit auch das Problem, dass beim CreateVssThread die Fehlermeldung "ERROR: COM call "CoInitializeSecurity" failed. (<Unknown error code>)." kommt. Genauer gesagt kommt der Fehler in der VssUtil Zeile 2431
Delphi-Quellcode:
hr:=InitSecurity
.
Kompilieren ist keine Problem.

Mein Code-Ausschnitt:
Delphi-Quellcode:
    .
    .
    .
    VssThread:=CreateVssThread(Copy(FSourceFile, 1, 2), True);
    VssThread.LogFileName:='c:\Transfer\vsslog.txt';
    VssThread.WriteLog:=True;
    VssThread.OnStatusMessage:=VssStatusMessage;
    DoLogMessage('Create Snapshot...');
    repeat
      FEvent.ResetEvent;
      FEvent.WaitFor(100);
    until VssThread.Done;
    if VssThread.Success then
    begin
      DoLogMessage('Create Snapshot successfully');
    end else begin
      DoLogMessage('Create Snapshot failed');
    end;
  finally
    if Assigned(VssThread) then
    try
      VssThread.DeleteShadowCopy;
    finally
      FreeAndNil(VssThread);
    end;
  end;
Ziel ist es, innerhalb eines Thread eine Datei, welche aktuell geöffnet ist, zu kopieren,

Ja, ich habe mein Programm mit "Als Administrator ausführen" gestartet.
Und über die Eingabeaufforderung mit VssAdmin geht's.

(Windows 10 Pro Version 1709)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr.
Seite 4 von 6   « Erste     234 56      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz