使远程RDP脚本工作时出现问题



我正在编写一个脚本,从按钮网格启动MSTSC。这些按钮将分别打开不同的服务器连接。我有一个单独的按钮,可以获取和存储管理员信誉,这是我从另一个脚本中借来的。单击时,该按钮调用getAdmin函数:

function getAdmin {
$returnObject = $null; $credValid = $null;
$cred = Get-Credential #Read credentials
$username = $cred.username
$password = $cred.GetNetworkCredential().password
$CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName
$domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,$UserName,$Password)
if ($domain.name -eq $null)
{
    $credValid = $false
    $cred = $null
} else {
    $credValid = $true
}
$returnobject = new-object psobject -property @{ Valid = $credValid; Credentials = $cred }
return $returnObject }

然后我有了我的"服务器按钮:"

$btnServ = new-object system.windows.forms.button
$btnServ.location = new-object system.drawing.point (10,200)
$btnServ.text = "Server Name (SERVER)"
$btnServ.width=250
$btnServ.height = 30
$btnServ.add_click({ Start-Process mstsc -ArgumentList "/v:SERVER" -Credential $cred })

现在,当我使用第一个按钮存储凭据,然后单击btnServ按钮时,它仍然会提示我输入"Windows PowerShell凭据请求",而不是从以前的操作中获取存储的凭据。如果我从呼叫中删除-Credential $cred,无论我是否单击第一个getAdmin按钮,它都只表示我的登录尝试失败,并且我提供了不正确的信息。

理想情况下,我想存储我的信用,然后无论我按下哪个服务器按钮,它都会让我登录,而不是让我在信用中键入两次。

这很可能是一个作用域问题-单击事件委托(.add_click({})操作)中的代码将$cred变量视为本地变量,默认为$null

由于您没有在getAdmin函数中为$cred变量指定作用域,因此它们被视为两个单独的变量,不能"看到"彼此的

您可以这样指定范围:

$Script:cred 

因此生成的代码变为:

function getAdmin(){
    # code code code
    $Script:cred = Get-Credential
    # more code
}

然后:

$btnServ.add_click({ Start-Process mstsc -ArgumentList "/v:SERVER" -Credential $Script:cred })

现在,两个ScriptBlock都引用父作用域中的同一变量,并且-Credential开关应该能在

中工作

最新更新