ASP.NET CORE 2.1 многопоточное олицетворение - PullRequest
0 голосов
/ 03 сентября 2018

У меня действительно странная проблема в ASP.NET core 2.1 Я пишу простое веб-приложение, которое при необходимом сценарии вызывает скрипты Powershell. Олицетворение отлично работает на уровне C #, но как только я запускаю скрипт Powershell, он вызывается с идентификатором по умолчанию (с которым работает IIS Express). Я знаю, что в ASP.NET было легко включить многопоточное олицетворение через файл aspnet.config, но я понятия не имею, как выполнить аналогичную реализацию в ASP.NET Core. Ниже приведен код рассматриваемой функции (хотя, думаю, функция не является проблемой).

    internal void InvokeScript()
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();

        Impersonation.LogonUser(userName, domain, password, 2, 0, out 
        SafeAccessTokenHandle handle);

        WindowsIdentity.RunImpersonated(handle, () => {

            PowerShell ps = PowerShell.Create();
            ps.Runspace = runspace;

            //Setting needed variables

            Collection<PSObject> PreFixOutput = new Collection<PSObject>();
            Collection<PSObject> FixOutput = new Collection<PSObject>();
            Collection<PSObject> PostFixOutput = new Collection<PSObject>();

            // Setting directory to needed KB subdir and finding needed stage files

            string KBtoWorkWith = RepositoryLocation + @"\" + KB.Number;

            Directory.SetCurrentDirectory(KBtoWorkWith);

            // Reading scripts from .ps1 and adding needed variables

            string commandToRun1 = string.Format("$Computer = '{0}'; $Username = '{1}'; $KB = '{2}' ; {3}", IP, Username, KB.Number, File.ReadAllText("Pre" + KB.Number + ".ps1"));
            string commandToRun2 = string.Format("$Computer = '{0}'; $Username = '{1}'; $KB = '{2}'; {3}; {4}; $success; $verbose", IP, Username, KB.Number, File.ReadAllText(KB.Number + ".ps1"), InnerFunction);
            string commandToRun3 = string.Format("$Computer = '{0}'; $Username = '{1}'; $KB = '{2}' ; {3}", IP, Username, KB.Number, File.ReadAllText("Post" + KB.Number + ".ps1"));

            // Invoking formed PS scripts & collecting returned data

            ps.AddScript(commandToRun1);

            PreFixOutput = ps.Invoke();

            OutputToUser = PreFixOutput[1].BaseObject.ToString();

            if (PreFixOutput[0].BaseObject.ToString() == "True")
            {
                IsFixApplicable = true;

                if ((PreFixOutput[2].BaseObject.ToString()) != "")
                {
                    InnerFunction = PreFixOutput[2].BaseObject.ToString();
                }

                else
                {
                    InnerFunction = "";
                }

                FixOutput = ps.AddScript(commandToRun2).Invoke();

                OutputToUser = FixOutput[1].BaseObject.ToString();

                if (FixOutput[0].BaseObject.ToString() == "True")
                {
                    PostFixOutput = ps.AddScript(commandToRun3).Invoke();

                    OutputToUser = PostFixOutput[1].BaseObject.ToString();

                    if (PostFixOutput[0].BaseObject.ToString() == "True")
                    {
                        WasFixApplied = true;
                    }

                    else
                    {
                        WasFixApplied = false;
                    }
                }

                else
                {
                    WasFixApplied = false;
                }
            }

            else
            {
                IsFixApplicable = false;
                WasFixApplied = false;
            }

            //runspace.Close();
        });

    }

1 Ответ

0 голосов
/ 06 сентября 2018

Только для всех, чтобы знать. Я никогда не решал это в среде DEV. Ни на ASP.NET CORE, ни на ASP.NET 4.5.2. Это похоже на проблему IIS Express. Как только я разместил на своем компьютере полнофункциональный IIS и опубликовал свое олицетворение, приложение начало работать.

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