Ошибка при попытке запустить скрипт powershell из приложения WinForms

Поэтому я следовал онлайн-руководству, в котором показано, как запустить сценарий powershell из приложения формы Windows с помощью VB.Net. Однако я продолжаю сталкиваться с этой проблемой, на которую я не могу найти ответ или что-то близкое, чтобы привести меня к ответу.

    Dim myRunSpace As Runspace = RunspaceFactory.CreateRunspace
    myRunSpace.Open()
    Dim mypipeline As Pipeline = myRunSpace.CreatePipeline()
    Dim command As String = " .'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; get-mailbox -recipienttypedetails UserMailbox | select-object DisplayName,RecipientTypeDetails,PrimarySmtpAddress"
    mypipeline.Commands.AddScript(command)
    mypipeline.Commands.Add("Out-String")
    Dim outputs As Collection(Of PSObject) = mypipeline.Invoke()
    'myRunSpace.Close()
    Dim MyStringBuiler As New StringBuilder()
    For Each result As PSObject In outputs
        MyStringBuiler.AppendLine(result.ToString())
    Next
    MessageBox.Show(MyStringBuiler.ToString)
    '        ReadExchangeCSVFile()

Это мой код, и он точно следует тому, что делает пример. Тем не менее, я продолжаю получать эту ошибку:

{"Cannot load Windows PowerShell snap-in Microsoft.PowerShell.Diagnostics  because of the following error: Could not load file or assembly 'Microsoft.PowerShell.Commands' or one of its dependencies.The system cannot find the file specified."}Source : System.Management.Automation

Из исследований, которые я собрал до сих пор, это может быть несоответствие версий библиотек, которые я импортирую, и версии powershell, установленной на машине.

Строка с ошибкой является первой в приведенном выше фрагменте кода. Поэтому при создании пространства выполнения он показывает мне ошибку при отладке.

Это точно могут быть несовместимые версии, это можно узнать если создать пустой проект и потом загрузить powershell. Если это работает, то у вас есть ссылки, которые не подходят друг к другу в компонентах COM. Например, командлеты Exchange, использующие тот же объект AD com, но в другой версии.

Christoph 28.06.2019 20:30

@Christoph, поэтому я создаю пустой проект формы Windows и пытаюсь загрузить оттуда powershell? или что именно ты имеешь в виду

justALostCoder 01.07.2019 18:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
574
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Точно. Если он работает в пустом проекте формы Windows без большого количества ссылок, это означает, что у вас есть конфликт (и тогда счастливое межпроцессное взаимодействие!).

Если ни то, ни другое не работает, значит, вам повезло, и вам просто нужно найти, какая DLL отсутствует (вы можете посмотреть с помощью средства просмотра журнала fusion или показать окно сообщения в соответствующем обработчике событий):

Imports System
Imports System.Linq
Imports System.Reflection
Imports Microsoft.VisualBasic

Module StartUp

    Public Sub Main(args As String())
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CustomResolver
        'Load powershell here

    End Sub

    Private Function CustomResolver(sender As Object, args As ResolveEventArgs) As Assembly
        MsgBox($"Assembly {args.Name} not found!{vbCrLf}{vbCrLf}(referred by {args.RequestingAssembly?.Modules?.FirstOrDefault()?.FullyQualifiedName})")
        Return Nothing
    End Function

End Module

Только что запустил это, и это дало мне другую ошибку: {"Произошла ошибка при попытке загрузить системные оснастки Windows PowerShell. Пожалуйста, свяжитесь со службой поддержки клиентов Microsoft."} - так что моя проблема заключается в отсутствии dll? и мне нужно найти, чего не хватает.

justALostCoder 02.07.2019 19:45

поэтому я знаю, какие из них мне нужны, но не знаю, как их установить/добавить в проект или на компьютер.

justALostCoder 02.07.2019 21:32

Давно у меня были эти проблемы, и я пытался отодвинуть их в сторону. В конце концов, я запускаю основное приложение, команды powershell, связанные с обменом, команды, связанные с активным каталогом, и команды, связанные с файловым сервером, в 4 разных процессах на 3 разных машинах. Командлеты Exchange мешают командам Active Directory (мы использовали команды Quest, теперь Dell). Exchange использует удаленные командлеты, которые вызывают проблемы, и они любят работать только на x64. Мне пришлось загружать их вручную, а некоторые сборки смешанные нативные/CLI (IJW), которые нужно загружать через правильную перегрузку (работает только 1)...

Christoph 02.07.2019 21:34

Когда я нахожу время, я смотрю, как я это сделал тогда, но у меня нет кода, хранящегося на этой машине (а ему около 10 лет). Не зная, отсутствует ли DLL или в чем проблема, попробуйте выполнить каждую команду, хранящуюся в вашем RemoteExchange.ps1, как собственную команду, и посмотрите, где возникает ошибка.

Christoph 02.07.2019 22:10

Из дальнейших исследований я понял, что две ненайденные сборки — это System.Management.Automation.resources, а также Microsoft.PowerShell.Commands.Diagnostics. Я пытаюсь запустить его в Windows 2012 AD R2 с установленным на нем Powershell 1.0, некоторые люди говорят мне, что проблема в том, что эти сборки не установлены в этой версии, я не могу перейти на powershell 3.0, который представил Runspaces. Спасибо за постоянную поддержку, это много значит.

justALostCoder 02.07.2019 23:13

Powershell 1.0 - это, вероятно, только название папки, это была бы древняя версия, которая наверняка не поддерживала бы текущие командлеты Exchange. См. $PSVersionTable. Я не понимаю вашего утверждения «Я не могу перейти на powershell 3.0, в котором представлены Runspaces». Вы явно зависите от пространства выполнения в коде выше.

Christoph 04.07.2019 09:32

Да, проблема заключалась в том, что мой код использовал пространства выполнения, которые используются в powershell версии 3.0 и выше. У меня была установлена ​​версия 1.0, поэтому я обновился до версии 3.0, и теперь код работает.

justALostCoder 05.07.2019 17:13

Другие вопросы по теме