我正在编写一个脚本,用于从按钮网格启动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
按钮,它只是说我的登录尝试失败了,而且我提供的信息不正确。
理想情况下,我想存储我的信用卡,然后无论我按哪个服务器按钮,它都会登录,而不是两次输入我的信用卡。
答案 0 :(得分:1)
这很可能是scoping issue - 点击事件代理中的代码(.add_click({})
操作)将$cred
变量视为本地变量,默认为$null
。< / p>
由于您尚未在$cred
函数中指定getAdmin
变量的范围,因此它们被视为两个单独的变量,无法查看&#34;请参阅&#34 ;海誓山盟
您可以像这样指定范围:
$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
开关应该可以正常工作