Analysis-Services/BismNormalizer/AlmToolkit/PowerBIHelper.cs
2019-11-27 23:51:28 -08:00

123 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
//using Serilog;
using System.Security.Principal;
namespace AlmToolkit
{
public enum EmbeddedSSASIcon
{
PowerBI,
Devenv,
PowerBIReportServer,
Loading
}
public class PowerBIInstance
{
public PowerBIInstance(string name, int port, EmbeddedSSASIcon icon)
{
Port = port;
Icon = icon;
try
{
var dashPos = name.LastIndexOf(" - ");
if (dashPos >= 0)
{ Name = name.Substring(0, dashPos); } // Strip "Power BI Designer" or "Power BI Desktop" off the end of the string
else
{
//Log.Warning("{class} {method} {message} {dashPos}", "PowerBIInstance", "ctor", $"Unable to find ' - ' in Power BI title '{name}'", dashPos);
Name = name;
}
}
catch (Exception ex)
{
//Log.Error("{class} {method} {message} {stacktrace}", "PowerBIInstance", "ctor", ex.Message, ex.StackTrace);
Name = name;
}
}
public int Port { get; private set; }
public string Name { get; private set; }
public EmbeddedSSASIcon Icon { get; private set; }
}
public class PowerBIHelper
{
public static List<PowerBIInstance> GetLocalInstances()
{
List<PowerBIInstance> _instances = new List<PowerBIInstance>();
_instances.Clear();
var dict = ManagedIpHelper.GetExtendedTcpDictionary();
foreach (var proc in Process.GetProcessesByName("msmdsrv"))
{
int _port = 0;
EmbeddedSSASIcon _icon = EmbeddedSSASIcon.PowerBI;
var parent = proc.GetParent();
// exit here if the parent == "services" then this is a SSAS instance
if (parent.ProcessName.Equals("services", StringComparison.OrdinalIgnoreCase)) continue;
// exit here if the parent == "RSHostingService" then this is a SSAS instance
if (parent.ProcessName.Equals("RSHostingService", StringComparison.OrdinalIgnoreCase))
{
// only show PBI Report Server if we are running as admin
// otherwise we won't have any access to the models
if (IsAdministrator())
_icon = EmbeddedSSASIcon.PowerBIReportServer;
else
continue;
}
// if the process was launched from Visual Studio change the icon
if (parent.ProcessName.Equals("devenv", StringComparison.OrdinalIgnoreCase)) _icon = EmbeddedSSASIcon.Devenv;
// get the window title so that we can parse out the file name
var parentTitle = parent.MainWindowTitle;
if (parentTitle.Length == 0)
{
// for minimized windows we need to use some Win32 api calls to get the title
//parentTitle = WindowTitle.GetWindowTitleTimeout( parent.Id, 300);
parentTitle = WindowTitle.GetWindowTitle(parent.Id);
}
// try and get the tcp port from the Win32 TcpTable API
try
{
TcpRow tcpRow = null;
dict.TryGetValue(proc.Id, out tcpRow);
if (tcpRow != null)
{
_port = tcpRow.LocalEndPoint.Port;
_instances.Add(new PowerBIInstance(parentTitle, _port, _icon));
//Log.Debug("{class} {method} PowerBI found on port: {port}", "PowerBIHelper", "Refresh", _port);
}
else
{
//Log.Debug("{class} {method} PowerBI port not found for process: {processName} PID: {pid}", "PowerBIHelper", "Refresh", proc.ProcessName, proc.Id);
}
}
catch (Exception ex)
{
//Log.Error("{class} {Method} {Error} {StackTrace}", "PowerBIHelper", "Refresh", ex.Message, ex.StackTrace);
}
}
return _instances;
}
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
}
}