0

我正在编写一个脚本来从按钮网格中启动 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按钮,它都只是说我的登录尝试失败并且我提供了不正确的信息。

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

4

1 回答 1

1

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

由于您没有为函数$cred内的变量指定范围getAdmin,因此它们被视为两个无法“看到”彼此的独立变量

您可以像这样指定范围:

$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 })

现在,两个 ScriptBlocks 都在父作用域中引用同一个变量,您的-Credential开关应该可以工作

于 2015-02-18T20:40:38.697 回答