Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

kopernikus 15. Nov 2014 12:12


Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 2)
Da nirgendwo eine aktuelle Konvertierung der C++-Header für den Volume Shadow Copy Service für Delphi zu finden war, habe ich mich selbst daran gemacht. Basis waren die Header Dateien aus dem Microsoft Software Developement Kit für Windows 7. Dort findet man außerdem ein Beispielprogramm vshadow.exe, das die Verwendung erläutert. Ich habe es ebenfalls nach Delphi konvertiert. Das Ergebnis sind eine Unit mit den erforderlichen Funktionen und Objekten und ein kleines Konsolenprogramm, mit dem man das Ganze testen kann.
Das Programm kann sowohl für 32- als auch für 64-Bit-Windowssysteme kompiliert werden (erfordert mindestens Delpi-XE2).

Alle Quelltexte befinden sich in der angehängten Zip-Datei Vss-s.zip: VssApi.pas, VssUtils und VsToolkit.dpr. Die Zip-Datei VsToolkit.zip enthält die ausführbaren Exe-Dateien und eine kurze Anleitung.

sh17 16. Nov 2014 14:05

AW: Volume Shadow Copy Service
 
:thumb:

Interesse das hier reinzustellen?

https://github.com/DelphiPraxis

kopernikus 26. Mär 2015 11:54

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

kopernikus 9. Jan 2016 14:34

AW: Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ein aktuelles Update mit einigen Fehlerkorrekturen (u.a. für Windows 10).

CCRDude 11. Jan 2016 09:10

AW: Volume Shadow Copy Service
 
Vielen Dank für Dein Update!

Ich verwende aktuell eine eigene Übersetzung, aber die ist längst nicht so vollständig, daher hatte ich Deinen Thread hier schon abonniert, als ich ihn das erste Mal sah, komme aber erst jetzt dazu, zu danken! Werde das sicher als Nachschlagmöglichkeit nutzen, wenn ich daran bin, meinen Code weiter für FreePascal fit zu machen.

sh17 15. Mär 2016 06:22

AW: Volume Shadow Copy Service
 
Wie kann denn ein eigener VSS Writer implementiert werden? Laut Doku muss von der abstrakten Klasse CVssWriter geerbt werden, nur ich hab da grad keine Idee wie das in Delphi funktioniert, falls überhaupt.

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Muss ich dazu die vssapi.lib in obj Dateien überführen?

RandomDD 11. Aug 2016 20:04

AW: Volume Shadow Copy Service
 
Darf ich eine dumme Frage stellen? Wie benutzt man das Toolkit wenn ich sagen wir mal eine Datei welche gerade benutzt wird kopieren möchte?
Ich versuche aktuell einen anderen Code zu benutzen aber da bekomme ich den Fehler
Zitat:

---------------------------
VSSTest.exe - Einsprungpunkt nicht gefunden
---------------------------
Der Prozedureinsprungpunkt "CreateVssBackupComponents" wurde in der DLL "vssapi.dll" nicht gefunden.
---------------------------
OK
---------------------------
Bei dem Code aus diesem Thema hier kommt folgender Fehler

Zitat:

(Option: Execute binary/script after shadow creation "C:\Users\TestNutzer\Desktop\script.bat")
(Option: Create shadow copy set)

Initializing IVssBackupComponents Interface ...
ERROR : COM call "TVolumeShadowCopy.Initialize:CreateVssBackupCompo nents" failed
.
- Returned HRESULT = $80070005
- Error text: Zugriff verweigert
Exception EOleSysError in module VsToolkit.exe at 001230B7.
TVolumeShadowCopy.Initialize:CreateVssBackupCompon ents (Zugriff verweigert).
script.bat
Zitat:

cp C:\Users\TestNutzer\NTUSER.DAT C:\Users\TestNutzer\Desktop\NTUSER.DAT

himitsu 12. Aug 2016 10:43

AW: Volume Shadow Copy Service
 
Zitat:

Zitat von RandomDD (Beitrag 1344724)
Ich versuche aktuell einen anderen Code zu benutzen aber da bekomme ich den Fehler
Zitat:

---------------------------
VSSTest.exe - Einsprungpunkt nicht gefunden
---------------------------
Der Prozedureinsprungpunkt "CreateVssBackupComponents" wurde in der DLL "vssapi.dll" nicht gefunden.
---------------------------
OK
---------------------------

Bei dem Code war jemand zu doof und vergaß die Dokumentation zu lesen, als er den zugehörigen Code schrieb (den man uns verheimlicht) und er vergaß seinen Code zu testen. :stupid:
https://msdn.microsoft.com/de-de/lib.../aa381517.aspx
Zitat:

