2017-01-30 3 views
0

Wir haben regionalisierte SSRS-Server und ich versuche, ein PowerShell-Skript zu erstellen, das Elemente von einem SSRS-Server zu anderen kopiert, um sie synchron zu halten. Für einige Gegenstände ist das problematisch. Ein Beispiel sind Systemrichtlinien (Kopieren von Systemberechtigungen).SSRS PowerShell kann Argument nicht konvertieren

Ursprünglich habe ich versucht:

#Reference source SSRS instance 
$SourceServer = "Source Server Name" 
$sourceServerUrl = "http://" + $SourceServer + "/ReportServer/ReportService2010.asmx" 
$SourceProxy = New-WebServiceProxy -Uri $sourceServerUrl -Namespace SSRS.ReportingService2010 -UseDefaultCredential 

#Reference target SSRS instance 
$DestinationServer = "Target Server Name" 
$TargetServerUrl = "http://" + $DestinationServer + "/ReportServer/ReportService2010.asmx" 
$TargetProxy = New-WebServiceProxy -Uri $TargetServerUrl -Namespace SSRS.ReportingService2010 -UseDefaultCredential 


#Compare System Policies 
$SourceSystemPolicies = $SourceProxy.GetSystemPolicies() 
$TargetSystemPolicies = $TargetProxy.GetSystemPolicies() 

If ($SourceSystemPolicies -ne $TargetSystemPolicies) { 
    $TargetProxy.SetSystemPolicies($SourceSystemPolicies) 
} 

Als ich nach SetSystemPolicies auf dem neuen Server versuchen, erhalte ich die Fehler

Cannot convert argument "Policies", with value: "SSRS.ReportingService2010.Policy[]", for "SetSystemPolicies" to type "SSRS.ReportingService2010.Policy[]": "Cannot convert the "SSRS.ReportingService2010.Policy" value of type 
"SSRS.ReportingService2010.Policy" to type "SSRS.ReportingService2010.Policy"." 

nach dem Ausgabetag aufzublicken ich sah, dass es ein Namespace Problem mit Powershell war Es wird versucht, einen Standardnamespace anstelle des SSRS-Namespace zu verwenden. Ich habe meinen Code aktualisiert, um einen benutzerdefinierten Namespace zu erstellen, der immer noch nicht funktionierte.

#Reference source SSRS instance 
$SourceServer = "Source Server Name" 
$sourceServerUrl = "http://" + $SourceServer + "/ReportServer/ReportService2010.asmx" 
$SourceProxy = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $sourceServerUrl -UseDefaultCredential 

#Reference target SSRS instance 
$DestinationServer = "Target Server Name" 
$TargetServerUrl = "http://" + $DestinationServer + "/ReportServer/ReportService2010.asmx" 
$TargetProxy = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $TargetServerUrl -UseDefaultCredential 

#Compare System Policies 
$SourceSystemPolicies = $SourceProxy.GetSystemPolicies() 
$TargetSystemPolicies = $TargetProxy.GetSystemPolicies() 
[RS.Policy[]] $SystemPolicyArray = @() 

If ($SourceSystemPolicies -ne $TargetSystemPolicies) { 
    $PolicyCounter = 0 
    ForEach ($SourceSystemPolicy in $SourceSystemPolicies) { 
     $SystemPolicyArray += New-Object RS.Policy 
     $SystemPolicyArray[$PolicyCounter].GroupUserName = $SourceSystemPolicy.GroupUserName 
     $SystemPolicyArray[$PolicyCounter].Roles = $SourceSystemPolicy.Roles 
     $PolicyCounter += 1 
    } 

    $TargetProxy.SetSystemPolicies($SystemPolicyArray) 
} 

Der neue Fehler ist

Cannot convert argument "Policies", with value: "RS.Policy[]", for "SetSystemPolicies" to type "RS.Policy[]": "Cannot convert the "RS.Policy" value of type "RS.Policy" to type "RS.Policy"." 

Ich habe auch den Namespace dynamisch zu schaffen versucht, mit GetType(). Namespace ohne Erfolg.

Antwort

0

Es stellte sich heraus, dass ich dies falsch automatisierte. Ich habe versucht, ein neues Objekt mit dem richtigen Namespace zu erstellen und ihm das alte Objekt direkt zuzuweisen, anstatt einzelne Eigenschaften zuzuweisen. Die endgültige Lösung war:

#Reference source SSRS instance 
$SourceServer = "Source Server Name" 
$sourceServerUrl = "http://" + $SourceServer + "/ReportServer/ReportService2010.asmx" 
$SourceProxy = New-WebServiceProxy -Uri $sourceServerUrl -UseDefaultCredential 
$SourceProxyType = $SourceProxy.GetType().Namespace 
$SourcePolicyType = "{0}.Policy" -f $SourceProxyType 
$SourceRoleType = "{0}.Role" -f $SourceProxyType 
$SourcePropertyType = "{0}.Property" -f $SourceProxyType 
$SourceItemReferenceType = "{0}.ItemReference" -f $SourceProxyType 
$SourceDataSourceDefinitionType = "{0}.DataSourceDefinition" -f $SourceProxyType 
$SourceItemReferenceType = "{0}.ItemReference" -f $SourceProxyType 

#Reference target SSRS instance 
$DestinationServer = "Target Server Name" 
$TargetServerUrl = "http://" + $DestinationServer + "/ReportServer/ReportService2010.asmx" 
$TargetProxy = New-WebServiceProxy -Uri $TargetServerUrl -UseDefaultCredential 
$TargetProxyType = $TargetProxy.GetType().Namespace 
$TargetPolicyType = "{0}.Policy" -f $TargetProxyType 
$TargetRoleType = "{0}.Role" -f $TargetProxyType 
$TargetPropertyType = "{0}.Property" -f $TargetProxyType 
$TargetItemReferenceType = "{0}.ItemReference" -f $TargetProxyType 
$TargetDataSourceDefinitionType = "{0}.DataSourceDefinition" -f $TargetProxyType 

#Compare System Policies and push source if different 
$NewSystemPolicies = @() 
If ($SourceSystemPolicies -ne $TargetSystemPolicies) { 
    ForEach ($SourceSystemPolicy in $SourceSystemPolicies) { 
     $NewPolicy = New-Object ($TargetPolicyType) 
     $NewPolicy.GroupUserName = $SourceSystemPolicy.GroupUserName 
     $NewPolicy.Roles = @() 
     ForEach ($SourceRole in $SourceSystemPolicy.Roles) { 
      $NewRole = New-Object ($TargetRoleType) 
      $NewRole.Description = $SourceRole.Description 
      $NewRole.Name = $SourceRole.Name 
      $NewPolicy.Roles += $NewRole 
     } 
     $NewSystemPolicies += $NewPolicy 
    } 
    $TargetProxy.SetSystemPolicies($NewSystemPolicies) 
} 
Verwandte Themen