Scripts de Powershell para hacer una copy de security de SQL, SVN

Intento utilizar PowerShell para crear algunas copys de security y luego copyrlas en una carpeta web (o, en otras palabras, cargarlas en un recurso compartido de WebDAV).

Al principio pensé que haría las cosas de WebDAV desde dentro de PowerShell, pero parece que esto todavía requiere una buena cantidad de "trabajo manual", es decir, build requestes HTTP. Luego me conformé con crear una carpeta web a partir de la secuencia de commands y dejar que Windows manejara las cosas de WebDAV. Parece que todo lo que se necesita para crear una carpeta web es crear un acceso directo estándar, como se describe aquí .

Lo que no puedo entender es cómo copyr realmente los files al objective del atajo … Tal vez estoy haciendo esto de la manera incorrecta.

Sería ideal si pudiera cifrar de alguna manera las cnetworkingenciales para WebDAV en el script, luego hacer que cree la carpeta web, desviar los files y eliminar la carpeta web nuevamente. O mejor aún, no usar una carpeta web en absoluto. La tercera opción sería simplemente crear la carpeta web manualmente y dejarla allí, aunque prefiero no hacerlo.

¿Alguna idea / pointers / consejos? 🙂

Si está utilizando PowerShell para realizar una copy de security de sus repositorys SVN utilizando svnadmin dump, tenga en count que la connection a un file dañará silenciosamente sus copys de security.

A Powershell le gusta cambiar las cosas a UTF-16 cuando se canaliza, también cambia los saltos de línea de Unix a los de Windows. Esto volverá a perseguirte cuando intentes restaurarlo.

Problema bien descrito aquí:

http://thoughtfulcode.wordpress.com/2010/01/29/powershells-object-pipeline-corrupts-piped-binary-data/

Solución aquí:

http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.windows.powershell&tid=e4cd89e9-427b-407d-a94f-c24be3f1e36f&cat=&lang=&cr=&sloc=&p= 1

En resumen, use cmd.exe en lugar de powershell:

cmd.exe /c svnadmin dump ... `> dumpfile.dump 

Tenga en count que se requiere el backtick en la networkingirección de salida para detener el análisis de PowerShell.

Bueno, mientras tanto improvisé otra solución. Tal vez sea útil para alguien …

[Run.cmd] –Es posible que necesite cambiar la ruta de powershell

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nologo -noninteractive -command "C:\Scripts\RunBackup.ps1" 

[RunBackup.ps1] –Out-File que no tiene el efecto deseado, ¿quizás alguien puede descubrir por qué?

 C:\Scripts\SqlBackup.ps1 | Out-File "C:\Scripts\log.txt" C:\Scripts\SVNBackup.ps1 | Out-File "C:\Scripts\log.txt" C:\Scripts\Zip.ps1 | Out-File "C:\Scripts\log.txt" 

[SqlBackup.ps1]: es posible que deba modificar qué ensamblados de SMO se cargan, según su versión del server SQL. No te olvides de configurar $ instancia y $ bkdir.

 #http://www.mssqltips.com/tip.asp?tip=1862&home $instance = ".\SQLEXPRESS" [System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SMO.dll") | out-null [System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SMOExtended.dll") | out-null $s = new-object ("Microsoft.SqlServer.Management.Smo.Server") $instance $bkdir = "c:\Backups" #We define the folder path as a variable $dbs = $s.Databases foreach ($db in $dbs) { if($db.Name -ne "tempdb") #We don't want to backup the tempdb database { $dbname = $db.Name $dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup") $dbBackup.Action = "Database" $dbBackup.Database = $dbname $dbBackup.Devices.AddDevice($bkdir + "\" + $dbname + "_db_" + $dt + ".bak", "File") $dbBackup.SqlBackup($s) } if($db.RecoveryModel -ne 3) #Don't issue Log backups for DBs with RecoveryModel=3 or SIMPLE { $dbname = $db.Name $dt = get-date -format yyyyMMddHHmm #Create a file name based on the timestamp $dbBackup = new-object ("Microsoft.SqlServer.Management.Smo.Backup") $dbBackup.Action = "Log" $dbBackup.Database = $dbname $dbBackup.Devices.AddDevice($bkdir + "\" + $dbname + "_log_" + $dt + ".trn", "File") $dbBackup.SqlBackup($s) } } 

[SVNBackup.ps1] – Modifique el repository y las routes de respaldo

 #set alias to svnadmin exe set-alias svnadmin "C:\Program Files (x86)\CollabNet Subversion Server\svnadmin.exe" #create dump cmd.exe /c svnadmin dump "C:\Repo" `> "C:\Backups\svn.dmp" #remove alias remove-item alias:svnadmin 

[Zip.ps1] –Necesita tener 7zip instalado, modificar la ruta 7z.exe si es necesario

 #set alias to command line version of 7zip set-alias sevenz "c:\program files\7-zip\7z.exe" #Backups location cd 'C:\Backups' #rar the contents of the directory $dt = get-date -format yyyyMMddHHmm #We use this to create a file name based on the timestamp $outputFileName = "SQLSVNBackup$dt.7z" $exclude1 = "-x!*.rar" $exclude2 = "-x!*.7z" sevenz a -t7z "$outputFileName" *.* "$exclude1" "$exclude2" #find all .bak files in the immediate directory dir '*.bak' | foreach-object{ #remove the bak file remove-item $_.name } #find all .dmp files in the immediate directory dir '*.dmp' | foreach-object{ #remove the dmp file remove-item $_.name } #find all .trn files in the immediate directory dir '*.trn' | foreach-object{ #remove the trn file remove-item $_.name } #remove 7zip alias remove-item alias:sevenz 

Utilicé GoodSync para realizar una copy de security en WebDAV y programé dos tareas para ejecutar el file .cmd y luego sincronizar / respaldar fuera del sitio.