Скрипт Powershell не работает должным образом при публикации веб-приложения - PullRequest
1 голос
/ 01 марта 2020

Веб-приложение работает, как и ожидалось, при работе в Web Developer, но после его преобразования в IIS; проблемы начинаются, и приложение не работает должным образом.

aspx

image

cs

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Management.Automation;
using System.Text;

namespace PowerShellExecution
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
          // Gets the name if authenticated.
                if (User.Identity.IsAuthenticated)
                    Label1.Text = User.Identity.Name;
                else
                    Label1.Text = "No user identity available.";

            // Clean the Result TextBox

            // Initialize PowerShell engine
            var shell = PowerShell.Create();

            // Add the script to the PowerShell object
            // shell.Commands.AddScript(Input.Text);
            // shell.Commands.AddScript("D:\\Local_Scripts\\sessioncall.ps1");
            //shell.Commands.AddCommand("c:\\Local_Scripts\\sessioncall.ps1");
            shell.Commands.AddCommand("e:\\wwwroot\\ctxrep2csharp\\Scripts\\sessioncall.ps1");

            // Add Params
            // shell.Commands.AddParameter(null,User.Identity.Name);
            // shell.Commands.AddParameter("Username", Label1.Text);
            shell.Commands.AddArgument(User.Identity.Name);

            // Execute the script
            var results = shell.Invoke();

            // display results, with BaseObject converted to string
            // Note : use |out-string for console-like output
            if (results.Count > 0)
            {
                // We use a string builder ton create our result text
                //var results2 = shell.Invoke();
                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
                    var UserFullName = (psObject.Members["UserFullName"]);
                    var BrokeringTime = (psObject.Members["BrokeringTime"]);
                    var ClientName = (psObject.Members["ClientName"]);
                    var DesktopGroupName = (psObject.Members["DesktopGroupName"]);
                    var SessionState = (psObject.Members["SessionState"]);
                    var Uid = (psObject.Members["Uid"]);
                    var MachineName = (psObject.Members["MachineName"]);
                    var ENV = (psObject.Members["ENV"]);
                    // builder.Append(psObject.BaseObject.ToString() + "\r\n");
                }

                var objects = results.Select(
        r => new MyClass
                        {
                            UserFullName = (string)r.Properties["UserFullName"].Value,
                            BrokeringTime = (DateTime)r.Properties["BrokeringTime"].Value,
                            ClientName = (string)r.Properties["ClientName"].Value,
                            DesktopGroupName = (string)r.Properties["DesktopGroupName"].Value,
                            //SessionState = (SessionState)r.Properties["SessionState"].Value,
                            Uid = (Int64)r.Properties["Uid"].Value,
                            MachineName = (string)r.Properties["MachineName"].Value,
                            //ENV = (string)r.Properties["ENV"].Value,
                        }
                    );
                this.ResultGrid.DataSource = objects;
                this.ResultGrid.DataBind();
            }

            }

        protected void ResultGrid_SelectedIndexChanged(object sender, EventArgs e)
        {


            //Response.Write(ResultGrid.SelectedValue.ToString());

            //Page.Response.Redirect(Page.Request.Url.ToString(), true);
        }


        protected void ResultGrid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Get the value of column from the DataKeys using the RowIndex.
                //int uid = Convert.ToInt32(ResultGrid.DataKeys[e.Row.RowIndex].Values[0]);
                //string uid = ResultGrid.DataKeys[e.Row.RowIndex].Values[0].ToString();
                //string DesktopGroupName = ResultGrid.DataKeys[e.Row.RowIndex].Values[1].ToString();
            }
        }


        protected void ResultGrid_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            //Response.Write(ResultGrid.SelectedValue.ToString());

            if (e.CommandName == "Logoff")
            {
                //Your code
                string[] arg = new string[2];
                arg = e.CommandArgument.ToString().Split(';');
                Session["uid"] = Convert.ToInt32(arg[0]);
                Session["DesktopGroupName"] = arg[1];

                int numVal = -1;
                numVal = Convert.ToInt32(Session["uid"]);
                Response.Write(e.CommandArgument.ToString());
                Response.Write(arg[0].ToString() + "<br/>");
                Response.Write(arg[1].ToString() + "<br/>");
                Response.Write(Session["uid"] + " " + Session["DesktopGroupName"]);

                // Initialize PowerShell engine
                var shell2 = PowerShell.Create();

                // Add the script to the PowerShell object
                // shell.Commands.AddScript(Input.Text);
                 //shell2.Commands.AddCommand("C:\\Local_Scripts\\sessionkill.ps1");
                shell2.Commands.AddCommand("e:\\wwwroot\\ctxrep2csharp\\Scripts\\sessionkill.ps1");

                // Add Params
                // shell.Commands.AddParameter(null,User.Identity.Name);
                shell2.Commands.AddArgument(Convert.ToInt32(arg[0]));
                //shell2.Commands.AddArgument(Session["uid"]);
                //shell2.Commands.AddArgument(Session["uid"] + " " + Session["DesktopGroupName"]);

                // Execute the script

                var results = shell2.Invoke();

                //Page.ClientScript.RegisterStartupScript(this.GetType(), "scriptkey", "alert('your message');");

                //ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + Session["uid"] + "');", true);
                System.Threading.Thread.Sleep(10000);
                Page.Response.Redirect(Page.Request.Url.ToString(), true);

            }
            //Page.Response.Redirect(Page.Request.Url.ToString(), true);
        }
    }



    internal class MyClass
    {
        public string UserFullName { get; set; }
        public DateTime BrokeringTime { get; set; }
        public string ClientName { get; set; }
        public string DesktopGroupName { get; set; }
        public SessionState SessionState { get; set; }
        public Int64 Uid { get; set; }
        public string MachineName { get; set; }
        public string ENV { get; set; }
    }
}

