我有一个 powershell 脚本,它作为计划任务运行,并被触发运行“工作站解锁时”。如果在工作站锁定期间连接断开,该脚本被编程为重新连接 SSTP VPN 连接。我想将用户名和密码传递给脚本,这样用户就不会被提示两次输入相同的信息(一次用于工作站解锁,另一次用于 VPN 连接)域用户名和密码与 vpn 用户名和密码相同。[System.Security.Principal.WindowsIdentity]::GetCurrent() 不允许我访问当前登录用户的密码。还有其他方法吗?
谢谢
答案1
据我所知,没有办法从标准用户模式进程(如 Powershell)获取当前用户的明文密码。这是件好事。如果有的话,那将是一个相当大的安全漏洞。
虽然有可能写一个Windows 凭据提供程序它可以挂接 WinLogon API 并最终在解锁过程中接收用户的明文用户名和密码,但这实际上并不是您要实现的目标的正确解决方案。它也可能超出了您愿意为该解决方案投入的编程工作量。
如果您的 VPN 解决方案实际上与您的域集成,我希望它支持一种使用用户现有 Kerberos 票证建立 VPN 连接的方法,而无需再次明确输入用户的凭据。但这将完全取决于您的 VPN 解决方案。它还假设 VPN 解决方案实际上与您的域绑定在一起,而不仅仅是使用重复的身份
答案2
我使用这两个脚本来保存和加载凭证。只有保存凭证的用户才能加载它们。
当然,用户必须输入一次他的凭证。
保存-Credential.ps1
param(
[Parameter(Mandatory=$True)]
[string]$CredentialName
)
$path = (([System.IO.Path]::GetDirectoryName($PROFILE.CurrentUserCurrentHost))+ '\Credentials\'+$CredentialName+'.xml')
$dir = ([System.IO.Path]::GetDirectoryName($path))
if((Test-Path ($dir)) -eq $false)
{
New-Item -Path $dir -ItemType Directory
}
$cred = Get-Credential
$cred | Export-Clixml $path
加载凭据.ps1
param(
[Parameter(Mandatory=$True)]
[string]$CredentialName
)
$path = (([System.IO.Path]::GetDirectoryName($PROFILE.CurrentUserCurrentHost))+ '\Credentials\'+$CredentialName+'.xml')
if(Test-Path ($path ))
{
Import-Clixml $path
}else
{
Write-Host "File $path not found."
}
凭证对象具有安全字符串属性。