Skip to content

Commit 177ff48

Browse files
authored
Merge pull request #1264 from getalex/patch-2
Major update: ssrs_migration.rss
2 parents e2eaa3e + 61647dc commit 177ff48

File tree

1 file changed

+108
-30
lines changed

1 file changed

+108
-30
lines changed

samples/features/reporting-services/ssrs-migration-rss/ssrs_migration.rss

Lines changed: 108 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,17 @@
1818
' 3) Run the following command (in one line):
1919
' rs.exe -i ssrs_migration.rss -e Mgmt2010
2020
'
21-
' -s SOURCE_URL 'URL of the source RS server.
22-
' -u domain\username -p password 'Credentials for source server. OPTIONAL, default credentials are used if missing.
23-
' -v st="SITE" 'Specifies SharePoint site, in case source server is in SharePoint integrated mode
24-
' -v f="SOURCEFOLDER" 'Set to "/" for migrating everything, or to something like "/folder/subfolder" for partial migration. Everything within this folder will be copied. OPTIONAL, default is "/".
21+
' -s SOURCE_URL 'URL of the source RS server.
22+
' -u domain\username -p password 'Credentials for source server. OPTIONAL, default credentials are used if missing.
23+
' -v st="SITE" 'Specifies SharePoint site, in case source server is in SharePoint integrated mode
24+
' -v f="SOURCEFOLDER" 'Set to "/" for migrating everything, or to something like "/folder/subfolder" for partial migration. Everything within this folder will be copied. OPTIONAL, default is "/".
2525
'
26-
' -v ts="TARGET_URL" 'URL of the target RS server"
27-
' -v tu="domain\username" -v tp="password" 'Credentials for target server. OPTIONAL, default credentials are used if missing.
28-
' -v tst="SITE" 'Specifies SharePoint site, in case target server is in SharePoint integrated mode
29-
' -v tf="TARGETFOLDER" 'Set to "/" for migrating into the root level, or to something like "/folder/subfolder" for copying into some folder, which must be already existing. Everything within "SOURCEFOLDER" will be copied into "TARGETFOLDER". OPTIONAL, default is "/".
30-
' -v security= "True/False" 'If set to "False", destination catalog items will inherit security setting according to the settings of the target system. Default is false.
26+
' -v ts="TARGET_URL" 'URL of the target RS server"
27+
' -v tu="domain\username" -v tp="password" 'Credentials for target server. OPTIONAL, default credentials are used if missing.
28+
' -v tst="SITE" 'Specifies SharePoint site, in case target server is in SharePoint integrated mode
29+
' -v tf="TARGETFOLDER" 'Set to "/" for migrating into the root level, or to something like "/folder/subfolder" for copying into some folder, which must be already existing. Everything within "SOURCEFOLDER" will be copied into "TARGETFOLDER". OPTIONAL, default is "/".
30+
' -v security= "True/False" 'If set to "False", destination catalog items will inherit security setting according to the settings of the target system. Default is false.
31+
' -v logprefix="PREFIX" 'Prefix name to the output log file.
3132
'
3233
' Example: rs.exe -i ssrs_migration.rss -e Mgmt2010 -s http://server1/reportserver -v ts="http://server2/_vti_bin/reportserver"
3334
' Example: rs.exe -i ssrs_migration.rss -e Mgmt2010 -s http://server1/reportserver -u domain1\user1 -p password1 -v f="/SOURCEFOLDER" -v ts="http://server2/_vti_bin/reportserver" -v tu="domain1\user2" -v tp="password2" -v tf="/TARGETFOLDER"
@@ -49,7 +50,6 @@
4950
' Open http://servername/_vti_bin/reportserver in a browser to see the non-virtual folder structure.
5051
' This is helpful for setting SrcFolder and SnkFolder to something other than "/" for a server in SharePoint integrated mode.
5152

52-
5353
Private RsSrc As ReportingService2010
5454
Private SrcProtocol As String = "http"
5555
Private SrcServer As String
@@ -75,6 +75,7 @@ Private policies As Policy() = Nothing
7575
Private srcSiteUrl As String = Nothing
7676
Private snkSiteUrl As String = Nothing
7777

