我正在编写一个脚本,从按钮网格启动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
开关应该能在