locked
How to execute a PowerShell script and continuously write the output to a TextBox? RRS feed

  • Question

  • User260076833 posted

    Hello,

    I would like to execute a PowerShell script from an input TextBox. And I would like the output of the script to be written to another output TextBox continuously, as it is produced.
    This is my approach:

    Test.aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Playground.lab.PowerShellExecution.Asynchroneous.Test" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
    
            <asp:ScriptManager ID="scm" runat="server"></asp:ScriptManager>
        
            <asp:TextBox ID="txt_Input" runat="server" Height="250" Width="400" TextMode="MultiLine" Text="get-date">
            </asp:TextBox>
            <br />
            <asp:Button ID="btn_Execute" runat="server" Text="Execute" OnClick="btn_Execute_Click"/>
            <br />
    
            <asp:TextBox ID="txt_Output" runat="server" Height="250" Width="400" TextMode="MultiLine"></asp:TextBox>
    
        </div>
        </form>
    </body>
    </html>
    

    Test.aspx.cs:

    using System;
    using System.Management.Automation;
    using System.Management.Automation.Runspaces;
    using System.Security;
    using System.Collections.ObjectModel;
    
    namespace Playground.lab.PowerShellExecution.Asynchroneous
    {
        public partial class Test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (Session["output"] == null)
                    Session["output"] = "";
            }
    
            protected void btn_Execute_Click(object sender, EventArgs e)
            {
                PowerShell psh = PowerShell.Create();
                
                PSDataCollection<PSObject> output = new PSDataCollection<PSObject>();
                output.DataAdded += output_DataAdded;
                psh.AddScript(txt_Input.Text);
                psh.Streams.Error.DataAdded += Error_DataAdded;
                var result = psh.BeginInvoke<PSObject, PSObject>(null, output);
            }
    
            void output_DataAdded(object snd, DataAddedEventArgs evt)
            {
                PSDataCollection<PSObject> col = (PSDataCollection<PSObject>)snd;
    
                Collection<PSObject> rsl = col.ReadAll();
    
                foreach (PSObject r in rsl)
                {
                    write(r.ToString());
                }
            }
    
            void Error_DataAdded(object sender, DataAddedEventArgs e)
            {
                //display error message in UI
            }
    
            private void write(String txt)
            {
                String t;
    
                if (Session["output"] != null)
                    t = (String)Session["output"];
                else
                    t = "";
    
                t = t + txt + "\n";
                Session["output"] = t;
                txt_Output.Text = t;
            }
        }
    }

    However, the output TextBox always remains empty. I can verify by debugging that the output_DataAdded callback method and in turn the write method is called, but the txt_Output TextBox remains empty.

    I also have tried this without using the session variable. I know that you can also use classes like Runspace and Pipeline, but I have not used them yet. I think the main mechanism is working here, because the callback method is actually called. But I don't know how to populate the data into the output TextBox.

    Any help is welcome.
    Magnus

    Tuesday, November 14, 2017 5:17 AM

