Volume Shadowcopy Provider

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Sundance
Beiträge: 24
Registriert: 25.04.2014 00:46

Volume Shadowcopy Provider

Beitrag 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
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Volume Shadowcopy Provider

Beitrag 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
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Sundance
Beiträge: 24
Registriert: 25.04.2014 00:46

Re: Volume Shadowcopy Provider

Beitrag 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.
Sundance
Beiträge: 24
Registriert: 25.04.2014 00:46

Re: Volume Shadowcopy Provider

Beitrag 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()
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Volume Shadowcopy Provider

Beitrag 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.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Volume Shadowcopy Provider

Beitrag 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 :wink:
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Sundance
Beiträge: 24
Registriert: 25.04.2014 00:46

Re: Volume Shadowcopy Provider

Beitrag 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
Sundance
Beiträge: 24
Registriert: 25.04.2014 00:46

Re: Volume Shadowcopy Provider

Beitrag 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
Antworten