Modify Microsoft Dynamics AX 2012 R3 SSRS configurations using PowerShell

reportManagerWebConfig.ps1

#Modify the Report Server Web.config file. ie replace MSRS11.VAS with your folder name
Set-ExecutionPolicy Unrestricted
$webConfig = "C:Program FilesMicrosoft SQL ServerMSRS11.VASReporting ServicesReportManagerWeb.config"
$currentDate = (get-date).tostring("mm_dd_yyyy-hh_mm_s") # month_day_year - hours_mins_seconds
$backup = $webConfig + "_$currentDate"
$doc = new-object System.Xml.XmlDocument
$doc.Load($webConfig)
#save a backup copy
$doc.Save($backup)
Write-Host "Backup saved as " + $backup
$node = $doc.get_DocumentElement()."system.web".httpRuntime
$attribute = $doc.CreateAttribute("maxRequestLength")
$attribute.set_Value("100000")
$node.SetAttributeNode($attribute )
$doc.Save($webConfig)
Write-Host "1) Modified the Report Manager Web.config file"

RsReportServer.ps1

#Modify the Report Server Web.config file. ie replace MSRS11.VAS with your folder name
Set-ExecutionPolicy Unrestricted

$version = "6.3.0.0"
$webConfig = "C:Program FilesMicrosoft SQL ServerMSRS11.VASReporting ServicesReportServerRsReportServer.config"
$currentDate = (get-date).tostring("mm_dd_yyyy-hh_mm_s") # month_day_year - hours_mins_seconds
$backup = $webConfig +  ".xml" #"_$currentDate"
$doc = new-object System.Xml.XmlDocument

$doc.Load($webConfig)

