【问题标题】:Where are the input values stored when using $host.ui.PromptForCredential?使用 $host.ui.PromptForCredential 时输入值存储在哪里?
【发布时间】:2018-05-24 17:25:27
【问题描述】:

在以下代码中,系统将 $Credential 的值存储在哪里?

$Credential= $host.ui.PromptForCredential("","Please Enter Your domain username, eg. user1@contoso.com","","")

代码执行后值会发生什么变化?

请原谅非常基本的问题...只是想确定我正在制作的脚本的任何安全隐患。我还希望能找到专门解决此问题的 MSDN/TechNet 文章。

非常感谢。

【问题讨论】:

    标签: powershell security


    【解决方案1】:

    首先,您应该改用Get-Credential - 它更简单,而且功能相同:

    $credential = Get-Credential -Message "Please Enter Your domain username, eg. user1@contoso.com"

    这两种方法都创建了一个PsCredential 对象,对该对象的引用存储在$credential 中。密码以SecureString 的形式存储在内存中,以帮助确保其安全,并且不会写入磁盘、注册表等,除非您特意这样做:

    PS C:\> $credential
    
    UserName                        Password
    --------                        --------
    domain\user System.Security.SecureString
    

    因此,不随意尝试阅读是安全的。但是,它并不完全安全:

    PS C:\> $credential.GetNetworkCredential() | Format-List *   
    
    UserName       : user
    Password       : Password123
    SecurePassword : System.Security.SecureString
    Domain         : domain
    

    【讨论】:

    • 哇!很好回答。因此,这些值确实存储在内存中,包括密码的纯文本版本,而不是一种单向安全哈希。我确实得到了与您显示的相同的输出。这是否意味着如果代码在 PS 脚本中运行,则在脚本执行后这些值仍会在内存中?如果是这样,应该添加和执行什么代码来确保清除和删除关键值?提前致谢。
    • 密码存储为SecureString,作为PsCredential object的一部分,所以通常不容易直接读取。但是,在某些时候它必须用作“密码”,因此必须可以转换回纯文本,这就是对 GetNetworkCredential() 的调用所做的 - 实际上,它返回一个相关对象,其详细信息“已解密” '。
    • 感谢您的回答。 =) 这是否意味着如果代码在 PS 脚本中运行,脚本执行后这些值仍会在内存中?如果是这样,应该添加和执行什么代码来确保清除和删除关键值?
    • 在脚本中处理完数据后,数据可能会在内存中停留一段时间,因为 .NET 垃圾收集器不是即时的 - 它最终会被清理,一旦你退出 PowerShell ,您的会话的内存将被 Windows 回收。我不知道有任何 PowerShell 命令可以清空特定的内存,即使您可以确定数据的存储位置。老实说,我认为绝大多数情况下不需要这种程度的偏执。
    • 你说得有道理。感谢您 [几乎] 实时响应。真的,当我开始介绍将使用那行代码的脚本时,如果这里的老板们有同样的看法,那将不是什么大问题。无论如何,我已经花了你很多时间,我开始把它变成一个真正的在线聊天会话......所以,最后,是否有任何特定的 MSDN/TechNet(和类似)文章包含所有内容?谢谢你,boxdog。
    猜你喜欢
    • 2010-11-03
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多