Note: This function is exported as CreateVssBackupComponentsInternal, but you should call CreateVssBackupComponents, not CreateVssBackupComponentsInternal.
Zitat:

Zitat von RandomDD (Beitrag 1344724)
Initializing IVssBackupComponents Interface ...
ERROR : COM call "TVolumeShadowCopy.Initialize:CreateVssBackupCompo nents" failed
.
- Returned HRESULT = $80070005
- Error text: Zugriff verweigert

Du, bzw. das Programm hat wohl nicht das "Recht", zum Ausführen dieser Funktion.
( billige Lösung: mal mit Administratorrechten ausführen? )

himitsu 12. Aug 2016 10:46

AW: Volume Shadow Copy Service
 
[deleted]

RandomDD 12. Aug 2016 10:56

AW: Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der von mir verwendete Code befindet sich im Anhang. Habe das hier gefunden
https://www.experts-exchange.com/que...or-Delphi.html

sh17 23. Sep 2016 07:02

AW: Volume Shadow Copy Service
 
VSToolkit funktioniert unter Windows 10, Version 1607 nicht mehr.

kopernikus 24. Jan 2017 12:17

AW: Volume Shadow Copy Service
 
Liste der Anhänge anzeigen (Anzahl: 2)
Die aktuelle Version von VsToolkit funktioniert auch unter Windows 10 Vers. 1607. Wichtig sind diese Voraussetzungen:
  • Das Programm muss als Administrator gestartet werden. Dabei genügt es nicht, mit einem Konto angemeldet zu sein, das die Rechte eines Administrators hat. Auch in diesem Fall muss das Programm über die Option "Als Administrator" ausführen aufgerufen werden. Grund für dieses Verhalten ist der Schutz durch die Windows-Benutzerkontensteuerung.
  • Es muss die zum System passende Version von VsToolkit verwendet werden (d.h. die 32-bit-Version auf 32-bit-Systemen und die 64-bit-Version auf 64-bit-Systemen)
Zur Sicherheit hier noch einmal die aktuelle Version zum Download:

himitsu 24. Jan 2017 12:23

AW: Volume Shadow Copy Service
 
Zitat:

Zitat von kopernikus (Beitrag 1359823)
  • Das Programm muss als Administrator gestartet werden. Dabei genügt es nicht, mit einem Konto angemeldet zu sein, das die Rechte eines Administrators hat. Auch in diesem Fall muss das Programm über die Option "Als Administrator" ausführen aufgerufen werden. Grund für dieses Verhalten ist der Schutz durch die Windows-Benutzerkontensteuerung.

Oder man verpasst seinem Programm ein Admin-Manifest.

Oder es reicht auch ein Adminkonto ohne "Als Admin", wenn dort die Rechte nicht durch das UAC beschränkt werden, aber nur deswegen würde ich nicht gleich das UAC deaktivieren.

jus 24. Jan 2017 15:44

AW: Volume Shadow Copy Service
 
Hallo,

vielen Dank fürs Bereitstellen. Könnte jemand auch mal erläutern was für gute Sachen mit dem Volume Shadow Kopie machen kann, sprich reele Anwendungsbeipiele?

lg,
jus

a.def 24. Jan 2017 15:47

AW: Volume Shadow Copy Service
 
Man kann damit Dateien welche in Benutzung sind trotzdem kopieren (glaube ich).
Hat der Anwender aber die Systemwiederherstellung deaktiviert, bringt auch VSS nix mehr (glaube ich).
VSS bedient sich nur alter Kopien der Dateien. Da wird nix Sekundengenau-aktuelels kopiert (glaube ich).

himitsu 24. Jan 2017 16:59

AW: Volume Shadow Copy Service
 
Wenn ich den VSS richtig verstanden hatte, dann ist mir so, als wenn man das mit einer Transaktion vergleichen kann.

Du startest eine Sitzung im VSS und bei späteren Zugriffen sind alle Dateien in dem Zustand, wie zu Beginn.
Viele Backupprogramme arbeiten so, wen sie Live-Systeme backupen, damit am Ende immer ein "konsistenter" Datenbestand herscht, auch wenn jemand zwischendrin irgendwelche Dateien verändert.
Dachte daher, dass bei späteren Schreibzugriffen, also während der Aktion, sowas wie ein Copy-on-Write abläuft, wo geänderte Dateien nicht das "Original" überschreiben, sondern eine Kopie ändern.

sh17 30. Mär 2017 09:06

AW: Volume Shadow Copy Service
 
Wenn ich die Quellen selbst übersetze und das ganze als Admin unter Windows 10 ausführe kommt

Exception EOleSysError in Modul VsToolkit.exe bei 000000000014A621.
ERROR : COM call "CoInitializeSecurity" failed. (<Unknown error code>).

