Windows 历史上不保存会话之间的命令历史记录,仅保存会话内的命令历史记录。对于命令提示符和 PowerShell 来说都是如此。
As 比尔·斯图尔特指出,Windows 10 和 Windows 2016 上的 Windows PowerShell 默认包含 PSReadline,它确实会保存会话之间的命令历史记录。您可以通过查看此处的文件来看到这一点:(Get-PSReadLineOption).HistorySavePath
.
但即使它被设置为关闭,或者在不提供该选项的操作系统版本上,这并不意味着输入明文密码作为参数是一个好主意。
如果你必须提供这个,你should还有一种方法可以让程序在运行时提示。
对于 PowerShell 和其他 .Net 应用程序,接受明文密码时还会遇到另一个问题:它们会保留在内存中,并且没有好的方法可以显式清除它们。
这个问题有两个方面:字符串在 .Net 中是不可变的,这意味着您不能只用空值或随机字符修改字符串以将其清除在内存中(您实际上将创建一个全新的字符串),最重要的是您无法控制垃圾回收何时处理特定对象,因此您无法显式删除它。
这就是为什么SecureString class存在,但并不是所有东西都可以使用它。
在PowerShell中,有一个PSCredential object它以纯文本形式存储用户名和密码SecureString
。这应该始终在 PowerShell 中使用,并且应该是首选参数类型(代替单独的用户名和密码)。
PowerShell 中需要凭据的大多数命令都将其视为此类对象。
您还可以使用此对象轻松检索密码的明文版本。这样做然后将其放入托管字符串中,您就会面临我上面提到的风险。
但在我看来,最好还是使用PSCredential
对象在这些情况下,直到您需要纯文本版本。它有助于在内置/“官方”功能以及用户定义的命令中保持这种类型的标准化。
这种类型也很容易序列化Export-Clixml转换为加密的形式。这可以为您提供一种非常好的方法,提供在脚本中使用存储的凭据的自动化选项,无需任何明文内容,也无需提示或用户干预.