78+
Private logFilePath As String = "MigrationLog.txt"
7879

7980
''''''''''''''''''''''''''''''''''''''''''''''
8081
Sub Main()
@@ -151,6 +152,11 @@ Sub Main()
151152

152153
If Not Me.GetType().GetField("security") Is Nothing Then
153154
MigrateSecurity = (Me.GetType().GetField("security").GetValue(Me).ToLower = "true")
155+
End If
156+
157+
' Update the migration log path to prefix if speficied
158+
If Not Me.GetType().GetField("logprefix") Is Nothing Then
159+
logFilePath = Me.GetType().GetField("logprefix").GetValue(Me) + "_" + logFilePath
154160
End If
155161

156162
SnkFolder = SnkSite + SnkFolder
@@ -225,13 +231,35 @@ Sub Main()
225231

226232
' Create destination folder if not present
227233
Try
228-
RsSnk.CreateFolder(SnkFolder.Substring(1), "/", Nothing)
229-
Catch ex As Exception
230-
If (ex.Message.Contains("Microsoft.ReportingServices.Diagnostics.Utilities.ItemAlreadyExistsException"))
231-
Console.WriteLine("Folder already exists.")
232-
Else
233-
Console.WriteLine(ex.Message + Environment.NewLine)
234-
End If
234+
If SnkFolder.Contains("/") And Not SnkFolder = "/" Then
235+
Dim targetFolders As String() = SnkFolder.Substring(1).Split("/"c)
236+
Dim parentFolder As String = "/"
237+
238+
For Each folderName As String In targetFolders
239+
240+
Try
241+
RsSnk.CreateFolder(folderName, parentFolder, Nothing)
242+
Catch er As Exception
243+
If (er.Message.Contains("Microsoft.ReportingServices.Diagnostics.Utilities.ItemAlreadyExistsException"))
244+
Console.ForegroundColor = ConsoleColor.Yellow
245+
Console.WriteLine("Folder already exists.")
246+
Console.ResetColor()
247+
Else
248+
Throw ' Unknown Exception
249+
End If
250+
End Try
251+
252+
If parentFolder <> "/" Then
253+
parentFolder = parentFolder + "/" + folderName
254+
Else
255+
parentFolder = "/" + folderName
256+
End If
257+
Next
258+
End If
259+
Catch ex As Exception
260+
Console.ForegroundColor = ConsoleColor.Red
261+
Console.WriteLine(ex.Message + Environment.NewLine)
262+
Console.ResetColor()
235263
End Try
236264

237265
Try
@@ -311,11 +339,11 @@ Sub Main()
311339
Console.ForegroundColor = ConsoleColor.Red
312340
Console.WriteLine(ex.Message + Environment.NewLine)
313341
Console.ResetColor()
342+
LogErrorToFile("GENERAL", "Exception", ex.Message)
314343
End Try
315344
End Sub
316345

317346

318-
319347
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
320348
'''''''''''' Migrate global settings'''''''''''''''''''
321349
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
@@ -338,13 +366,15 @@ Sub MigrateSchedules()
338366
Console.WriteLine(" ... FAILURE:")
339367
Console.WriteLine(e.Message + Environment.NewLine)
340368
Console.ResetColor()
369+
LogErrorToFile("SCHEDULES", s.Name, e.Message)
341370
End Try
342371
Next
343372

344373
Catch ex As Exception
345374
Console.ForegroundColor = ConsoleColor.Red
346375
Console.WriteLine(ex.Message + Environment.NewLine)
347376
Console.ResetColor()
377+
LogErrorToFile("SCHEDULES", "Exception", ex.Message)
348378
End Try
349379
End Sub
350380

@@ -357,7 +387,6 @@ Sub MigrateRoles()
357387
Console.WriteLine("Migrating roles.")
358388

359389
Try
360-
361390
For Each r As Role In roles
362391
Try
363392
Console.Write("Migrating role: " + r.Name)
@@ -376,13 +405,15 @@ Sub MigrateRoles()
376405
Console.WriteLine(" ... FAILURE:")
377406
Console.WriteLine(e.Message + Environment.NewLine)
378407
Console.ResetColor()
408+
LogErrorToFile("ROLES", r.Name, e.Message)
379409
End Try
380410
Next
381411

382412
Catch ex As Exception
383413
Console.ForegroundColor = ConsoleColor.Red
384414
Console.WriteLine(ex.Message + Environment.NewLine)
385415
Console.ResetColor()
416+
LogErrorToFile("ROLES", "Exception", ex.Message)
386417
End Try
387418
End Sub
388419

@@ -402,6 +433,7 @@ Sub MigrateSystemPolicies()
402433
Console.WriteLine("... FAILURE:")
403434
Console.WriteLine(ex.Message + Environment.NewLine)
404435
Console.ResetColor()
436+
LogErrorToFile("POLICIES", "Exception", ex.Message)
405437
End Try
406438
End Sub
407439

@@ -423,6 +455,7 @@ Function MigrateFolder(srcItem As CatalogItem) As CatalogItem
423455
Console.WriteLine(" ... FAILURE:")
424456
Console.WriteLine(ex.Message + Environment.NewLine)
425457
Console.ResetColor()
458+
LogErrorToFile("FOLDER", srcItem.Path, ex.Message)
426459
End Try
427460
Return result
428461
End Function
@@ -441,15 +474,20 @@ Function MigrateDataSource(srcItem As CatalogItem) As CatalogItem
441474

442475
If definition.CredentialRetrieval = CredentialRetrievalEnum.Store Then
443476
Console.ForegroundColor = ConsoleColor.Yellow
444-
Console.WriteLine("You need to re-enter the password for user '" + definition.UserName + "' in data source '" + result.Path + "'")
477+
Dim warningMsg as String = "You need to re-enter the password for user '" + definition.UserName + "' in data source '" + result.Path + "'"
478+
Console.WriteLine(warningMsg)
445479
Console.ResetColor()
480+
481+
LogErrorToFile("CATALOGITEM", "Warning", warningMsg)
482+
446483
End If
447484

448485
Catch ex As Exception
449486
Console.ForegroundColor = ConsoleColor.Red
450487
Console.WriteLine(" ... FAILURE:")
451488
Console.WriteLine(ex.Message + Environment.NewLine)
452489
Console.ResetColor()
490+
LogErrorToFile("DATASOURCE", srcItem.Path, ex.Message)
453491
End Try
454492
Return result
455493
End Function
@@ -489,6 +527,7 @@ Function MigrateLinkedReport(srcItem As CatalogItem) As CatalogItem
489527
Console.WriteLine(" ... FAILURE:")
490528
Console.WriteLine(ex.Message + Environment.NewLine)
491529
Console.ResetColor()
530+
LogErrorToFile("LINKEDREPORT", srcItem.Path, ex.Message)
492531
End Try
493532
Return result
494533
End Function
@@ -524,8 +563,11 @@ Function MigrateCatalogItem(srcItem As CatalogItem) As CatalogItem
524563
Dim dsd As DataSourceDefinition = d.Item
525564
If dsd.CredentialRetrieval = CredentialRetrievalEnum.Store Then
526565
Console.ForegroundColor = ConsoleColor.Yellow
527-
Console.WriteLine("You need to re-enter the password for user '" + dsd.UserName + "' in data source '" + d.Name + "' contained in " + result.TypeName + " '" + result.Path + "'")
566+
Dim warningMsg as String = "You need to re-enter the password for user '" + dsd.UserName + "' in data source '" + d.Name + "' contained in " + result.TypeName + " '" + result.Path + "'"
567+
Console.WriteLine(warningMsg)
528568
Console.ResetColor()
569+
570+
LogErrorToFile("CATALOGITEM", "Warning", warningMsg)
529571
End If
530572
End If
531573
Next
@@ -548,13 +590,12 @@ Function MigrateCatalogItem(srcItem As CatalogItem) As CatalogItem
548590
Console.ForegroundColor = ConsoleColor.Red
549591
Console.WriteLine(Environment.NewLine + ex.Message + Environment.NewLine)
550592
Console.ResetColor()
593+
LogErrorToFile("CATALOGITEM", srcItem.Path, ex.Message)
551594
End Try
552595
Return result
553596
End Function
554597

555598

556-
557-
558599
'Re-link DataSources of a Report or a Model
559600
Sub RelinkDataSources(snkReport As CatalogItem, srcReport As CatalogItem)
560601
Console.Write("Re-linking data source for item " + snkReport.Name)
@@ -593,6 +634,7 @@ Sub RelinkDataSources(snkReport As CatalogItem, srcReport As CatalogItem)
593634
Console.WriteLine(" ... FAILURE:")
594635
Console.WriteLine(ex.Message + Environment.NewLine)
595636
Console.ResetColor()
637+
LogErrorToFile("RELINKDATASOURCE", snkReport.Name, ex.Message)
596638
End Try
597639
End Sub
598640

@@ -628,12 +670,12 @@ Sub RelinkItemReferences(snkItem As CatalogItem, srcItem As CatalogItem)
628670
Console.WriteLine(" ... FAILURE:")
629671
Console.WriteLine(ex.Message + Environment.NewLine)
630672
Console.ResetColor()
673+
LogErrorToFile("RELINKREFERENCES", snkItem.Name, ex.Message)
631674
End Try
632675
End Sub
633676

634677

635678

636-
637679
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
638680
''''''''''''' Migrate report artefacts ''''''''''''''''
639681
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
@@ -710,8 +752,12 @@ Sub MigrateReportSubscriptions(snkReport As CatalogItem, srcReport As CatalogIte
710752
Dim dsd As DataSourceDefinition = dataRetrievalPlan.Item
711753
If dsd.CredentialRetrieval = CredentialRetrievalEnum.Store Then
712754
Console.ForegroundColor = ConsoleColor.Yellow
713-
Console.WriteLine("You need to re-enter the password for user '" + dsd.UserName + "' in data-driven subscription '" + description + "' contained in report '" + snkReport.Path + "'")
714-
Console.ResetColor()
755+
Dim warningMsg as String = "You need to re-enter the password for user '" + dsd.UserName + "' in data-driven subscription '" + description + "' contained in report '" + snkReport.Path + "'"
756+
Console.WriteLine(warningMsg)
757+
Console.ResetColor()
758+
759+
LogErrorToFile("SUBSCRIPTIONS", "Warning", warningMsg)
760+
715761
End If
716762
End If
717763

@@ -745,8 +791,12 @@ Sub MigrateReportSubscriptions(snkReport As CatalogItem, srcReport As CatalogIte
745791
End If
746792
Next
747793
Console.ForegroundColor = ConsoleColor.Yellow
748-
Console.WriteLine("You need to re-enter the password for user '" + username + "' in file share subscription '" + description + "' contained in report '" + snkReport.Path + "'.")
749-
Console.ResetColor()
794+
Dim warningMsg as String = "You need to re-enter the password for user '" + username + "' in file share subscription '" + description + "' contained in report '" + snkReport.Path + "'."
795+
Console.WriteLine(warningMsg)
796+
Console.ResetColor()
797+
798+
LogErrorToFile("SUBSCRIPTIONS", "Warning", warningMsg)
799+
750800
End If
751801
Next
752802

@@ -755,6 +805,7 @@ Sub MigrateReportSubscriptions(snkReport As CatalogItem, srcReport As CatalogIte
755805
Console.WriteLine(" ... FAILURE:")
756806
Console.WriteLine(ex.Message + Environment.NewLine)
757807
Console.ResetColor()
808+
LogErrorToFile("SUBSCRIPTIONS", snkReport.Name, ex.Message)
758809
End Try
759810
End Sub
760811

@@ -788,13 +839,15 @@ Sub MigrateCacheRefreshPlans(snkReport As CatalogItem, srcReport As CatalogItem)
788839
Console.WriteLine(" ... FAILURE")
789840
Console.WriteLine(e.Message + Environment.NewLine)
790841
Console.ResetColor()
842+
LogErrorToFile("CACHEREFRESH", snkReport.Name, e.Message)
791843
End Try
792844
Next
793845

794846
Catch ex As Exception
795847
Console.ForegroundColor = ConsoleColor.Red
796848
Console.WriteLine(ex.Message + Environment.NewLine)
797849
Console.ResetColor()
850+
LogErrorToFile("CACHEREFRESH", "Exception", ex.Message)
798851
End Try
799852
End Sub
800853

@@ -817,6 +870,7 @@ Sub MigrateReportParameters(snkReport As CatalogItem, srcReport As CatalogItem)
817870
Console.WriteLine(" ... FAILURE:")
818871
Console.WriteLine(ex.Message + Environment.NewLine)
819872
Console.ResetColor()
873+
LogErrorToFile("REPORTPARAMETERS", snkReport.Name, ex.Message)
820874
End Try
821875
End Sub
822876

@@ -840,6 +894,7 @@ Sub MigrateReportExecutionOptions(snkReport As CatalogItem, srcReport As Catalog
840894
Console.WriteLine(" ... FAILURE:")
841895
Console.WriteLine(ex.Message + Environment.NewLine)
842896
Console.ResetColor()
897+
LogErrorToFile("EXECUTIONOPTIONS", snkReport.Name, ex.Message)
843898
End Try
844899
End Sub
845900

@@ -863,6 +918,7 @@ Sub MigrateReportCacheOptions(snkReport As CatalogItem, srcReport As CatalogItem
863918
Console.WriteLine(" ... FAILURE:")
864919
Console.WriteLine(ex.Message + Environment.NewLine)
865920
Console.ResetColor()
921+
LogErrorToFile("CACHEOPTIONS", snkReport.Name, ex.Message)
866922
End Try
867923
End Sub
868924

@@ -892,6 +948,7 @@ Sub MigrateReportHistorySettings(snkReport As CatalogItem, srcReport As CatalogI
892948
Console.WriteLine(" ... FAILURE:")
893949
Console.WriteLine(ex.Message + Environment.NewLine)
894950
Console.ResetColor()
951+
LogErrorToFile("HISTORYSETTINGS", snkReport.Name, ex.Message)
895952
End Try
896953
End Sub
897954

@@ -922,12 +979,11 @@ Sub MigrateItemPolicies(snkReport As CatalogItem, srcReport As CatalogItem)
922979
Console.WriteLine(" ... FAILURE:")
923980
Console.WriteLine(ex.Message + Environment.NewLine)
924981
Console.ResetColor()
982+
LogErrorToFile("ITEMPOLICIES", snkReport.Name, ex.Message)
925983
End Try
926984
End Sub
927985

928986

929-
930-
931987
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
932988
'''''''''''''' Helper Functions '''''''''''''''''''''''
933989
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
@@ -1128,3 +1184,25 @@ Function SortParentFoldersFirst(first As CatalogItem, second As CatalogItem) As
11281184
Return String.Compare(first.Path, second.Path)
11291185
End If
11301186
End Function
1187+
1188+
Sub LogErrorToFile(source As String, errItem as String, message As String)
1189+
Dim writer as StreamWriter
1190+
1191+
Try
1192+
' Create a StreamWriter object
1193+
writer = New StreamWriter(logFilePath, True)
1194+
1195+
' Format log message with timestamp
1196+
Dim timeStamp As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
1197+
Dim formattedMessage as String = String.Format("{0}, {1}, {2}, ""{3}""", timeStamp, source, errItem, message.Replace(Environment.NewLine, ""))
1198+
1199+
' Write the log entry to file
1200+
writer.WriteLine(formattedMessage)
1201+
Catch ex As Exception
1202+
Console.WriteLine(ex.Message)
1203+
Finally
1204+
If Not writer Is Nothing Then
1205+
writer.Close()
1206+
End If
1207+
End Try
1208+
End Sub

0 commit comments

Comments
 (0)