почему я не могу выполнить простую команду powershell rasdial в моем рабочем пространстве в vb.net приложение winforms?

#vb.net #powershell #pipeline #vpn #runspace

#vb.net #powershell #конвейер #vpn #runspace

Вопрос:

Я создал приложение, которое содержит пространство выполнения PowerShell.
Оно отлично работает для всего, что я на него бросил …. до сегодняшнего дня.

Одна из добавленных мною функций определяет, когда пользователь пытается получить доступ к корпоративным ресурсам, и указывает, отключен ли его VPN.
Мы используем постоянно работающую VPN с авторизацией сертификата, поэтому имя пользователя / пароль не требуется.

Пространство выполнения и приложение, в котором оно содержится, выполняются в контексте пользователя.
Я смог продемонстрировать это, выведя текущего пользователя среды из рабочего пространства, который возвращается как я (т. Е. Не системный, не администратор или что-нибудь глупое).

У меня есть действительно простая часть PowerShell, которая попытается 4 раза повторно подключить VPN, прежде чем сообщать о сбое, проверяя перед каждой повторной попыткой успех.
Этот код отлично работает, если я запускаю ISE (стандартный, НЕ повышенный), но когда я передаю этот код для выполнения, я получаю сообщение об ошибке, возвращающееся из rasdial, в котором просто говорится: «данные недействительны».

PowerShell достаточно прост…

 $myvpn = Get-VpnConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com"}
$VPNStatus = ( $myvpn ).ConnectionStatus
if ($VPNStatus -eq "Connected")
{
    $output= 0
}
else
{
    $attempt = 0
    DO
    {
        Write-output "not connected"
        rasdial $myvpn.name
        $check = (Get-VpnConnection | Where-Object {$_.ServerAddress -eq "vpn.example.com"}).ConnectionStatus
        start-sleep -Seconds 4
        $attempt   
    } Until ($attempt -gt 3 -or $check -eq "Connected")
    if ($check -eq "Connected")
    {
        $output= 0
    }
    else
    {
        $output= 1
    }
}
 

Я понятия не имею, почему оно не будет работать в пространстве выполнения, но будет работать в обычном PowerShell с легкостью. Моим первым подозрением был контекст, но, как я уже сказал, я опроверг эту теорию.

Я прогуглил ошибку и, похоже, не могу найти никаких связанных результатов.
Я также пытался обойти это, создав фактический сеанс PowerShell (т. Е. Не В пространстве выполнения) и передав команду, но это также не удается при запуске из моего приложения.

Кто-нибудь видел это раньше или подобное поведение при использовании пространств выполнения / конвейеров и т. Д. внутри vb.net ?

Есть ли какие-либо странные ошибки в разрешениях, которые я, возможно, упустил из виду?

Редактировать: расширил powershell, чтобы он был полностью инклюзивным

Комментарии:

1. Должны ли мы предположить $myvpn , что оно было передано в качестве параметра в область runspace?

2. У меня нет такой же проблемы только в powershell, только при использовании runspace в моем vb.net приложение. И действительно, $ myvpn находится дальше по powershell…. Я просто не вставил все это для удобства чтения

3. @John Я думаю, что это важно для вопроса. Я бы включил этот момент.

4. Отредактировано соответствующим образом 🙂

Ответ №1:

Итак, я только что добрался до сути… Оказывается, команда PS будет работать только в оболочке x64, а рабочее пространство моего приложения создавалось x86.

Я изменил приложение на целевое для x64, и оно сработало с первого раза.

Этот пост в Technet был панировочными сухарями, которые помогли мне преодолеть финишную черту.