For retrieving the SQL Server Reporting Services configurations using custom program in C# or .NET we need to use WMI (Windows Management Instrumentation) script. The process involves the following steps.
RETRIEVING WMI NAMESPACE FOR SSRS
For retrieving the WMI namespace we write the following function.
public static string GetNamespace(string machineName)
{
string rSroot = @"root\Microsoft\SqlServer\ReportServer";
string strNamespace = "";
System.Management.ManagementClass mc = new ManagementClass(new ManagementScope(@"root\Microsoft\SqlServer\ReportServer"), new ManagementPath("__namespace"), null);
foreach (ManagementObject ns in mc.GetInstances())
{
if (ns["Name"].ToString().Contains("RS_"))
{
rSroot = rSroot + "\\" + ns["Name"].ToString();
}
}
System.Management.ManagementClass mc1 = new ManagementClass(new ManagementScope(rSroot), new ManagementPath("__namespace"), null);
foreach (ManagementObject ns in mc1.GetInstances())
{
if (ns["Name"].ToString().Contains("v"))
{
rSroot = rSroot + "\\" + ns["Name"].ToString();
}
}
System.Management.ManagementClass mc2 = new ManagementClass(new ManagementScope(rSroot), new ManagementPath("__namespace"), null);
foreach (ManagementObject ns in mc2.GetInstances())
{
if (ns["Name"].ToString().Contains("Admin"))
{
rSroot = rSroot + "\\" + ns["Name"].ToString();
}
}
strNamespace = rSroot;
return strNamespace;
}
RETRIEVING WMI CLASS FOR SSRS
The above function accepts system name/ IP address as parameter. Once we get the namespace for reporting service, we pass the same to the below function to get the associated class which contains the report server configuration.
public static string GetClass(string strNamespace)
{
string ClassName = "";
ManagementClass newRSClass = new ManagementClass(strNamespace);
EnumerationOptions options = new EnumerationOptions();
options.EnumerateDeep = true; // set to false if only the root classes
ManagementObjectCollection mo = newRSClass.GetSubclasses(options);
foreach (ManagementObject ob in mo)
{
if (ob["__Class"].ToString().Contains("MSRep"))
ClassName = ob["__Class"].ToString();
}
return ClassName;
}
RETRIEVING SSRS CONFIGURATION PROPERTIES
Once we have retrieved the Class Name then we refer to class and try to get the configuration info through the below code.
public static void ReportServerProperties(string strNamespace, string ClassName)
{
ManagementClass serverClass;
ManagementScope scope;
try
{
scope = new ManagementScope(strNamespace);
scope.Connect();
serverClass = new ManagementClass(ClassName);
serverClass.Get();
if (serverClass == null)
throw new Exception("No class found");
ManagementObjectCollection instances = serverClass.GetInstances();
foreach(ManagementObject mo in instances)
{
Console.WriteLine("Instances detected");
PropertyDataCollection props = mo.Properties;
foreach (PropertyData propData in props)
{
string name = propData.Name;
string value = propData.Value != null ? propData.Value.ToString() : "NULL";
Console.WriteLine(name + " " + value);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
No comments:
Post a Comment