Запуск Powershell из .Net Core. Не удалось загрузить файл или сборку Microsoft.Management.Infrastructure. - PullRequest
9 голосов
/ 29 мая 2019

Я пытался запустить скрипт powershell из веб-приложения .Net Core (не обсуждая здесь лучшие практики;)) со следующим кодом:

    string command = @"& """c:\\my Folder\\myScript.ps1""";

    using (var ps = PowerShell.Create())
    {
        var results = ps.AddScript(command).Invoke();
    }

Он хорошо работает на моей машине разработчика,но в производственном процессе происходит сбой при попытке выполнить эту функцию:

ps.AddScript(command).Invoke()

Я получаю следующее исключение:

System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'Microsoft.Management.Infrastructure, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 '.Система не может найти указанный файл.Имя файла: «Microsoft.Management.Infrastructure, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35» в System.Reflection.RuntimeAssembly.GetExportedTypes (сборка RuntimeAssembly, ObjectHandleOnStack retTypes) в System.RefseyTime.RuSystem.Management.Automation.Runspaces.PSSnapInHelpers.GetAssemblyTypes (сборка сборки, имя строки) в System.Management.Automation.Runspaces.PSSnapInHelpers.AnalyzeModuleAssemblyWithReflection (сборка сборки, имя * строки, словарь_интерфейса_интерфейса)2 & псевдонимы, Словарь 2& providers, String helpFile, Type& randomCmdletToCheckLinkDemand, Type& randomProviderToCheckLinkDemand) at System.Management.Automation.Runspaces.PSSnapInHelpers.AnalyzePSSnapInAssembly(Assembly assembly, String name, PSSnapInInfo psSnapInInfo, PSModuleInfo moduleInfo, Boolean isModuleLoad, Dictionary 2 & командлеты, Словарь 2& aliases, Dictionary 2 & провайдеры, String & helpFile) в System.Management.Automation.Runspaces.InitialSessionState.ImportPSSnapIn (PSSnapInInfo psSnapInInfo, PSSnapInException.CreateDefault () в System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace (хост PSHost) в System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace () в System.Management.Automation.PowerShell.Worker.CreateRunspaceIfNeededAndDoWork (Runspace rsToUse, логическое значение isSync *).1 вывод, настройки PSInvocationSettings) в System.Management.Automation.PowerShell.CoreInvoke [TInput, TOutput] (PSDataCollection 1 input, PSDataCollection 1 выход, настройки PSInvocationSettings) в System.Management.Automation.PowerShell.CoreInvoke [вход для IE] [TOutput]`1 вывод, настройки PSInvocationSettings) в System.Management.Automation.PowerShell.Invoke (вход IEnumerable, настройки PSInvocationSettings)

Я не знаю, какой фреймворк / пакет я должен установить, чтобы сделать егозапустить.Целевой платформой является .Net Core 2.1, которая установлена, следовательно, приложение работает нормально, за исключением строки, упомянутой выше.

Файл deps.json содержит следующее:

    "Microsoft.Management.Infrastructure/1.0.0": {
        "dependencies": {
          "NETStandard.Library": "2.0.3",
          "System.Runtime.CompilerServices.VisualC": "4.3.0",
          "System.Runtime.Serialization.Xml": "4.3.0",
          "System.Security.SecureString": "4.3.0",
          "System.Threading.ThreadPool": "4.3.0"
        },
        "compile": {
          "ref/netstandard1.6/Microsoft.Management.Infrastructure.Native.dll": {},
          "ref/netstandard1.6/Microsoft.Management.Infrastructure.dll": {}
        }
      }

Установленные пакеты Nuget:

Microsoft.AspNetCore.App (2.1.1)
Microsoft.PowerShell.Commands.Diagnostics (6.0.5)
Microsoft.PowerShell.SDK (6.0.5)
Microsoft.PowerShell.WSMan.Management (6.0.5)

Редактировать Я также добавил Microsoft.Management.Infrastructure (1.0.0), но это не устранило проблему

Редактировать2 Dev isWindows 10 Pro и Prod - это Windows Server 2016 Standard

Edit3 Скрипт отлично работает на prod при прямом запуске через PowerShell.Ошибка отображается, когда веб-приложение пытается запустить PowerShell.

Edit4 Учетная запись пула приложений имеет права администратора и является той же учетной записью, которую я использовал для запуска сценария вручную (не рекомендуется, нона данный момент я просто пытаюсь сделать этот запуск).

Edit5 Я попытался поместить dll в папку приложения на сервере и перезапустить сайт + перезапустить пул приложений,Я пытался с каждой версией, которую я мог найти на машине разработчика, и ничего не работало: /

Edit6 Обновлены пакеты nuget с 6.0.5 до последней версии 6.2.1, та же проблема

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Проверка пула идентификации приложений для веб-приложения в пуле. Это может быть проблема прав Используйте олицетворение личности или запустите учетную запись администратора. когда вы запускаете из консоли, вы запускаете с вашей идентификацией, когда вы запускаете с приложением его пул идентификаций приложения

2 голосов
/ 25 июня 2019

У меня была такая же проблема, Microsoft.Management.Infrastructure.dll (и связанные файлы) не были опубликованы.Решается путем указания непереносимого RID в профиле публикации (*.pubxml, , а не * *.csproj):

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Возможно, проблема вызванафакт, что под C:\Users\UserName\.nuget\packages\microsoft.management.infrastructure\1.0.0\runtimes есть только папки с непереносимыми RID;нет win-x86 и win-x64.

0 голосов
/ 02 июня 2019

Вы можете загрузить любую DLL из Powershell, поэтому одно решение, которое должно работать, - это загрузка Microsoft.Management.Infrastructure DLL как части скрипта. Но прежде чем это сделать, давайте проверим разницу между тем, что загружается в сеансах dev и prods powershell.

Вы можете получить список загруженных сборок в PowerShell, запустив [Threading.Thread]::GetDomain().GetAssemblies(). Добавьте эту строку в начале и конце вашего сценария (в конце, потому что PowerShell будет автоматически загружать ссылочные сборки, если это возможно, когда они впервые используются в сценарии). Теперь запустите скрипт на dev и prod и сравните результаты. Скорее всего, Microsoft.Management.Infrastructure будет отсутствовать на продукт.

Вывод списка сборок показывает расположение сборок. Из списка разработчиков возьмите файл DLL Microsoft.Management.Infrastructure. Теперь у вас есть два варианта:

  1. Поместите файл в GAC машины. PowerShell теперь должен загружать DLL автоматически по мере необходимости.
  2. Сделайте загрузку этого DLL-файла частью вашего скрипта PowerShell. Добавьте [Reflection.Assembly]::LoadFile($fullPathToDLL) в начале вашего скрипта (или в любом месте, прежде чем использовать Microsoft.Management.Infrastructure).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...