Веб-приложение находится в пуле приложений, который работает как домен учетная запись службы в порядке кода PowerShell выполняется в нужном контексте пользователя. Страница отрисовывается, но результаты gridview пропускают первые записи, а затем возвращают 2 повторяющихся строки последней записи. Однако; что странно, если я перезагружаю IIS и быстро перехожу на сайт, который будет отображаться правильно, но если я затем переоцениваю sh страницу, она возвращается к отображению повторяющихся записей в сетке.

например, перезапустите IIS и перейдите к страница enter image description here

При обновлении sh и последующих обновлениях enter image description here

Я предполагаю, что это проблема контекста / настройка IIS , Странный.

Похоже, это проблема с кодом powershell при добавлении в массив.

$SessionUser = "$($args[0])"
Add-PSSnapin cit* 
Set-brokersite -AdminAddress ukserver
$a = @(Get-BrokerSession -BrokeringUserName $SessionUser | Select-Object UserFullName, BrokeringTime, ClientName,DesktopGroupName, @{Name="SessionState";Expression={$_.SessionState.ToString()}}, uid, machinename,@{Name='ENV';Expression={'UK'.ToString()}})
#Pull US Sessions into array
Set-brokersite -AdminAddress usserver
$a += @(Get-BrokerSession -BrokeringUserName $SessionUser | Select-Object UserFullName, BrokeringTime, ClientName,DesktopGroupName, @{Name="SessionState";Expression={$_.SessionState.ToString()}}, uid, machinename,@{Name='ENV';Expression={'US'.ToString()}})

If ($a -ne $null){
    $a 
}
Else {
    $a
}

Это работает полностью, как и ожидалось, в окне DEV и успешно перечисляет все сеансы в один массив. Однако; при продвижении и запуске кода на веб-сервере; казалось бы, он перезаписывает первый вызов массива и повторяющуюся запись во втором вызове массива?!

Единственный вариант - запускать отдельные сценарии powershell, которые заполняют отдельные виды сетки. Это работает, но это немного неуклюже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...