0

我想制作一个 PowerShell 脚本,可用于将计算机连接到各种客户端的 SonicWall VPN(特别是通过 Global VPN 和 NetExtender)。我希望它像一个用户界面来提示用户(它将设置变量),然后使用该信息传递到命令提示符中的命令行。

我希望能够在脚本的 cmd 行中应用输入的信息。

我尝试通过(使用应用商店中的应用)使用 MobileConnect 连接并与 Microsoft VPN 客户端连接,但这并不能获取所有网络信息;特别是 DNS 服务器。

最好的方法是安装 Global VPN 或 NetExtender 并通过 cmd 线连接;那样会抓取整个网络的信息。

这是运行它的基本命令:

 Function Connect-VPN {

 Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"

 cmd /c "NECLI connect -s address:4433 -u Uname -p Password -d Domain -A"

 Set-Location -Path C:\

 }

基本上,您更改目录并使用这些参数执行命令。

我想在 POSH 中提示,使用用户输入创建变量,然后将这些参数传递下来。

我现在拥有的是:

param(
  [string]$Testadd ,
  [string]$Testun ,
  [string]$TestPW ,
  [string]$TestDom 
  )


If ($Testadd -eq "")
   {$Testadd = (Read-Host "test")
   }

If ($Testun -eq "")
   {$Testun = (Read-Host "test")
   }


If ($TestPW -eq "")
   {$TestPW = (Read-Host "test")
   }


If ($TestDom -eq "")
   {$TestDom = (Read-Host "test")
   }

 Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"

 cmd /c "NECLI connect -s "$($Testadd)" -u "$($Testun)" -p "$($TestPW)" -d "$($TestDom)" -A"

 Set-Location -Path C:\

问题是所有参数都为空。我不知道这是否可能,但我想看看。

4

3 回答 3

0

您可以在运行 cmd 之前尝试构建字符串

param (
    [string]$Testadd,
    [string]$Testun,
    [string]$TestPW,
    [string]$TestDom
)


If ($Testadd -eq "")
{
    $Testadd = (Read-Host "testadd")
}

If ($Testun -eq "")
{
    $Testun = (Read-Host "testun")
}


If ($TestPW -eq "")
{
    $TestPW = (Read-Host "testpw")
}


If ($TestDom -eq "")
{
    $TestDom = (Read-Host "testdom")
}

Set-Location -Path "C:\Program Files (x86)\SonicWALL\SSL-VPN\NetExtender"

#build the string before
$cmd = "NECLI connect -s " + $($Testadd) + " -u " + $($Testun) + " -p " + $($TestPW) + " -d " + $($TestDom) + " -A"

# Or even like this
$cmd = "NECLI connect -s $Testadd -u $Testun -p $TestPW -d $TestDom -A"

# exec command
cmd /c $cmd

Set-Location -Path C:\

于 2019-04-17T18:02:59.177 回答
0

要添加到@Desinternauta,我怀疑这是命令解释引号和变量的方式。即,当您按原样写出字符串时,它会添加空格:

$b = "b"
Write-Host "a"$($b)"c"

输出:

a b c

好消息是双引号字符串允许您将变量嵌入到字符串中:

cmd /c "NECLI connect -s $Testadd -u $Testun -p $TestPW -d $TestDom -A"
于 2019-04-17T18:06:56.167 回答
0

调用使用 cmd.exe 的外部 exe / 命令需要特殊考虑和外出细节。您也不需要直接调用 cmd.exe,因为这会发生。这是有据可查的。例如:

PowerShell:运行可执行文件

  1. 电话接线员 &

原因:用于将字符串视为 SINGLE 命令。对于处理空格很有用。

在 PowerShell V2.0 中,如果您正在运行 7z.exe (7-Zip.exe) 或其他以数字开头的命令,则必须使用命令调用运算符 &。

PowerShell V3.0 解析器现在更智能了,在这种情况下,您不再需要 & 了。

详细信息:运行命令、脚本或脚本块。调用运算符,也称为“调用运算符”,可让您运行存储在变量中并由字符串表示的命令。因为调用操作符不解析命令,所以不能解释命令参数

 # Example: 

& 'C:\Program Files\Windows Media Player\wmplayer.exe' "c:\videos\my home video.avi"  /fullscreen
  1. 启动过程(启动/saps)

原因:如果提供了 -PassThru,则启动一个进程并返回 .Net 进程对象 Jump。它还允许您控制启动进程的环境(用户配置文件、输出重定向等)。您还可以使用 Verb 参数(右键单击文件,操作列表),例如,您可以播放 wav 文件。

详细信息:执行一个程序,返回应用程序的进程对象。允许您控制对文件的操作(上面提到的动词)并控制应用程序运行的环境。您还可以等待进程结束。您还可以订阅流程退出事件。

#Example: 

#starts a process, waits for it to finish and then checks the exit code.

$p = Start-Process ping -ArgumentList "invalidhost" -wait -NoNewWindow -PassThru

$p.HasExited

$p.ExitCode


10. Stop-Parsing Symbol --%

Why: Its a quick way to handle program arguments that are not standard. Also its the new cool way to do it.

 Details: The stop-parsing symbol (--%), introduced in Windows PowerShell 3.0, directs Windows PowerShell to refrain from interpreting input as Windows PowerShell commands or expressions. When calling an executable program in Windows PowerShell, placethe stop-parsing symbol before the program arguments.

 After the stop-parsing symbol --% , the arguments up to the end of the line (or pipe, if you are piping) are passed as is.

#Examples:

# icacls in V2

# You must  use escape characters to prevent PowerShell from misinterpreting the parentheses.

icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F



# In V3 you can use the stop-parsing symbol. 
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

也可以看看:

使用 Windows PowerShell 运行旧的命令行工具(以及它们最奇怪的参数)

解决 PowerShell 中的外部命令行问题

报价

关于报价规则

PowerShell 引用规则的故事

于 2019-04-17T19:55:47.360 回答