【问题标题】:PS1 script works normal in ISE but displays my -AsSecureString text when in Exe?PS1 脚本在 ISE 中正常工作,但在 Exe 中显示我的 -AsSecureString 文本?
【发布时间】:2022-10-17 05:59:23
【问题描述】:

我现在正在编写一个脚本,但我无法弄清楚为什么在使用 ISEsteroids 编译到 CMD/window (.*Exe) 时,添加到脚本中会使我的 -AsSecureString 在完成的结果中回显。

我正在使用Read-Host 在上面使用并隐藏脚本中编写的密码。在编辑器中运行代码时效果很好。但是,当使用 ISEsteroids 编译以执行我的脚本时,我的脚本运行,然后最后以纯文本形式回显密码 3 次......就像这样(图片)

我使用它在两者之间添加“再次运行”框和脚本。

$choices = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes","&No")
while ( $true ) {

脚本在这里:

  $Host.UI.RawUI.WindowTitle = $PSScriptRoot
  $choice = $Host.UI.PromptForChoice("Run again","",$choices,0)
  if ( $choice -ne 0 ) {
    break
  }
}

ISE 输出:

可执行文件的输出:

更新 - 已解决从@mklement0 获得帮助!这解决了这个问题。

while ([Console]::KeyAvailable) { $null = [Console]::ReadKey($true) }

【问题讨论】:

  • 但是,在我的帖子中为“是/否”问题添加该代码时,它仅以纯文本形式显示密码。而且,正如仅在编译为可执行文件时所说的那样,而不是在 Powershell 编辑器中运行相同的确切代码时。 :/
  • 是的,当以任何一种方式运行脚本时,它都会显示 ****,但用户名和密码都写在脚本末尾的图片中,同时作为已编译的可执行文件运行。用户名:test 密码:test
  • $test2=Read-Host "Password" -AsSecureString 但是一旦我将变量传递给 Start-process 和我的测试环境中的计算机列表,它就运行良好。然后在脚本输出的最后显示“再次运行?” Y/N:用户名密码“再次运行?” Y/N:用户名密码仅在作为可执行文件时发生。而不是在 PS1 或编辑器中
  • 太棒了!非常感谢你不知道这实际上是在幕后发生的。
  • 很高兴听到。我在这里清理了我的 cmets,并在答案中总结了解决方案以及背景信息。

标签: powershell securestring


【解决方案1】:

tl;博士

作为您在编译的应用程序中看到的意外行为的解决方法 - 为响应 Read-Host 而键入的字符也出现在稍后的无关提示中 - 在调用 $Host.UI.PromptForChoice(...) 之前清除控制台键盘缓冲区(取自 this answer):

# Clear any pending keystrokes.
while ([Console]::KeyAvailable) { $null = [Console]::ReadKey($true) }

行为差异归结为不同的 PowerShell主持人实现.

PowerShell 主机是派生自抽象 System.Management.Automation.Host.PSHost 类的 .NET 类,其目的是为 PowerShell 运行时提供输入并显示输出。

不同的 PowerShell 环境有不同的主机实现,它们的行为可能会有很大差异,并且允许主机不是实现某些功能。 $Host.Name 报告主机的友好名称,例如常规控制台窗口中的 ConsoleHost[1]

  • 不同行为的一个示例是(过时的)ISE 使用Read-Host -AsSecureString 的GUI 对话框,而常规控制台窗口直接在控制台中提示。

我不知道您编译的可执行文件(通过将 PowerShell 脚本包装在独立的可执行文件中创建)使用什么主机实现。在最简单的情况下,它使用简单的DefaultHost 实现,当您通过PowerShell SDK 将PowerShell 嵌入应用程序时默认使用该实现。

您所经历的行为闻起来像一个错误,但至少上面显示的解决方法似乎是有效的。


[1] 请注意,似乎无法通过automatic $Host variable 确定特定于主机的PSHost 派生类的完整类型名称,其自己的类型是非公共 [System.Management.Automation。 Internal.Host.InternalHost]` 类。类似地,特定于主机的类型可能是非公开的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多