#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 был панировочными сухарями, которые помогли мне преодолеть финишную черту.