【问题标题】:Credential selection popup not appearing凭据选择弹出窗口未出现
【发布时间】:2022-01-03 18:41:16
【问题描述】:

搜索这个问题的答案会发现很多关于 GitHub 凭据的信息,但没有关于这个特定问题的信息。 我开始使用 PowerShell (PoSH) Cmdlet 'Get-Credential',因为我的公司使用双重身份验证 (2FA),因此用户名/密码无法从我的桌面(用户帐户)远程访问服务器(管理员帐户)。 另外,我刚刚开始使用 VS Code。 问题是,当运行一个简单的 PoSH sn-p 时,在 PoSH ISE 中使用 Get-Credential 我得到一个弹出窗口,让我选择我需要的证书,然后输入一个 Pin。当我在 VS Code 中运行相同的 sn-p 时,弹出窗口永远不会出现。 有谁知道这是为什么,我可以解决吗?

这里是sn-p供参考。

$serverList = Get-Content "C:\temp\Servers.txt"
$cred = Get-Credential


ForEach ($Server in $serverList){

$OS = Invoke-Command -Credential $cred -ComputerName $Server -ScriptBlock {
    (get-itemproperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName).ProductName
        
        }
    Write-Host $Server, $OS   
       
       }

谢谢大家。

【问题讨论】:

  • 它应该出现在要求凭据的命令行中,我相信弹出窗口仅适用于 ISE 应用程序。确实看到了非常奇怪的情况,因为我也使用带有证书的智能卡。解决方案是否可以以提升的方式打开 VSC,因此它继承了该智能卡的权限?除此之外,我似乎在外网上找不到任何与它相关的东西。如果您能弄清楚如何阻止对象:PowerShell.exe -Command "Get-Credential" 这可能有效,但它只会返回一个字符串对象。也许导出到 XML?
  • Get-Credential 行为似乎已从 PS 5 更改为 PS 7。在 PowerShell 5.1 控制台(由 ISE 使用)中,我得到一个 GUI 提示,而在 PS 7.2.1(由 VSCode 使用)我在控制台中收到提示。
  • @SantiagoSquarzon 我认为这不能满足 OP 使用 2 因素身份验证的要求。有用于显示标准信用 UI 的原生 API CredUIPromptForWindowsCredentials。让它使用P/Invoke 显示一个对话框,但我目前懒得弄清楚如何将结果转换为PSCredential 对象。
  • 这是我目前所拥有的(不完整):gist.github.com/zett42/b32086e25fa8ff84d8841e3bb4835017
  • @zett42 我在使用智能卡时使用了这个github.com/bongiovimatthew-microsoft/pscredentialWithCert,效果很好,你可能会在那里找到有用的东西。

标签: powershell visual-studio-code


【解决方案1】:

TL;DR:这种行为是设计使然。 VS Code 是微软跨平台开发经验努力的结果。默认情况下,PowerShell 版本是跨平台的 PowerShell Core。它专注于终端体验和脚本。因此,您无法在 VS Code 上触发 Windows 本机凭据提示。

当您使用 $PSVERSIONTABLE 检查版本时,您会看到如下内容:

=====> PowerShell Integrated Console v2021.12.0 <=====

PS C:\Users\Foo> $PSVersionTable


Name                           Value
----                           -----
PSVersion                      7.2.1
PSEdition                      Core
GitCommitId                    7.2.1
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}       
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion   

默认情况下,这不是powershell.exe,这意味着它不是您在 ISE 或控制台中使用的 Windows 原生和 Powershell 5.x 或更低版本。它是使用pwsh.exe 的VS Code 主机,6.0 及更高版本的跨平台版本。

您可以查看文档: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-credential?view=powershell-7.2

您可以看到,对于 6.x 及更高版本,它始终专注于脚本和终端。坏消息是 VS Code 也是围绕跨平台方法构建的。因此,即使您将终端中的配置文件更改为使用如下所示的 Windows Powershell,您也可以使用 PowerShell 5.1 但无法查看该提示:

"PowerShell Core": {
    "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe"
 },
 "Windows PowerShell (x64)": {
    "path": "${env:windir}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
}

总之,您无法使用 VS Code 获得该提示。除了在集成终端中输入powershell.exe 并在那里粘贴代码外,基本上不使用VS Code。它不会帮助你。我会坚持使用 ISE 来满足此要求,请注意它已贬值。

编辑 1:添加了 TL;DR。

编辑2:我created a cmdlet只弹出默认凭据对话框并返回PSCredential对象。

就像其他评论所有者一样,我使用了P/Invoke

【讨论】:

  • 您的回答中有很好的信息,但它可以从“tl;dr”中受益:在 VS Code 中,如果您想使用 PowerShell 扩展的 PowerShell 集成控制台,显示 GUI 形式的凭据提示不受支持,无论您使用的是 Windows PowerShell 还是 PowerShell (Core)。如果需要 GUI 凭据提示,请使用常规控制台窗口(最好避免使用 obsolescent ISE)。
  • @mklement0,感谢您的反馈。我编辑了内容。我愿意接受任何建议。
【解决方案2】:

您可以从“查看”菜单或使用显示或隐藏终端

Ctrl + '

然后您可以交互输入凭据。

【讨论】:

  • 我认为是反引号 (`) - 而不是 ' - 结合 Ctrl 来切换集成终端的可见性。也就是说,我不认为终端的可见性是这里真正的问题(在运行脚本时按需显示)。相反,真正的问题是 GUI 凭据提示提供了基于控制台的凭据提示不提供的功能。
  • 不,控制台可见性不是问题,也不是尝试使用 PoSH 版本 6+。这似乎是Zafer提到的。因此,该决议很可能是 zett42 所暗示的。一个自定义类。