#save a backup copy
$doc.Save($backup)
Write
Write-Host  "Backup saved as " + $backup
#remove node "RSWindowsNegotiate" 
$node = $doc.documentElement.SelectSingleNode("//Configuration/Authentication/AuthenticationTypes/RSWindowsNegotiate")
if ($node) 
{
    
{
    $node.ParentNode.RemoveChild($node)
    Write
    Write-Host  "RSWindowsNegotiate Removed"
}
#Add node "IsRdceEnabled" 
$nodeService = $doc.documentElement.SelectSingleNode("//Configuration/Service")
$nodeIsRdceEnabled = $doc.documentElement.SelectSingleNode("//Configuration/Service/IsRdceEnabled")


#Set to true if already exists, otherwise create the node
if ($nodeIsRdceEnabled)
{
    
{
    $nodeIsRdceEnabled.InnerXml = "True"
}
else
{
    if ($nodeService)
    {
        
    {
        $subnodeService = $doc.createElement("IsRdceEnabled")
        
        $subnodeService.InnerXml = "True"
        $nodeService.appendChild($subnodeService)
        Write
        Write-Host  "IsRdceEnabled added"
    }
}
#Find Data
$nodeCodeAxQuery = $doc.documentElement.SelectSingleNode("//Configuration/Extensions/Data/Extension[@Name='AXQUERY']")

#Add Data Extension
if (-not($nodeCodeAxQuery))
{
    
{
    $nodeData = $doc.documentElement.SelectSingleNode("//Configuration/Extensions/Data")
    
    if ($nodeData) 
    {
        
    {
        $nodeData.InnerXml = $nodeData.InnerXml + 
        
        "<Extension Name='AXQUERY' Type='Microsoft.Dynamics.Framework.Reports.AxQueryConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>
      <Extension Name='AXDATAMETHOD' Type='Microsoft.Dynamics.Framework.Reports.AxDataMethodConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>
      <Extension Name='AXREPORTDATAPROVIDER' Type='Microsoft.Dynamics.Framework.Reports.AxReportProviderConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>
      <Extension Name='AXADOMD' Type='Microsoft.Dynamics.Framework.Reports.AxAdomdConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>
      <Extension Name='AXENUMDATAPROVIDER' Type='Microsoft.Dynamics.Framework.Reports.EnumProviderConnection,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>"
        Write-Host  "Data Extension added"
    }
}
#Find Extensions
$nodeExtensions = $doc.documentElement.SelectSingleNode("//Configuration/Extensions")
$nodeReportDefinitionCustomization = $doc.documentElement.SelectSingleNode("//Configuration/Extensions/ReportDefinitionCustomization")

if (-not($nodeReportDefinitionCustomization))
{
    
{
    #Add ReportDefinitionCustomization
    if ($nodeExtensions) 
    {
        
    {
        $subnodeExt = $doc.createElement("ReportDefinitionCustomization")
        
        $subnodeExt.InnerXml = "<Extension Name='AXRDCE' Type='Microsoft.Dynamics.Framework.Reports.AxRdce.CustomizationExtension,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>"
        $nodeExtensions.appendChild($subnodeExt)
        Write
        Write-Host  "ReportDefinitionCustomization added"
    }
}
else
{
    $nodeAXRDCE= $doc.documentElement.SelectSingleNode("//Configuration/Extensions/ReportDefinitionCustomization/Extension [@Name='AXRDCE']")
    
    if (-not($nodeAXRDCE))
    {
        
    {
        $nodeReportDefinitionCustomization.InnerXml = $nodeReportDefinitionCustomization.InnerXml +
            "<Extension Name='AXRDCE' Type='Microsoft.Dynamics.Framework.Reports.AxRdce.CustomizationExtension,Microsoft.Dynamics.Framework.ReportsExtensions, Version=" +
		$version +
		", Culture=neutral, PublicKeyToken=31bf3856ad364e35'/>"
    }
}
$doc.Save($webConfig)

Write
Write-Host  "2) Modified the Report Server Web.config file"
text some thing

ReportServerRsSrvPolicyConfig.ps1

#Instructions: Modify the Report Server Web.config file. ie replace MSRS11.VAS with your folder name
# Modify version 6.3.0.0 for Dynamics AX 2012
Set-ExecutionPolicy Unrestricted
$version = "6.3.0.0"
$webConfig = "C:Program FilesMicrosoft SQL ServerMSRS11.VASReporting ServicesReportServerrssrvpolicy.config"
$currentDate = (get-date).tostring("mm_dd_yyyy-hh_mm_s") # month_day_year - hours_mins_seconds
$backup = $webConfig + ".xml" #"_$currentDate"
$doc = new-object System.Xml.XmlDocument
$doc.Load($webConfig)
#save a backup copy
$doc.Save($backup)
Write
Write-Host "Backup saved as " + $backup
#Add SecurityClass
$nodeAxSessionPermission = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/SecurityClasses/SecurityClass[@Name='AxSessionPermission']")
if (-not($nodeAxSessionPermission))
{
{
 $nodeSecurityClasses = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/SecurityClasses")
 if ($nodeSecurityClasses)
{
 {
 $nodeSecurityClass = $doc.createElement("SecurityClass")
 $nodeSecurityClass.InnerXml = "<SecurityClass Name='AxSessionPermission' Description='Microsoft.Dynamics.Framework.Reports.AxSessionPermission, Microsoft.Dynamics.Framework.Reports, Version=" +
 $version +
 ", Culture=neutral, PublicKeyToken=31bf3856ad364e35' />"
 $nodeSecurityClasses.appendChild($nodeSecurityClass.FirstChild)
Write
 Write-Host "SecurityClass added"
 }
}
#Add PermissionSet
$nodeAxSessionPermissionSet = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/NamedPermissionSets/PermissionSet[@class='NamedPermissionSet' and @version='1' and @Name='AxSessionPermissionSet']")
if (-not($nodeAxSessionPermissionSet))
{
{
 $nodeNamedPermissionSets = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/NamedPermissionSets")
 if ($nodeNamedPermissionSets)
{
 {
 $nodePermissionSet = $doc.createElement("PermissionSet")
 $nodePermissionSet.InnerXml = "<PermissionSet class='NamedPermissionSet' version='1' Name='AxSessionPermissionSet'>
 <IPermission class='AxSessionPermission' version='1' Unrestricted='true' />
 <IPermission class='SecurityPermission' version='1' Flags='Assertion' />
 </PermissionSet>"
 $nodeNamedPermissionSets.appendChild($nodePermissionSet.FirstChild)
Write
 Write-Host "PermissionSet added"
 }
}
#Add CodeGroup
$nodeAxStrongName = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/CodeGroup[@class='FirstMatchCodeGroup' and @version='1' and @PermissionSetName='Nothing']/CodeGroup[@class='UnionCodeGroup' and @version='1' and @PermissionSetName='FullTrust' and @Name='AX_Reports_Strong_Name']")
if (-not($nodeAxStrongName))
{
{
 $nodeCodeGroup = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/CodeGroup[@class='FirstMatchCodeGroup' and @version='1' and @PermissionSetName='Nothing']")
 if ($nodeCodeGroup)
{
 {
 $subnodeCodeGroup = $doc.createElement("CodeGroup")
 $subnodeCodeGroup.InnerXml = "<CodeGroup class='UnionCodeGroup' version='1' PermissionSetName='FullTrust' Name='AX_Reports_Strong_Name' Description='This code group grants Dynamics AX Reports code full trust. '>
 <IMembershipCondition class='StrongNameMembershipCondition' version='1' PublicKeyBlob='0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9' />
 </CodeGroup>"
 $nodeCodeGroup.appendChild($subnodeCodeGroup.FirstChild)
Write
 Write-Host "CodeGroup added"
 }
}
#Add nodeReportExpressionPermission
#http://blogs.msdn.com/b/axsupport/archive/2012/02/02/microsoft-dynamics-ax-2012-reporting-extensions-error-system-security-permissions-environmentpermission-while-running-report.aspx
$nodeReportExpressionPermission = $doc.documentElement.SelectSingleNode("//configuration/mscorlib/security/policy/PolicyLevel/CodeGroup[@class='FirstMatchCodeGroup' and @version='1' and @PermissionSetName='Nothing']/CodeGroup[@class='UnionCodeGroup' and @version='1' and @PermissionSetName='Execution' and @Name='Report_Expressions_Default_Permissions']")
if ($nodeReportExpressionPermission)
{
{
 $attribute = $doc.CreateAttribute("PermissionSetName")
 $attribute.set_Value("FullTrust")
 $nodeReportExpressionPermission.SetAttributeNode($attribute )
}
}
$doc.Save($webConfig)
Write
Write-Host "3) Modified the Report Server rssrvpolicy.config file"

Max Nguyen

Max Nguyen
MCP - Microsoft Dynamics AX Technical Consultant, currently living and working in Seoul, S.Korea :)

Number sequence farmework overview in Dynamics AX 2012

How to create number sequence in Dynamics AX 2012 with difference scenarios Continue reading

Overview delete action in Dyanmics AX 2012

Published on January 19, 2017

Response in AIF custom service class

Published on January 12, 2017