Share via


PROJECT SERVER 2013. SCRIPT DE POWERSHELL PARA RESTAURAR PROYECTOS AUTOMATICAMENTE.

Hola, buenas

En este post queríamos haceros llegar la referencia a este script de PowerShell que nos puede ayudar a restaurar proyectos que hayamos archivado, usando el “backup” administrativo, de manera automática, de tal manera que nos ayude agilizar esta tarea. Lo hemos probado en la versión de Project Server 2013, y la verdad es que funciona divinamente

El script puede encontrarse en este enlace:

https://gallery.technet.microsoft.com/projectserver/Server-2013-restore-2f4b686b

Desde aquí queremos agradecer al MVP Christoph Muelder, por la creación de este script.

El código en sí es el siguiente:

<<<<<<<<<<<

<# 
 
.SYNOPSIS 
Restores a specified list of projects from archive to draft tables in Microsoft Project Server 2013
 
.DESCRIPTION 
The list of projects to be restored is queried from the Project Server database by a query connecting to the standard ver.msp_projects table. 
It can be filtered by any column contained in the Archive Projects table (e.g. date of the version) 
After the list of Project UIDs is retrieved the script makes a connection to the PSI Projects WebService to initiate a restore of all the projects. 
The restore requests enter the Project Server queue and will be executed there. 
 
.PARAMETER ProjectServerURL     
URL of the Project Server instance to be connected to (example: https://projectserver/pwa 
 
.PARAMETER DatabaseServer 
Name of the SQL Server (or database instance) containing the database (example: SQLSRV1\INSTANCE1) 
 
.PARAMETER ReportingDB 
Name of the ProjectServer Database (example: PWA_Reporting) 
 
.PARAMETER WhereClause 
WHERE CLAUSE to specify the list of projects to be restored (optional Parameter). (example: "WHERE proj_name like '%Test%' "  (double quotes needed) 
 
.EXAMPLE 
.\SOLVIN_EasyRestoreFromArchive.ps1 -ProjectServerURL https://projectserver/pwa -DatabaseServer SQLSRV1 -ReportingDB PWA_Reporting -WhereClause "WHERE proj_name like '%Test%'" 
Restore the last version of all projects containing "Test" in the name
 
.EXAMPLE 
.\SOLVIN_EasyRestoreFromArchive.ps1 -ProjectServerURL https://projectserver/pwa -DatabaseServer SQLSRV1 -ReportingDB PWA_Reporting -WhereClause "WHERE maxdate <'2015-01-01'" 
Restore the last version of all projects that have been last written to archive before that date
 
.NOTES 
You need to have Read permissions to the Project Server Database and Project Server Administrative permissions to run this Script. 
Integrated SQL query will read only the newest version of each project and will limit to projects that still exist in the draft database. Can be modified as needed.
 
#> 
 
 
#define parameters 
PARAM( 
    [parameter(Mandatory=$true)] 
    [string]  
    $ProjectServerURL  
    , 
    [parameter(Mandatory=$true)] 
    [string]  
    $DatabaseServer  
    , 
    [parameter(Mandatory=$true)] 
    [string]  
    $ReportingDB 
    ,     
    [string] 
    $WhereClause 
   ) 
     
# connect to windows authentication using current username/password  
 
$connection= new-object system.data.sqlclient.sqlconnection #Set new object to connect to sql database  
 
$connection.ConnectionString ="server=$DatabaseServer;database=$ReportingDB;trusted_connection=True" # Connectiongstring setting for local machine database with window authentication  
 
Write-host "connection information:"  
 
$connection #List connection information  
 
Write-host "connect to database successful."  
 
$connection.open() #Connecting successful  
 
#####################################################################  
 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand #setting object to use sql commands  
 
$SqlQuery = "select archiv.proj_name,max.maxdate,max.proj_version_uid,archiv.proj_uid  from
(
select proj_version_uid,max(proj_version_date) as maxdate from ver.msp_projects 
group by proj_version_uid
)as max
inner join ver.msp_projects as archiv
on max.proj_version_uid=archiv.proj_version_uid and max.maxdate=archiv.proj_version_date
inner join draft.msp_projects as draft on draft.proj_uid=archiv.proj_version_uid
$WhereClause " #setting query   
 
$SqlCmd.CommandText = $SqlQuery # get query  
 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter #  
 
$SqlAdapter.SelectCommand = $SqlCmd 
 
$SqlCmd.Connection = $connection  
 
$DataSet = New-Object System.Data.DataSet  
 
$SqlAdapter.Fill($DataSet)   
 
$connection.Close()  
 
    $svcPSProxy = New-WebServiceProxy -uri "$ProjectServerURL/_vti_bin/PSI/Archive.asmx?wsdl" -useDefaultCredential 
     
    foreach ($row in $DataSet.Tables[0]) 
    {  
        if ($row.ItemArray.Count -gt 0) 
        { 
            Write-Host "Restoring project" $row[0] "version from " $row[1] 
            $projId = [System.Guid]$row[3] 
            $archiveId = [System.Guid]$row[2] 
            $svcPSProxy.QueueRestoreProject([System.Guid]::NewGuid() , $archiveId, $projId) 
        } 
    } 

>>>>>>>>>>>>>>>>>>>

 

Funciona perfectamente, y simplemente comentaros que es necesario indicar en la clausula “WHERE” “archive.proj_name”, en vez de “proj_name”, para evitar un error “Ambiguous column name”.

 

Esperamos os resulte de interés, un saludo.

 

Jorge Puig