Answers

  • User475983607 posted

    Hello,

    this is what I am doing, but I cannot get this simple Hello World running.

    It seems that I don't have the right DLLs or references. I have tried different "SignalR" packages with NuGet, but without success. I also don't find any DLLs with "SignalR" in their name...

    I would be happy if someone could tell me what's still wrong.

    Magnus

    I followed this tutorial and was up in running in 5 minutes.

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

    I installed SignalR using the Package Manager

    install-package Microsoft.AspNet.SignalR

    I had to change the index.html JQuery File Reference to version 1.10 and that's what was installed by the PM

    <script src="Scripts/jquery-1.10.2.js"></script>

    I upgraded jQuery to version 3.2.1 using the NuGet PM and the demo stopped working.

    I down graded jQuery back to 1.10.2 and the demo started working again.

    Once I upgraded to SignalR version 2.2.2 (was 2.2.1) then the project started working with the latest jQuery 3.2.1.

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Sunday, November 19, 2017 3:58 PM
  • User-1355817221 posted

    Hi,

    "signalr/hubs"

    There is a script file named hubs that the SignalR library dynamically generates at runningtime. So you could't find it locally.

    If you want to see the content of this file, you could type in http://localhost:port/signalr/hubs into your browser to see it.

    "this is what I am doing, but I cannot get this simple Hello World running."

    I have created a simple demo, which could output 'Hello World'. You could refer to:

    Code in MyHub2.cs(right-click the project, select Add | SignalR Hub Class (v2).

     public class MyHub2 : Hub
        {
            public void Hello(string msg)
            {
                Clients.All.sendMessage(msg);
            }
        }

    Code in Startup.cs:(right-click the project, then click Add | OWIN Startup Class.)

    public class Startup1
        {
            public void Configuration(IAppBuilder app)
            {          
                app.MapSignalR();
            }
        }

    Code in Test.html:

    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="Scripts/jquery-1.10.2.min.js"></script>
        <script src="Scripts/jquery.signalR-2.1.2.min.js"></script>
        <script src="signalr/hubs"></script>
    </head>
    <body>
        <div id="log"></div>
        <script type="text/javascript">
                $(function () {
            var myHub = $.connection.myHub2;//the hub class name
            myHub.sendMessage = function (data) {
                $('#log').html(data);
                };
            $.connection.hub.start({transport: 'auto' }, function () {
                    myHub.sendMessage("Hello World!");
            });
        });
      </script>
    </body>
    </html>

    You could see the result like this:

    Besides, you could refer to this link:

    https://stackoverflow.com/questions/12091190/signalr-first-demo-project

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Monday, November 20, 2017 6:12 AM

All replies

  • User-335504541 posted

    Hi Yeoman,

    Please try to use the following code:

    public partial class HowtoexecuteaPowerShellscriptandcontinuouslywritetheoutputtoaTextBox : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
               
            }
    
            protected void btn_Execute_Click(object sender, EventArgs e)
            {
                var shell = PowerShell.Create();
                shell.Commands.AddScript(txt_Input.Text);
                var results = shell.Invoke();
                if (results.Count > 0)
                {
                    var builder = new StringBuilder();
                    foreach (var psObject in results)
                    {
                        // Convert the Base Object to a string and append it to the string builder.
                        // Add \r\n for line breaks
                        builder.Append(psObject.BaseObject.ToString() + "\r\n");
                    }
                    // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
                    txt_Output.Text = txt_Output.Text + Server.HtmlEncode(builder.ToString());//output continuously
                }
            }
    
        }
    

    You could see the result like this:

     

    For more details about this issue, you could refer to this link:

    http://mohan1315.blogspot.sg/2014/10/execute-powershell-from-aspnet-web.html

     

    Best regards,

    Billy

    Wednesday, November 15, 2017 7:04 AM
  • User260076833 posted

    Hello Billy,

    thank you, but this is the synchroneous invocation, which I know already.

    The problem with the synchroneous invocation is that you get all the output "at once", when the script has terminated. When the script is working for a long time, you won't see the output until it has terminated.

    The asynchroneous invcocation is started with the BeginInvoke method. Whenever there is new output, an event is triggered, which you can use to append the new output to the output widget. So if you have a script that takes a long time, you can observe the output live on the screen.

    In the meantime I have learned that the client has to "poll" the server, i. e. periodically ask the server if there is new output. I made my first steps with SignalR, but I cannot get my example to work. I would be glad if someone could point me in the right direction.

    Thanks
    Magnus

    Thursday, November 16, 2017 10:51 AM
  • User753101303 posted

    Hi,

    Or have a lok at https://www.asp.net/signalr

    It allows to send back information to the client side while a processing is done on the server side... The basic mode for the web is to Stream a document that will be fully shown once entirely sent (thought you have tricks, SignalR is more flexible).

    Thursday, November 16, 2017 10:55 AM
  • User475983607 posted

    Regardless of implementing long polling or SignalR, the transaction is still request/response.  The difference is SignalR maintains a connection to the client browser.  This allows a role reversal where the server can send messages to connected clients.  This is not a new concept in computing but it is new for web browsers.

    The common way to handle this problem is the running process (your PowerShell Script) writes status to a central location.  A monitoring process reads this location at some frequency or the monitoring process listens for changes made by running process, things like a file change or DB table change. 

    The monitoring process can happen in either the browser by sending an HTTP requests to execute server side code at some frequency or in the web app listening for changes.  Basically, you're moving the monitoring process from the browser to the web server when using SignalR.

    The main point is you need a place to put the process status.  Can you explain the design approach?

    Thursday, November 16, 2017 12:07 PM
  • User260076833 posted

    Dear mgebhard,

    my design approach would be to use SignalR to notify the client(s) when the script has produced new output.
    But I did not come so far. Prior to that I wanted to go my first steps with SignalR. I have tried to get warm with a minimal example.

    I have taken an example from here, but I could not make it work yet. When I add the SignalR components to the project using Visual Studio's "Add..." "New Item..." command, the JS scripts for SignalR and jQuery are generated in the Scripts folder. But when I launch the application, I get this error:

    0x800a1391 - JavaScript runtime error: '$' is undefined

    I guess this means that jQuery is not loaded. But all the scripts are included.
    Here is my example:

    index.html:

    <!DOCTYPE html>
    <html>
    <head>
        <title>SignalR Example 1</title>
        <meta charset="utf-8" />
    
        <script src="Scripts/jquery-3.1.1.min.js"></script>
        <script src="Scripts/jquery.signalR-2.2.2.min.js"></script>
        <script src="signalr/hubs"></script>
        <script type="text/javascript">
            $(function () {
    
                var myHub = $.connection.myHub;
                myHub.client.hello = function () {
                    $("#log").append("Hello <br />");
                }
                $.connection.hub.start().done(function () {
                    myHub.server.hello();
                });
            });
        </script>
    </head>
    <body>
        <div id="log"></div>
    </body>
    </html>

    MyHub.cs:

    using Microsoft.AspNet.SignalR;
    
    namespace Playground.lab.SignalRTest
    {
        public class MyHub : Hub
        {
            public void Hello()
            {
                Clients.All.hello();
            }
        }
    }

    Startup.cs:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartup(typeof(Playground.lab.SignalRTest.Startup))]
    
    namespace Playground.lab.SignalRTest
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
                app.MapSignalR();
            }
        }
    }

    The following files were generated in the Scripts folder:

    bootstrap.js
    bootstrap.min.js
    jquery-3.1.1.intellisense.js
    jquery-3.1.1.js
    jquery-3.1.1.min.js
    jquery-3.1.1.min.map
    jquery-3.1.1.slim.js
    jquery-3.1.1.slim.min.js
    jquery-3.1.1.slim.min.map
    jquery.signalR-2.2.2.js
    jquery.signalR-2.2.2.min.js
    modernizr-2.6.2.js
    respond.js
    respond.min.js
    WebForms
    _references.js

    The file jquery-3.1.1.min.js should provide the jQuery functionality, but I get the error stated above. When I add my "own" online reference to jQuery

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>

    I get another error:

    0x800a138f - JavaScript runtime error: Unable to get property 'myHub' of undefined or null reference

    This looks like jQuery is loaded and as if we have another error now. But I don't understand why the scripts generated by Visual Studio don't work.

    I also have no good feelings when Visual Studio generates scripts for me, because I don't think that they can be kept up to date automatically. Maybe I should use my own scripts?
    However, I am stuck here and I would be glad if I could get this "Hello world" to work...

    Thanks
    Magnus

    Friday, November 17, 2017 12:46 PM
  • User753101303 posted

    Hi,

    Start by using F12 Network to see if you have an http 404 error. Could be just a typo in a js file name.

    Friday, November 17, 2017 12:49 PM
  • User475983607 posted

    The file reference assume you have a Scripts folder at the same level as the page.  

    <script src="Scripts/jquery-3.1.1.min.js"></script>

    Open dev tools then the network tab and make sure you not receiving 404 errors.

    Friday, November 17, 2017 12:58 PM
  • User260076833 posted

    Thank you,

    the JS files are resolved now (no 404), but the signalr/hubs file doesn't exist at all.
    Here is my current code:

    <!DOCTYPE html>
    <html>
    <head>
        <title>SignalR Example 1</title>
        <meta charset="utf-8" />
    
        <script src='<%# ResolveUrl ("~/Scripts/jquery-3.1.1.min.js") %>'></script>
        <script src='<%# ResolveUrl ("~/Scripts/jquery.signalR-2.2.2.min.js") %>'></script>
    
        <script src="signalr/hubs"></script>
    
        <script type="text/javascript">
            $(function () {
    
                var myHub = $.connection.myHub;
                myHub.client.hello = function () {
                    $("#log").append("Hello <br />");
                }
                $.connection.hub.start().done(function () {
                    myHub.server.hello();
                });
            });
        </script>
    </head>
    <body>
        <div id="log"></div>
    </body>
    </html>

    It still throws the old error:

    0x800a1391 - JavaScript runtime error: '$' is undefined

    Thanks
    Magnus

    Friday, November 17, 2017 1:51 PM
  • User475983607 posted

    It still throws the old error:

    0x800a1391 - JavaScript runtime error: '$' is undefined

    Again, the error message means JQuery is not loaded.  This is commonly caused by an incorrect file reference.  Try dragging the jQuery and signalR files from the Scripts folder to the markup page.

    Friday, November 17, 2017 2:02 PM
  • User260076833 posted

    Hello mgebhard,

    when I drag them, I get ugly references ("../../Scripts"), but then jQuery gets loaded. I assume that the ResolveUrl calls were not evaluated because it's a html file and not a aspx file.

    Anyhow, now we have this:

    0x800a138f - JavaScript runtime error: Unable to get property 'client' of undefined or null reference

    Remember that there is no signalr/hubs file in my file system...

    Magnus

    Friday, November 17, 2017 2:10 PM
  • User475983607 posted

    I think it would be best if you read through the SignalR documentation and try a few tutorials from the learn link above.

    https://www.asp.net/signalr

    Friday, November 17, 2017 2:49 PM
  • User260076833 posted

    Hello,

    this is what I am doing, but I cannot get this simple Hello World running.

    It seems that I don't have the right DLLs or references. I have tried different "SignalR" packages with NuGet, but without success. I also don't find any DLLs with "SignalR" in their name...

    I would be happy if someone could tell me what's still wrong.

    Magnus

    Sunday, November 19, 2017 1:15 PM
  • User475983607 posted

    Hello,

    this is what I am doing, but I cannot get this simple Hello World running.

    It seems that I don't have the right DLLs or references. I have tried different "SignalR" packages with NuGet, but without success. I also don't find any DLLs with "SignalR" in their name...

    I would be happy if someone could tell me what's still wrong.

    Magnus

    I followed this tutorial and was up in running in 5 minutes.

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

    I installed SignalR using the Package Manager

    install-package Microsoft.AspNet.SignalR

    I had to change the index.html JQuery File Reference to version 1.10 and that's what was installed by the PM

    <script src="Scripts/jquery-1.10.2.js"></script>

    I upgraded jQuery to version 3.2.1 using the NuGet PM and the demo stopped working.

    I down graded jQuery back to 1.10.2 and the demo started working again.

    Once I upgraded to SignalR version 2.2.2 (was 2.2.1) then the project started working with the latest jQuery 3.2.1.

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Sunday, November 19, 2017 3:58 PM
  • User-1355817221 posted

    Hi,

    "signalr/hubs"

    There is a script file named hubs that the SignalR library dynamically generates at runningtime. So you could't find it locally.

    If you want to see the content of this file, you could type in http://localhost:port/signalr/hubs into your browser to see it.

    "this is what I am doing, but I cannot get this simple Hello World running."

    I have created a simple demo, which could output 'Hello World'. You could refer to:

    Code in MyHub2.cs(right-click the project, select Add | SignalR Hub Class (v2).

     public class MyHub2 : Hub
        {
            public void Hello(string msg)
            {
                Clients.All.sendMessage(msg);
            }
        }

    Code in Startup.cs:(right-click the project, then click Add | OWIN Startup Class.)

    public class Startup1
        {
            public void Configuration(IAppBuilder app)
            {          
                app.MapSignalR();
            }
        }

    Code in Test.html:

    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="Scripts/jquery-1.10.2.min.js"></script>
        <script src="Scripts/jquery.signalR-2.1.2.min.js"></script>
        <script src="signalr/hubs"></script>
    </head>
    <body>
        <div id="log"></div>
        <script type="text/javascript">
                $(function () {
            var myHub = $.connection.myHub2;//the hub class name
            myHub.sendMessage = function (data) {
                $('#log').html(data);
                };
            $.connection.hub.start({transport: 'auto' }, function () {
                    myHub.sendMessage("Hello World!");
            });
        });
      </script>
    </body>
    </html>

    You could see the result like this:

    Besides, you could refer to this link:

    https://stackoverflow.com/questions/12091190/signalr-first-demo-project

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Monday, November 20, 2017 6:12 AM
  • User260076833 posted

    Hello Janley,

    this was the explanation! I didn't find the hubs file locally, but after your post, I finally managed to access it with the URL.
    Then I also found that I had to make the include path relative. So it works now.
    Thanks a lot!

    Besides that, I still feel unsure when using NuGet packages. For now, I have included Microsoft.AspNet.SignalR.
    Until now I donwloaded scripts for jQuery and jQuery components manually, added them to my project and added the includes, all manually.
    Now, when installing the NuGet packages for SignalR, other dependent packages like jQuery are installed, too, and with old versions (jQuery 1.6,4).
    I am hesitating switching to this fully automated dependency management.
    Is this the way to go?

    Thanks
    Magnus

    Monday, November 20, 2017 4:52 PM
  • User780756053 posted

    Hi,

    " I still feel unsure when using NuGet packages"

    If you could't find related jquery and signalR.js files in Scripts folder, you need to install Nuget packages to get them.

    It depends on whether your project has related packages of signalR.

    "I am hesitating switching to this fully automated dependency management."

    On my side, I get the latest version of jquery and jquery.signalR when I install the Nuget package. So I'm not sure why you get the old versions.

    Right click project>Manage Nuget packages>Browse> search signalR.

    You could see the info of version. Besides, You could also run the signalR project successfully even you use old jquery version reference.

    So it's not the only way to achieve signalR.

    Tuesday, November 21, 2017 1:18 AM
  • User260076833 posted

    Hello folks,

    with your help I got a basic solution based on Signal R up and running.

    • The user may enter a PowerShell script in a TextBox (or select one from a database, which is where I want to go).
    • When he clicks on the "execute" button, the script is executed asynchroneously.
      A callback method "newOutput" on the server is executed whenever there is new output.
    • The "newOutput" callback method then forwards the new output to all the connected clients.

    This all works perfectly, but there is still one major drawback:
    The new output is forwarded to "all" connected clients!

    But every client has different scripts and a different execution context. User A doesn't want to see the output of user B's scripts. This is different from all the SignalR examples that show a chat application. In a chat application, the users want to see the output of the other users, but when executing scripts, each user should have its own output.

    I know you can distinguish different users by their connectionId, but I don't know how to change my code to use it.

    Below is my code.
    Any help is welcome!

    Thanks,
    Magnus

    OutputHub.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Microsoft.AspNet.SignalR;
    
    namespace Playground.lab.PowerShellExecution.Asynchroneous
    {
        public class OutputHub : Hub
        {
            public void Hello()
            {
                Clients.All.hello();
            }
    
            public void write(String txt)
            {
                Clients.All.write(Context.ConnectionId,txt);
            }
        }
    }

    Test.aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Playground.lab.PowerShellExecution.Asynchroneous.Test" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script src="../../../Scripts/jquery-3.2.1.min.js"></script>
        <script src="../../../Scripts/jquery.signalR-2.2.2.min.js"></script>
        <script src="../../../signalr/hubs"></script>
    
        <script type="text/javascript">
            $(function () {
                var outputHub = $.connection.outputHub;
    
                outputHub.client.hello = function () {
                    $("#txt_Output").append("Hello <br />");
                }
    
                outputHub.client.write = function (connectionId,txt) {
                    $("#txt_Output").append(connectionId + ": " + txt + "<br />");
                }
    
                $.connection.hub.start();
            });
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="scm" runat="server"></asp:ScriptManager>
            <asp:TextBox ID="txt_Input" runat="server" Height="250" Width="400" TextMode="MultiLine" Text="get-date"></asp:TextBox>
            <br />
            <asp:Button ID="btn_Execute" runat="server" Text="Execute" OnClick="btn_Execute_Click"/>
            <br />
            <asp:TextBox ID="txt_Output" runat="server" Height="250" Width="400" TextMode="MultiLine"></asp:TextBox>
        </div>
        </form>
    </body>
    </html>
    

    Test.aspx.cs:

    using System;
    using System.Management.Automation;
    using System.Management.Automation.Runspaces;
    using System.Security;
    using System.Collections.ObjectModel;
    using Microsoft.AspNet.SignalR;
    
    namespace Playground.lab.PowerShellExecution.Asynchroneous
    {
        public partial class Test : System.Web.UI.Page
        {
            private Runspace runSpace;
            
            protected void Page_Load(object sender, EventArgs e)
            {
                scm.RegisterAsyncPostBackControl(btn_Execute);
            }
    
            protected void btn_Execute_Click(object sender, EventArgs e)
            {
                PowerShell psh = PowerShell.Create();
                
                PSDataCollection<PSObject> output = new PSDataCollection<PSObject>();
                output.DataAdded += output_DataAdded;
                psh.AddScript(txt_Input.Text);
                psh.Streams.Error.DataAdded += Error_DataAdded;
                var result = psh.BeginInvoke<PSObject, PSObject>(null, output);
            }
    
            void output_DataAdded(object snd, DataAddedEventArgs evt)
            {
                PSDataCollection<PSObject> col = (PSDataCollection<PSObject>)snd;
    
                Collection<PSObject> rsl = col.ReadAll();
    
                foreach (PSObject r in rsl)
                {
                    write(r.ToString());
                }
            }
    
            void Error_DataAdded(object sender, DataAddedEventArgs e)
            {
                //display error message in UI
            }
    
            private void write(String txt)
            {
                IHubContext c = GlobalHost.ConnectionManager.GetHubContext<OutputHub>();
    
                for (int i = 0; i < 100; i++)
                {
                    System.Threading.Thread.Sleep(3000);
    // don't know how to get the connection ID here, so we use "111" instead... c.Clients.All.write("111","Current integer value : " + i.ToString()); } } } }

    Sunday, November 26, 2017 12:12 AM
  • User-1355817221 posted
    Hi, Since this thread has discussed so long, and it is seems that your original issue has been sovled, I suggest you could create a new thread for this new issue. So that other people could easier to see your new problems. I'm still glad to help you.
    Sunday, November 26, 2017 12:40 AM
  • User260076833 posted

    Hello Janley,

    thank you, I opened a new thread here!

    Magnus

    Sunday, November 26, 2017 2:26 PM