Saya memiliki Skrip Powershell yang sedang saya kerjakan untuk tugas administrasi laporan SSRS pascamigrasi.

Dalam skenario khusus ini, kami memiliki lingkungan DEV (tempat saya terutama menguji) yang menampung satu instance SSRS, dan lingkungan Prod yang merupakan penyebaran skala di 4 node.

Saya baru mengenal Powershell (baru menemukannya 2 hari yang lalu ...) dan skrip yang saya miliki cukup sederhana:

Clear-Host 

$Username = "domain\myUsername"
$Password = "myPassword"

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($Username,(ConvertTo-SecureString -String $Password -AsPlainText -Force))

# Dev Connection String
$webServiceUrl = 'http://DEVwebServer.domain.com/reportserver/reportservice2010.asmx?WSDL'

# Prod Connection String
# $webServiceUrl = 'http://PRODwebServerNode1.domain.com/reportserver/reportservice2010.asmx?WSDL'

$rs = New-WebServiceProxy -Uri $webServiceUrl -Credential $Cred
 
$reports = $rs.ListChildren("/Some Folder Under Root", $true) | Where-Object { $_.TypeName -eq "Report" }

$type = $ssrsProxy.GetType().Namespace;
$schedDefType = "{0}.ScheduleDefinition" -f $type;
$schedDef = New-Object ($schedDefType) 

$warning = @();

foreach ($report in $reports) {

    $sched = $rs.GetExecutionOptions($report.Path, [ref]$schedDef);
    $snapShotExists = $rs.ListItemHistory($report.Path);


    if($sched -eq "Snapshot") {
        Write-Host "Following report is configured to run from Snapshot:" -ForegroundColor Yellow
        Write-Host ("Report Name: {0}`nReport Path: {1}`nExecution Type: {2}`n" -f $report.Name, $report.Path, $sched)

        if ($snapShotExists) {
            Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
            Write-Host "Yes!`tNumber of Snapshots: " $snapShotExists.Count -ForegroundColor Green
            $snapShotExists.CreationDate
            Write-Host "`n------------------------------------------------------------"
        } 
        elseif (!$snapShotExists) {
            Write-Host "Does Snapshot Exist..?`n" -ForegroundColor Yellow
            Write-Host ("No!`n") -ForegroundColor Red
            Write-Host "Creating Snapshot.......`n" -ForegroundColor Yellow
            $rs.CreateItemHistorySnapshot($report.Path, [ref]$warning);
            Write-Host "Snapshot Created!`n" -ForegroundColor Green
            $snapShotExists.CreationDate
            Write-Host "`n------------------------------------------------------------"
        }
    }
}

Tujuan skrip hanyalah untuk mengulang secara rekursif semua laporan untuk folder yang diberikan dalam variabel $reports , periksa untuk melihat apakah jenis eksekusi diatur ke "Snapshot", jika diperiksa untuk melihat apakah "Snapshot Riwayat " ada, dan jika tidak ada, buatlah.

Ketika saya menjalankan ini di Dev, ini berfungsi dengan baik, tetapi ketika saya menjalankan PROD, saya mendapatkan kesalahan berikut yang berulang untuk setiap $report di loop foreach saya:

enter image description here

Adakah ide mengapa ini berhasil di satu dan bukan yang lain dan bagaimana cara mengatasi kesalahan ini?

1
Fernando Vega 22 November 2017, 01:36

1 menjawab

Jawaban Terbaik

Saya dapat membuatnya bekerja pada instance Prod dengan membuat beberapa penyesuaian menggunakan jawaban ini sebagai panduan:

Dengan memperbarui panggilan saya ke New-WebServiceProxy untuk menambahkan bendera Kelas dan Namespace, saya dapat memperbarui skrip dengan cara berikut:

...
# Add Class and Namespace flags to New-WebServiceProxy call
$rs = New-WebServiceProxy -Class 'RS' -Namespace 'RS' -Uri $webServiceUrl -Credential $Cred
 
$reports = $rs.ListChildren("/Business and Technology Solutions", $true) | Where-Object { $_.TypeName -eq "Report" }

# Declare new "ScheduleDefintion object using the Class declared in the New-WebServiceProxy call
$schedDef = New-Object RS.ScheduleDefinition
$warning = @();

foreach ($report in $reports) {

    # Referencing the "Item" property from the ScheduleDefinition
    $execType = $rs.GetExecutionOptions($report.Path, [ref]$schedDef.Item)

...

Saya tidak berpikir penambahan flag Class dan Namespace pada panggilan New-WebServiceProxy adalah persis apa yang melakukannya, karena saya pikir itu hanya cara yang lebih bersih untuk memastikan Anda mendapatkan Namespace yang tepat dari WebService. Mungkin hanya sedikit gula.

Saya pikir perubahan kuncinya adalah memastikan properti "Item" dari objek definisi jadwal, meskipun saya tidak yakin mengapa itu berfungsi di Dev tanpa melakukannya ...

0
Fernando Vega 22 November 2017, 01:32