Seite 1 von 1
Volume Shadowcopy Provider
Verfasst: 07.06.2014 23:04
von Sundance
Hallo Zusammen,
ich versuche unter PureBasic den Microsoft VolumeShadowcopyService (VSS) zu nutzen. Dieser wird als COM Object zur Verfügung gestellt.
Hier seht ihr eine generelle Definition wie mit dem Object/Interface gearbeitet werden kann:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Um die Sache zu Vereinfachen dachte ich mir ich nutze COMate(-Plus)
Code: Alles auswählen
IncludePath ".\COMate"
XIncludeFile "COMatePLUS.pbi"
Define.COMateObject VSSobject
COMate_RegisterCOMServer("c:\windows\system32\vssapi.dll")
VSSobject = COMate_CreateObject("IVssBackupComponents")
If Not VSSobject
PrintN("no VSS object created")
PrintN(COMate_GetLastErrorDescription())
ProcedureReturn 0
EndIf
Leider erhalte ich folgende Meldung: 'Invalid progID/CLSID. Check your spelling ...'
Ich habe auch mal versucht verschiedene CLSID zu nutzen, aber auch das geht daneben.
Wahrscheinlich mache ich etwas grundlegendes falsch...
Vielleicht kann mir einer von den Profis einen kleinen Tipp geben!?
Viele Grüße
Sundance
Re: Volume Shadowcopy Provider
Verfasst: 11.06.2014 11:12
von _JON_
Also COMate brauchst du hier nicht.
Das IVssBackupComponents Objekt bekommst Du durch Aufruf der CreateVssBackupComponentsInternal() API.
Was Du aber vorher machen musst sind die Interferaces und Konstanten raus suchen.
Die Interfaces sollten alle auf IUnknown aufbauen, sollte also so aussehen.
Code: Alles auswählen
Interface IVssBackupComponents Extends IUnknown
GetWriterComponentsCount(*pcComponents)
...
EndInterface
Re: Volume Shadowcopy Provider
Verfasst: 11.06.2014 11:34
von Sundance
Hi _JON_,
danke dir für die Antwort. Dann mache ich das mal. Hatte schon vermutet das ich hier mit Kanonen auf Spatzen schieße.
Vielen Dank!!!
Sundance
PS: Falls ich was habe, poste ich das hier.
Re: Volume Shadowcopy Provider
Verfasst: 15.06.2014 16:02
von Sundance
So. Da bin ich wieder. Ich habe nun mal einige Konstanten und die ersten zwei Befehle im entsprechenden Interface geschrieben.
Mir ist es aber vollkommen schleierhaft wie ich jetzt das COM Objekt erzeuge. Ich habe das schonmal in AutoIt geschrieben. Aber mir fehlt der Entsprechende Part in PB. Ich denke ich muss mit CoCreateInstance_ das Objekt erzeugen, grübel aber noch wie....
Ich zeige euch mal die Include Dateie und den Hauptcode. Vielleicht kann mir jemand einen kleinen Stupps geben. Vielleicht habe ich auch nur noch nicht ein für mich verwertbares Beispiel gefunden. Kann aber auch sein das die späten WM Spiele mir einen Streich spielen. *gähn*. (Diese glücklichen Italiener...)
viele Grüße
Sundance
PS: Ich sehe gerade, dass ich keine Datei anhängen kann. Dann mal hier der Code so...
VSSinc.pb:
Code: Alles auswählen
; VSS_OBJECT_TYPE
#VSS_OBJECT_UNKNOWN = 0
#VSS_OBJECT_NONE = 1
#VSS_OBJECT_SNAPSHOT_SET = 2
#VSS_OBJECT_SNAPSHOT = 3
#VSS_OBJECT_PROVIDER = 4
#VSS_OBJECT_TYPE_COUNT = 5
; VSS_BACKUP_TYPE
#VSS_BT_UNDEFINED = 0
#VSS_BT_FULL = 1
#VSS_BT_INCREMENTAL = 2
#VSS_BT_DIFFERENTIAL = 3
#VSS_BT_LOG = 4
#VSS_BT_COPY = 5
#VSS_BT_OTHER = 6
; VSS_VOLUME_SNAPSHOT_ATTRIBUTES
#VSS_VOLSNAP_ATTR_PERSISTENT = $1
#VSS_VOLSNAP_ATTR_NO_AUTORECOVERY = $2
#VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE = $4
#VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE = $8
#VSS_VOLSNAP_ATTR_NO_WRITERS = $10
#VSS_VOLSNAP_ATTR_TRANSPORTABLE = $20
#VSS_VOLSNAP_ATTR_NOT_SURFACED = $40
#VSS_VOLSNAP_ATTR_NOT_TRANSACTED = $80
#VSS_VOLSNAP_ATTR_HARDWARE_ASSISTED = $10000
#VSS_VOLSNAP_ATTR_DIFFERENTIAL = $20000
#VSS_VOLSNAP_ATTR_PLEX = $40000
#VSS_VOLSNAP_ATTR_IMPORTED = $80000
#VSS_VOLSNAP_ATTR_EXPOSED_LOCALLY = $100000
#VSS_VOLSNAP_ATTR_EXPOSED_REMOTELY = $200000
#VSS_VOLSNAP_ATTR_AUTORECOVER = $400000
#VSS_VOLSNAP_ATTR_ROLLBACK_RECOVERY = $800000
#VSS_VOLSNAP_ATTR_DELAYED_POSTSNAPSHOT= $1000000
#VSS_VOLSNAP_ATTR_TXF_RECOVERY = $2000000
; VSS_SNAPSHOT_CONTEXT
#VSS_CTX_BACKUP = 0
#VSS_CTX_FILE_SHARE_BACKUP = #VSS_VOLSNAP_ATTR_NO_WRITERS
#VSS_CTX_NAS_ROLLBACK = #VSS_VOLSNAP_ATTR_PERSISTENT | #VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE | #VSS_VOLSNAP_ATTR_NO_WRITERS
#VSS_CTX_APP_ROLLBACK = #VSS_VOLSNAP_ATTR_PERSISTENT | #VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE
#VSS_CTX_CLIENT_ACCESSIBLE = #VSS_VOLSNAP_ATTR_PERSISTENT | #VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE | #VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE | #VSS_VOLSNAP_ATTR_NO_WRITERS
#VSS_CTX_CLIENT_ACCESSIBLE_WRITERS = #VSS_VOLSNAP_ATTR_PERSISTENT | #VSS_VOLSNAP_ATTR_CLIENT_ACCESSIBLE | #VSS_VOLSNAP_ATTR_NO_AUTO_RELEASE
#VSS_CTX_ALL = $ffffffff
; VSS_S_ASYNC
#VSS_S_ASYNC_PENDING = $00042309
#VSS_S_ASYNC_FINISHED = $0004230a
#VSS_S_ASYNC_CANCELLED = $0004230b
; default time in milliseconds to wait for a asynchronous operation to finish
#VSS_S_ASYNC_TIMEOUT = 30000
; _VSS_ERROR_CODES
#_VSS_NO_ARRAY = 5
#_VSS_ARRAY_NO_VOLUME = 6
#_VSS_DLL_ERROR = 10
#_VSS_NO_BACKUP_COMPONENT = 11
#_VSS_SETBACKUPSTATE_ERROR = 20
#_VSS_GATHERWRITERMETADATA_ERROR = 21
#_VSS_ASYNC_CREATE_ERROR = 30
#_VSS_ASYNC_OPERATION_TIMEDOUT = 31
#_VSS_ASYNC_OPERATION_ERROR = 32
#_VSS_SETCONTEXT_ERROR = 40
#_VSS_STARTSNAPSHOTSET_ERROR = 45
#_VSS_ADDTOSNAPSHOTSET_ERROR = 46
#_VSS_ADDTOSNAPSHOTSET_SOURCE_ERROR = 47
#_VSS_PREPAREFORBACKUP_ERROR = 50
#_VSS_GATHERWRITERSTATUS_ERROR = 51
#_VSS_DOSNAPSHOTSET_ERROR = 52
#_VSS_BACKUPCOMPLETE_ERROR = 53
#_VSS_DELETESNAPSHOTSET_ERROR = 55
#_VSS_UNKNOWN_ARCHITECTURE = 70
#sIID_IVssBackupComponents = "{665C1D5F-C218-414D-A05D-7FEF5F9D5C86}"
#sIID_IVssAsync_XP_2003 = "{C7B98A22-222D-4e62-B875-1A44980634AF}" ; Windows XP/2003!
#sIID_IVssAsync_VISTA_LATER = "{507C37B4-CF5B-4e95-B0AF-14EB9767467E}" ; windows Vista and later
Interface IVssBackupComponentes Extends IUnknown
InitializeForBackup(*NullPointer)
SetContext(Context.l)
EndInterface
VSScreate.pb:
Code: Alles auswählen
;
;
; VSS modul to do a create a shadowcopy set
;
;
DeclareModule VSS
Declare CreateShadowCopySet( List DriveLetters.s() )
Declare DeleteShadowCopys( List DriveLetters.s() )
EndDeclareModule
Module VSS
XIncludeFile "VSSinc.pb"
Procedure CreateShadowCopySet( List DriveLetters.s() )
Define.i pIVssBackupComponents, hVSS
hVSS = OpenLibrary(#PB_Any, "c:\windows\system32\vssapi.dll")
pIVssBackupComponents = CallFunction(hVSS, "CreateVssBackupComponentsInternal", 0)
CloseLibrary(hVSS)
PrintN("pIVssBackupComponents: " + pIVssBackupComponents)
; Jetzt müsste ich das Interface erzeugen und die Methode InitializeForBackup aufrufen.
;
ProcedureReturn 1
EndProcedure
Procedure DeleteShadowCopys( List DriveLetters.s() )
EndProcedure
EndModule
; test. Create shadowcopy of drive d and e
;
OpenConsole()
PrintN("Creating a shadowcopy set...")
NewList DriveLetters.s()
AddElement(DriveLetters()) : DriveLetters() = "d:"
AddElement(DriveLetters()) : DriveLetters() = "e:"
VSS::CreateShadowCopySet ( DriveLetters() )
PrintN("press enter to release shadow copys") : Input()
VSS::DeleteShadowCopys( DriveLetters() )
CloseConsole()
Re: Volume Shadowcopy Provider
Verfasst: 15.06.2014 20:18
von kunstlust
Hallo Sundance, mit dem Thema habe ich auch mal geliebäugelt, bin aber drüber hinweggekommen. Kannst du deinen AutoIt Code mal aufzeigen, oder den Link zu Forum posten, soweit du Ihn veröffentlich hast?
Ich würde wohl anders angehen und über Purebasic ein Powershell Script erstellen, lassen unter Powershell 3.0 gibt es sehr viele Möglichkeiten, es ist nicht nur die Frage wie VSS zu erstellen, sondern wie es zurückgesichert werden sollte, wie Files aus dem VSS zu wählen sind usw.
Nur mal so als Vorschlag.
Re: Volume Shadowcopy Provider
Verfasst: 15.06.2014 20:53
von _JON_
Code: Alles auswählen
hVSS = OpenLibrary(#PB_Any, "c:\windows\system32\vssapi.dll")
pIVssBackupComponents = CallFunction(hVSS, "CreateVssBackupComponentsInternal", 0)
CloseLibrary(hVSS)
Also Du muss schon die MSDN Dokumentation einer Schnittstelle lesen.
Die Funktion hat einen Parameter in den sie die Adresse des Objekts schreibt, da kannst nicht einfach 0 schreiben.
Aber schau mal ins englische Forum, dort wurde vor kurzem was zu VSS geposted.
Und das auch noch sauber und lesbar

Re: Volume Shadowcopy Provider
Verfasst: 15.06.2014 21:37
von Sundance
Hallo kunstlust,
hier der Link zum AutoItForum Post:
http://www.autoitscript.com/forum/topic ... try1160603
Mir wäre es lieber, auf die PowerShell zu verzichten und es wirklich mit dem von MS zur Verfügung gestellten COM Objekt zu lösen.
Okay Jon, ich schaue mir das mal im englischen Forum an und werde hier weiter posten wenn ich weiter gekommen bin.
Danke euch. Bin mir sicher das wir das schaffen
Viele Grüße
Sundance
Re: Volume Shadowcopy Provider
Verfasst: 16.06.2014 22:06
von Sundance
Hi.
Also im englischen Forum hat PureGuy ein script welches einen SnapShotSet anlegt. Es läuft unter 32 und 64Bit.
Als Anfang um weitere Methoden umsetzen zu können sollte das reichen. Ich werde mir das in den nächsten Tagen mal anschauen und mal versuchen was zu posten.
Danke für die Infos!
bis denne
Sundance