Woran kann das liegen?

Die mitgelieferte EXE funktioniert.

a.def 23. Apr 2017 23:59

AW: Volume Shadow Copy Service
 
Ich habs bis heute auch nicht gebacken bekommen das zum Rennen zu bringen.
Gibt es denn nirgendwo ein funktionierendes Beispiel-Projekt?

Hobbycoder 24. Apr 2017 08:08

AW: Volume Shadow Copy Service
 
Was man bei VSS noch beachten sollte ist:

- Wenn man Datenbanken von z.B. einem MS-SQL-Server sichern möchte, die VSS-Writer benachrichtigen sollte, bzw. wenn eben diese nicht möchte, dass diese auch nicht benachrichtigt werden sollen (also nur wenn man auch wirklich die DB sichern/kopieren will)
- Dass, sollte man eben ein Backup von einer Datenbank gemacht haben die VSS-Writer nutzt, diese über ein vollständiges Backup benachrichtig wird. Dann wird das Transaktionslog abgeschnitten, damit eine Konsistenz der Daten auch bei einem Restore sichergestellt werden kann.

Alternativ könnte man sicherlich auch den entsprechenden Dienst z.b. eines Exchangeservers stoppen. Das hätte aber den Nachteil, dass a) die User damit nicht mehr arbeiten können und b) der Server nicht weiß, dass ein vollständiges Backup der Daten erfolgt ist, und somit die Transaktionslogs weiterhin anwachsen.

a.def 24. Apr 2017 08:11

AW: Volume Shadow Copy Service
 
Gibt es auch Infos dazu wie man den Code hier zum Rennen bekommt? :stupid:

Hobbycoder 24. Apr 2017 08:25

AW: Volume Shadow Copy Service
 
Das ist doch der Source für das VSS-Toolkit bei. Läuft der bei dir nicht?

sh17 24. Apr 2017 08:29

AW: Volume Shadow Copy Service
 
Zitat:

Zitat von Hobbycoder (Beitrag 1368788)
Das ist doch der Source für das VSS-Toolkit bei. Läuft der bei dir nicht?

Das ist es ja, er funktioniert nicht

Hobbycoder 24. Apr 2017 08:36

AW: Volume Shadow Copy Service
 
Und welchen Fehler bekommst du? Oder meldet dein Delphi jetzt nur "Geht nicht"?

sh17 24. Apr 2017 08:44

AW: Volume Shadow Copy Service
 
So wie ich oben beschrieben habe

http://www.delphipraxis.net/1365944-post17.html

Hobbycoder 24. Apr 2017 08:57

AW: Volume Shadow Copy Service
 
Sorry, den Beitrag hatte ich überlesen.

Läuft bei mir ohne Fehler. Sowohl als 32-Bit als auch als 64-bit (natürlich nur als Administrator).
mit welchen Optionen startest du es denn?

Einzig die Unit FileUtils habe ich gegen JclDateUtils getauscht, weil er die nicht gefunden hat.

sh17 24. Apr 2017 09:16

AW: Volume Shadow Copy Service
 
Unter Windows 10?

Hobbycoder 24. Apr 2017 09:56

AW: Volume Shadow Copy Service
 
Ja.

a.def 24. Apr 2017 12:08

AW: Volume Shadow Copy Service
 
Zitat:

Das ist doch der Source für das VSS-Toolkit bei. Läuft der bei dir nicht?
Ich bekomme zwar kompiliert aber dann gibt es AV's.

Gibt es nichts Einfacheres wie man VSS nutzen kann? Ein simples Beispielprojekt welches auch Sinn ergibt?

Hobbycoder 24. Apr 2017 12:52

AW: Volume Shadow Copy Service
 
Hm...noch einfacher. Sind doch nur 300 Zeilen im Programm.
Pack dir das doch in eine Klasse, dann ist es noch einfacher zu händeln.


Was deine AV's angeht. Ich könnte dir mal die 32 oder 64-Bit-Exe von mir kompiliert schicken. Wenn die geht, liegt am Kompilat.

Oder, was mir grad noch einfällt, manche Backupprogramm z.B. Acronis, installieren ihren eigenen VSS-Treiber und biegen irgendwas am Windows rum, dass das Hauseigene VSS nicht mehr funktioniert. Die verursachen dann bei sowas auch Fehler. Das das nicht sein muss zeigt Drivesnapshot.

a.def 24. Apr 2017 12:54

AW: Volume Shadow Copy Service
 
Wäre das viel Arbeit wenn du das in eine Klasse packst und hier anbietest?

Ein Kompilat kannst du mir schicken. Habe Win7Home x64

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 10:35 Uhr.
Seite 1 von 2  1 2      

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